主从故障排查

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 主从故障排查

如何监控主从状态

$ mysql -S /tmp/mysql3308.sock -e "show slave status \G"
Slave_IO_Running: Yes                # IO线程工作状态:YES、NO、Connecting  
Slave_SQL_Running: Yes               # SQL线程工作状态:YES、NO
Last_IO_Errno: 0                     # IO故障代码:2003,1045,1040,1593,1236
Last_IO_Error:                       # IO线程报错详细信息  
Last_SQL_Errno: 0                    # SQL故障代码:1008,1007
Last_SQL_Error:                      # IO线程报错详细信息

IO线程故障

连接主库失败
user,password,IP,Port,plugin
主库无法连接:网络、宕机、防护墙、最大连接数上限

故障模拟:

(1)主库宕机 
 systemctl stop mysqld3307 
 show slave status\G 
 还原: 
 systemctl start mysqld3307 
 mysql -S /tmp/mysql3308.sock  -e "start slave;" 
(2) 模拟用户密码错误
  mysql -S /tmp/mysql3307.sock  -e "alter user repl@'10.0.0.%' identified by '11212'" 
  mysql -S /tmp/mysql3308.sock  -e "start slave;  show slave status\G " 
 还原: 
   mysql -S /tmp/mysql3307.sock  -e "alter user repl@'10.0.0.%' identified by '123'" 
   mysql -S /tmp/mysql3308.sock  -e "start slave;  show slave status\G " 
(3) 连接数上限
 mysql -S /tmp/mysql3307.sock  -e " set global max_connections=2;" 
 mysql -S /tmp/mysql3307.sock
 mysql -S /tmp/mysql3307.sock
 mysql -S /tmp/mysql3308.sock  -e "stop slave; start slave;  show slave status\G " 
 还原:  
 mysql -S /tmp/mysql3307.sock  -e " set global max_connections=200;" 
 mysql -S /tmp/mysql3308.sock  -e "stop slave; start slave;  show slave status\G "

排查方法:

$ mysql -urepl -p123 -h 10.0.0.51 -P 3300
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.0.51' (111)
$ mysql -urepl -p123 -h 10.0.0.52 -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '10.0.0.52' (113)
$ mysql -urepla -p123 -h 10.0.0.51 -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'repla'@'db01' (using password: YES)
$ mysql -urepl -p1123 -h 10.0.0.51 -P 3307
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'repl'@'db01' (using password: YES)

请求日志

主库日志损坏、缺失。
主从的server_id、Server_uuid相同。

server_id 故障重现:

$ mysql -S /tmp/mysql3307.sock
mysql> set global server_id=8;
$ mysql -S /tmp/mysql3307.sock
mysql> select @@server_id;
$ mysql -S /tmp/mysql3308.sock
mysql> stop slave;start slave;show slave status;

回退:

$ mysql -S /tmp/mysql3307.sock
mysql> set global server_id=7;
$ mysql -S /tmp/mysql3307.sock
mysql> select @@server_id;
$ mysql -S /tmp/mysql3308.sock
mysql> start slave;show slave status;

主库日志损坏故障重现:

$ mysql -S /tmp/mysql3307.sock
mysql> reset master;
$ mysql -S /tmp/mysql3308.sock
mysql> start slave;show slave status;
测试环境处理方法(主从的数据当前是一致的):
$ mysql -S /tmp/mysql3308.sock
# 将所有线程停止。
mysql> stop slave;                
# 将从库复制信息清空(master.info,relay-log.info清空,show slave status看不到信息了)
mysql> reset slave all;  
mysql> CHANGE MASTER TO
  MASTER_HOST='10.0.0.51',
  MASTER_USER='repl',
  MASTER_PASSWORD='123',
  MASTER_PORT=3307,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
mysql> start slave;

生产中需要额外考虑什么情景?

需要重构主从:
    1. 备份恢复.
    2. change master to  ;    start slave

SQL线程故障

SQL线程主要工作:回放relaylog中的日志事件,可以理解为后台执行SQL语句

1. realy-log 损坏。 
处理方法: 重构。
方法1: 备份主库+change master to + start slave;  
方法2: 找到问题点+ change master + start slave;
  思路: 如何找到问题位置点。
    1. 找到SQL已经回放到什么位置了。
    SQL回放的realylog位置点,对应的主库binlog的位置点(relay-log.info)
    Relay_Log_File: db01-relay-bin.000006
    Relay_Log_Pos: 320
    ----》 
    2. 找到主库相应位置点:
    Relay_Master_Log_File: mysql-bin.000001
    Exec_Master_Log_Pos: 600
        3.  change master to  mysql-bin.000001 600
2. 执行SQL出问题?
(1)主从节点配置不一样: 平台、版本、参数、SQL_MODE
  调整成一致。
(2)修改的对象不存在(库、表、用户)
 从库被写入了。 双主架构。异步方式主从,导致数据不一致。
(3)创建的对象已存在(库、表、用户、约束冲突)
 从库被写入了。 双主架构。
方法一:部分场景可以使用,只要保证数据以主库为准即可使用。
stop slave; 
set global sql_slave_skip_counter = 1;
#将同步指针向下移动一个,如果多次不同步,可以重复操作。
start slave;
方法二:不推荐
/etc/my.cnf
slave-skip-errors = 1032,1062,1007

常见错误代码:

1007:对象已存在

1032:无法执行DML

1062:主键冲突,或约束冲突

总结:SQL线程故障规避方法

1. 从库只读 ,读写分离中间件。
2. 不使用双主结构。PXC、MGR替代。
3. 半同步、增强半同步复制等,或者PXC、MGR替代。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
网络协议 测试技术 应用服务中间件
|
9月前
|
SQL 分布式计算 大数据
深度剖析数据中台架构图,铸造数字文明的基石
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
|
存储 Ubuntu 开发工具
在Ubuntu 16.04上安装Git的方法
在Ubuntu 16.04上安装Git的方法
278 0
|
Linux C语言
Linux 下pause函数是如何实现的?
Linux 下pause函数是如何实现的?
312 0
|
存储 监控 NoSQL
RedisSearch与Elasticsearch:技术对比与选择指南
RedisSearch与Elasticsearch:技术对比与选择指南
|
SQL 运维 关系型数据库
记一次 MySQL 主从同步异常的排查记录,百转千回!
这篇文章主要讲述了在 MySQL 主从同步过程中遇到的一个问题,即从库的 SQL 线程因 Relay Log 损坏导致同步停止。作者首先介绍了现象,从库的 Slave_IO_Running 正常,但 Slave_SQL_Running 停止,报错信息提示可能是 binlog 或 relay log 文件损坏。
602 7
|
存储 Kubernetes 安全
kubernetes集群备份与恢复
k8s集群服务所有组件都是无状态服务,所有数据都存储在etcd集群当中,所以为保证k8s集群的安全可以直接备份etcd集群数据,备份etcd的数据相当于直接备份k8s整个集群。
2546 1
|
关系型数据库 MySQL 安全
|
缓存 负载均衡 算法
【Spring Cloud系列】-负载均衡(Load Balancer,LB)
【Spring Cloud系列】-负载均衡(Load Balancer,LB)
2924 1
|
存储 SQL 关系型数据库
MySQL数据库,从入门到精通:第十六篇——MySQL变量、流程控制和游标详解(一)
MySQL数据库,从入门到精通:第十六篇——MySQL变量、流程控制和游标详解
609 0