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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA高并发编程「建议收藏」

    JAVA高并发编程「建议收藏」synchronized关键字同步方法同步代码块锁的底层实现锁的种类volatile关键字wait¬ifyAtomicXxx类型组CountDownLatch门闩锁的重入ReentrantLock同步容器Map/SetListQueueThreadPool&amp;ExecutorExecutorExecutorServiceFuture…

    2022年5月19日
    35
  • git版本控制和git基本操作[通俗易懂]

    git版本控制和git基本操作[通俗易懂]git版本控制和git基本操作

    2022年4月24日
    41
  • html2canvas, JsPDF生成pdf

    html2canvas, JsPDF生成pdf创建 pdf js 引入依赖 importVuefro vue importhtml2c html2canvas importJsPDFf jspdf constPDF PDF install function Vue options targetDom 需要打印的 dom 对象 name pdf 的名字 callback 回调函数 Vue prototype create

    2025年7月12日
    3
  • modbus协议讲解及实现_通俗易懂近义词

    modbus协议讲解及实现_通俗易懂近义词什么是协议在了解什么是Modbus之前,我们先来看下什么是协议协议是一个汉语词汇,读音为xiéyì,意思是共同计议,协商;经过谈判、协商而制定的共同承认、共同遵守的文件。简单地说,在我们的单片机之间互相通信,以及单片机和上位机通信中,规定了不同的内容规范,这个规范是通信的双方都需要遵守的,这样就可以实现两者的通信。而这个协议规范可以有很多种,来适应不同的设备以及通信要求等,我们常见的就有IICSPIUART串口通信协议等等。而Modbus也是一个串行通信协议。什么是RS-485RS-2

    2022年10月9日
    2
  • 有关ViewPager使用及解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题

    有关ViewPager使用及解决ViewPager和PagerAdapter中调用notifyDataSetChanged失效问题ViewPager是android-support-v4.jar包中的一个系统控件,继承自ViewGroup,专门用以实现左右滑动切换View的效果,使用时需要首先在Project->properties->JavaBuildPath->Libraries->AddExternalJars中加入sdk目录下的extras/android/support/v4/android-support

    2022年7月22日
    9
  • Timer时间控件

    Timer时间控件第一步、创建一个Windows窗体,第二步、创建样式,在工具箱中找到TextBox和Labell、Button、timer。第三步、改变属性的Name和Text(就是改写名称)第四步、排版按钮1:使用的控制器是Label;name改为lblTime2:使用的控制器是TextBox;Name改为txtTime3:使用的控制器是Button;Name改为btnGet4…

    2022年5月23日
    51

发表回复

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

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