背景

生产库有三张表被开发清空,开发说是10点38清空的。三张表如下:

platform_goods_info

platform_goods_spec_info

platform_goods_image_info

需求:现在复盘先确认以下两个问题:

  • 数据库在还原时是否有快捷的手段(比如只还原以上三张表的数据)

  • 确认10点38的还原时间点是否正确

一、还原全量备份数据库

1.1还原基础库
[root@abc mnt]# gzip -d os20210306054301.sql.gz
[root@abc mnt]# du -sh os20210306054301.sql         #库有5G还原起来比较费时
5.2G    os20210306054301.sql
[root@abc mnt]# mysql -uroot -p123456 <os20210306054301.sql    #官方也没有办法去分离备份表,除非预先做分离

#5G数据全量还原了18分钟,如果数据超过100G的话时间可能会延长至1小时

二、处理基础数据

参考文档:https://dev.mysql.com/doc/refman/5.7/en/point-in-time-recovery.html

#备注:因为我这里知道有清空三张表,同时又知道具体清空的时间,所以比较好找位置点。基础库还原之后将3张表导出备份。

2.1实例开启远程连接

#可选操作
[root@abc tmp]# systemctl restart mysqld.service
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'root'@'%';
flush privileges;

2.2工具导出

[]

2.3本地备份

#可选操作,任选一种模式将基础表导出
[root@abc tmp]# mysqldump -uroot -p123456 os platform_goods_info > platform_goods_info.sql
[root@abc tmp]# mysqldump -uroot -p123456 os platform_goods_spec_info > platform_goods_spec_info.sql
[root@abc tmp]# mysqldump -uroot -p123456 os platform_goods_image_info > platform_goods_image_info.sql

#检查
[root@abc tmp]# du -sh ./*.sql
13M ./platform_goods_image_info.sql
8.9M    ./platform_goods_info.sql
13M ./platform_goods_spec_info.sql
[root@abc tmp]# tail -200 ./platform_goods_spec_info.sql

三、增量还原

3.1拆分binlog
[root@abc mnt]# mysqlbinlog -vv --base64-output=decode-rows --start-datetime="2021-03-06 10:37:00" --stop-datetime="2021-03-06 10:38:59" mysql-bin.004226 >/tmp/check.sql

3.2查看删除信息

[root@abc mnt]# egrep -n "platform_goods_info|platform_goods_spec_info|platform_goods_image_info" /tmp/check.sql |more

[]

#备注:可以看到行3809有删除操作

3.3分析位置点
[root@abc mnt]# sed -n '3800,3823p' /tmp/check.sql

[]

#vi确认,大文件避免vim操作
[root@abc mnt]# vim /tmp/check.sql 

[]

3.3选择位置点
[root@abc mnt]# mysqlbinlog -vv --base64-output=decode-rows --stop-position="48778781" mysql-bin.004226 >/add.sql
3.4还原
[root@abc mnt]# mysql -uroot -p123456</add.sql
3.5查看数据
[root@abc mnt]# mysql -uroot -p123456 -e 'select count(*) from os.platform_goods_info'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 29111 |
+----------+

[root@abc mnt]# mysql -uroot -p123456 -e 'select count(*) from os.platform_goods_spec_info'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 31566 |
+----------+

[root@abc mnt]# mysql -uroot -p123456 -e 'select count(*) from os.platform_goods_image_info'
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| count(*) |
+----------+
| 46323 |
+----------+

#数据表没有被删除证明增量位置相对正确,实际删除时间应该是10点36分
四、分析
  • 这里有个细节,就是一开始我就知道我的binlog日志是哪些,因为我在全量备份的时候使用了参数–flush-logs,每次备份完毕后会在mysql-bin.004225的binlog日志基础上自增1
    [root@abc mnt]# more os20210306054301.sql 
    ...
    -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.004225', MASTER_LOG_POS=154;
    
  • 每次增量数据确实很难百分百确认数据完全还原成功,所以在人为删除表之后需要将业务停止。防止新增数据。

  • mysqldump备份的数据还原起来还是很慢的,数据量大的话可以尝试innobackupex方式进行备份还原

最后修改日期: 2023年12月12日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。