mysql變量 exec_MySQL slave_exec_mode 參數說明

背景:

今天無意當中看到參數slave_exec_mode,從手冊里的說明看出該參數和MySQL復制相關,是可以動態修改的變量,默認是STRICT模式(嚴格模式),可選值有IDEMPOTENT模式(冪等模式)。設置成IDEMPOTENT模式可以讓從庫避免1032(從庫上不存在的鍵)和1062(重復鍵,需要存在主鍵或則唯一鍵)的錯誤,該模式只有在ROW EVENT的binlog模式下生效,在STATEMENT EVENT的binlog模式下無效。IDEMPOTENT模式主要用于多主復制和NDB CLUSTER的情況下,其他情況不建議使用。從上面的介紹來看,這個參數的讓從庫跳過指定的錯誤,那問題來了:

1:和sql_slave_skip_counter 比,有什么好處?

2:和 slave-skip-errors = N比,有什么好處?

帶著這2個問題,本文來進行相關的測試和說明。

環境:

MySQL版本:Percona MySQL 5.7

復制模式:ROW,沒有開啟GTID

測試:

① 1062 錯誤:Could not execute ... event on table db.x; Duplicate entry 'xx' for key 'PRIMARY', Error_code: 1062;

主從上的測試表結構:

CREATE TABLE`x` (

`id`int(11) NOT NULLAUTO_INCREMENT,PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

主從上的表記錄:

M:

select * fromx;+----+

| id |

+----+

| 2 |

| 3 |

+----+

2 rows in set (0.01 sec)

S:

select * fromx;+----+

| id |

+----+

| 1 |

| 2 |

| 3 |

+----+

3 rows in set (0.00 sec)

主從上的表記錄本來就不一致了,主上缺少了id=1的記錄。

此時從上的slave_exec_mode為默認的STRICT模式:

show variables like 'slave_exec_mode';+-----------------+--------+

| Variable_name | Value |

+-----------------+--------+

| slave_exec_mode | STRICT |

+-----------------+--------+

1 row in set (0.00 sec)

M上的binlog模式為:

show variables like 'binlog_format'; +---------------+-------+

| Variable_name | Value |

+---------------+-------+

| binlog_format | ROW |

+---------------+-------+

1 row in set (0.00 sec)

在M上執行:

insert into x values(1),(4),(5);

Query OK,3 rows affected (0.00sec)

Records:3 Duplicates: 0 Warnings: 0

因為從上已經存在了id=1的記錄,此時從的復制就報了1062的錯誤:

Last_SQL_Errno: 1062Last_SQL_Error: Couldnot execute Write_rows event on table dba_test.x; Duplicate entry '1' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin-3306.000006, end_log_pos 7124

出現這個錯誤時,大家的一致做法就是執行:sql_slave_skip_counter=N。關于該參數的說明可以看

1、set global sql_slave_skip_counter=N中的N是指跳過N個event2、最好記的是N被設置為1時,效果跳過下一個事務。3、跳過第N個event后,位置若剛好落在一個事務內部,則會跳過這整個事務4、一個insert/update/delete不一定只對應一個event,由引擎和日志格式決定

sql_slave_skip_counter的單位是“event”,很多人認為該參數的單位是“事務”,其實是錯誤的,因為一個事務里包含了多個event,跳過N個可能還是在同一個事務當中。對于上面出現1062的錯誤,把N設置成1~4效果是一樣的,都是跳過一個事務。因為執行的SQL生成了4個event:

show binlog events in 'mysql-bin-3306.000006' from 6950;+-----------------------+------+------------+-----------+-------------+---------------------------------+

| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |

+-----------------------+------+------------+-----------+-------------+---------------------------------+

| mysql-bin-3306.000006 | 6950 | Query | 169 | 7026 | BEGIN |

| mysql-bin-3306.000006 | 7026 | Table_map | 169 | 7074 | table_id: 707 (dba_test.x) |

| mysql-bin-3306.000006 | 7074 | Write_rows | 169 | 7124 | table_id: 707 flags: STMT_END_F |

| mysql-bin-3306.000006 | 7124 | Xid | 169 | 7155 | COMMIT /*xid=74803*/ |

+-----------------------+------+------------+-----------+-------------+---------------------------------+

4 rows in set (0.00 sec)

所以處理該錯誤的方法有:

1:skip_slavesql_slave_skip_counter

stop slave; Query OK, 0 rows affected (0.00sec)set global sql_slave_skip_counter=[1-4];

Query OK,0 rows affected (0.00sec)

start slave;

Query OK,0 rows affected (0.00 sec)

2:在配置文件里指定slave-skip-errors=1062(需要重啟)

這2種方法都能讓復制恢復正常,但是會讓主從數據不一致(謹慎使用),讓從庫丟失了id=4和5的記錄。并且第2種方法還需要重啟數據庫,這時本文介紹的slave_exec_mode參數就派上用場了。在從庫上設置該參數:

set global slave_exec_mode='IDEMPOTENT';

Query OK,0 rows affected (0.00sec)

stop slave; Query OK,0 rows affected (0.00sec)

start slave;

Query OK,0 rows affected (0.00 sec)

同樣在主上執行:

insert into x values(1),(4),(5);

可以驚喜的發現主從數據是同步的,沒有出現復制異常:

M:select * from x; +----+

| id |

+----+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+----+

5 rows in set (0.00sec)

S:select * from x; +----+

| id |

+----+

| 1 |

| 2 |

| 3 |

| 4 |

| 5 |

+----+

5 rows in set (0.01 sec)

上面的測試可以看到,參數設置成slave_exec_mode='IDEMPOTENT' 后,可以跳過出一個錯誤的event。

② 1032錯誤:Could not execute ... event on table db.x; Can't find record in 'x', Error_code: 1032;

這個錯誤的出現是因為ROW模式下的復制,對數據的一致性有了很嚴的要求,具體的可以看MySQL Binlog 【ROW】和【STATEMENT】選擇

主從上的測試表結構:

CREATE TABLE`x` (

`id` int(11) NOT NULLAUTO_INCREMENT,

PRIMARY KEY(`id`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

主從上的表記錄:

M:

select * from x; +----+

| id |

+----+

| 1 |

| 2 |

| 3 |

+----+

3 rows in set (0.00 sec)

S:

select * fromx;

+----+

| id |

+----+

| 1 || 3 |

+----+

2rows in set (0.00 sec)

主從上的表記錄本來就不一致了,從上缺少了id=2的記錄。此時從上的slave_exec_mode為默認的STRICT模式:

show variables like 'slave_exec_mode';

+-----------------+--------+

| Variable_name | Value |

+-----------------+--------+

| slave_exec_mode | STRICT |

+-----------------+--------+

1 row in set (0.00 sec)

M上的binlog模式為:

show variables like 'binlog_format'; +---------------+-------+

| Variable_name | Value |

+---------------+-------+

| binlog_format | ROW |

+---------------+-------+

1 row in set (0.00 sec)

在M上執行:

BEGIN;INSERT INTO x SELECT 4;DELETE FROM x WHERE id = 2;INSERT INTO x SELECT 5;COMMIT;

因為從上不存在了id=2的記錄,此時從的復制就報了1032的錯誤:

Last_SQL_Errno: 1032Last_SQL_Error: Couldnot execute Delete_rows event on table dba_test.x; Can't find record in'x', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin-3306.000006, end_log_pos 12102

同樣的,在上面測試中說明的2種方法可以讓復制正常,但是數據也一樣會丟失。丟失了id=4和5的記錄,繼續在從庫上設置該參數:

set global slave_exec_mode='IDEMPOTENT';

Query OK,0 rows affected (0.00sec)

stop slave; Query OK,0 rows affected (0.00sec)

start slave;

Query OK,0 rows affected (0.00 sec)

在M上執行同樣的操作:

BEGIN;INSERT INTO x SELECT 4;DELETE FROM x WHERE id = 2;INSERT INTO x SELECT 5;COMMIT;

也可以驚喜的發現主從數據是同步的,沒有出現復制異常。

注意:

總結:

對于上面的測試總結,針對slave_exec_mode參數,它可以跳過1062和1032的錯誤,并且不影響同一個事務中正常的數據執行。如果是多個SQL組成的事務,則可以跳過有問題的event。

看著這個參數很不錯,但手冊上說明不建議在普通的復制環境中開啟。對于NDB以外的存儲引擎,只有在確定可以安全地忽略重復鍵錯誤和沒有鍵的錯誤時,才應使用IDEMPOTENT模式。這參數是專門針對NBD Cluster進行設計的,NBD Cluster模式下,該參數只能設置成IDEMPOTENT模式。所以要根據自己的應用場景來決定,正常情況下,主從是一致的,有任何錯誤發生都要報錯,不過在做特殊處理時,可以臨時開啟。

另外在GTID模式下的復制,sql_slave_skip_counter是不支持的,該模式下的復制可以自行測試。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/388914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/388914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#word

主要功能為根據word模板生成word報表文檔,注意引用Interop.Word.dll;首先要生成word程序對象Word.Application app new Word.Application();根據模板文件生成新文件框架File.Copy(TemplateFile, FileName);生成documnet對象ord.Document doc new Word.Document(); 打開…

機器學習kaggle競賽實戰-泰坦尼克號

數據展示 首先登kaggle 下載泰坦尼克訓練相關數據 import pandas as pd import numpy as np data pd.read_csv(train.csv) print(data.shape) print(data.head) train data[:800] test data[800:] print(train.shape) print(test.shape)選擇特征 selected_features [Pcl…

上海大都會 H.A Simple Problem with Integers

題目描述 You have N integers A1, A2, ... , AN. You are asked to write a program to receive and execute two kinds of instructions: C a b means performing Ai (Ai2 mod 2018) for all Ai such that a ≤ i ≤ b.Q a b means query the sum of Aa, Aa1, ..., Ab. Note…

探索性數據分析入門_入門指南:R中的探索性數據分析

探索性數據分析入門When I started on my journey to learn data science, I read through multiple articles that stressed the importance of understanding your data. It didn’t make sense to me. I was naive enough to think that we are handed over data which we p…

用Javascript代碼實現瀏覽器菜單命令(以下代碼在 Windows XP下的瀏覽器中調試通過

每當我們看到別人網頁上的打開、打印、前進、另存為、后退、關閉本窗口、禁用右鍵等實現瀏覽器命令的鏈接,而自己苦于不能實現時,是不是感到很遺憾?是不是也想實現?如果能在網頁上能實現瀏覽器的命令,將是多么有意思的…

mysql程序設計教程_MySQL教程_編程入門教程_牛客網

MySQL 索引MySQL索引的建立對于MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車。拿漢語字典的目錄頁(索引)打比…

學習筆記整理之StringBuffer與StringBulider的線程安全與線程不安全

關于線程和線程不安全: 概述 編輯 如果你的代碼所在的進程中有多個線程在同時運行,而這些線程可能會同時運行這段代碼。如果每次運行結果和單線程運行的結果是一樣的,而且其他的變量的值也和預期的是一樣的,就是線程安全的。或者說…

python web應用_為您的應用選擇最佳的Python Web爬網庫

python web應用Living in today’s world, we are surrounded by different data all around us. The ability to collect and use this data in our projects is a must-have skill for every data scientist.生活在當今世界中,我們周圍遍布著不同的數據。 在我們的…

NDK-r14b + FFmpeg-release-3.4 linux下編譯FFmpeg

下載資源 官網下載完NDK14b 和 FFmpeg 下載之后,更改FFmpeg 目錄下configure問價如下: SLIBNAME_WITH_MAJOR$(SLIBPREF)$(FULLNAME)-$(LIBMAJOR)$(SLIBSUF) LIB_INSTALL_EXTRA_CMD$$(RANLIB)"$(LIBDIR)/$(LIBNAME)" SLIB_INSTALL_NAME$(SLI…

C# WebBrowser自動填表與提交

C# WebBrowser自動填表與提交 默認分類 2007-04-18 15:47:17 閱讀57 評論0 字號:大中小 訂閱 要使我們的WebBrowser具有自動填表、甚至自動提交的功能,并不困難。   假設有一個最簡單的登錄頁面,輸入用戶名密碼,點“登錄”…

html中列表導航怎么和圖片對齊_HTML實戰篇:html仿百度首頁

本篇文章主要給大家介紹一下如何使用htmlcss來制作百度首頁頁面。1)制作頁面所用的知識點我們首先來分析一下百度首頁的頁面效果圖百度首頁由頭部的一個文字導航,中間的一個按鈕和一個輸入框以及下邊的文字簡介和導航組成。我們這里主要用到的知識點就是列表標簽(ul…

C# 依賴注入那些事兒

原文地址:http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 里面有一個例子差了些代碼,補全后貼上。 3.1.3 依賴獲取 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml;//定義…

asp.net core Serilog的使用

先貼上關于使用這個日志組件的一些使用方法,等有時間了在吧官方的文檔翻譯一下吧,現在真是沒時間。 Serilog在使用上主要分為兩大塊: 第一塊是主庫,包括Serilog以及Serilog.AspNetCore,如果導入后一個的話會自動導入前…

在FAANG面試中破解堆算法

In FAANG company interview, Candidates always come across heap problems. There is one question they do like to ask — Top K. Because these companies have a huge dataset and they can’t always go through all the data. Finding tope data is always a good opti…

android webView的緩存機制和資源預加載

android 原生使用WebView嵌入H5頁面 Hybrid開發 一、性能問題 android webview 里H5加載速度慢網絡流量大 1、H5頁面加載速度慢 渲染速度慢 js解析效率 js本身的解析過程復雜、解析速度不快,前端頁面設計較多的js代碼文件 手機硬件設備的性能 機型多,…

mysql springboot 緩存_Spring Boot 整合 Redis 實現緩存操作

摘要: 原創出處 www.bysocket.com 「泥瓦匠BYSocket 」歡迎轉載,保留摘要,謝謝!『 產品沒有價值,開發團隊再優秀也無濟于事 – 《啟示錄》 』本文提綱一、緩存的應用場景二、更新緩存的策略三、運行 springboot-mybatis-redis 工程…

http壓力測試工具及使用說明

http壓力測試工具及使用說明 轉 說明:介紹幾款簡單、易使用http壓測工具,便于研發同學,壓測服務,明確服務臨界值,尋找服務瓶頸點。 壓測時候可重點以下指標,關注并發用戶數、TPS(每秒事務數量&a…

itchat 道歉_人類的“道歉”

itchat 道歉When cookies were the progeny of “magic cookies”, they were seemingly innocuous packets of e-commerce data that stored a user’s partial transaction state on their computer. It wasn’t disclosed that you were playing a beneficial part in a muc…

使用Kubespray部署生產可用的Kubernetes集群(1.11.2)

Kubernetes的安裝部署是難中之難,每個版本安裝方式都略有區別。筆者一直想找一種支持多平臺 、相對簡單 、適用于生產環境 的部署方案。經過一段時間的調研,有如下幾種解決方案進入筆者視野: 部署方案優點缺點Kubeadm官方出品部署較麻煩、不夠…

android webView 與 JS交互方式

webView 與JS交互 Android調用JS代碼的方法有: 通過WebView的loadUrl()通過WebView的evaluateJavascript() 對于JS調用Android代碼的方法有3種: 通過WebView的addJavascriptInterface(&…