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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/101942.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • list的splice方法[通俗易懂]

    list的splice方法[通俗易懂]#include#includeusingnamespacestd;intmain(){std::listmylist1,mylist2;std::list::iteratorit;//setsomeinitialvalues:for(inti=1;i<=4;++i)mylist1.push_back(i);

    2022年9月24日
    0
  • 经常使用的DB2命令(2)

    经常使用的DB2命令(2)

    2022年1月28日
    40
  • kfold交叉验证_SPSS交叉验证法

    kfold交叉验证_SPSS交叉验证法一、前言在机器学习建模过程中,通行的做法是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训

    2022年9月20日
    0
  • 如何生成Android的keystore文件

    如何生成Android的keystore文件

    2021年10月1日
    50
  • 怎么更改wifi频段_【wifi信号频率】wifi频率怎么设置 wifi2.4g和5g哪个更好[通俗易懂]

    怎么更改wifi频段_【wifi信号频率】wifi频率怎么设置 wifi2.4g和5g哪个更好[通俗易懂]wifi频率怎么设置1、打开浏览器,输入192.168.1.1,进入路由设置界面。2、单击左侧的设置向导,然后单击下一步。3、一般情况,选择让路由器自动选择上网方式。4、输入你从运营商那里获得上网账号、密码。5、弹出无线频段选择界面,可按自己的需求进行选择,6、然后设置无线密码即可!wifi2.4g和5g哪个更好2.4gwifi:2.4G信号频率低,在空气或障碍物中传播时衰减较小,传播距离更远。…

    2022年10月20日
    0
  • Spring是如何解决循环依赖问题的及三级缓存的作用

    Spring是如何解决循环依赖问题的及三级缓存的作用前置知识 所谓的三级缓存只是三个可以当作是全局变量的 Map Spring 的源码中大量使用了这种先将数据放入容器中等使用结束再销毁的代码风格 Spring 的初始化过程大致有四步我们说的循环依赖就是第四步在给 Bean 属性注入的时候发生的一个问题循环依赖就是 假设有两个类 A 和 B A 中需要注入 B B 中需要注入 A 由于 A 注入 B 时 B 没有创建 B 创建时 A 也无法创建导致的死循环问题我们都知道 AOP 是 Spring 的一个重要核心思想 其实现就是根据动态代理来实现的 也就是说我们的 Bean 其实很大概率都是要生成代理类 让

    2025年6月12日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号