欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog

 更新時(shí)間:2024年01月22日 14:59:50   作者:風(fēng)流 少年  
binlog用來(lái)實(shí)現(xiàn)主從復(fù)制,也常用來(lái)誤刪數(shù)據(jù)庫(kù)找回丟失的記錄,本文主要介紹了SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog,具有一定的參考價(jià)值,感興趣的可以了解一下

一:什么是bin log

MySQL的所有的數(shù)據(jù)庫(kù)改變操作(除了select等)都會(huì)記錄到一種二進(jìn)制文件中,這種文件就是bin log。
bin log 用來(lái)實(shí)現(xiàn)主從復(fù)制,也常用來(lái)誤刪數(shù)據(jù)庫(kù)找回丟失的記錄。

一般恢復(fù)從兩種緯度來(lái)進(jìn)行恢復(fù):

  • 一部分從mysqldump中恢復(fù)備份到之前的狀態(tài)。
  • 另一部分在恢復(fù)到備份之前的基礎(chǔ)上再?gòu)腷in log中找出需要恢復(fù)的數(shù)據(jù)。

二:查看bin log配置

  • log_bin :是否開啟bin log,默認(rèn)值為 ON 表示開啟。
  • log_bin_basename :配置bin log文件所在的目錄(/usr/local/mysql/data)以及文件名前綴(mysql-bin)。
  • bin log文件名是從mysql-bin.000001開始的。log_bin_index:配置索引對(duì)應(yīng)的bin log文件的絕對(duì)路徑,文件中記錄所有bin log文件名。 /usr/local/mysql/data/mysql-bin.index

三:刪除bin log文件

為了測(cè)試方便可以先刪除之前的bin log文件。

注意:最好是自己本地開發(fā)環(huán)境來(lái)執(zhí)行以下命令,千萬(wàn)不要在測(cè)試環(huán)境或者其它共用環(huán)境刪除bin log。

# 用來(lái)查看當(dāng)前最新的bin log文件及對(duì)應(yīng)的結(jié)束位置
show master status;

# 查看所有bin log文件
show binary logs;

# 生成一個(gè)新的bin log文件(推薦:自己玩的時(shí)候可以先生成一個(gè)新的bin log文件,所有新操作都記錄在新生成的文件中)
flush binary logs;

# 刪除所有binlog日志,新日志編號(hào)從頭000001開始(建議自己玩的時(shí)候可以使用)
reset master;

# 刪除mysql-bin.000001之前的所有bin log
purge master logs to 'mysql-bin.000001';

# 刪除指定時(shí)間之前的數(shù)據(jù)
purge master logs before '2022-09-01 23:59:59';

四:準(zhǔn)備測(cè)試數(shù)據(jù)

執(zhí)行SQL時(shí)不要一下子全部執(zhí)行,為了后續(xù)方便演示基于時(shí)間范圍的操作,需要一條一條的執(zhí)行,最好每條命令間隔1秒以上執(zhí)行。

