美团点评开源MySQL极速闪回工具MyFlash_最新动态_新闻资讯_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 新闻资讯 > 最新动态 > 美团点评开源MySQL极速闪回工具MyFlash

美团点评开源MySQL极速闪回工具MyFlash

 2017/11/25 11:50:36    程序员俱乐部  我要评论(0)
  • 摘要:MyFlash是由美团点评公司技术工程部开发维护且内部使用的一个回滚DML操作的工具,旨在方便且高效地进行数据恢复,已于近日宣布开源。该工具通过解析v4版本的binlog,完成回滚操作。相对已有的回滚工具,其增加了更多的过滤选项,让回滚更加容易。开发团队也在其博客上将MyFlash与市面上现有的闪回工具进行了对比。目前市面上已有的恢复工具,从实现角度把可划分成如下几类。①mysqlbinlog工具配合sed、awk。该方式先将binlog解析成类SQL的文本,然后使用sed
  • 标签:工具 点评 SQL MySQL 开源 Flash
class="topic_img" alt=""/>

  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;

  测试结果 

发表评论
用户名: 匿名