iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >分析MySQL的slave_skip_errors参数对MGR可用性的影响
  • 288
分享到

分析MySQL的slave_skip_errors参数对MGR可用性的影响

2024-04-02 19:04:59 288人浏览 泡泡鱼
摘要

这篇文章主要介绍“分析Mysql的slave_skip_errors参数对MGR可用性的影响”,在日常操作中,相信很多人在分析mysql的slave_skip_errors参数对MGR可用性的影响问题上存在

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

一、案例描述

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

集群状态如下:

[root@mysql.sock][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节点:
[root@mysql.sock][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节点:
[root@mysql.sock][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

如下图:

分析MySQL的slave_skip_errors参数对MGR可用性的影响

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

分析MySQL的slave_skip_errors参数对MGR可用性的影响

集群搭建正常。

然后执行如下操作:

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

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

然后我们插入数据:

[root@mysql.sock][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个节点都是正常的,集群并没有失效。

[root@mysql.sock][test]>select * from test.a_1;
+----+------+
| id | name |
+----+------+
|  1 | tom  |
+----+------+
1 row in set (0.00 sec)
[root@mysql.sock][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:
[root@mysql.sock][test]>select * from test.a_1;
ERROR 1146 (42S02): Table 'test.a_1' doesn't exist
[root@mysql.sock][test]>
secondary 2:
[root@mysql.sock][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可用性的影响”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 分析MySQL的slave_skip_errors参数对MGR可用性的影响

本文链接: https://www.lsjlt.com/news/63424.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 分析MySQL的slave_skip_errors参数对MGR可用性的影响
    这篇文章主要介绍“分析MySQL的slave_skip_errors参数对MGR可用性的影响”,在日常操作中,相信很多人在分析MySQL的slave_skip_errors参数对MGR可用性的影响问题上存在...
    99+
    2024-04-02
  • MySQL连接数对数据库性能的影响分析
    MySQL连接数对数据库性能的影响分析 随着互联网应用的不断发展,数据库成为了支撑应用系统重要的数据存储和管理工具。在数据库系统中,连接数是一个重要的概念,它直接关系到数据库系统的性能...
    99+
    2024-04-02
  • C++ 函数默认参数和可变参数对程序性能的影响
    默认参数在编译时展开,不影响运行时性能;可变参数会产生运行时开销,应避免密集使用。 C++ 函数默认参数和可变参数对程序性能的影响 默认参数 默认参数允许函数在不传递实际参数的情况下指...
    99+
    2024-04-22
    程序性能 函数参数 c++
  • PHP 函数对项目性能的影响分析
    php 函数使用不当会显著影响项目性能,主要体现在内存消耗、处理时间和 i/o 操作。最佳实践包括:选择合适函数(时间和内存复杂度);避免嵌套函数(内存消耗);缓存结果(减少重复执行);...
    99+
    2024-04-13
    性能 php 重构代码 冒泡排序
  • GO反射对性能的影响分析
    目录写在前面代码性能分析写在后面写在前面 今天在公司写了一段代码,判断一个变量是否为空值,由于判断的类型太少,code review的时候同事说还有很多类型没有考虑到,并且提到有没...
    99+
    2023-01-06
    GO 反射性能分析 GO 反射
  • PHP 函数的参数传递方式对代码可读性和可维护性的影响?
    PHP 函数的参数传递方式对代码可读性和可维护性的影响 PHP 中的参数传递有两种方式:传值和传引用。理解这两种方式之间的差异对于编写可读、可维护的代码至关重要。 传值 原理:函数...
    99+
    2024-04-15
    php 可读性 代码可读性
  • 数据类型对 ASP 程序性能的影响分析
    ASP(Active Server Pages)是一种基于服务器端的动态网页技术,它使用VBScript或JScript等脚本语言来创建动态内容。在ASP程序中,数据类型的选择对程序的性能有着重要的影响。本文将对数据类型对ASP程序性能的影...
    99+
    2023-11-12
    并发 数据类型 编程算法
  • 分析overflow属性对网页展示的影响
    解析overflow属性对网页显示的影响,需要具体代码示例 在网页设计和开发中,经常会遇到元素内容超出容器宽度或高度的情况。这时,我们可以使用CSS的overflow属性来控制溢出内容的显示方式。overflow属性有四个可能的...
    99+
    2024-01-29
    影响 解析 Overflow
  • 对MySQL性能影响关系紧密的配置参数有哪些
    这篇文章主要介绍对MySQL性能影响关系紧密的配置参数有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! (一)连接 连接通常来自Web 服务器,下面列出了一些与连接有关的参数...
    99+
    2024-04-02
  • mysql索引对排序的影响实例分析
    本文实例讲述了mysql索引对排序的影响。分享给大家供大家参考,具体如下: 索引不仅能提高查询速度,还可以添加排序速度,如果order by 后面的语句用到了索引,那么将会提高排序的速度。 测试 1、创建测...
    99+
    2024-04-02
  • mysql事务对效率的影响分析总结
    1、数据库事务会降低数据库的性能。为了保证数据的一致性和隔离性,事务需要锁定事务。 2、如果其他事务需要操作这部分数据,必须等待最后一个事务结束(提交,回滚)。 实例 creat...
    99+
    2024-04-02
  • 分析CSS回流和重绘对性能的影响
    了解CSS回流和重绘对性能的影响,需要具体代码示例 CSS回流和重绘是网页性能优化中非常重要的概念,合理使用CSS可以减少页面的回流和重绘,提高页面渲染速度。本文将介绍CSS回流和重绘的概念以及如何避免它们对性能的影响,并提供具...
    99+
    2024-01-26
    CSS 重绘 回流
  • PHP静态化对网站性能的影响分析
    PHP静态化对网站性能的影响分析 随着互联网的迅速发展,网站的性能优化变得愈发重要。其中,PHP静态化技术是一种有效的手段,可以提高网站的性能和用户体验。本文将对PHP静态化对网站性能...
    99+
    2024-03-05
    php 网站性能 静态化
  • 索引对数据库查询性能的影响:深入分析
    索引是数据库中用于加速数据检索的数据结构,它通过对表中的特定列进行排序和组织,从而快速定位符合查询条件的行。索引对数据库查询性能的影响主要表现在以下方面: 1. 查询时间优化 快速查询:索引允许数据库直接跳到包含匹配数据的表部分,而不需...
    99+
    2024-03-15
    数据库索引
  • PHP 函数对提高代码可读性和可维护性的影响
    使用 php 函数可以提升代码可读性和可维护性。函数优势包括:可重用性:避免重复代码。模块化:将代码细分为易于管理的块。可维护性:轻松修改特定功能。代码可读性:命名函数块,提高代码描述性...
    99+
    2024-04-13
    php 代码可读性
  • 怎么使用MySQL中的character_set_server影响参数
    这篇文章主要讲解了“怎么使用MySQL中的character_set_server影响参数”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用MySQL中...
    99+
    2024-04-02
  • C++ 函数参数传递方式对程序性能的影响
    在 c++++ 中,函数参数可以通过值传递(创建副本传递给函数)或引用传递(传递原始变量的地址)。值传递安全但开销大,适用于小型参数或需要保护原始变量的情况。引用传递速度快但灵活性低,适...
    99+
    2024-04-13
    c++ 函数参数传递
  • Golang中可用的同步机制对性能的影响
    在Golang中,可用的同步机制主要有锁、条件变量、通道和原子操作。不同的同步机制对性能的影响是不同的。1. 锁:在并发编程中,锁是...
    99+
    2023-10-20
    Golang
  • MySQL性能参数的示例分析
    这篇文章主要介绍MySQL性能参数的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过...
    99+
    2024-04-02
  • golang函数命名约定对代码可读性的影响
    遵循 go 中的函数命名约定可显著提高代码可读性。这些约定包括:使用动词或动名词描述函数操作。采用帕斯卡命名法命名参数、局部变量和函数。使用小写前缀表示私有函数。使用后缀指定函数返回类型...
    99+
    2024-05-01
    命名约定 golang 代码可读性
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作