今天,我在公司的測(cè)試環(huán)境上遇到了一個(gè)非常麻煩的問(wèn)題,發(fā)現(xiàn)我的MySQL數(shù)據(jù)庫(kù)中的一個(gè)關(guān)鍵表被意外刪除了。
在這個(gè)表中存儲(chǔ)了我的公司業(yè)務(wù)的重要數(shù)據(jù),如果沒(méi)有這些數(shù)據(jù),我們將無(wú)法進(jìn)行正常的業(yè)務(wù)流程,嚴(yán)重影響公司的經(jīng)營(yíng)效益。
首先,我檢查了一下數(shù)據(jù)庫(kù)的備份情況,發(fā)現(xiàn)備份文件是有的,但是由于最近一次備份是在昨天,所以我需要對(duì)這個(gè)被刪除的表進(jìn)行恢復(fù)。
# 查看備份文件 ls /var/backups/ # 進(jìn)入備份文件目錄 cd /var/backups/ # 還原數(shù)據(jù)表結(jié)構(gòu) mysql -u root -p dbname< dbname.sql # 還原數(shù)據(jù) mysql -u root -p dbname< dbname.table.sql
經(jīng)過(guò)一段時(shí)間的等待,數(shù)據(jù)表結(jié)構(gòu)和數(shù)據(jù)成功被還原了。我對(duì)數(shù)據(jù)庫(kù)進(jìn)行了徹底的檢查,發(fā)現(xiàn)一些之前被刪掉的數(shù)據(jù)并沒(méi)有被恢復(fù),所以我需要進(jìn)行手動(dòng)恢復(fù)數(shù)據(jù)。
此時(shí),我特別感謝MySQL提供的binlog日志功能,它記錄了MySQL服務(wù)器上執(zhí)行的所有數(shù)據(jù)修改操作,包括增、刪、改等操作。通過(guò)binlog日志,我可以回放操作并找回之前被刪除的數(shù)據(jù)。
# 在備份文件日志中查找刪除記錄 mysqlbinlog --database=dbname --start-position=107 dbname-bin.0000xx | grep "delete from tablename" # 將刪除記錄恢復(fù)回表中 mysqlbinlog --database=dbname --start-position=107 dbname-bin.0000xx | mysql -u root -p dbname
最后,我通過(guò)以上的恢復(fù)操作成功找回了丟失的數(shù)據(jù),業(yè)務(wù)又可以正常進(jìn)行了。但是在此之后,我對(duì)數(shù)據(jù)庫(kù)的備份和安全性再次進(jìn)行了檢查和加強(qiáng),以避免類似的事情再次發(fā)生。