说明:
6月11号下午,研发不小心执行update语句,将一个表数据全部更新,表有15万条数据,需尽快恢复数据。
恢复过程:
1,使用腾讯云的极速恢复到时间点
2,使用binlog2sql工具
使用1,数据库是早上0点备份,要回放0点到现在的全部sql,执行会比较慢
使用2,binlog2sql,生成15万条update回滚语句,执行一直很慢
数据量小用binlog2sql,很快,一旦10万以上,就太慢,有没有其他更快的恢复数据方法,在网上了一下,MyFlash恢复大量数据比较快,
其恢复数据原理好binlog2sql,有区别,能快速恢复数据。
MyFlash使用:
1,安装MyFlash
2,根据时间查出执行 SQL的gtid或者是start-pos和end-pos
测试:update student_ocean set update_time=now(),更新全表数据,共176654条
mysqlbinlog --read-from-remote-server --base64-output=DECODE-ROW -vvv --host= 10.0 . 0.1 --port= 3306 --user=xxx --password=xxx --start-datetime= "2021-06-17 10:12:09" --stop-datetime= "2021-06-17 10:26:16" mysql-bin. 000648 |grep student_ocean -A 120 -B 10 >/data/ 61 .txt
|
到对应gtid,start-pos和end-pos,这里-A 120,就是要把后面的信息打印出来,如end-pos的信息
通过 head -n 20 /data/61.txt 和 tail -n 160 /data/61.txt ,找到对应的start-pos和end-pos
mysqlbinlog --read-from-remote-server --base64-output=DECODE-ROW -vvv --host= --port= 3306 --user=xxx --password=xxx --start-position= 233673651 --stop-position= 275603033 mysql-bin. 014292 >/data1/binlog/ 621 .txt
|
这样621.txt,就是完整的更新信息
grep 'student_ocean' 60.txt |wc -l ,计数student_ocean个数:176656,多2个表名:因为,binlog包含下面信息,看信息是完整的:
# update student_ocean set update_time=now()
# at 233673808
#210625 15:26:36 server id 219103 end_log_pos 233673919 CRC32 0x269a4e74 Table_map: `db_support_test`.`student_ocean` mapped to number 99901648
确认后,执行:
./flashback --databaseNames=db_support_test --tableNames=student_ocean --start-position= 233673651 --stop-position= 275603033 --sqlTypes= 'update' --binlogFileNames=/data1/binlog/mysql-bin. 014292
|
应用到数据:
mysqlbinlog --skip-gtids binlog_output_base.flashback|mysql -uxxx -pxxx -h
|
这里的xxx用户,需要super权限,因腾讯云上没有开super权限,可以将表同步到自建库里,再自建库里运行改命令