MySQL之—數(shù)據(jù)庫增量數(shù)據(jù)恢復(fù)的圖文代碼案例

本篇介紹了mysql之—數(shù)據(jù)庫增量數(shù)據(jù)恢復(fù)的圖文代碼案例,有需要的朋友可以參考下

一、使用場景

  • MySQL數(shù)據(jù)庫每日零點(diǎn)自動(dòng)全備

  • 某天上午9點(diǎn),張三不小心drop了一個(gè)數(shù)據(jù)庫

  • 我們需要通過全備的數(shù)據(jù)文件,以及增量的binlog文件進(jìn)行數(shù)據(jù)恢復(fù)

二、主要思想與原理

  • 利用全備的sql文件中記錄的CHANGE MASTER語句,binlog文件及其位置點(diǎn)信息,找出binlog文件增量的部分

  • 用mysqlbinlog命令將上述的binlog文件導(dǎo)出為sql文件,并剔除其中的drop語句

  • 通過全備文件和增量binlog文件的導(dǎo)出sql文件,就可以恢復(fù)到完整的數(shù)據(jù)

三、過程示意圖

MySQL之—數(shù)據(jù)庫增量數(shù)據(jù)恢復(fù)的圖文代碼案例

四、操作過程

1、模擬數(shù)據(jù)

CREATE?TABLE?`student`?(  ??`id`?int(11)?NOT?NULL?AUTO_INCREMENT,  ??`name`?char(20)?NOT?NULL,  ??`age`?tinyint(2)?NOT?NULL?DEFAULT?'0',  ??PRIMARY?KEY?(`id`),  ??KEY?`index_name`?(`name`)  )?ENGINE=InnoDB?AUTO_INCREMENT=8?DEFAULT?CHARSET=utf8?    mysql>?insert?student?values(1,'zhangsan',20);?  mysql>?insert?student?values(2,'lisi',21);?  mysql>?insert?student?values(3,'wangwu',22);

2、全備命令

#?mysqldump?-uroot?-p?-B?-F?-R?-x?--master-data=2?test|gzip?>/server/backup/test_$(date?+%F).sql.gz    參數(shù)說明:  -B?指定數(shù)據(jù)庫  -F?刷新日志  -R?備份存儲(chǔ)過程等  -x?鎖表  --master-data?在備份語句里添加CHANGE?MASTER語句以及binlog文件及位置點(diǎn)信息

3、繼續(xù)插入數(shù)據(jù)并刪庫

mysql>?insert?student?values(6,'xiaoming',20);  ?  mysql>?insert?student?values(6,'xiaohong',20);?    此時(shí)誤操作,刪除了test數(shù)據(jù)庫  mysql>?drop?database?test;

此時(shí),全備之后到誤操作時(shí)刻之間,用戶寫入的數(shù)據(jù)在binlog中,需要恢復(fù)出來

4.查看全備之后新增的binlog文件

#?cd?/server/backup/  #?ls  test_2017-03-04.sql.gz  #?gzip?-d?test_2017-03-04.sql.gz?  #?grep?CHANGE?test_2017-03-04.sql?  --?CHANGE?MASTER?TO?MASTER_LOG_FILE='mysql-bin.000003',?MASTER_LOG_POS=107;

這是全備時(shí)刻的binlog文件位置,即mysql-bin.000003的107行,因此在該文件之前的binlog文件中的數(shù)據(jù)都已經(jīng)包含在這個(gè)全備的sql文件中了

5. 移動(dòng)binlog文件,并讀取sql,剔除其中的drop語句

#?cp?/data/3306/mysql-bin.000003?/server/backup/  #?mysqlbinlog?-d?test?mysql-bin.000003?>003bin.sql  #?用vim編輯文件,剔除drop語句

在恢復(fù)全備數(shù)據(jù)之前必須將該binlog文件移出,否則恢復(fù)過程中,會(huì)繼續(xù)寫入語句到binlog,最終導(dǎo)致增量恢復(fù)數(shù)據(jù)部分變得比較混亂

6. 恢復(fù)數(shù)據(jù)

#?mysql?-uroot?-p?<test_2017-03-04.sql>#?mysql?-uroot?-p?-e?"select?*?from?test.student;"  +----+----------+-----+  |?id?|?name?????|?age?|  +----+----------+-----+  |??1?|?zhangsan?|??20?|  |??2?|?lisi?????|??20?|  |??3?|?wangwu???|??20?|  |??4?|?xiaoming?|??20?|?  |??5?|?xiaohong?|??20?|  +----+----------+-----+  完成</test_2017-03-04.sql>

五、總結(jié)

  • 適合人為SQL語句造成的誤操作或者沒有主從復(fù)制等的熱備情況宕機(jī)時(shí)的修復(fù)

  • 恢復(fù)條件要全備和增量的所有數(shù)據(jù)

  • 恢復(fù)時(shí)建議對外停止更新,即禁止更新數(shù)據(jù)庫

  • 先恢復(fù)全量,然后把全備時(shí)刻點(diǎn)以后的增量日志,按順序恢復(fù)成SQL文件,然后把文件中有問題的SQL語句刪除(也可通過時(shí)間和位置點(diǎn)),再恢復(fù)到數(shù)據(jù)庫

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享