如果因为某些原因误删误删数据或者数据库,需要面对如何快速恢复问题。关于这个问题的解决总结如下:
一、恢复数据的方法
1. 误删数据表或数据库:
使用 `DROP TABLE`、`TRUNCATE TABLE` 或 `DROP DATABASE` 误删数据时,binlog 记录的是 statement 格式,可能不能通过 binlog 恢复。
恢复方法:依赖全量备份和增量日志。这个需要定期的全量备份和实时备份的 binlog。
2. 误删数据行:
使用 `DELETE` 语句误删数据行,可以通过 Flashback或者美团闪回工具Myflash进行恢复数据。
美团Myflash详细介绍:https://github.com/Meituan-Dianping/MyFlash。
二、提升数据恢复效率:
MySQL 5.6 之后引入了延迟复制的备库,防止错误操作快速蔓延到从库,导致主从数据都被删除。
具体方法: 通过命令 CHANGE MASTER TO MASTER_DELAY = N ,可以指定这个备库持续保持跟主库有 N 秒的延迟。这样可以缩短了整个数据恢复需要的时间,提高恢复数据的效率。
三、预防数据误删的方法
规范数据库脚本审计以及脚本发布上线的流程,出现问题能够及时撤销和回退。
数据库账号权限的管理,特别是Drop/Truncate权限必须严格管理。
数据库配置层面也需要做好约束规范,sql_safe_updates 参数设置为 on。 delete 或者 update 语句中没有 where 条件,或者 where 条件里面没有包含索引字段的话,这条语句的执行就会报错。
为了防止集群集体删除的极端情况,我们做数据库备份的时候有条件尽量选择跨机房或者跨城市都可以,提高数据库可用性,降低数据丢失的损失。