MyFlash 是由美团点评公司技术工程部开发维护且内部使用的一个回滚 DML 操作的工具
简介
MyFlash 是由美团点评公司技术工程部开发维护且内部使用的一个回滚 DML 操作的工具,旨在方便且高效地进行数据恢复,已于近日宣布开源。该工具通过解析 v4 版本的 binlog ,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。
开发团队也在其博客上将 MyFlash 与市面上现有的闪回工具进行了对比。目前市面上已有的恢复工具,从实现角度把可划分成如下几类。
① mysqlbinlog 工具配合 sed、awk 。该方式先将 binlog 解析成类 SQL 的文本,然后使用 sed、awk 把类 SQL 文本转换成真正的 SQL 。
② 给数据库源码打 patch 。该方式扩展了 mysqlbinlog 的功能,增加 Flashback 选项。
优点:复用了 MySQL Server 层中 binlog 解析等代码,一旦稳定之后,无须关心复杂的字段类型,且效率较高。
缺点:在修改前,需要对 MySQL 的复制代码结构和细节需要较深的了解。版本比较敏感,在 MySQL 5.6 上做的 patch ,基本不能用于 MySQL 5.7 的回滚操作。升级困难,因为 patch 的代码是分布在 MySQL 的各个文件和函数中,一旦 MySQL 代码改变,特别是复制层的重构,升级的难度不亚于完全重新写一个。
③ 使用业界提供的解析 binlog 的库,然后进行 SQL 构造。其优秀代表是 binlog2sql 。
上述几种实现方式,主要是提供的过滤选项较少,比如不能提供基于 SQL 类型的过滤,需要回滚一个 delete 语句,导致在回滚时,需要结合 awk、sed 等工具进行筛选。总结了上述几种工具的优缺点,理想的闪回工具应具有以下特性。
MyFlash 应运而生。
性能对比
测试场景
使用 testFlashback2 ,插入 100 万条数据:
CREATE TABLE `testFlashback2` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nameShort` varchar(20) DEFAULT NULL,
`nameLong` varchar(260) DEFAULT NULL,
`amount` decimal(19,9) DEFAULT NULL,
`amountFloat` float DEFAULT NULL,
`amountDouble` double DEFAULT NULL,
`createDatetime6` datetime(6) DEFAULT NULL,
`createDatetime` datetime DEFAULT NULL,
`createTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`nameText` text,
`nameBlob` blob,
`nameMedium` mediumtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB
mysql> select count(*) from testFlashback2;
+----------+
| count(*) |
+----------+
| 1048576 |
+----------+
1 row in set (0.16 sec)
delete from testFlashback2;
测试结果