亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL中slave_exec_mode參數詳解

2024-07-24 13:15:12
字體:
來源:轉載
供稿:網友

今天無意當中看到參數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 NULL AUTO_INCREMENT, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8

主從上的表記錄:

M:

select * from x;+----+| id |+----+| 2 || 3 |+----+2 rows in set (0.01 sec)

S:

select * from x;+----+| 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.00 sec)Records: 3 Duplicates: 0 Warnings: 0

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

Last_SQL_Errno: 1062Last_SQL_Error: Could not 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.00 sec)set global sql_slave_skip_counter=[1-4];Query OK, 0 rows affected (0.00 sec)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.00 sec)stop slave;                                                                   Query OK, 0 rows affected (0.00 sec)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.00 sec)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模式下的復制,對數據的一致性有了很嚴的要求

主從上的測試表結構:

CREATE TABLE `x` ( `id` int(11) NOT NULL AUTO_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 * from x;+----+| id |+----+| 1 || 3 |+----+2 rows 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: Could not 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.00 sec)stop slave;                                                                   Query OK, 0 rows affected (0.00 sec)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='IDEMPOTENT'不能對DDL操作冪等,并且也不能對字段長度不同導致的錯誤進行冪等,如把例子中的從庫表的id字段類型int改成bigint。并且只能在binlog_format為ROW的模式下使用,而且只能對1032和1062進行冪等模式。

總結:

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

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

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


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97在线免费观看视频| 亚洲电影成人av99爱色| 欧美福利视频网站| 亚洲欧美另类国产| 欧美一级视频在线观看| 国产成人啪精品视频免费网| 久久韩剧网电视剧| 欧美在线性视频| 51精品国产黑色丝袜高跟鞋| xvideos亚洲人网站| 欧美日韩国产影院| 久久免费精品日本久久中文字幕| 欧美日韩爱爱视频| 欧美xxxx综合视频| 一区二区在线视频播放| 久久久噜噜噜久久| 亚洲在线视频观看| 97精品国产aⅴ7777| 中文字幕亚洲专区| 国产美女直播视频一区| 精品小视频在线| 久久精品电影一区二区| 国产午夜精品美女视频明星a级| 亚洲欧美在线x视频| 日韩av电影手机在线观看| 欧洲亚洲妇女av| 91精品国产成人www| 国产精品高潮呻吟久久av野狼| 欧美黄色片在线观看| 欧美午夜激情在线| 中文日韩在线观看| 久久天堂电影网| 播播国产欧美激情| 欧美激情xxxx性bbbb| 姬川优奈aav一区二区| 国产免费一区二区三区在线能观看| 亚洲福利在线视频| 美女啪啪无遮挡免费久久网站| 国产99久久久欧美黑人| 亚洲男人天堂网| 91精品国产乱码久久久久久蜜臀| 91高清免费在线观看| 亚洲老板91色精品久久| 91精品在线播放| 亚洲欧美日韩区| 国产午夜精品一区二区三区| 中文字幕亚洲综合久久| 久久99久国产精品黄毛片入口| 九九视频这里只有精品| 国产欧美日韩高清| 狠狠色狠色综合曰曰| 亚洲午夜色婷婷在线| 在线激情影院一区| 亚洲色图av在线| 久久精品国产视频| 国产精品视频一区二区高潮| 欧美性69xxxx肥| 亚洲精品成人久久电影| 国产精品自产拍在线观看中文| 欧美精品在线视频观看| 国产一区二区日韩| 久久精品最新地址| 国产欧洲精品视频| 欧美一级电影免费在线观看| 久久久国产精品免费| 亚洲综合小说区| 国产美女精彩久久| 亚洲最大福利网| 欧美另类老女人| 高清欧美一区二区三区| 亚洲欧美精品一区二区| 国产成人一区二区三区电影| 亚洲天堂av网| 欧美性xxxx极品高清hd直播| 亚洲精品少妇网址| 久久成年人视频| 欧美成人精品激情在线观看| 在线看片第一页欧美| 亚洲美女性视频| 91精品久久久久久久久久久| 欧美激情国内偷拍| 精品视频久久久久久| 日韩免费在线播放| 日韩欧美中文字幕在线播放| 色综合久久悠悠| 青草青草久热精品视频在线网站| 欧美激情xxxxx| 精品香蕉一区二区三区| 在线观看日韩www视频免费| 色综合久久中文字幕综合网小说| 亚洲欧美精品一区二区| 欧美中文字幕在线观看| 国产精品久久久久久久久借妻| 亚洲free性xxxx护士白浆| 欧美成人激情视频| 国产精品青草久久久久福利99| 日韩视频免费大全中文字幕| 91国产视频在线| 成人精品网站在线观看| 成人在线国产精品| 亚洲综合视频1区| 久久夜色精品亚洲噜噜国产mv| 亚洲精品成人久久| 欧美最顶级的aⅴ艳星| 国产精品中文字幕在线观看| 亚洲精品国产综合久久| 日韩欧美精品中文字幕| 欧美精品久久一区二区| 国产91久久婷婷一区二区| 欧美性极品少妇精品网站| 九九热视频这里只有精品| 最近中文字幕日韩精品| 亚州国产精品久久久| 欧洲精品在线视频| 91久久久久久久久久久久久| 日韩精品视频在线免费观看| 欧美精品在线网站| 国产精品视频免费观看www| 亚洲区一区二区| 奇米成人av国产一区二区三区| 91产国在线观看动作片喷水| 成人激情av在线| 亚洲欧洲午夜一线一品| 久久久久亚洲精品| 日韩中文字幕久久| 这里只有精品视频在线| 亚洲国内高清视频| 欧美一区二区三区免费视| 成人亚洲综合色就1024| 欧美成人午夜免费视在线看片| 国产91久久婷婷一区二区| 91黑丝高跟在线| 亚洲国产欧美日韩精品| 欧美一区视频在线| 国产日韩欧美日韩大片| 日韩美女视频免费在线观看| 国产精品久久久精品| 久久亚洲精品小早川怜子66| 亚洲免费一在线| 久久男人的天堂| 精品国产一区二区三区四区在线观看| 亚洲欧美国产精品专区久久| 欧美高清不卡在线| 国产精品久久久久国产a级| 亚洲欧美日韩中文在线| 亚洲精品国产拍免费91在线| 国产欧美日韩精品丝袜高跟鞋| 一本久久综合亚洲鲁鲁| 欧美裸体xxxx极品少妇| 啊v视频在线一区二区三区| 欧洲成人性视频| 国产aⅴ夜夜欢一区二区三区| 日韩欧美亚洲国产一区| 国产精品99一区| 亚洲欧美在线磁力| 国产精品普通话| 日韩电影中文字幕av| 国产xxx69麻豆国语对白| 欧美日韩国产一区在线| 一区二区三区天堂av| 97国产suv精品一区二区62| 亚洲www在线观看| 国模gogo一区二区大胆私拍| 国产成人涩涩涩视频在线观看|