tidb之dm叢集跳過某個事務實踐

賀子_DBA時代發表於2021-11-01

被動跳過 SQL 語句,參考官方文件

假設業務上可以接受下游 TiDB 不執行此 DDL 語句(即繼續保持原有的表結構),則可以透過使用 sql-skip 命令跳過該 DDL 語句以恢復遷移任務。操作步驟如下:

一:使用 query-error 獲取遷移出錯的 binlog event 的 position 資訊。

position 資訊可直接由 query-error 返回的 failedBinlogPosition 獲得。

本示例中的 position 為 mysql-bin|000001.000003:34642。

二:使用 sql-skip 預設一個 binlog event 跳過操作,該操作將在使用 resume-task 後遷移該 binlog event 到下游時生效。

» sql-skip --worker=127.0.0.1:8262 --binlog-pos=mysql-bin|000001.000003:34642 test

{ "result": true, "msg": "", "workers": [ { "result": true, "worker": "", "msg": "" } ]}

二:對應 DM-worker 節點中也可以看到類似如下日誌:

2018/12/28 11:17:51 operator.go:121: [info] [sql-operator] set a new operatoruuid: 6bfcf30f-2841-4d70-9a34-28d7082bdbd7, pos: (mysql-bin|000001.000003, 34642), op: SKIP, args:on replication unit

三:使用 resume-task 恢復之前出錯中斷的遷移任務。

» resume-task --worker=127.0.0.1:8262 test

{ "op": "Resume", "result": true, "msg": "", "workers": [ { "op": "Resume", "result": true, "worker": "127.0.0.1:8262", "msg": "" } ]}

四:對應 DM-worker 節點中也可以看到類似如下日誌:

2018/12/28 11:27:46 operator.go:158: [info] [sql-operator] binlog-pos (mysql-bin|000001.000003, 34642) matched,applying operator uuid: 6bfcf30f-2841-4d70-9a34-28d7082bdbd7, pos: (mysql-bin|000001.000003, 34642), op: SKIP, args:

五:使用 query-status 確認該任務的 stage 已經轉為 Running。

» query-status --worker=127.0.0.1:8262 test

六:使用 query-error 確認原錯誤資訊已不再存在。

»query-error --worker=127.0.0.1:8262 test

具體案例

首先模擬出主鍵衝突的報錯,注意模擬的時候一定注意等你task執行一段時間後,再模擬,因為safe-mode: false # 設定為 true,則將來自上游的 `INSERT` 改寫為 `REPLACE`,將 `UPDATE` 改寫為 `DELETE` 與 `REPLACE`,保證在表結構中存在主鍵或唯一索引的條件下遷移資料時可以重複匯入 DML。在啟動或恢復增量複製任務的前 5 分鐘內 TiDB DM 會自動啟動 safe mode,這是這個原因所以當你啟動某個task_mode 為all的任務的時候,當全量同步完成後,切換到增量的前5分鐘內是safe-mode:true,這樣就不會有主鍵衝突的問題!所以需要過5分鐘後再模擬主鍵衝突!

然後透過 query-error檢視報錯的binlog點位!如下紅色部分所示:failedBinlogPosition": "binlog|000001.000025:166513224"

[tidb@tidb-monitor-01 kv]$ dmctl --master-addr 11.28.11.143:8261 query-error liuwenhe