CREATE DATABASE `db1`;
use db1;
CREATE TABLE `tbl_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL COMMENT '用戶名',
  `status` tinyint(4) DEFAULT NULL COMMENT '狀態(tài)(0:關(guān)閉,1:打開)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


insert into tbl_user(username, status) values('monday', 0);
insert into tbl_user(username, status) values('vbirdbest', 1);

update tbl_user set status = 1 where username = 'monday';

delete from tbl_user where username = 'vbirdbest';
drop database db1;

五:查看bin log

  • bin log 需要關(guān)注的字段:
  • Log_name:bin log 文件名。
  • Pos:開始位置點(diǎn)。
  • End_log_pos:結(jié)束位置點(diǎn)。
  • Event_type:事件類型(Query:DML語(yǔ)句,Write_rows:insert語(yǔ)句,Update_rows:update語(yǔ)句,Delete_rows:delete語(yǔ)句)。

方式一:show binlog events

# 查看當(dāng)前最新的bin log文件
mysql> show master status;
# 查看bin文件基本信息, Pos表示位置position,如904位置是insert一條數(shù)據(jù)
mysql> show binlog events in 'mysql-bin.000001';

方式二:mysqlbinlog命令

mysqlbinlog方式和show binlog events方式差不多,其中 at 表示開始位置Pos(position),end_log_pos表示結(jié)束位置點(diǎn)。

  • bin log中創(chuàng)建數(shù)據(jù)庫(kù)create database、創(chuàng)建表create table、刪除數(shù)據(jù)庫(kù)drop database 都是直接記錄的SQL語(yǔ)句,
  • 插入insert、更新update、刪除delete 都是編碼之后的人類不可讀的內(nèi)容存在。所以需要--base64-output=DECODE-ROWS -vv解碼。
  • 每個(gè)SQL操作都會(huì)記錄操作時(shí)間, #220903 17:08:44。
# 如果報(bào)權(quán)限問題切換root用戶 mysqlbinlog: File '/usr/local/mysql/data/mysql-bin.000001' not found (Errcode: 13 - Permission denied)
~ sudo su

# 解碼:將insert/update/delete等解碼成SQL語(yǔ)句
mysqlbinlog --no-defaults --skip-gtids --base64-output=DECODE-ROWS -vv /usr/local/mysql/data/mysql-bin.000001

六:恢復(fù)數(shù)據(jù)mysqlbinlog

6.1 mysqlbinlog命令常用參數(shù)

  • --no-defaults:如果不報(bào)錯(cuò)可以不使用該參數(shù)。 mysqlbinlog: [ERROR] unknown variable 'default-character-set=utf8'。
  • --skip-gtids=true:gtid是一種全局唯一id。設(shè)置為true表示導(dǎo)出的sql中不包含gtid相關(guān)的設(shè)置。
  • --base64-output=DECODE-ROWS -vv:bin log內(nèi)容經(jīng)過編碼了,需要解碼之后人類才可讀。
  • --start-position=801:恢復(fù)的開始位置。注意:開始位置一般取BEGIN的位置,取靠下的位置可能導(dǎo)不出來(lái)想要的log。
  • --stop-position=1590:恢復(fù)的結(jié)束位置。注意:是不包含停止位置的。
  • --start-datetime="2022-01-01 00:00:00" :指定開始時(shí)間之后的bin log。如果不指定表示從頭開始。
  • --stop-datetime="2022-09-01 23:59:59":指定結(jié)束時(shí)間之前的bin log。如果不指定表示一直到結(jié)尾。--database=db1:bin log 文件會(huì)記錄所有數(shù)據(jù)庫(kù)的變更,所以一般我們需要指定數(shù)據(jù)庫(kù)對(duì)應(yīng)的bin log。

6.2 查看最新的bin log文件

# 刪除所有bin log文件,從mysql-bin.000001開始
mysql> reset master;
mysql> show master status;

6.3 模擬數(shù)據(jù)庫(kù)誤刪操作

mysql> CREATE DATABASE `db1`;
mysql> use db1;
mysql> CREATE TABLE `tbl_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) DEFAULT NULL COMMENT '用戶名',
  `status` tinyint(4) DEFAULT NULL COMMENT '狀態(tài)(0:關(guān)閉,1:打開)',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

mysql> insert into tbl_user(username, status) values('monday', 0);
mysql> insert into tbl_user(username, status) values('vbirdbest', 1);

# mysql備份 https://blog.csdn.net/zhou920786312/article/details/123354503
# 單事務(wù)導(dǎo)出包括存儲(chǔ)過程、觸發(fā)器、事件
~ mysqldump -uroot -p --single-transaction --triggers --routines --events --databases db1 > db1-20220904.dump
mysql> insert into tbl_user(username, status) values('modely', 1);



# 模擬誤操作,清空了表
mysql> delete from tbl_user;

6.4 從備份中恢復(fù)

~ mysql -uroot -p  < alldb1.dump

七:從bin log中恢復(fù)

總共有3條數(shù)據(jù),已經(jīng)有2條從備份中恢復(fù)了,剩下1條我們從bin log中找出來(lái)恢復(fù)。

7.1 方式一:基于時(shí)間范圍

7.1.1 先查看一下所有的內(nèi)容,確認(rèn)時(shí)間范圍

~ sudo su
~ /usr/local/mysql/bin/mysqlbinlog --no-defaults \
--base64-output=DECODE-ROWS -vv --skip-gtids=true \
--database=db1 /usr/local/mysql/data/mysql-bin.000001

7.1.2 根據(jù)時(shí)間范圍確認(rèn)過濾出來(lái)的日志

