共计 2479 个字符,预计需要花费 7 分钟才能阅读完成。
作者:xuty
本文起源:原创投稿
* 爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。
一. 纲要
本文分享下对于 my2sql 的一些改良,并且接入到 DBeaver 中供开发便捷应用的一个理论案例。
置信很多 DBA 日常都会遇到开发 误删除数据(DML 闪回)
或者须要 追溯数据变动起因(解析原始 SQL)
的需要,当这种需要愈发多的时候(别问为什么,说多了都是泪),就会很厌倦此类工作,因而就想着实现一套工具供开发或者施行本人应用,而不须要 DBA 接入解决。
my2sql 是集体用过的很多 binlog 解析工具中比拟杰出的一个,因为它解析性能比拟优异,且应用也绝对简略。
- 误删除数据闪回:依赖于 my2sql 的性能,能够疾速生成指定表指定操作的 DML 操作回滚语句,确认后执行回滚 SQL 即可回复数据。
- 追溯数据变动起因:my2sql 无奈实现该性能,须要依赖 DBA 手动解析 binlog,剖析 rows_query_log,失去原始执行 SQL 进一步剖析。
咱们以如下图为例:闪回性能即须要实现 rollback
,生成对应 DML 的回滚 SQL,这是 my2sql 自带的性能;而想要晓得数据变动的真正起因,则须要实现query
,失去原始执行 SQL 才比拟好剖析(当然须要保障 MySQL 中开启了binlog_rows_query_log_events
才会在 binlog 中记录原始 SQL)。
二. my2sql 改良
为了更加不便非 DBA 应用,对于 my2sql 进行了一些改良,次要包含 2 点:
- 实现 query 能力,其实就是在原有的根底上,减少解析
Rows_query
对应的 event 性能,让 my2sql 也能够依据库表、操作类型解析失去对应的原始 SQL,而非只能实现行数据的回滚 SQL or 前滚 SQL。 - 原生的 my2sql 应用上通常须要
指定 star-file,即起始 binlog
,这对于不相熟 MySQL 的人来说比拟麻烦,如果不指定起始 binlog,光指定工夫范畴,那么 my2sql 会从第一个 binlog 开始解析,比拟费时,性能不好。这里我的做法是,只须要输出工夫范畴,因为这个对于开发来说比较简单,而 binlog 的范畴则会通过输出的工夫范畴,主动适配,原理是对于 MySQL 中存在的每个 binlog 都会只解析其第一个 event,失去每个 binlog 工夫范畴,而后依据输出工夫范畴,就能够主动匹配对应的 binlog 范畴,这样就不须要解析无用的 binlog,节省时间。
吐槽:MySQL 中为了失去每个 binlog 的工夫区间真的好难,官网就不能在 show binary logs 中减少工夫输入吗?
BEGIN
/*!*/;
# at 291
#220117 12:49:23 server id 1000000 end_log_pos 328 CRC32 0xc0df907c Rows_query
# delete from a
# at 328
#220117 12:49:23 server id 1000000 end_log_pos 373 CRC32 0x7bc9707d Table_map: `test`.`a` mapped to number 5705
# at 373
#220117 12:49:23 server id 1000000 end_log_pos 435 CRC32 0x15ae3096 Delete_rows: table id 5705 flags: STMT_END_F
### DELETE FROM `test`.`a`
### WHERE
### @1=1 /* INT meta=0 nullable=0 is_null=0 */
### @2=1 /* INT meta=0 nullable=1 is_null=0 */
### DELETE FROM `test`.`a`
### WHERE
### @1=2 /* INT meta=0 nullable=0 is_null=0 */
### @2=2 /* INT meta=0 nullable=1 is_null=0 */
### DELETE FROM `test`.`a`
### WHERE
### @1=3 /* INT meta=0 nullable=0 is_null=0 */
### @2=3 /* INT meta=0 nullable=1 is_null=0 */
# at 435
#220117 12:49:23 server id 1000000 end_log_pos 466 CRC32 0x22eae195 Xid = 548
COMMIT/*!*/;
三. 接入 DBeaver
通过上述 my2sql 改进后,其实对于非 DBA 曾经十分敌对了(都不须要输出起始 binlog),因为只须要输出一些参数即可调用 my2sql 应用。
./my2sql -user root -password xxx -host 127.0.0.1 -port 3306 \
-databases test -tables a -sql delete \
-start-datetime "2021-04-02 11:05:00" -stop-datetime "2021-04-02 11:06:00" \
-work-type rollback \
-add-extraInfo -output-dir /opt/tmp
然而开发还会说没有图形化,命令行我不太会弄奥,行把,给你加个图形化。
公司有专门的开发基于开源 DBeaver 进行了革新,减少了一些个性化性能,并把 DBeaver 作为全公司的对立数据库客户端工具应用,所以想到把 my2sql 集成到 DBeaver 中应用应该会很不便,大略步骤就是通过 DBeaver 来抉择库、表、操作类型等一系列入参,而后内部调用 my2sql 的程序生成脚本(DBeaver 中自身就寄存了连贯信息)。
大抵的应用如下图:
rollback 类型:
query 类型:
四. 总结
对于 my2sql 的改良应用,尽管不如传统 DBA 依据误操作指定对应 binlog&position 后解析的那么准确,然而对于开发来说,我感觉曾经够用了,即便该时间段内含有其余非误操作的回滚 SQL,也能够自行筛选进去。
最初提一下,my2sql 仅反对 DML 语句,所以并没有退出 DDL 的解析性能,因为 DDL 误操作只能通过备份 +binlog 回放复原,无奈间接闪回。