以上几个过程,已经解决了第一个问题,接下来我们要解决第二个问题。
1. 在以上的步骤里,已经在仿真环境复盘了生产环境的故障,同时在也仿真环境里里安装了 binlog 转成 SQL 的工具。
2. 使用 binlog2sql 的工具,解析出来错误执行的 SQL,让工作流的平台的同时进行确认,同时让工作流的同事,确认在这个时间段内没有其他的应用也在操作这个数据库。
3. 工作流的同事确认 SQL 全部为误操作产生的 SQL。
具体的确认方式如下:
1)在仿真环境模拟创建一个工作流模板。
2)在这个模板上创建几个测试实例
3)通过接口去删除这个工作流模板,观察应用产生的 SQL,以此来确认本人提供的 SQL 是否正确。
同时,工作流平台确认在问题时间段内无其他应用操作,感觉胜利在望了,该问题可以轻松解决了。
4)通过 binlog2sql 生产反向 SQL,把 SQL 应用于仿真环境,问题就能解决了,仔细观察反向 SQL 文件,发现里面有一些乱码,查看乱码字段所在的表,发现表的定义是这样的。
表中有个字段为 longblob 字段,产生的 INSERT 的 SQL 无法执行,这个问题该怎么处理??
5)这个问题到这里陷入了僵局,眼看马上就能解决的问题,发现有一个表数据无法通过 SQL 进行插入,询问工作流平台同事,这个表是否很重要,得到答复,没有这个表的数据,系统无法运转。
6)换个思路考虑一下,既然 SQL 是通过二进制的 binlog 生成的,可以考虑生成反向的二进制 binlog,然后把这一段反向的 binlog 应用到数据库,这个问题就解决了。
7)带着这个思路,去 Github 里翻看了项目。果然还真有一个:https://github.com/Meituan-Dianping/MyFlash
再次非常感谢美团点评开源的 myflash 项目。
8)利用 myflash 生成了反向二进制文件,把文件应用到数据库,工作流平台在仿真环境测试,数据完美再现。