我们不止要说误删数据的事后处理办法,更重要是要做到事前预防。

误删数据分类

  • 使用 delete 语句误删数据行;
  • 使用 drop table 或者 truncate table 语句误删数据表;
  • 使用 drop database 语句误删数据库;
  • 使用 rm 命令误删整个 MySQL 实例。

需要完善自动恢复脚本

一种加速的方法是,在用备份恢复出临时实例之后,将这个临时实例设置成线上备库的从库

1
2
3
4
5
6
7
8
9
10
11
#1.恢复全量备份
a.指定全量备份路径
b.写入全量备份名称
c.恢复全量备份到指定临时实例

在 start slave 之前,先通过执行change replication filter replicate_do_table = (tbl_name) 命令,就可以让临时库只同步误操作的表;
这样做也可以用上并行复制技术,来加速整个数据恢复过程。
#2.自动恢复binlog
a.指定binlog备份路径
b.指定需要恢复的binlog名称(1个或者多个)
c.恢复binlog到指定临时实例

预防误删库 / 表的方法

  • 第一条建议是,账号分离。这样做的目的是,避免写错命令。

    比如:我们只给业务开发同学 DML 权限,而不给 truncate/drop 权限。
    而如果业务开发人员有 DDL 需求的话,也可以通过开发管理系统得到支持。
    即使是 DBA 团队成员,日常也都规定只使用只读账号,必要的时候才使用有更新权限的账号。

  • 第二条建议是,制定操作规范。

    这样做的目的,是避免写错要删除的表名。
    比如:在删除数据表之前,必须先对表做改名操作。然后,观察一段时间,确保对业务无影响以后再删除这张表。
    改表名的时候,要求给表名加固定的后缀(比如加 _to_be_deleted),然后删除表的动作必须通过管理系统执行。并且,管理系删除表的时候,只能删除固定后缀的表。