mysql数据库-秒级别精度恢复数据、误删表恢复实现
1 前提条件
- 源db要可用的全量备份数据
- 源db要有可用的bin-log日志备份
- 还原实施依据实际问题情况,使用2.1或是2.2的步骤执行
1.1 源数据库二进制日志独立存放
[mysqld]
log-bin=/data/mysql/mysql-bin
1.2 完全备份时,需记录备份的二进制位置
mysqldump -uroot -p123456 -A -F --default-character-set=utf8 --single-transaction --master-data=2 | gzip > /backup/all_`date +%F`.sql.gz
mysql> show master logs;
2 还原实施
2.1 全量备份还原环境初始化准备
2.1.1 备份文件准备
gzip -d /backup/all_2000-01-01.sql.gz
2.1.2 数据库准备
如果是故障本机从修复,重新启动数据库程序,如果是新建数据库无需此操作
systemctl restart mariadb
#mysql_install_db --user=mysql #依据损坏程度可能需要事先重新生成数据库相关文件,或是重装数据库,或是重装系统
2.1.3 还原数据
2.1.3.1 登录数据库确认bin-log position并还原数据文件
MySQL> show master logs;
# 还原数据库前先关闭bin-log日志记录功能,避免无效记录
MySQL> set sql_log_bin=0;
MySQL> source /data/all_1999-01-01.sql
2.1.3.2 确认全备份文件中记录的二进制文件和位置,将其之后生成的所有二进制日志进行复制备份
# grep '^-- CHANGE MASTER TO' /data/all_1999-01-01.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=188;
2.1.3.3 根据bin log position,备份从完全备份后的二进制日志,生成新需要的增量sql数据文件
# 二进制日志的备份还原
mysqlbinlog mysql-bin.000002 --start-position=188 > /backup/inc.sql
mysqlbinlog mysql-bin.000003 >> /backup/inc.sql
mysqlbinlog mysql-bin.000004 >> /backup/inc.sql
...
2.1.3.4 还原增量备份sql数据
# 还原备份文件
MySQL> source /backup/inc.sql
MySQL> set sql_log_bin=1;
2.2 误删表还原准备
2.2.1 首先执行以上2.1到2.1.3.3的步骤,完成全量数据还原增量数据的生成操作
2.2.2 找到误删除的语句,从bin_log增量备份中删除此语句
sed -i.bak '/^DROP TABLE/d' /data/inc.sql
2.2.3 对修改过的二进制日志进行还原
# 还原备份文件
MySQL> source /backup/inc.sql
MySQL> set sql_log_bin=1;
5 其他
无