MyFlash 是由美团点评公司技术工程部开发维护且内部使用的一个回滚 DML 操作的工具,旨在方便且高效地进行数据恢复,已于近日宣布开源。该工具通过解析 v4 版本的 binlog ,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。
开发团队也在其博客上将 MyFlash 与市面上现有的闪回工具进行了对比。目前市面上已有的恢复工具,从实现角度把可划分成如下几类。
① mysqlbinlog 工具配合 sed、awk 。该方式先将 binlog 解析成类 SQL 的文本,然后使用 sed、awk 把类 SQL 文本转换成真正的 SQL 。
优点:当 SQL 中字段类型比较简单时,可以快速生成需要的 SQL ,且编程门槛也比较低。
缺点:当 SQL 中字段类型比较复杂时,尤其是字段中的文本包含 HTML 代码,用 awk、sed 等工具时,就需要考虑极其复杂的转义等情况,出错概率很大。
② 给数据库源码打 patch 。该方式扩展了 mysqlbinlog 的功能,增加 Flashback 选项。
优点:复用了 MySQL Server 层中 binlog 解析等代码,一旦稳定之后,无须关心复杂的字段类型,且效率较高。
缺点:在修改前,需要对 MySQL 的复制代码结构和细节需要较深的了解。版本比较敏感,在 MySQL 5.6 上做的 patch ,基本不能用于 MySQL 5.7 的回滚操作。升级困难,因为 patch 的代码是分布在 MySQL 的各个文件和函数中,一旦 MySQL 代码改变,特别是复制层的重构,升级的难度不亚于完全重新写一个。
③ 使用业界提供的解析 binlog 的库,然后进行 SQL 构造,其优秀代表是 binlog2sql 。
优点:使用业界成熟的库,因此稳定性较好,且上手难度较低。
缺点:效率往往较低,且实现上受制于 binlog 库提供的功能。
上述几种实现方式,主要是提供的过滤选项较少,比如不能提供基于 SQL 类型的过滤,需要回滚一个 delete 语句,导致在回滚时,需要结合 awk、sed 等工具进行筛选。总结了上述几种工具的优缺点,理想的闪回工具应具有以下特性。
无需把 binlog 解析成文本,再进行转换。
提供原生的基于库、表、SQL 类型、位置、时间等多种过滤方式。
支持 MySQL 多个版本。
对于数据库的代码重构不敏感,利于升级。
自主掌控 binlog 解析,提供尽可能灵活的方式。
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;
测试结果