/usr/local/mysql/bin/mysqlbinlog \
--no-defaults \
--start-datetime="2022-09-04 18:12:17" \
--stop-datetime="2022-09-04 18:12:52" \
--base64-output=DECODE-ROWS -vv \
--skip-gtids=true \
--database=db1 /usr/local/mysql/data/mysql-bin.000001 

7.1.3 確認(rèn)好后導(dǎo)出.sql文件

# 導(dǎo)出sql文件
/usr/local/mysql/bin/mysqlbinlog \
--no-defaults \
--start-datetime="2022-09-04 18:12:17" \
--stop-datetime="2022-09-04 18:12:52" \
--base64-output=DECODE-ROWS -vv \
--skip-gtids=true \
--database=db1 /usr/local/mysql/data/mysql-bin.000001 \
> /Users/mengday/binlog.sql 

7.1.4 從.sql文件中恢復(fù)數(shù)據(jù)

# 2. 方式一:然后登錄mysql source這個(gè)文件
~ mysql -uroot -p	
mysql> source /Users/mengday/binlog.sql;

# 2. 方式二
mysql -uroot -p < /Users/mengday/binlog.sql;

通過 source binlog.sql 或者 mysql -uroot -p < binlog.sql 都沒有將insert語(yǔ)句插入進(jìn)去,不知道什么原因。通過另一種形式也沒有執(zhí)行成功?。。?/p>

/usr/local/mysql/bin/mysqlbinlog \
--no-defaults \
--start-datetime="2022-09-04 18:12:17" \
--stop-datetime="2022-09-04 18:12:52" \
--base64-output=DECODE-ROWS -vv \
--skip-gtids=true \
--database=db1 /usr/local/mysql/data/mysql-bin.000001 \
| mysql -uroot -p

7.2 方式二:基于位置(推薦)

因?yàn)樵谕幻胫锌赡懿僮鞫鄺lSQL,如果在這一秒中有一部分需要恢復(fù)有一部分不需要恢復(fù)那么使用居于時(shí)間范圍的就不準(zhǔn)確,使用基于位置的就更加準(zhǔn)確。

7.2.1 基于位置過濾日志

/usr/local/mysql/bin/mysqlbinlog \
--no-defaults \
--start-position=841 \
--stop-position=948 \
--base64-output=DECODE-ROWS -vv \
--skip-gtids=true \
--database=db1 /usr/local/mysql/data/mysql-bin.000001 \
> /Users/mengday/binlog2.sql

7.2.2 恢復(fù)數(shù)據(jù)

source binlog2.sql;

同樣不出意外的insert語(yǔ)句并沒有執(zhí)行。

7.3 多文件恢復(fù)

# 跨bin log文件
mysqlbinlog --skip-gtids=true \
--start-position=802 mysql-bin.000001 \
--stop-position=726 mysql-bin.000002 \
|mysql -uroot -proot

# 從mysql-bin.000001 802位置開始到mysql-bin.000002結(jié)束
mysqlbinlog --skip-gtids=true \
--start-position=802 mysql-bin.000001  mysql-bin.000002 \
|mysql -uroot -proot

注意:如果有多個(gè)mysql-bin文件,文件中的位置position不是唯一的,是重復(fù)利用的。所以當(dāng)操作多個(gè)文件時(shí)要小心。例如 at 4 可能在多個(gè)bin log中出現(xiàn)。需要操作多個(gè)文件時(shí)最好分開一個(gè)一個(gè)單獨(dú)操作。

八:binlog2sql 工具

既然通過source不能直接執(zhí)行bin log sql語(yǔ)句,那么我們就把bin log sql語(yǔ)句轉(zhuǎn)化成正常的sql語(yǔ)句自己手動(dòng)執(zhí)行。

Python工具 binlog2sql:https://github.com/danfengcao/binlog2sql

git clone https://github.com/danfengcao/binlog2sql.git && cd binlog2sql

# 注意:如果本地python環(huán)境沖突的話,最好為當(dāng)前項(xiàng)目創(chuàng)建一個(gè)虛擬環(huán)境,否則很容易報(bào)ModuleNotFoundError: No module named 'pymysqlreplication'
python3 -m venv env
source env/bin/activate
pip3 install -r requirements.txt

