MySQL數據庫遭到進擊改動(應用備份和binlog停止數據恢復)。本站提示廣大學習愛好者:(MySQL數據庫遭到進擊改動(應用備份和binlog停止數據恢復))文章只能為提供參考,不一定能成為您想要的結果。以下是MySQL數據庫遭到進擊改動(應用備份和binlog停止數據恢復)正文
本文重要描寫了MySQL遭到進擊改動數據,應用從庫的備份和主庫的binlog停止不完整恢復。
迎接轉載,請注明作者、出處。
作者:張正
QQ:176036317
若有疑問,迎接接洽。
1、發明成績
明天是2014-09-26,開辟年夜清晨就說昨晚數據庫遭到了進擊。數據庫中某文章表的文章內容字段遭到改動,全體改成了統一篇文章。
經由過程檢查日制 發明 數據是在 2014-09-25 21:53:57 遭到改動。
一切的內容全體被改成了以下:
subject: 桂林陽朔自助游
content:
一向都是自助游,從不愛好?團。去之前都是在網上做足了作業,真的是很感激那些寫紀行寫攻略的同伙。所以,如今也想把本身的領會和經歷寫出來,和年夜家分享,願望對後來的同伙有贊助。
此處省略n字。。。。。
2、處理辦法
這個庫我們是天天清晨備份,保存30天的備份。主庫的binlog保存時光為7天。
是以很輕易想到的辦法是將從庫2014-09-25清晨的備份拿出來恢復,然後經由過程主庫的binlog經由過程時光段來挑選出清晨至2014-09-25 21:53:56的一切更改,以後的數據,經營業確認,可以捨棄失落。或許前面再經由過程其他辦法漸漸將這部門數據找出來。然則燃眉之急,是立馬恢單數據庫。
3、找備份實時間點
在備份的從庫上檢討備份:
crontab -l
#0 3 * * * /data/opdir/mysqlbak/backup_mysqldump.sh 6084 >> /data/opdir/mysqlbak/6084/mysql-bakup.log 2>&1
發明備份義務讓正文了
檢查備份文件:
[root@localhost 6084]# ll
total 128
drwxr-xr-x 2 root root 4096 Aug 25 03:13 20140825
drwxr-xr-x 2 root root 4096 Aug 26 03:13 20140826
drwxr-xr-x 2 root root 4096 Aug 27 03:13 20140827
drwxr-xr-x 2 root root 4096 Aug 28 03:13 20140828
drwxr-xr-x 2 root root 4096 Aug 29 03:13 20140829
drwxr-xr-x 2 root root 4096 Aug 30 03:13 20140830
drwxr-xr-x 2 root root 4096 Aug 31 03:13 20140831
drwxr-xr-x 2 root root 4096 Sep 1 03:13 20140901
drwxr-xr-x 2 root root 4096 Sep 2 03:13 20140902
drwxr-xr-x 2 root root 4096 Sep 3 03:13 20140903
drwxr-xr-x 2 root root 4096 Sep 4 03:13 20140904
drwxr-xr-x 2 root root 4096 Sep 5 03:13 20140905
drwxr-xr-x 2 root root 4096 Sep 6 03:13 20140906
drwxr-xr-x 2 root root 4096 Sep 7 03:13 20140907
drwxr-xr-x 2 root root 4096 Sep 8 03:13 20140908
drwxr-xr-x 2 root root 4096 Sep 9 03:13 20140909
drwxr-xr-x 2 root root 4096 Sep 10 03:13 20140910
drwxr-xr-x 2 root root 4096 Sep 11 03:13 20140911
drwxr-xr-x 2 root root 4096 Sep 12 03:13 20140912
drwxr-xr-x 2 root root 4096 Sep 13 03:13 20140913
drwxr-xr-x 2 root root 4096 Sep 14 03:13 20140914
drwxr-xr-x 2 root root 4096 Sep 15 03:13 20140915
drwxr-xr-x 2 root root 4096 Sep 16 03:13 20140916
drwxr-xr-x 2 root root 4096 Sep 17 03:13 20140917
drwxr-xr-x 2 root root 4096 Sep 18 03:14 20140918
drwxr-xr-x 2 root root 4096 Sep 19 03:14 20140919
drwxr-xr-x 2 root root 4096 Sep 20 03:13 20140920
drwxr-xr-x 2 root root 4096 Sep 21 03:13 20140921
drwxr-xr-x 2 root root 4096 Sep 22 03:14 20140922
drwxr-xr-x 2 root root 4096 Sep 23 18:33 20140923
-rw-r--r-- 1 root root 5475 Sep 23 18:33 mysql-bakup.log
備份只到20140923日,下晝18:33分。
備份日記最初一段截取: tail -n 5 mysql-bakup.log
deleting backup of 30 days ago -- 20140824
2014-09-23 18:19:12 begin backup ...
20140824 deleted OK
2014-09-23 18:33:43 end backup ...
由於這些表是在從庫備份的,並且表都是MyiSAM的表。檢查備份劇本,是先stop slave以後,才開端備份,是以從備份劇本輸入的日記中找到備份開端的時光是:
2014-09-23 18:19:12
經由過程:drwxr-xr-x 2 root root 4096 Sep 23 18:33 20140923
可看到停止時光是:2014-09-23 18:33:00
如今斟酌究竟是以備份開端的時光:2014-09-23 18:19:12 為start-datetime照樣以2014-09-23 18:33:00 為start-datetime。
後面 提到備份劇本是從庫停止備份的,是在2014-09-23 18:19:12開端的,在這個時辰備份開端,履行了stop slave;是以全部備份的狀況反應的是從庫2014-09-23 18:19:12 這個時光的狀況。並且經由過程監控可以看到在這個時光點,從庫的延遲為0,是以可以以為這個備份就是 主庫在這個時光的備份。
NOTES:
(有人能夠會由於從庫上有binlog,從庫也會接收主庫的binlog之類的機制而形成混雜。這裡要聯合我們詳細的備份方法和恢復方法來看,以選出准確的時光點。)
後面提到經由過程日記查到遭到改動的時光為:2014-09-25 21:53:57,是以可以將2014-09-25 21:53:56作為stop-datetime
是以binlog敕令應當是如許:
mysqlbinlog --database=[db_name] --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56'
[binlog_name] > binlog_name0000x.sql
4、詳細的恢復操作
清晰了這些,詳細的操作就簡略了:
1.從備份機拷貝備份:
scp <備份機IP>:/data/mysqlbak/20140923/20140923.db_name.gz <恢復測試機IP>:/data/opdir/20140926
2.恢復測試機 解壓:
gunzip 20140923.db_name.gz
3.恢復測試機導入(測試恢復庫中之前沒有db_name這個庫):
mysql -uroot -pxxxxxx -S /tmp/mysql.sock < 20140923.db_name
4.將主庫的binlog拷貝到恢復測試機:
檢查主庫binlog
-rw-rw---- 1 mysql mysql 87669492 Sep 23 00:00 mysql-bin.000469
-rw-rw---- 1 mysql mysql 268436559 Sep 23 04:20 mysql-bin.000470
-rw-rw---- 1 mysql mysql 268435558 Sep 23 17:32 mysql-bin.000471
-rw-rw---- 1 mysql mysql 37425262 Sep 24 00:00 mysql-bin.000472
-rw-rw---- 1 mysql mysql 137389819 Sep 25 00:00 mysql-bin.000473
-rw-rw---- 1 mysql mysql 147386521 Sep 26 00:00 mysql-bin.000474
我們須要的binlog時光段為:2014-09-23 18:28:00 至 2014-09-25 21:53:56
是以只須要:
-rw-rw---- 1 mysql mysql 37425262 Sep 24 00:00 mysql-bin.000472
-rw-rw---- 1 mysql mysql 137389819 Sep 25 00:00 mysql-bin.000473
-rw-rw---- 1 mysql mysql 147386521 Sep 26 00:00 mysql-bin.000474
將這3個binlog copy曩昔:
scp mysql-bin.000472 <恢復測試機IP>:/data/opdir/20140926
scp mysql-bin.000473 <恢復測試機IP>:/data/opdir/20140926
scp mysql-bin.000474 <恢復測試機IP>:/data/opdir/20140926
5.應用mysqlbinlog 生成sql劇本:
mysqlbinlog --database=[db_name] --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56'
mysql-bin.000472 > 472.sql
mysqlbinlog --database=[db_name] --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56'
mysql-bin.000473 > 473.sql
mysqlbinlog --database=[db_name] --start-datetime='2014-09-23 18:19:12' --stop-datetime='2014-09-25 21:53:56'
mysql-bin.000474 > 474sql
6.binlog生成的sql劇本導入:
待20140923.db_name導入到恢復測試庫以後,將mysqlbinlog生成的sql劇本導入到數據庫中:
mysql -uroot -pxxxxxx -S /tmp/mysql.sock db_name < 472.sql
mysql -uroot -pxxxxxx -S /tmp/mysql.sock db_name < 473.sql
mysql -uroot -pxxxxxx -S /tmp/mysql.sock db_name < 474.sql
7.導入完成後檢討數據准確性:
年夜致看一下數據的情形,然後可以經由過程時光字段來看一下情形:
mysql> select max(createtime),max(updatetime) from table_name;
+-----------------+-----------------+
| max(createtime) | max(updatetime) |
+-----------------+-----------------+
| 1411648043 | 1411648043 |
+-----------------+-----------------+
1 row in set (0.00 sec)
時光差不多為 早晨20:27了
這個斷定,作為DBA,檢查部門數據,只能起到幫助感化,詳細的須要 究竟能否OK,須要營業開辟的人來斷定。
經由營業開辟確認後,便可將該數據導出後,再導入到線上主庫中。
8、將該庫導出,並緊縮:
mysqldump -uroot -pxxxxxx -S /tmp/mysql.sock -q db_name table_name > table_name.sql
緊縮:
gzip table_name.sql
scp 到主庫 (復制的時刻,請將收集身分斟酌出來,確認不會占用過量帶寬而影響其他線上營業)
9.恢復測試的數據導入到線上主庫中:
線上主庫操作:
操作之前,最好閃開發把運用營業那段先暫停,不然能夠會影響導入。好比這個表現MyISAM的,運用那裡假如不聽有update出去,就會壅塞數據導入。
a、主庫將原始被改動的表更名:(不要下去就drop,先rename,後續確認沒成績了再斟酌drop,由於許多成績不是一剎時就可以全體反應下去的)
rename table_name to old_table_name;
b、解壓:
gunzip table_name.sql.gz
c、導入新表數據:
mysql -uroot -pxxxxxx -S /tmp/mysql.sock db_name < table_name.sql
前面就須要開辟來進一步驗證數據能否 OK 了。 驗證沒成績後,再啟動運用法式。