在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

分析MySQL的slave

121次阅读
没有评论

共计 6507 个字符,预计需要花费 17 分钟才能阅读完成。

这篇文章主要介绍“分析 MySQL 的 slave_skip_errors 参数对 MGR 可用性的影响”,在日常操作中,相信很多人在分析 MySQL 的 slave_skip_errors 参数对 MGR 可用性的影响问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”分析 MySQL 的 slave_skip_errors 参数对 MGR 可用性的影响”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

一、案例描述

MGR 在遇到表不存在的情况下,节点没有退出节点而是爆出一个警告,并且节点状态也正常,警告如下:

2019-10-17T21:16:11.564211+08:00 10 [Warning] Slave SQL for channel 
group_replication_applier : Worker 1 failed executing transaction  aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:8  at master log , end_log_pos 220; 
Error executing row event:  Table  test.a_1  doesn t exist , Error_code: 1146

集群状态如下:

[[email protected]][test] select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 9fd479bb-f0d8-11e9-9381-000c29105312 | mysql_1 | 3306 | ONLINE |
| group_replication_applier | a8833a96-f0d8-11e9-a9f4-000c291fd9a5 | mysql_2 | 3306 | ONLINE |
| group_replication_applier | b2968fe2-f0d8-11e9-a8ff-000c29c89e42 | mysql_3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

当时觉得很奇怪,我们知道这种错误即便是在主从情况下也是报错的 SQL 线程退出的,MGR 居然还能在线,这种情况数据已经不同步了,应该报错并且剔除节点才对。

二、问题分析

随即一些感兴趣的同学马上进行了测试,测试结果和上面不一致,测试结果是报错而不是出警告如下:

2019-10-17T09:16:34.317542Z 84 [ERROR] Slave SQL for channel
  group_replication_applier : Error executing row event:
  Table  test.emp1  doesn t exist , Error_code: 1146

并且这种情况表不存在的节点已经被剔除掉了。下面是正常情况的节点状态:

secondary 1 节点:[[email protected]][test] select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | a8833a96-f0d8-11e9-a9f4-000c291fd9a5 | mysql_2 | 3306 | ERROR |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)
secondary 2 节点:[[email protected]][test] select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | b2968fe2-f0d8-11e9-a8ff-000c29c89e42 | mysql_3 | 3306 | ERROR |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
1 row in set (0.00 sec)

那么疑问就是为什么同样是 MGR 一个是警告一个是错误呢,并且前者还能处于正常同步状态。不错看到题目就知道这里和 slave_skip_errors 参数有关。

三、测试模拟

我们知道再 Master-Slave 中如果遇到从库表不存在肯定是报错的,除非设置 slave_skip_errors 参数,当然我在线上重来没有设置过这个参数,并且通过这个案例我们发现本参数对 MGR 也有影响,如下测试方法:

我们在 3 个节点都开启 slave-skip-errors= ddl_exist_errors

如下图:

然后搭建 3 节点 single-primary 模式的 MGR 集群。

集群搭建正常。

然后执行如下操作:

[[email protected]][(none)] set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)
[[email protected]][(none)] create table test.a_1(id bigint auto_increment primary key,name varchar(20));
Query OK, 0 rows affected (0.01 sec)
[[email protected]][(none)] set sql_log_bin=1;
Query OK, 0 rows affected (0.00 sec)

此时 primary 节点是有 a_1 表的,但是因为 binlog 关闭的原因,两个 secondary 节点是不存在 a_1 表的。

然后我们插入数据:

