標籤:開發 lob 常見 通過 錯誤 key 16px 失敗 9.png
定時任務是我們開發、營運人員經常用到的,比如cron,job,schedule,events scheduler等都是為了方便我們重複執行某項工作而無需人工參與而設計,這裡我要說的是MySQL資料庫本身的定時任務,即events scheduler的風險案例。
一、現象描述
這裡有一個從庫出現資料不同步現象,具體報錯如下:
Slave_IO_Running: Yes Slave_SQL_Running: No Last_SQL_Errno: 1032 Last_SQL_Error: Could not execute Delete_rows event on table bs.dg_sale; Can‘t find record in ‘dg_sale‘, Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event‘s master log mysql-bin.000079, end_log_pos 159513315
這個現象出現是由於主鍵問題導致資料刪除失敗,進而引發資料同步錯誤。
二、原因分析
出現上述錯誤比較常見的是從庫做了一些刪除操作,然後資料同步的時候通過主鍵尋找條件刪除的時候無法執行刪除操作,進而導致主從錯誤。
通過對比主庫資料和從庫資料發現表資料記錄數都是0,然後自增值不同,從庫始終沒有外部賬戶訪問,這裡就有點懵逼了吧?沒錯,還有一種情況可能導致從庫被操作,那就是定時任務。通過排查發現,果然主庫設有幾個events事件,其中有個定時任務就設計到這個表的多次查詢、刪除、插入等操作。
三、處理過程
1.查看從庫狀態和錯誤碼資訊。
2.檢查主庫、從庫表資料資訊、表結構資訊。
show slave status \G
show create table bs.dg_sale \G
select count(1) from bs.dg_sale;
3.分析產生錯誤的binlog資訊。
主庫:
show binlog events in ‘mysql-bin.000079‘ from 159512534 limit 10;
mysqlbinlog --base64-output=‘decode-rows‘ --start-position=159512534 --stop-position=159512838 -vv mysql-bin.000079 >binlog.txt
4.查看主庫/從庫events scheduler資訊
show variables like ‘event_scheduler‘;
show events;
select EVENT_SCHEMA,EVENT_NAME,STATUS ,EXECUTE_AT,INTERVAL_VALUE from events;
這裡看到events scheduler
5.禁用從庫的events scheduler
set global event_scheduler=0;
在從庫my.cnf設定檔中加入set global event_scheduler=0
6.重新完成資料同步
四、知識擴充
1.建立mysql events scheduler
2.刪除mysql events scheduler
3.更改mysql events scheduler
MySQL案例08:MySQL Events帶來的風險