MySQL案例08:MySQL Scheduler Events帶來的風險

来源:https://www.cnblogs.com/rangle/archive/2018/07/27/9376842.html
-Advertisement-
Play Games

定時任務是我們開發、運維人員經常用到的,比如cron,job,schedule,events scheduler等都是為了方便我們重覆執行某項工作而無需人工參與而設計,這裡我要說的是MySQL資料庫本身的定時任務,即events scheduler的風險案例。 一、現象描述 這裡有一個從庫出現數據不 ...


定時任務是我們開發、運維人員經常用到的,比如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事件,其中有個定時任務就設計到這個表的多次查詢、刪除、插入等操作。

正常情況下主庫創建event schedule,從庫自動的將event disable掉,如果切換需要手動enable event scheduler,如果搭建主從實現創建好的定時任務複製到從庫,從庫的scheduler可能會被激活,導致主從的scheduler都被執行。

三、處理過程

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;或者在主創建的時候加入DISABLE ON SLAVE

在從庫my.cnf配置文件中加入set global event_scheduler=0

6.重新完成數據同步

四、總結和知識擴展

含有scheduler事件的風險項:

1)主從切換的時候,新主庫需要enable scheduler events

2)含有scheduler 的資料庫搭建從庫,需要特別註意從庫的scheduler events需要被disable

1.創建mysql events scheduler

語法:

CREATE
    [DEFINER = { user | CURRENT_USER }]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    DO event_body;

schedule:
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

實例:

CREATE EVENT myevent
    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;

2.刪除mysql events scheduler

語法:

DROP EVENT [IF EXISTS] event_name

3.更改mysql events scheduler

語法:

ALTER
    [DEFINER = { user | CURRENT_USER }]
    EVENT event_name
    [ON SCHEDULE schedule]
    [ON COMPLETION [NOT] PRESERVE]
    [RENAME TO new_event_name]
    [ENABLE | DISABLE | DISABLE ON SLAVE]
    [COMMENT 'string']
    [DO event_body]

實例:

ALTER EVENT no_such_event 
      ON SCHEDULE 
      EVERY '2:3' DAY_HOUR;

五、案例回放測試

名稱 主庫 備庫
IP地址 192.168.1.1 192.168.1.2
OS RHEL6.6 RHEL6.6
MySQL 5.7.21-20 5.7.21-20
     

 1.部署主從(略)

 2.檢查主從scheduer是否開啟(mysqladmin var |grep event_scheduler)

主:

從:

3.主庫創建schedure相關信息

(root:localhost:Fri Jul 27 14:32:52 2018)[dbtest]>create table t(id int primary  key,name varchar(30));

CREATE EVENT ev_test 
ON SCHEDULE EVERY 1 MINUTE STARTS '2018-07-27 15:58:00' ON COMPLETION PRESERVE ENABLE DO 
BEGIN
    insert into   t  values(1,'N1'),(2,'N2'),(3,'N3');
END

4.主從數據檢查

show slave status \G

select * from t;

 

主從狀態正常,數據正常。

這裡發現並無異常,原因主從狀態本身存在的情況下,在主庫新建scheduler,從庫的scheduler event會被預設設置為disable

主庫:

(root:localhost:Fri Jul 27 16:29:12 2018)[dbtest]>show events;

從庫:

(root:localhost:Fri Jul 27 16:29:49 2018)[dbtest]>show events;

5.調整從庫的schedule為enable狀態

(root:localhost:Fri Jul 27 16:31:37 2018)[dbtest]>alter event ev_test enable;
Query OK, 0 rows affected (0.00 sec)
此時從庫的scheduer也會被執行,如果因為時間等原因的關係,從庫先執行了scheduler events,主庫再執行然後傳輸binlog到從庫再次執行會導致主從數據不一致,進而導致複製失敗,這也就是為什麼含有scheduer event的主從架構需要特別註意的原因了。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 過程,函數,觸發器是PL/SQL編寫的,存儲在oracle中的.PL/SQL是非常強大的資料庫過程語言. PL/SQL優點:性能,模塊化,網路傳輸量,安全性缺點:移植性不好 簡單分類:塊:過程,函數,觸發器,包 Demo:create or replace procedure sp01 isbegi ...
  • 占座 ...
  • 轉自:http://www.maomao365.com/?p=6965 摘要: 下文將分享兩種將欄位中null值替換為指定值的方法分享,如下所示: 實驗環境:sqlserver 2008 R2 例: ...
  • 一、 約束的含義和分類 1.1約束的含義:是一種限制,用於限製表中的數據,保證數據的完整性和一致性。 1.2約束的分類: ①not null:非空,保證欄位不能為空。違反約束不會報錯,但是會有警告,適用於說有的類型。 ②default:預設約束,當數據插入的時候,指定的欄位如果沒有數據插入,即插入默 ...
  • 一、增加(create add insert )1,create操作庫 create database 庫名 新建庫 create database 庫名 character set 編碼表 2,create 操作表結構 新建表: create table 表名( id int primary ke ...
  • 字元集&&排序規則 字元集是針對不同語言的字元編碼的集合,比如UTF-8字元集,GBK字元集,GB2312字元集等等,不同的字元集使用不同的規則給字元進行編碼排序規則則是在特定字元集的基礎上特定的字元排序方式,排序規則是基於字元集的,是對字元集在排序方式維度上的一個劃分。排序規則是依賴於字元集的,一 ...
  • 連接zookeeper出現異常:unknowHostException 出現這種錯誤一開始以為是zookeeper的配置文件出了問題,所以一直在找配置文件的問題,但是zookeeper在虛擬機裡面是可以正常運行的,操作命令也正常,後來看到以為博主的解決方法,按照他的來果然解決了:https://bl ...
  • 前言 在之前的博文中已經詳細的介紹了redis4.0基礎部分,並且在memcache和redis對比中提及redis提供可靠的數據持久化方案,而memcache沒有數據持久化方案,本篇博文將詳細介紹redis4.0所提供的持久化方案:RDB持久化和AOF持久化以及redis4.0新特性混合持久化。這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...