MySQL從庫實用技能教程 巧用slave_exec_mode參數

2020-12-18 站長之家

MySQL從庫實用技能教程 巧用slave_exec_mode參數

MySQL從庫實用技能教程,巧用slave_exec_mode參數。想必從庫異常中斷的情況不在少數,其中報錯信息中 1032 及 1062 的錯誤佔了不少的比重

錯誤 1032 指的是從庫中找不到對應行的記錄

錯誤 1062 指的是主鍵衝突

遇到此報錯時,大多DBA會使用如下方法進行處理

1 手動處理

方法一: 找出引起異常的數據然後手動在從庫處理後重啟SQL線程繼續觀察;

根據報錯的信息,通過mysqlbinlog解析binlog日誌,找到對應的數據,然後查看從庫是否缺失數據或者已存在對應主鍵的數據,然後手動在從庫處理對應記錄的數據。處理完畢後再次開啟同步。

但是,後續還得觀察是否再次出現錯誤

方法二: 手動跳過 1 個或更多個事務,然後繼續觀察。

/* 傳統點位模式複製 */SQL>set global sql_slave_skip_counter=1;SQL>start sql_thread;/* GTID模式複製 */SQL>set gtid_next='e29d3917-9dbb-11e9-8b64-e4434b6e2c80:11103335-16054791';SQL>begin;commit;SQL>set gtid_next='AUTOMATIC';

注意,手動跳過事務的方式存在一個很大的缺點:1 個事務中存在多個sql,用此方式,本事務中的其他SQL也會被跳過(具體的和binlog-format有關,對於當前常用的ROW格式均有影響)。

2  持續跳過錯誤

但是,如果一直報錯,但是,這些報錯又可以忽略可以怎麼處理,此時也有很多方法,通常使用的是如下幾種:

方法一:  使用pt-slave-restart工具跳過對應錯誤

但是使用pt-slave-restart工具跳過報錯時,必須關閉多線程複製,因為工具分不清到底哪個線程複製出了問題,然後會報類似如下的報錯:

Cannot skip transactions properly because GTID is enabled and slave_parallel_workers > 0.  See 'GLOBAL TRANSACTION IDS' in the tool's documentation

處理步驟為:

/*暫停並行複製*/SQL> set global slave_parallel_workers=0;/*使用pt-slave-restart工具跳過錯誤(填寫錯誤號)*/pt-slave-restart  --user=root --password='Admin@123' --socket=/data/mysql3306/tmp/mysql.sock--error-numbers=1062/* 不再報錯時,再開啟並行複製 */mysql> set global slave_parallel_workers=8;

方法二:  在配置文件裡配置跳過指定錯誤

在配置文件[mysqld]項裡加入參數slave-skip-errors

slave-skip-errors=1032,1062

但是,此方法存在一個致命缺點:該參數是靜態參數,無法動態修改,需要修改配置文件後重啟資料庫方可生效。

3  冪等模式

因為手動跳過事務時,會忽略相同事務下的其他正常的SQL在從庫的應用;pt-slave-restart工具需要停止多線程複製,影響從庫應用速度;配置slave-skip-errors又需要重啟資料庫方可生效。那麼有沒有一種方式既不會跳過多餘的SQL,又無需重啟資料庫也不影響從庫應用SQL的速度呢?答案是有的,也就是將slave_exec_mode參數設置為IDEMPOTENT,即冪等模式(默認為嚴格模式STRICT)。

/*在線動態修改 */SQL > set global slave_exec_mode='IDEMPOTENT';

改為冪等模式後,可以忽略 1032 及 1062 的錯誤,對同一事務內的其他SQL無影響,依舊能正常執行。

4. 結語

本文中沒有舉具體案例進行實戰演示,不過建議大家還是自行搭建環境進行場景復現的演示(在從庫先插入部分數據或先更新部分數據),然後再在主庫執行,即可出現 1062 或 1032 的錯誤。

很多初學者或實戰經驗不足的同學可能不知道該參數,因此,更加建議在多種場景下測試。

本文轉載自微信公眾號【資料庫乾貨鋪】。

