技術分享 | my2sql 接入 DBeaver 案例分享

愛可生雲資料庫發表於2022-01-21

作者:xuty

本文來源:原創投稿

*愛可生開源社群出品,原創內容未經授權不得隨意使用,轉載請聯絡小編並註明來源。


一. 大綱

本文分享下對於 my2sql 的一些改進,並且接入到 DBeaver 中供開發便捷使用的一個實際案例。

相信很多 DBA 日常都會遇到開發誤刪除資料(DML閃回)或者需要追溯資料變化原因(解析原始SQL)的需求,當這種需求愈發多的時候(別問為什麼,說多了都是淚),就會很厭倦此類工作,因此就想著實現一套工具供開發或者實施自己使用,而不需要 DBA 接入處理。

my2sql 是個人用過的很多 binlog 解析工具中比較出色的一個,因為它解析效能比較優異,且使用也相對簡單。

  1. 誤刪除資料閃回:依賴於 my2sql 的功能,可以快速生成指定表指定操作的 DML 操作回滾語句,確認後執行回滾 SQL 即可回覆資料。
  2. 追溯資料變化原因: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點:

  1. 實現 query 能力,其實就是在原有的基礎上,增加解析Rows_query對應的 event 功能,讓 my2sql 也可以根據庫表、操作型別解析得到對應的原始 SQL ,而非只能實現行資料的回滾SQL or 前滾SQL 。
  2. 原生的 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 回放恢復,無法直接閃回。

相關文章