故障现象:两个数据库数据大小不一致,主从有问题,我重新建立主从关系后从的IO和SQL线程状态都是yes但是不同步数据。
首先这个是生产环境已经投入使用的,不可能换主的数据库,不能线上终止业务 这两个数据库MySQL都是运行在docker容器内的,主库重启也要报备一下
排查步骤: 主的话可以使用: 查看主库状态:
代码语言:javascript复制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:限制同步数据库在主配置文件中添加设置
主上查看从的连接信息
代码语言:javascript复制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等信息也可以判定没有主从关系
如果有的话也要去看一下从的状态对不对
从的话可以使用:
代码语言:javascript复制mysql>show slave statusG
*************************** 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 statusG 查看: 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 statusG #IO 、SQL线程状态都是YES
以上内容只是我个人遇见的生产环境的问题,希望可以帮助遇到相同问题的人 &&配置文件参数语法问题
这里需要说的是如果你的IO线程状态为connecting或no可能证明你的防火墙有问题 查看一下防火墙规则,放行端口要不就把防火墙关闭 systemctl stop firewalld 关闭防火墙之后 docker restart mysql 当我要重启数据库的时候会报错iptables等一些报错 不要慌。。。不是啥大问题 重启一下docker systemctl restart docker.service 再次重启的时候就不会报错了
如果你的防火墙没问题了,状态还是no或者不同步,也有可能是你的数据差异比较大,毕竟数据库是正式环境主库是投入使用的 ,你重新建立的主从关系master日志里面和你的pos位置,不存在现在主库已有的当时创建数据库和表的sql语句,必须你在从库上也要有相同的库和表才能进行同步成功
划重点:一定要注意主从重新搭建之后。生产环境确保主库的库和表在从上必须也要有 要不然数据往哪里同步呢???
我是用mysqldump把主库的库表数据直接导出来然后放到从库上在导入 使得让他们两个数据尽量一致,差异缩小,这样不耽误也不耽误主库的运行无非就是可能那一段时间的数据从上没有 等搭建好了在导入一次备份就好了。