備注:公司新來(lái)了一個(gè)妹子,操作失誤,執(zhí)行了 rm -rf / ,完蛋钙姊,整個(gè)服務(wù)器全部GG,通過(guò)ext3grep等軟件只能恢復(fù)到binlog日志埂伦。怎么辦煞额?數(shù)據(jù)庫(kù)每天凌晨全量備份一次,前提是mysqldump執(zhí)行的備份文件是在別的服務(wù)器上沾谜,否則只能將所有的binlog日志回放一遍膊毁,今天來(lái)介紹下如何通過(guò)binlog日志恢復(fù)mysql。
一基跑、我們將最新的mysqldump文件恢復(fù)到新的數(shù)據(jù)量實(shí)例上媚媒,至于命令,我前面的文章有詳細(xì)的解讀涩僻。
二缭召、找到今日凌晨到數(shù)據(jù)庫(kù)刪除時(shí)的binlog日志,通常情況下binlog日志是按照對(duì)應(yīng)的時(shí)間節(jié)點(diǎn)進(jìn)行的切割逆日。
mysql binlog日志截圖
三嵌巷、假如需要將某一個(gè)binlog完全恢復(fù),只需要執(zhí)行以下命令:
mysqlbinlog mysql-bin.000010 | mysql -uroot -p
四室抽、binlog文件處于凌晨備份的時(shí)間節(jié)點(diǎn)(這種情況下搪哪,復(fù)雜一些。)
方法1坪圾、根據(jù)起始和終止時(shí)間進(jìn)行恢復(fù)
mysqlbinlog mysql-bin.000001 --start-datetime='2019-07-12 19:50:36' --stop-datetime='2019-07-13 19:23:40' | mysql -uroot -p
方法2晓折、根據(jù)起始節(jié)點(diǎn)和終止節(jié)點(diǎn)進(jìn)行恢復(fù)
#查看binlog日志的節(jié)點(diǎn)位置情況
show binlog events in 'mysql-bin.000001' \G;
#根據(jù)binlog起始和結(jié)束節(jié)點(diǎn)做恢復(fù)
mysqlbinlog mysql-bin.000001 --start-position=100 --stop-position=200 | mysql -uroot -p
show binlog events in 'mysql-bin.000001' 執(zhí)行之后的效果
五、linux不是太熟悉的同學(xué)看這里(前面文章有介紹過(guò))
#將mysqlbinlog 轉(zhuǎn)為可讀兽泄、可執(zhí)行的sql文件
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 > text.log
六漓概、后記
1、mysqldump備份mysql時(shí)切記需要全路徑病梢,否則備份得到的文件是空的胃珍。
2、reset master
命令不要隨便執(zhí)行蜓陌,它會(huì)將你的mysqlbinlog全部刪除觅彰。
3、mysql 5.6以上版本備份時(shí)會(huì)有個(gè)gtid钮热,備份時(shí)最好關(guān)閉填抬,否則恢復(fù)時(shí)會(huì)有個(gè)error,百度告訴你隧期,你需要reset master飒责,然后你的binlog全都丟失蛀骇,切記切記。
#關(guān)閉gtid的mysqldump備份命令
/usr/bin/mysqldump --set-gtid-purged=off --opt -h$DB_HOST -u$DB_ROOT -p$DB_PASS $DB_PROJECT > /root/mysqlbak/project/${DB_PROJECT}_${data}.sql
4读拆、記得實(shí)戰(zhàn)演練(不要隨便去升級(jí)mysql的版本,你會(huì)發(fā)現(xiàn)很多意想不到的事情等著你鸵闪。)