# 查詢所有sql語(yǔ)句,從而找到想要恢復(fù)是sql語(yǔ)句
python3 binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root123' -ddb1 -ttbl_user --start-file='mysql-bin.000001'

# 通過起始位置進(jìn)一步確認(rèn)是否是想要的sql
python3 binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root123' -ddb1 -ttbl_user --start-file='mysql-bin.000001' --start-position=705 --stop-position=948

# -B參數(shù)生成對(duì)應(yīng)的回滾sql,如insert回滾sql為delete
python3 binlog2sql/binlog2sql.py -h127.0.0.1 -P3306 -uroot -p'root123' -ddb1 -ttbl_user --start-file='mysql-bin.000001' --start-position=705 --stop-position=948 > insert.sql | cat

# 拿到這個(gè)SQL我直接執(zhí)行,我就不信恢復(fù)不過來(lái)
INSERT INTO `db1`.`tbl_user`(`id`, `username`, `status`) VALUES (6, 'modely', 1); #start 705 end 948 time 2022-09-04 18:12:17

??????????????????至此葵花寶典已經(jīng)連成。??????????????????

到此這篇關(guān)于SpringBoot數(shù)據(jù)庫(kù)恢復(fù)的兩種方法mysqldump和mysqlbinlog的文章就介紹到這了,更多相關(guān)SpringBoot數(shù)據(jù)庫(kù)恢復(fù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)猜拳游戲

    Java實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)猜拳游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)人機(jī)對(duì)戰(zhàn)猜拳游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • java實(shí)現(xiàn)撲克牌發(fā)牌器

    java實(shí)現(xiàn)撲克牌發(fā)牌器

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)撲克牌發(fā)牌器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • spring springMVC中常用注解解析

    spring springMVC中常用注解解析

    這篇文章主要介紹了spring springMVC中常用注解,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05
  • springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式

    springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式

    這篇文章主要介紹了springboot 返回json格式數(shù)據(jù)時(shí)間格式配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Jmeter實(shí)現(xiàn)Base64編碼的兩種方式

    Jmeter實(shí)現(xiàn)Base64編碼的兩種方式

    這篇文章主要介紹了Jmeter實(shí)現(xiàn)Base64編碼,大家都知道Jmeter實(shí)現(xiàn)Base64編碼有兩種方式,本文通過圖文并茂的形式把每種方法給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • SpringBoot基于RabbitMQ實(shí)現(xiàn)消息延時(shí)隊(duì)列的方案

    SpringBoot基于RabbitMQ實(shí)現(xiàn)消息延時(shí)隊(duì)列的方案

    在很多的業(yè)務(wù)場(chǎng)景中,延時(shí)隊(duì)列可以實(shí)現(xiàn)很多功能,此類業(yè)務(wù)中,一般上是非實(shí)時(shí)的,需要延遲處理的,需要進(jìn)行重試補(bǔ)償?shù)?本文給大家介紹了SpringBoot基于RabbitMQ實(shí)現(xiàn)消息延遲隊(duì)列的方案,文中有詳細(xì)的代碼講解,需要的朋友可以參考下
    2024-04-04
  • 詳解springmvc如何處理接受http請(qǐng)求

    詳解springmvc如何處理接受http請(qǐng)求

    這篇文章主要給大家介紹了springmvc如何處理接受http請(qǐng)求,文中通過代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-02-02
  • 深入解析Java編程中接口的運(yùn)用

    深入解析Java編程中接口的運(yùn)用

    這篇文章主要介紹了Java編程中接口的運(yùn)用,接口是Java面向?qū)ο蟮睦^承特性的體現(xiàn),需要的朋友可以參考下
    2015-10-10
  • 帶你快速搞定java多線程

    帶你快速搞定java多線程

    這篇文章主要介紹了java多線程編程實(shí)例,分享了幾則多線程的實(shí)例代碼,具有一定參考價(jià)值,加深多線程編程的理解還是很有幫助的,需要的朋友可以參考下
    2021-07-07
  • java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    java操作PDF文件方法之轉(zhuǎn)換、合成、切分

    最近需要做?個(gè)把多個(gè)pdf報(bào)告合并成?個(gè)以?便預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于java操作PDF文件方法之轉(zhuǎn)換、合成、切分的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論