mysqldump+binlog完整恢复被删除的表/数据库

使用mysqldump对全库进行完全备份
mysqldump -h127.0.0.1 -uroot -pJimstars -P3306 --single-transaction --master-data=2 --events --routines --all-databases > /data/backup/20200820-1352-all_bak.sql


创建测试库和测试表
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "create database test_drop_db;"
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "create table test_drop_db.test_drop_tab_100(id int,name varchar(200)); "
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "insert into test_drop_db.test_drop_tab_100 values (10000,'full_bak-0');"
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "insert into test_drop_db.test_drop_tab_100 values (10001,'full_bak-1');"
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "insert into test_drop_db.test_drop_tab_100 values (10002,'full_bak-2');"


多切换几次 binlog日志
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "flush logs;"


mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "insert into test_drop_db.test_drop_tab_100 values (10003,'full_bak-3');"
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "insert into test_drop_db.test_drop_tab_100 values (10004,'full_bak-4');"


假设在这里误删除了表
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "drop table test_drop_db.test_drop_tab_100;"


多切换几次 binlog日志
mysql -h127.0.0.1 -uroot -pJimstars -P3306 -e "flush logs;"


恢复备份的到测试库 3308,3308是新搭建的,没有任何数据,仅做恢复用途
mysql -h127.0.0.1 -uroot -pJimstars -P3308 <   /data/backup/20200820-1352-all_bak.sql


确认mysqldump备份到的最终位置
head -n 40  /data/backup/20200820-1352-all_bak.sql


找到如下信息:
CHANGE MASTER TO MASTER_LOG_FILE='VM_0_15_centos-bin.000012', MASTER_LOG_POS=26808;
 

查找删除恢复时的所在binlog日志
 
mysqlbinlog -v  VM_0_15_centos-bin.000001 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000002 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000003 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000004 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000005 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000006 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000007 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000008 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000009 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000010 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000011 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000012 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000013 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000014 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000015 | grep -i "drop table" | grep -i "test_drop_tab_100"
mysqlbinlog -v  VM_0_15_centos-bin.000016 | grep -i "drop table" | grep -i "test_drop_tab_100"


通过多次查找,发现所在的binlog日志为:VM_0_15_centos-bin.000014
mysqlbinlog -v  VM_0_15_centos-bin.000014 | grep -i "drop table" | grep -i "test_drop_tab_100"
DROP TABLE `test_drop_db`.`test_drop_tab_100` /* generated by server */


把 binlog 为14的保存到另外的地方
mysqlbinlog -v VM_0_15_centos-bin.000014 > /tmp/VM_0_15_centos-bin.000014.log


查找对应的pos点
grep -C 30 -i "drop table" /tmp/VM_0_15_centos-bin.000014.log
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 506
#200820 13:54:37 server id 2003306  end_log_pos 574 CRC32 0xcc80d2be     Query    thread_id=1163    exec_time=0    error_code=0
SET TIMESTAMP=1597902877/*!*/;
BEGIN
/*!*/;
# at 574
#200820 13:54:37 server id 2003306  end_log_pos 645 CRC32 0x81dc364b     Table_map: `test_drop_db`.`test_drop_tab_100` mapped to number 1005
# at 645
#200820 13:54:37 server id 2003306  end_log_pos 697 CRC32 0x4e6ac31f     Write_rows: table id 1005 flags: STMT_END_F

BINLOG '
HRA+XxNqkR4ARwAAAIUCAAAAAO0DAAAAAAEADHRlc3RfZHJvcF9kYgARdGVzdF9kcm9wX3RhYl8x
MDAAAgMPAiADA0s23IE=
HRA+Xx5qkR4ANAAAALkCAAAAAO0DAAAAAAEAAgAC//wUJwAACgBmdWxsX2Jhay00H8NqTg==
'/*!*/;
### INSERT INTO `test_drop_db`.`test_drop_tab_100`
### SET
###   @1=10004
###   @2='full_bak-4'
# at 697
#200820 13:54:37 server id 2003306  end_log_pos 728 CRC32 0x5e8414ed     Xid = 6052
COMMIT/*!*/;
# at 728
#200820 13:54:41 server id 2003306  end_log_pos 793 CRC32 0x051dd8b3     Anonymous_GTID    last_committed=2    sequence_number=3    rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 793
#200820 13:54:41 server id 2003306  end_log_pos 942 CRC32 0x98257be2     Query    thread_id=1164    exec_time=0    error_code=0
SET TIMESTAMP=1597902881/*!*/;
DROP TABLE `test_drop_db`.`test_drop_tab_100` /* generated by server */
/*!*/;
# at 942
#200820 13:54:43 server id 2003306  end_log_pos 998 CRC32 0xe63ee3e7     Rotate to VM_0_15_centos-bin.000015  pos: 4
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;



从上述日志,可以确认恢复的结束binlog为 VM_0_15_centos-bin.000014  pos点为 793
而开始恢复的binlog为  VM_0_15_centos-bin.000012   pos点为 26808


最开始需要恢复开始binlog日志文件
mysqlbinlog --start-position=26808  /data/mysql/VM_0_15_centos-bin.000012 | mysql -h127.0.0.1 -uroot -pJimstars -P3308
 

接着需要恢复的binlog日志文件
mysqlbinlog   /data/mysql/VM_0_15_centos-bin.000013     | mysql -h127.0.0.1 -uroot -pJimstars -P3308
 

如果中间需要恢复的binlog日志文件很多,也可以这样写:
mysqlbinlog   /data/mysql/VM_0_15_centos-bin.000013  /data/mysql/VM_0_15_centos-bin.000014   /data/mysql/VM_0_15_centos-bin.000015      | mysql -h127.0.0.1 -uroot -pJimstars -P3308
 
 
最后需要恢复的binlog日志文件
mysqlbinlog --stop-position=793  /data/mysql/VM_0_15_centos-bin.000014 | mysql -h127.0.0.1 -uroot -pJimstars -P3308


查看3308数据库,确定所删除的表是否已经恢复。
说明:如果删除的是数据库,步骤和上面的步骤完全一样,此处不再赘述。
原文地址:https://www.cnblogs.com/l10n/p/13534808.html