一、防微杜渐:
保护数据,不仅仅是DBA的事情,是每个开发人员都应该有的觉悟;
先要做好预防,可以通过一下几个点:
- 1.权限控制与分配(数据库和服务器权限)
- 2.制作操作规范
- a. 脚本完善:备份脚本、执行脚本、验证脚本、回滚脚本
- 3.定期给开发进行培训
- 4.搭建延迟备库
- 5.做好sql审计,只要是对线上数据有更改操作的语句(DML和DDL)都需要进行审核
- 6.做好备份。备份的话又分为两个点.
- a. 如果数据量比较大,用物理备份xtrabackup。定期对数据库进行全量备份,也可以做增量备份。
- b. 如果数据量较少,用mysqldump或者mysqldumper。再利用binlog来恢复或者搭建主从的方式来恢复数据。
- 7.定期备份binlog文件也是很有必要的
- 8.定期检查备份文件是否可用,如果真的发生了误操作,需要恢复数据的时候,发生备份文件不可用,那就更悲剧了
二、亡羊补牢
如果发生了数据删除的操作,又可以从以下几个点来恢复:
-
1.DML误操作语句造成数据不完整或者丢失。可以通过flashback,不过我们目前用的是美团的myflash,也是一个不错的工具,本质都差不多.都是先解析binlog event,然后在进行反转。把delete反转为insert,insert反转为delete,update前后image对调。所以必须设置binlog_format=row 和 binlog_row_image=full.
切记恢复数据的时候,应该先恢复到临时的实例,然后在恢复回主库上。 -
2.DDL语句误操作(truncate和drop),由于DDL语句不管binlog_format是row还是statement.在binlog里都只记录语句,不记录image所以恢复起来相对要麻烦得多。只能通过全量备份+应用binlog的方式来恢复数据。一旦数据量比较大,那么恢复时间就特别长。