MySQL生产环境主从关系数据不同步

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL生产环境主从关系数据不同步

故障现象:两个数据库数据大小不一致,主从有问题,我重新建立主从关系后从的IO和SQL线程状态都是yes但是不同步数据。

首先这个是生产环境已经投入使用的,不可能换主的数据库,不能线上终止业务
这两个数据库MySQL都是运行在docker容器内的,主库重启也要报备一下

排查步骤:
主的话可以使用:
查看主库状态:

mysql> show master status;
+---------------+----------+--------------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB       | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------------+------------------+-------------------+
| master.000011 |      733 | ceair,ceair_zipkin |                  |                   |
+---------------+----------+--------------------+------------------+-------------------+
1 row in set (0.00 sec)
 Binlog_Do_DB:限制同步数据库在主配置文件中添加设置

主上查看从的连接信息

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|         2 |      | 3306 |         1 | bc702520-0f77-11eb-9263-0242ac110002 |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)
#如果没有反馈server_id,slave_UUID等信息也可以判定没有主从关系
如果有的话也要去看一下从的状态对不对

从的话可以使用:

mysql>show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.20
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master.000011
          Read_Master_Log_Pos: 733
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 495
        Relay_Master_Log_File: master.000011
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
           Replicate_Do_DB: ceair,ceair_zipkin   #限制同步数据库在从配置文件中添加设置
          Replicate_Ignore_DB: 

以上是我重新建立的主从关系,从状态上可以看出没有什么问题,并且我在从上重新导入了一份主库的数据库包括数据表,使主从数据差异缩小,我尝试在主上指定的ceair库中新建立一个表但是不同步,主从复制数据还是有问题,上图中可以看出只复制ceair和ceair_zipkin库,在主ceair里面创建新的也没用,也是比较困扰我的,毕竟都是yes状态还不复制确实蒙蔽,相信遇见问题的你也是一样的现在开始慢慢排查
1.都是yes首先连接性可以保证了没有问题都是通的,防火墙也没问题
2.现状就是在状态ok下~主从不同步数据,按照指定的库去创建也不管用
网上的方法众多但不是我想要的
例如:解决:
stop slave;

表示跳过一步错误,后面的数字可变