相關焦點

  • 高性能Mysql主從架構的複製原理及配置詳解
    但是,read_only並是很實用,特別是那些需要在slave上創建表的應用。2.5、啟動slave接下來就是讓slave連接master,並開始重做master二進位日誌中的事件。你不應該用配置文件進行該操作,而應該使用CHANGE MASTER TO語句,該語句可以完全取代對配置文件的修改,而且它可以為slave指定不同的master,而不需要停止伺服器。
  • 主庫n -> 從庫s - MySQL5.7多主一從(多源複製)同步配置 - 計算機...
    多主一從,也稱為多源複製,數據流向:主庫1 -> 從庫s主庫2 -> 從庫s主庫n -> 從庫s應用場景數據匯總,可將多個主資料庫同步匯總到一個從資料庫中,方便數據統計分析。讀寫分離,從庫只用於查詢,提高資料庫整體性能。部署環境註:使用docker部署mysql實例,方便快速搭建演示環境。
  • MySQL主從複製高級進階
    一般企業建議3-6小時,具體看公司運維人員對於故障的反應時間執行之前在需要先stop slave,否則會報錯,無法執行;stop slave;設置master_delay並重新開啟複製start slave後,,MySQL從庫會清空原有的relay log
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave1: jdbc-url: jdbc:mysql://192.168.102.56:
  • 網際網路公司常用MySql架構
    進程#在db1上創建複製用戶grant replication slave on *.* to 'repl'@'192.168.8.%' identified by '123456';#從db1上導出數據mysqldump --master-data
  • MySQL 備份數據那點事
    mysqldump什麼是 mysqldump ?mysqldump 是 MySQL 用於執行邏輯備份的一款工具,可以根據原始資料庫對象以及表的定義和數據來生成一系列可以被執行的 SQL 語句。通常我們用它作為備份或者遷移數據。
  • SpringBoot + MyBatis + MySQL讀寫分離實踐!
    username: root password: 123456 driver-class-name: com.mysql.jdbc.Driver slave1: jdbc-url: jdbc:mysql://192.168.102.56:
  • mysqldump的實現原理
    拋開源碼不談,其實我們可以通過打開general log,查看mysqldump全庫備份時執行的命令來了解mysqldump背後的原理。>執行全庫備份# mysqldump --master-data=2  -R --single-transaction -A -phello > 3306_20160518.sql其中--master-data指定為2指的是會在備份文件中生成CHANGE MASTER的注釋。
  • MySQL基於MHA的FailOver過程
    relaylog差異,恢復到2號從庫提供額外的數據補償功能解除從庫身份剩餘從庫和主庫構建主從關係應用透明故障節點自愈故障提醒/binlog創建必要目錄mkdir -p /data/mysql/binlog chown -R mysql.mysql /data/*修改完成後,將主庫binlog接過來(從000001開始拉取,之後的binlog
  • Prometheus 監控MySQL資料庫
    systemd,使用systemd是官方的建議,詳見 https://kubernetes.io/docs/setup/cri/mkdir -p /etc/docker/cat>/etc/docker/daemon.json<<EOF{"exec-opts
  • 實戰體驗幾種MySQL Cluster方案
    由於未設置主伺服器,兩個服務的狀態都是SECONDARY提升其中一個為主伺服器:mysqlfabric group promote group_id-1 --slave_id 00f9831f-d602-11e3
  • MariaDB Galera Cluster(MGC/PXC)重要參數、狀態解讀大全
    正巧,筆者曾經對Galera集群複製插件做過完整的參數研究與整理。在這裡分享給大家,希望能夠幫助大家更好地使用MGC/PXC集群。wsrep_dbug_option1.10. wsrep_debug1.11. wsrep_desync1.12. wsrep_dirty_reads1.13. wsrep_drupal_282555_workaround 1.14. wsrep_forced_binlog_format1.15. wsrep_gtid_domain_id1.16. wsrep_gtid_mode
  • 【MySQL】如何最大程度防止人為誤操作MySQL資料庫?
    mysql> delete from oldboy.student;ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY columnmysql> quitBye
  • 問答:學SQL Server好還是學MySQL好?
    那麼既然是想通的,為什麼推薦用mysql呢?1.mysql體積小,環境安裝更方便。而SQLserver安裝包比較大,安裝麻煩。可以看到SQLserver2016的安裝包2.28G,不光安裝包大,安裝起來的步驟也非常費勁,還容易出錯,而mysql安裝就簡單多了。環境配置是必不可少的配置,總不能說我會用這個,但是環境我不會配置吧。
  • MySQL官方的資料庫中間件,有人用麼?
    mysql-proxy是什麼?mysql-proxy是mysql官方提供的mysql中間件服務,上遊可接入若干個mysql-client,後端可連接若干個mysql-server。畫外音:中間件有基於客戶端的,也有基於服務端的,此為後者。mysql-proxy使用什麼協議?
  • MySQL資料庫的分組操作,語句拼接,列轉行操作
    關於group by 的sql_mode關於group by 的sql_modeonly_full_group_by說明:僅是MySQL5.7中存在,5.6和8.0都沒有,查看sql_modeselect @@sql_mode;在帶有group by 子句的select中,select後的條件列(
  • MySQL忘記密碼怎麼辦 密碼重置詳細教程
    修改資料庫配置文件vim  /etc/my.cnf--添加如下參數skip_grant_tables2.   重啟資料庫如果部署了服務 可以重啟資料庫服務重啟,如果沒有部署,需要殺掉資料庫進程,在重新啟動資料庫。
  • android focusmode_android focus mode - CSDN
    = af_port_handle_set_focus_mode_evt(port, set_parm,(int)parm->u.af_mode); //Handle set parameter event to set focus mode.
  • DTCC:MySQl核心代碼開發經驗揭示
    /mysql-test-run.pl –gdb sample  MySQL 測試框架參考資源  • The MySQL Test Framwork, Version 2.0  Ø http://dev.mysql.com/doc/mysqltest/2.0/en/index.html  • mysqltest Language Reference