{

"result": true,

"msg": "",

"workers": [

{

"result": true,

"worker": "11.28.11.147:8266",

"msg": "",

"subTaskError": [

{

"name": "liuwenhe",

"stage": "Paused",

"unit": "Sync",

"sync": {

"errors": [

{

"msg": "[code=10006:class=database:scope=not-set:level=high]execute statement failed: INSERT INTO `bre_tidb`.`bre_event_data` (`REQUEST_ID`,`BUSINESS_ID`,`SYSTEM_CODE`,`DECISION_NUM`,`LOGIN_TYPE`,`SOURCE_TYPE`,`PRODUCT_TYPE`,`CUST_CHANNEL_CODE`,`NODE_NAME`,`CUST_NO`,`PROD_NO`,`SUB_PROD_NO`,`type`,`ID_NO`,`PHONE`,`DATA_PATH`,`BLAZE_PACKAGE_NAME`,`EXPERIMENT_NO`,`BLAZE_SIGN`,`CREATE_DATE`,`CREATE_TIME`,`UPDATE_DATE`,`UPDATE_TIME`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?): Error 1062: Duplicate entry 'C011802110030080021' for key 'PRIMARY'",

"failedBinlogPosition": "binlog|000001.000025:166513224",

"errorSQL": "[tp: insert, sql: INSERT INTO `bre_tidb`.`bre_event_data` (`REQUEST_ID`,`BUSINESS_ID`,`SYSTEM_CODE`,`DECISION_NUM`,`LOGIN_TYPE`,`SOURCE_TYPE`,`PRODUCT_TYPE`,`CUST_CHANNEL_CODE`,`NODE_NAME`,`CUST_NO`,`PROD_NO`,`SUB_PROD_NO`,`type`,`ID_NO`,`PHONE`,`DATA_PATH`,`BLAZE_PACKAGE_NAME`,`EXPERIMENT_NO`,`BLAZE_SIGN`,`CREATE_DATE`,`CREATE_TIME`,`UPDATE_DATE`,`UPDATE_TIME`) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?), args: [C011802110030080021 C011802110047862166 rms TransactionCheck AND001 DF bnh_product zhifubao Application 150000407304 101 \u003cnil\u003e \u003cnil\u003e 360733198610043678 18807972084 /ReportFile/2018/02/11/C011802110030080021.gz \u003cnil\u003e \u003cnil\u003e \u003cnil\u003e 20180211 181415 20180211 181415], key: C011802110030080021`bre_tidb`.`bre_event_data`, ddls: [], last_pos: (binlog|000001.000025, 166512691), current_pos: (binlog|000001.000025, 166513224), gtid:\u003cnil\u003e]"

}

]

}

}

],

"RelayError": {

"msg": ""

}

}

]

}

執行具體的sql-skip操作:

[tidb@tidb-monitor-01 kv]$ dmctl --master-addr 11.28.11.143:8261Welcome to dmctl

Release Version: v1.0.6

Git Commit Hash: eaf2683c05ab44143bfb286bfbbc3ba157c555cc

Git Branch: release-1.0

UTC Build Time: 2020-06-17 10:22:01

Go Version: go version go1.13 linux/amd64

» sql-skip --worker=11.28.11.147:8266 --binlog-pos="binlog|000001.000025:166513224" liuwenhe

{

"result": true,

"msg": "",

"workers": [

{

"result": true,

"worker": "",

"msg": ""

}

]

}

恢復處於Paused狀態的task:

» resume-task liuwenhe

{

"op": "Resume",

"result": true,

"msg": "",

"workers": [

{

"meta": {

"result": true,

"worker": "11.28.11.147:8266",

"msg": ""

},

"op": "Resume",

"logID": "4736"

}

]

}

再次檢視發現已經正常:

» query-status liuwenhe

{

"result": true,

"msg": "",

"workers": [

{

"result": true,

"worker": "11.28.11.147:8266",

"msg": "",

"subTaskStatus": [

{

"name": "liuwenhe",

"stage": "Running",

"unit": "Sync",

"result": null,

"unresolvedDDLLockID": "",

"sync": {

"totalEvents": "3",

"totalTps": "0",

"recentTps": "0",

"masterBinlog": "(binlog.000025, 292158424)",

"masterBinlogGtid": "78ad9491-9efa-11ea-b4dc-005056b3c9fc:1-27595888",

"syncerBinlog": "(binlog|000001.000025, 163696575)",

"syncerBinlogGtid": "",

"blockingDDLs": [

],

"unresolvedGroups": [

],

"synced": false

}

}

],

"relayStatus": {

"masterBinlog": "(binlog.000025, 292158424)",

"masterBinlogGtid": "78ad9491-9efa-11ea-b4dc-005056b3c9fc:1-27595888",

"relaySubDir": "78ad9491-9efa-11ea-b4dc-005056b3c9fc.000001",

"relayBinlog": "(binlog.000025, 292158424)",

"relayBinlogGtid": "78ad9491-9efa-11ea-b4dc-005056b3c9fc:1-27595888",

"relayCatchUpMaster": true,

"stage": "Running",

"result": null

},

"sourceID": "13-3323-8266"

}

]

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29654823/viewspace-2840117/,如需轉載,請註明出處,否則將追究法律責任。

相關文章