set global sql_slave_skip_counter =1;
start slave;
之后再用mysql> show slave status\G 查看:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
对于我这个问题没啥用我也不是连接的问题 我都是yes
因为是线上的数据库不好做其他停止之类的操作,影响线上运行!
我就把线上的mysql镜像我导出放到我自己的虚拟机中模拟了生产环境的一套一摸一样的主从环境
导出命令
docker save -o 存放路径/包名字 镜像名字
导入命令
docker load < 包名字
搭建环境我就不说了
当我尝试重新建立主从关系然后进行在主建立表还是不复制状态如生产环境一样没问题都是yes
令我苦恼
于是我就在我的测试环境用自己的pull的镜像做了一下主从都用新的
docker pull mysql:5.6
环境比较干净,没有正式环境配置的那么多参数,也没有写限制的数据库语句,按照自己搭建主从的方式做了一遍没问题主从能复制
不能直接断定是镜像的问题 毕竟生产环境换镜像换数据库不可能的
我就慢慢试验我主库的镜像还原到旧镜像 从换成新的镜像还是不能复制,
我就感觉可能是配置文件有什么东西限制了
我是看的docker inspect mysql查看了容器的详细信息 看到了它挂载路径

    "Mounts": [
        {
            "Type": "bind",
            "Source": "/app/mysql/config",
            "Destination": "/etc/mysql/conf.d",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        },
        {
            "Type": "bind",
            "Source": "/app/mysql/data",
            "Destination": "/var/lib/mysql",
            "Mode": "",
            "RW": true,
            "Propagation": "rprivate"
        }

可以看出容器内的路径是放配置文件的地方映射到了宿主机上
我在宿主机上查看配置文件
主:
[root@localhost config]# cat docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve
max_allowed_packet = 256M
max_connections = 1500
lower_case_table_names=1
character-set-server=utf8
wait_timeout=2073600
interactive_timeout=388000
log-bin=master
server-id=1
log-slave-updates = true
binlog-do-db=ceair,ceair_zipkin
从:
[mysqld]
skip-host-cache
skip-name-resolve
max_allowed_packet = 256M
max_connections = 1500
lower_case_table_names=1
character-set-server=utf8
wait_timeout=2073600
interactive_timeout=388000
explicit_defaults_for_timestamp=true
log-bin=slave
server-id=2
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
replicate_do_db:ceair,ceair_zipkin
没有遇见过类似的问题一般看不出来问题,如果你到现在没看出什么问题那就继续往下看你就明白了
我自己做的干净环境中没有配置限制同步数据库的语句 就没问题
正式环境就有问题,测试中到这里我也没发觉是配置文件的问题,感觉主从上配置文件也应该没啥问题
我就尝试在我自己干净环境中加入相同的语句:主配置文件中添加
binlog-do-db=ceair(这个时候我只添加了一个限制同步库测试没问题)这个就疑惑了昂
不能偷懒我就在添加一个库binlog-do-db=ceair,ceair_zipkin
然后重启容器查看主状态

mysql> show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
master.000011 733 ceair,ceair_zipkin

1 row in set (0.00 sec)
我尝试主上新建立ceair但是发现并没有同步,不写那个参数就没问题,或者只写一个ceair没问题,写两个就不行了,这个时候我就感觉是配置文件的问题,我百度了一下各个配置参数的解释以及语法
最后发现是binlog-do-db这条限制的语法出了问题 让我我绕了一大圈

主从数据同步中限制哪些数据库复制参数的正确语法:

这个是主库配置文件举例,从库配置文件相同解决,配置文件参数语法问题

binlog-do-db=ceair
binlog-do-db=ceair_zipkin
如果多个库限制就如上进行配置。复制多个参数,绝对不能像线上环境中binlog-do-db=1,2,3,4
逗号隔开虽说重启容器不会报错但是真的会影响主从数据复制 并不识别这样的语法
查看主的状态可以看出虽然状态一致但是错误的语句就是不同步数据
mysql> show master status;
File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
master.000011 733 ceair,ceair_zipkin

1 row in set (0.00 sec)
再次尝试创建ceair库和ceair_zipkin没问题同步了

划重点:更改配置文件之后记得重启数据库,让mysql重新读取数据。重新建立一下主从关系,

从:stop slave;

    reset slave;

主:重新授权一次用于允许从库连接的用户名密码语句
从:进行连接记住主的show master status;file名字和pos位置
确保show slave status\G #IO 、SQL线程状态都是YES

### 以上内容只是我个人遇见的生产环境的问题,希望可以帮助遇到相同问题的人 &&配置文件参数语法问题

这里需要说的是如果你的IO线程状态为connecting或no可能证明你的防火墙有问题
查看一下防火墙规则,放行端口要不就把防火墙关闭
systemctl stop firewalld
关闭防火墙之后
docker restart mysql
当我要重启数据库的时候会报错iptables等一些报错
不要慌。。。不是啥大问题 重启一下docker
systemctl restart docker.service
再次重启的时候就不会报错了

如果你的防火墙没问题了,状态还是no或者不同步,也有可能是你的数据差异比较大,毕竟数据库是正式环境主库是投入使用的 ,你重新建立的主从关系master日志里面和你的pos位置,不存在现在主库已有的当时创建数据库和表的sql语句,必须你在从库上也要有相同的库和表才能进行同步成功

划重点:一定要注意主从重新搭建之后。生产环境确保主库的库和表在从上必须也要有 要不然数据往哪里同步呢???

我是用mysqldump把主库的库表数据直接导出来然后放到从库上在导入
使得让他们两个数据尽量一致,差异缩小,这样不耽误也不耽误主库的运行无非就是可能那一段时间的数据从上没有 等搭建好了在导入一次备份就好了。

千万不能在主库锁表,这样生产环境会出问题

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
8天前
|
Java 关系型数据库 MySQL
JDBC实现往MySQL插入百万级数据
JDBC实现往MySQL插入百万级数据
|
8天前
|
运维 DataWorks 关系型数据库
DataWorks产品使用合集之DataWorks还有就是对于mysql中的表已经存在数据了,第一次全量后面增量同步的步骤如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
26 2
|
1天前
|
存储 关系型数据库 MySQL
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
本篇文章来讨论MySQL字段的字符类型选择并深入实践char与varchar类型的区别以及在千万数据下的性能测试
MySQL字段的字符类型该如何选择?千万数据下varchar和char性能竟然相差30%🚀
|
1天前
|
关系型数据库 MySQL 数据管理
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
MySQL通过 bin-log 恢复从备份点到灾难点之间数据
|
6天前
|
关系型数据库 MySQL 数据库
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
【MySQL-10】DCL-数据控制语言-【管理用户&权限控制】 (语法语句&案例演示&可cv案例代码)
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL-7】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)
【MySQL-7】DML的表操作详解:添加数据&修改数据&删除数据(可cv例题语句)
|
6天前
|
SQL 关系型数据库 MySQL
【MySQL-1】理解关系型数据库&数据的数据模型
【MySQL-1】理解关系型数据库&数据的数据模型
|
8天前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之DataWorks在同步mysql时报错Code:[Framework-02],mysql里面有个json类型字段,是什么原因导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
26 0
|
8天前
|
缓存 关系型数据库 MySQL
mysql用in查询大量数据的方法
在MySQL中使用 IN 子句来查询大量数据时,性能可能会成为一个问题
|
8天前
|
SQL Java 关系型数据库
JDBC批量插入mysql数据
JDBC批量插入mysql数据