前两天一个朋友半夜给我打电话,说他们公司测试库被误操作,drop掉了某个重要的数据库,整个团队都慌了。说实话,这种事在 DBA 圈子里并不新鲜,几乎每隔一段时间就会有人踩坑。MySQL 恢复某个数据库听起来像技术活,但说白了,就是看你有没有提前做好备份,以及是否知道怎么把备份变成可用的数据。很多人以为只要数据库还能跑就没事,真正出问题时才会发现手里有没有真家伙。

先说最基础的情况:如果你有 mysqldump 或 xtrabackup 的完整备份,恢复某个数据库其实是三步走。假设备份文件是 ,里面包含了所有库的内容,但你只想恢复名为 “testdb” 的库,最直接的办法是先用 或 把对应库的内容过滤出来。比如可以使用testdb/p' backup.sql > testdb.sqlxtrabackup --copy-backmysqlbinlog --database=testdb--stop-datetime--stop-positiongtidexecutedSET @@SESSION.SQLLOGBIN=0--skip-gtidsmysqlbinlog --database=testdbFLUSH TABLES WITH READ LOCKmysqldump --databases testdbmysql testdb < testdb.sqlexpirelogs_dayspt-table-syncpt-archiver` 等工具,在部分恢复场景下也很有帮助。归根结底,恢复某个数据库并不是技术有多牛,而是平时有没有做好准备。备份是保命符,binlog是后悔药,这两样必须至少拥有一样,否则半夜被电话吵醒时只能对着屏幕干瞪眼。


