MySQL误删库之还原实战

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

MySQL误删库之还原实战

1 场景介绍

某个时间点用户用drop database误删除了业务数据库数据(比如fi库),由于没有做物理备份,已知的备份策略为每天凌晨1点的逻辑全备+binlog日志。现需要回滚数据库到误删除之前的状态,并前滚至当前最新时间点。


2 还原恢复方案选择

 根据已知备份策略,此处选择 全库还原+使用binlog增量还原方案,进行数据库恢复。


3 确定恢复所需的备份集及binlog日志文件

a. 根据每天定时任务的备份脚本,已知全量备份集在/备份路径/"`date '+%Y%m%d%H%M%S'`"目录下


b. 进入上述目录,查看最近备份集中metadata文件信息

# strings metadata 

Started dump at: 2023-05-11 01:00:01

SHOW MASTER STATUS:

        Log: mysql_bin_30001.001491

        Pos: 185349301

        GTID:8afb9d79-120c-11ed-9c65-005056a06c35:1-84026942

由上可知,我们应用binlog日志应该从mysql_bin_30001.001491日志文件的185349301位置开始,一直到最新的binlog文件(本例为mysql_bin_30001.001493)。


4 恢复数据库

a. 对当前数据库进行全备,全备脚本参考

# cat dbbackup.sh

DT="`date '+%Y%m%d%H%M%S'`"

echo "$DT : ##### begin backup"

mkdir -p /你的备份路径/$DT

/bin/mydumper -h 127.0.0.1 -u cosmic -p **** -P 3306 -G -R -E -c -t 8 -r 10000 -o /你的备份路径/$DT

[ $? -eq 0 ] && echo "$DT : backup done" || echo "$DT : backup failed"


重命名备份文件

mv /你的备份路径/`date '+%Y%m%d%H%M%S'` /你的备份路径/bak"`date '+%Y%m%d%H%M%S'`"


b. 停止应用


c. 清理业务库

# mysql -ucosmic -p****

mysql> show databases;

mysql> drop database uat_fi;


d. 全库还原

使用最近的全量备份进行恢复

# myloader -ucosmic -p**** -o -d /你的备份路径/bak_20230511010001


e. 增量还原

# mysqlbinlog --start-position=185349301 --skip-gtids=true mysql_bin_30001.001491 > mysql_bin_30001.001491.sql

# mysqlbinlog --start-position=1 ---skip-gtids=true mysql_bin_30001.001492 > mysql_bin_30001.001492.sql

# mysqlbinlog --start-position=1 --skip-gtids=true mysql_bin_30001.001493 > mysql_bin_30001.001493.sql


注释掉删库的命令

sed -i 's/drop database/#drop database/g' mysql_bin*.sql


依次导入sql文件

# mysql -ucosmic -p**** -h127.0.0.1 < mysql_bin_30001.001491.sql01

# mysql -ucosmic -p**** -h127.0.0.1 < mysql_bin_30001.001492.sql01

# mysql -ucosmic -p**** -h127.0.0.1 < mysql_bin_30001.001493.sql01


f. 启动应用,并检查业务数据及功能是否正常。


5 还原注意事项

说明:--skip-gtids=true 参数

是否使用--skip-gtids=true参数,要根据情况来定;

第一种情况:

如果我们是要恢复数据到源数据库或者和源数据库有相同 GTID 信息的实例,那么就要使用该参数。如果不带该参数的话,是无法恢复成功的。因为包含的 GTID 已经在源数据库执行过了,根据 GTID 特性,一个 GTID 信息在一个数据库只能执行一次,所以不会恢复成功。


第二种情况:

如果是恢复到其他实例的数据库并且不包含源实例的 GTID 信息,那么可以不使用该参数,使用或者不使用都可以恢复成功。

本次是要恢复到源数据库,故应该加上--skip-gtids=true参数。

MySQL误删库之还原实战

1 场景介绍某个时间点用户用drop database误删除了业务数据库数据(比如fi库),由于没有做物理备份,已知的备份策略为每天凌晨1点的逻辑...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息