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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云防火墙,500元 1000GB
简介: 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把主库的库表数据直接导出来然后放到从库上在导入
使得让他们两个数据尽量一致,差异缩小,这样不耽误也不耽误主库的运行无非就是可能那一段时间的数据从上没有 等搭建好了在导入一次备份就好了。

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
26天前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
146 0
|
8天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
113 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
8天前
|
缓存 NoSQL 关系型数据库
Redis和Mysql如何保证数据⼀致?
在项目中,为了解决Redis与Mysql的数据一致性问题,我们采用了多种策略:对于低一致性要求的数据,不做特别处理;时效性数据通过设置缓存过期时间来减少不一致风险;高一致性但时效性要求不高的数据,利用MQ异步同步确保最终一致性;而对一致性和时效性都有高要求的数据,则采用分布式事务(如Seata TCC模式)来保障。
41 14
|
11天前
|
SQL 前端开发 关系型数据库
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
SpringBoot使用mysql查询昨天、今天、过去一周、过去半年、过去一年数据
42 9
|
22天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
19天前
|
SQL 关系型数据库 MySQL
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
定时任务频繁插入数据导致锁表问题 -> 查询mysql进程
38 1
|
20天前
|
SQL 关系型数据库 MySQL
mysql数据误删后的数据回滚
【11月更文挑战第1天】本文介绍了四种恢复误删数据的方法:1. 使用事务回滚,通过 `pymysql` 库在 Python 中实现;2. 使用备份恢复,通过 `mysqldump` 命令备份和恢复数据;3. 使用二进制日志恢复,通过 `mysqlbinlog` 工具恢复特定位置的事件;4. 使用延迟复制从副本恢复,通过停止和重启从库复制来恢复数据。每种方法都有详细的步骤和示例代码。
|
分布式计算 关系型数据库 MySQL
E-Mapreduce如何处理RDS的数据
目前网站的一些业务数据存在了数据库中,这些数据往往需要做进一步的分析,如:需要跟一些日志数据关联分析,或者需要进行一些如机器学习的分析。在阿里云上,目前E-Mapreduce可以满足这类进一步分析的需求。
4971 0
|
9天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
24 4
|
7天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
23 1