[[email protected]][test] insert into test.a_1 values(null, tom 
Query OK, 1 row affected (0.02 sec)

此时,primary 节点因为存在 a_1 表,所以能够插入,但是两个 secondary 节点不存在 a_1 表,所以插入是失败的。数据产生不一致。正常情况下这种数据不一致会导致 2 个 secondary 节点被提出集群才对。但是实际上 3 个节点都是正常的,集群并没有失效。

[[email protected]][test] select * from test.a_1;
+----+------+
| id | name |
+----+------+
| 1 | tom |
+----+------+
1 row in set (0.00 sec)
[[email protected]][test] select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
| group_replication_applier | 9fd479bb-f0d8-11e9-9381-000c29105312 | mysql_1 | 3306 | ONLINE |
| group_replication_applier | a8833a96-f0d8-11e9-a9f4-000c291fd9a5 | mysql_2 | 3306 | ONLINE |
| group_replication_applier | b2968fe2-f0d8-11e9-a8ff-000c29c89e42 | mysql_3 | 3306 | ONLINE |
+---------------------------+--------------------------------------+-------------+-------------+--------------+
3 rows in set (0.00 sec)

此时去 2 个 secondary 节点读取 test.a_1 表,表是不存在的。

secondary 1:[[email protected]][test] select * from test.a_1;
ERROR 1146 (42S02): Table  test.a_1  doesn t exist
[[email protected]][test] 
secondary 2:[[email protected]][test] select * from test.a_1;
ERROR 1146 (42S02): Table  test.a_1  doesn t exist

error log 输出信息:(set global log_error_verbosity = 3;)

2019-10-17T21:16:11.564211+08:00 10 [Warning] Slave SQL for channel
  group_replication_applier : Worker 1 failed executing transaction  aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:8  at master log , 
end_log_pos 220; Error executing row event:  Table  test.a_1  doesn t exist , Error_code: 1146

四、slave_skip_errors 源码生效点

这个设置在 Rows_log_event::do_apply_event 函数中生效,也就是 DML Event 开始应用的时候生效,这是常规的 SQL 线程(或者 Worker 线程)调用的。

#ifdef HAVE_REPLICATION
 if (opt_slave_skip_errors)
 add_slave_skip_errors(opt_slave_skip_errors);
#endif
if (open_and_lock_tables(thd, rli- tables_to_lock, 0))// 打开表
 { uint actual_error= thd- get_stmt_da()- mysql_errno();
 if (thd- is_slave_error || thd- is_fatal_error) 
 { if (ignored_error_code(actual_error)) // 这里受到  slave_skip_errors  参数控制  ignored_error_code 会将 slave_skip_errors 的参数设置读取出来
 { if (log_warnings   1)
 rli- report(WARNING_LEVEL, actual_error,
  Error executing row event:  %s ,
 (actual_error ? thd- get_stmt_da()- message_text() :
  unexpected success or fatal error ));
 thd- get_stmt_da()- reset_condition_info(thd);
 clear_all_errors(thd, const_cast Relay_log_info* (rli));
 error= 0;
 goto end;
 }
 else
 {
 rli- report(ERROR_LEVEL, actual_error,
  Error executing row event:  %s ,
 (actual_error ? thd- get_stmt_da()- message_text() :
  unexpected success or fatal error ));
 thd- is_slave_error= 1;
 const_cast Relay_log_info* (rli)- slave_close_thread_tables(thd);
 DBUG_RETURN(actual_error);
 }
 }

可以看到 MGR 的执行逻辑受到了该参数的影响。

到此,关于“分析 MySQL 的 slave_skip_errors 参数对 MGR 可用性的影响”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-26发表,共计6507字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 亚洲天堂免费在线视频 | 亚洲av无码专区国产乱码不卡 | 香港aa三级久久三级老师 | 免费国产成人高清在线电影 | 国产精品视频福利视频网 | 无人精品乱码一区二区三区 | 亚洲欧美精品成人久久91 | 中国孕妇变态孕交xxxx | 国产婷婷色综合成人精品 | 亚洲综合图色国模40p | 久久久久久噜噜噜久久久精品 | 成人国内精品视频在线观看 | 肉色欧美久久久久久久免费看 | 分享一个无毒不卡免费国产 | 精品视频亚洲 | 看黄网站在线 | 做a免费视频 | 欧美日韩一二三 | 九九九精品午夜在线观看 | 国产丰满老熟妇乱xxx1区 | 一本大道久久香蕉成人网 | 国产麻豆媒一区一区二区三区 | 国产精品视频久久久久 | 青青青久热国产精品视频 | 亚洲成av人片天堂网 | 国产午夜亚洲精品久久www | 色香欲综合成人免费视频 | 亚洲欧洲一区二区 | 午夜爱爱毛片xxxx视频免费看 | 日韩精品乱码av一区二区 | 美女视频黄频a免费 | 国产欧美综合一区二区三区 | 亚洲精品卡2卡3卡4卡5卡区 | 疯狂添女人下部视频免费 | 日韩一品在线播放视频一品免费 | 在线观看视频福利 | 日本欧美韩国一区二区三区 | a一级免费 | 高潮迭起av乳颜射后入 | 新版资源天堂中文 | 亚洲欧美另类激情综合区蜜芽 |