?
本文出處:?
?
?
本文僅模擬使用mysqldump和log-bin二進(jìn)制日志進(jìn)行簡(jiǎn)單測(cè)試,僅作為個(gè)人學(xué)習(xí)筆記,可能離實(shí)際應(yīng)用還有很大差距,僅參考。
?
開(kāi)啟mysql的bin-log二進(jìn)制日志
模擬還原是需要mysqldump出來(lái)的文件和log-bin,因此需要開(kāi)始log-bin二進(jìn)制日志。
mysql5.7.18在開(kāi)啟二進(jìn)制日志的時(shí)候除了要設(shè)置log-bin的位置之外,另外需要設(shè)置一個(gè)server-id,MySQL之前的版本應(yīng)該不需要這個(gè)設(shè)置。
吐槽一下開(kāi)源軟件,基本上每個(gè)版本都有一些跟之前版本不一樣的地方,網(wǎng)上查資料往往不好使,不同版本的情況下不少東西都是不一樣的,這一點(diǎn)需要注意。
重啟之后,查詢log_bin相關(guān)的變量
?
mysqldump備份(導(dǎo)出)數(shù)據(jù)的基本使用
mysqldump命令參數(shù)相當(dāng)多,簡(jiǎn)單記錄一下常用的命令,以及利用mysqldump備份(嚴(yán)格說(shuō)是導(dǎo)出數(shù)據(jù))和二進(jìn)制日志log-bin進(jìn)行數(shù)據(jù)庫(kù)還原操作。
— 備份testdb整個(gè)數(shù)據(jù)庫(kù),-l 表示給所有表上加一個(gè)讀鎖,-F (F要大寫,小寫不報(bào)錯(cuò)單頁(yè)無(wú)效)表示滾動(dòng)生成一個(gè)新的日志文件
mysqldump -u root -p -l -F -h localhost testdb > usr/local/mysqlbak/test20170607_data.sql
備份出來(lái)的文件就是create table和insert into table的腳本
— 備份testdb數(shù)據(jù)庫(kù)中的test_table1 test_table2兩張表,加上–no-create-info就意味這個(gè)備份出來(lái)的文件不帶create table的腳本,僅僅是insert into table的信息
mysqldump -uroot -p -h localhost testdb test_table1 test_table2 –no-create-info> usr/local/mysqlbak/test20170606_1.sql
— 備份testdb數(shù)據(jù)庫(kù)中的test2表中的一部分?jǐn)?shù)據(jù),也就是備份test_table1表中符合idmysqldump -uroot -p -h localhost testdb test_table1?–where “id > ?usr/local/mysqlbak/test20170606_2.sql
?
更多mysqldump的參數(shù),參考:
另外,mysql log-bin的更換策略:
使用索引來(lái)循環(huán)文件,在以下條件將循環(huán)至下一個(gè)索引
1。服務(wù)器重啟
2。服務(wù)器被更新
3。日志到達(dá)了最大日志長(zhǎng)度 max_binlog_size
4。日志被刷新 mysql> flush logs;
?
利用mysqldump備份的文件和log-bin二進(jìn)制日志進(jìn)行還原
首先在以表中有數(shù)據(jù)的情況下進(jìn)行備份
執(zhí)行 mysqldump -u root -p -l -F -h localhost testdb –master-data=2 > usr/local/mysqlbak/test20170607_data.sql
這里加了一個(gè)–master-data=2的選項(xiàng),目的是在備份文件中備注出來(lái)當(dāng)前的log_bin的文件,
至于為什么要加這個(gè)命令,很多博客上都記錄的是用mysqldump備份出來(lái)一個(gè)文件之后,修改數(shù)據(jù),然后模擬數(shù)據(jù)庫(kù)誤刪或者宕機(jī)還原怎么的,然后在使用mysqldump出來(lái)的文件還原之后,接著使用log-bin還原
雖然都是測(cè)試模擬,但是有一個(gè)明顯的問(wèn)題啊,怎么知道m(xù)ysqldump之后日志是否發(fā)生了滾動(dòng),滾動(dòng)了幾次?
如果日志不滾動(dòng)還要,按照時(shí)間點(diǎn)或者位置還原log-bin文件,如果滾動(dòng)了,怎么知道滾動(dòng)了幾個(gè)日志文件呢
就需要在mysqldump執(zhí)行的時(shí)候,記錄下來(lái)刷新日志之后的新生成的log-bin文件,在使用日志還原的時(shí)候,才能判斷使用哪些日志進(jìn)行還原。
有了–master-data=2的選項(xiàng),才知道m(xù)ysqldump備份時(shí)候的log_file位置
然后繼續(xù)往表中插入10條數(shù)據(jù)
然后模擬在某個(gè)時(shí)間點(diǎn)誤刪數(shù)據(jù)的情況,truncate測(cè)試表,測(cè)試表此時(shí)為空
首先利用mysqldump出來(lái)的文件還原數(shù)據(jù)庫(kù),mysqldump出來(lái)的文件備份是100行時(shí)候的數(shù)據(jù)
因?yàn)閭浞菸募袀浞莸臅r(shí)候的數(shù)據(jù)是100行,這里還原之后是100行,沒(méi)有問(wèn)題。
然后接著利用log-bin按照時(shí)間點(diǎn)還原,上面說(shuō)了,mysqldump出來(lái)的文件記錄了日志刷新之后的log-bin的文件名稱,
那么就可以判斷日志是否發(fā)生了滾動(dòng),如果沒(méi)有滾動(dòng),就按照下圖最新的log-bin進(jìn)行按照時(shí)間點(diǎn)進(jìn)行還原。
進(jìn)行一次mysqldump備份還原
mysql -u root -p testdb 進(jìn)然后再行一次基于bin-log的時(shí)間點(diǎn)還原
mysqlbinlog –stop-datetime=”2017-6-7 21:45:00″ /var/lib/mysql/mysql-bin.000022 | mysql -u root -p testdb
然后數(shù)據(jù)就回來(lái)了。
?
?
當(dāng)然這里僅僅是模擬操作,當(dāng)然還有許多細(xì)節(jié)尚未確定,如果發(fā)生了日志滾動(dòng),要做基于時(shí)間點(diǎn)的還原,還要追究到究竟是基于哪個(gè)日志文件的時(shí)間點(diǎn)。
?
總結(jié):
本文僅僅以一個(gè)簡(jiǎn)單的示例來(lái)模式數(shù)據(jù)庫(kù)的還原操作,
mysqldump備份模式比較簡(jiǎn)單粗暴,僅僅是將數(shù)據(jù)導(dǎo)出為insert腳本,在還原較大數(shù)據(jù)時(shí)候會(huì)有性能問(wèn)題,可能mysqldump就不適合了,就需要更為高效的xtrabackup來(lái)做備份還原了。
?
?
?