误删除数据库操作
模拟操作
数据库每天进行一次数据库备份,binglog每天生成一个新文件,三天钱创建了一个数据库,今天删除了其中的一张表,现要求恢复数据
第一步:
show binary logs; #获取binlog文件列表
show master status; #查看当前正在写入的binlog文件 记录当前删除之后的pos点
flush logs; #刷新 binlog 重新生成binlog文件
第二步:
将执行删除操作的数据库备份 以备不时之需
第三步:
将昨天的备份恢复到现存数据库
第四部查看当天的binlog
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000008
#其中包含今天新增数据和删除数据的命令
/*!80011 SET @@session.default_collation_for_utf8mb4=255*//*!*/;
BEGIN
/*!*/;
# at 309
#211011 18:56:33 server id 1 end_log_pos 369 CRC32 0xd6ad0ce6 Table_map: `zbb`.`t` mapped to number 120
# at 369
#211011 18:56:33 server id 1 end_log_pos 429 CRC32 0x7a99aafc Write_rows: table id 120 flags: STMT_END_F
BINLOG '
/*!*/;
# at 613
#211011 18:56:46 server id 1 end_log_pos 673 CRC32 0x6da63852 Table_map: `zbb`.`t` mapped to number 120
# at 673
#211011 18:56:46 server id 1 end_log_pos 733 CRC32 0x5e9ab277 Delete_rows: table id 120 flags: STMT_END_F
mysqlbinlog --no-defaults --stop-datetime="2021-10-11 18:56:39" /var/lib/mysql/mysql-bin.000009 -d zbb|mysql -uroot -p123456 -f
企业实战
昨天删除了2张表 现要求恢复到未删除的状态
恢复昨天的数据
从昨天的备份sql中取出那两张表结构和数据
注mysqldump导出的都是insert语句
grep -i 'INSERT INTO `www`' all109.sql >> wcmmle.sql
mysqldump -uroot -p"123" -d zbb www >www.sql
#-d 是导出表结构
#-t 是导出表数据
导出binglog增量数据
mysqlbinlog --no-defaults --start-datetime="2021-11-09 00:10:00" mysql-bin.000361 |egrep "表1|表2" >2.sql &
mysqlbinlog --no-defaults mysql-bin.000362 |egrep "表1|表2" >>2.sql &
mysqlbinlog --no-defaults mysql-bin.000363 |egrep "表1|表2" >>2.sql &
mysqlbinlog --no-defaults mysql-bin.000364 |egrep "表1|表2" >>2.sql &
mysqlbinlog --no-defaults --stop-datetime="2021-11-09 22:00:00" mysql-bin.000365 |egrep "表1|表2" >>2.sql &
sed -i "s#\#Q> ##g" 2.sql
重定义文件格式
# -*- coding: utf-8 -*-
with open("./2.sql") as f:
with open("./3.sql", "w") as f2:
for i in f:
f2.write(str(i.strip()) + ";" + "\n")
在测试库中操作
恢复表结构
恢复数据
create zbb;
mysql -uroot -p"123" zbb </www.sql
mysql -uroot -p"123" zbb <wcmmle.sql
恢复增量数据
mysql -uroot -p"123" zbb <3.sql