本篇介紹了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ù)
三、過程示意圖
四、操作過程
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ù)庫