好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > MySQL中slave_exec_mode參數詳解

MySQL中slave_exec_mode參數詳解

熱門標簽:甘孜電話機器人廠家 哈爾濱crm外呼系統價格 凱立德科技館地圖標注 做地圖標注都需要什么工具 西安400電話在哪里辦理 銀川電銷外呼系統定制 中科嘉智人工智能電銷機器人 電銷機器人好品牌門薩維l 上海智能外呼系統需要多少錢

今天無意當中看到參數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: 1062
Last_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個event
2、最好記的是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: 1032
Last_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同步問題之Slave延遲很大優化方法
  • 解決MySQL中的Slave延遲問題的基本教程
  • MySQL中slave監控的延遲情況分析
  • mysql 主從數據不一致,提示: Slave_SQL_Running: No 的解決方法
  • 記一次MySQL Slave庫恢復實戰記錄
  • Mysql主從數據庫(Master/Slave)同步配置與常見錯誤
  • MySQL5.6 數據庫主從同步安裝與配置詳解(Master/Slave)
  • MySQL Slave 觸發 oom-killer解決方法
  • MySQL slave 延遲一列 外鍵檢查和自增加鎖

標簽:浙江 平頂山 四川 濮陽 安康 安徽 山南 那曲

巨人網絡通訊聲明:本文標題《MySQL中slave_exec_mode參數詳解》,本文關鍵詞  MySQL,中,slave,exec,mode,參數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL中slave_exec_mode參數詳解》相關的同類信息!
  • 本頁收集關于MySQL中slave_exec_mode參數詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 91无码Av影院在线观看| 日本免费成人网| bdsm中国精品调教| ktv鸭子男同吃吊视频| 萱萱影院| 极品撕开美女衣服| 狠狠色伊人久久精品综合网| 亚洲天砖砖区免费| 中文字幕av人妻少妇无码| 可以看的毛片| 国产乱XX乂XXX交| 国产福利片在线观看| 多男一女np超h文| 狠狠色噜噜狠狠狠狠2022| 原神琳妮特被扒下裤子打屁股| 日本午夜精品视频在线观看| 我从不忠截取的一段画面| 国产精品亚洲精品午夜| 校花系列h| 日本熟妇无码亚洲成a人片在线| 久久国产成人精品国产成人亚洲 | 亚洲美女自拍视频| 日本VR无码视频在线播放网站| 91九色国产porny| 欧美性稚交6-12| 大胸喷奶水www观看软件| 国产精品xxxxbbbb18| 久久精品免费i国产| 成品源码78w78| 国产又粗又硬又长又爽的演员 | 婷婷综合久久狠狠色99h| 一区二区在线大桥未久播放| 韩国漫画被黄漫免费网站| 成人h视频在线观看| 国产成人久久久日韩美女网站直播| 国产妇女偷人视频大全| jessejanevideoxxx| 网曝热门事件吃瓜黑科技| 久久久久久精品无码日本蜜乳| 轻点你的太大了弄得我疼| 一前一后两根双龙|