排查MySQL主从

2019-12-22 15:37:52河南刘进京
网络安全和信息化 2019年8期
关键词:主从日志命令

■ 河南 刘进京

编者按:数据库直接关系到单位IT系统的安全稳定运行,笔者遇到某单位的业务系统后台采用了MySQL主从结构,最近出现了数据异常的问题。

某单位的业务系统后台采用了MySQL主从结构,最近出现了数据异常的问题。

问题主要表现在使用相同的查询语句,在主从服务器中查询到不同的结果,并且在从服务器上执行“show slave status G”命令时,在返回信息中的“Slave_IO_Running”栏 中 显 示“Connecting”, 在“Slave_SQL_Running”栏 中 显 示“Yes”,在“Last_IO_Errno”栏中显示“1045”,在其下显示“error connecting to master 'xxx' – retrytime :60 retries:1”之类的错误信息。

故障排查

对以上故障进行分析,可以看到从服务器是无法连接到主服务器上的,才导致主从数据库中的数据存在不一致的问题。要寻找连接不上主服务器的原因,可以从多个方面进行排查。例如检测主从服务器之间的网络是否畅通,如果连接处于中断状态,Slave自然无法连接到Master。如果网络连接没有问题,可以检测是否在Master端启动了防火墙,对数据库端口进行了过滤。对复制链路配置的用户和密码进行检查,查看该账户是否拥有相应的权限。

在从服务器上执行“ping xxx.xxx.xxx.xxx”命令,对主服务器进行探测,其中的“xxx”标书主服务器的IP。根据返回信息,可以看到网络是畅通的。执行“telnet xxx.xxx.xxx.xxx 3306”命令,使用Telnet连接主服务器的TCP 3306端口,根据返回信息,可以看到是可以通过TCP 3306连接到MySQL实例的,说明主服务器的TCP 3306端口没有被防火墙过滤。执行“mysql -urepl -p xxxxxx -h yyy”命令,来连接从数据库,这里的账户名为“repl”, 密码为“xxxxxx”。“yyy”为从服务器的IP,连接是没有问题的。在“mysql>”提示符下执行“show grants for current_user;”命令,查看当前账户的授权信息。

这里仅仅显示“GRANT USAGE ON *.* 'repl'@'x.x.x.%'”信息,这说明仅仅在该节点上创建了一个账户,但是并没有授权,导致从服务器的IO进程无法通过该账号到主节点上获取增量的二进制日志。

至于为什么出现权限丢失的问题,可能是操作人员在最近时间内的误操作所致。解决的方法很简单,在主界面上执行“mysql-uroot -p”命令,以root账户登录 MySQL,执行“grant replication slave on *.*to repl@'x.x.x.%';”命令,为从节点授予复制的权限。

其 中 的“x.x.x.%”为具体的网段。返回从节点,在MySQL中执行“show slave status G” 命 令,在返回信息中的“Slave_IO_Running”栏中依然显示“Connecting”,执 行“stop salve;”和“start slave;”命令,重启从节点MySQL进程 ,之后再次进行查看,在“Slave_IO_Running”栏中显示为“Yes”,说明从节点已经可以从主节点复制数据了。

虽然主从数据库连接已经正常,但依然面对两者数据库数据不一致的问题。对于此类问题,首先需要确认主从数据库是否存在延迟,这里不存在延迟问题。并且经过以上以上处理,Slave实例上的IO线程和SQL线程的状态均为“Yes”,但是相同的查询在主从数据库中的结果存在差异。并且对相关表进行checksum检查时,得到的校验值是不同的。所以可以确定主从数据库中的数据确实存在不一致问题。

之所以会出现该问题,原因可能不止一个,例如有人因误操作对Slave节点的数据进行了修改,因为在Slave上的写操作并不会同步到Master上,就会造成主从主从数据的不一致。另外,在进行主从故障处理时使用了sql_slave_skip_counter或注入空事务的方式来修复错误,造成在Master节点上执行的事务,在Slave节点上应用也会造成主从数据的差异。此外,如果在主从复制中使用statement格式的二进制日志,因为该格式的日志会分别在主从节点上执行SQL语句来完成对数据的修改,对于诸如UUID等不确定的函数来说,会提取当前系统时间作为默认值,来生成对应的数据列,会在主从节点上产生不一致的数据。

故障解决

根据不同的错误原因可采取对应的策略,例如对于在从节点的误操作,可在Slave实例中设置“read_only=ON”参数,让不具有Super权限用户无法对从节点进行写操作,对于拥有Super权限的用户,可以设置“super_read_only=ON”参数进行限制,但需要在MySQL 5.7版本之后才具备该功能。

对于采用statement格式的二进制日志来说,为了避免出现主从数据差异,可以改用row格式的二进制日志,该格式对于Master实例进行实际修改后,在Slave端直接应用,就可以避免主从的数据差异。当然,也可以使用pt_table_sync这一工具来修复主从数据库的数据异常。

在主节点上执行“pt_table_sync --execute--c h a r s s e t=u t f 8--database=tb1 --table=tk1--sync-to-master h=x.x.x.x,u=dba,p=mima”命令,其中的“tb1”为目标数据库的名称,“tk1”为表的名称。表示对指定库中的表进行数据同步,同步的仅仅是不一致的数据。如果仅仅指定数据库,表示对该库进行整体数据同步。其中的“syncto-master”参数表示向Master 进行同步,“x.x.x.x”为从库的 IP,“dba”为具有访问该数据库的的账户名,“mima”为该账户的密码。当该命令执行成功后,在Slave节点查看相关的数据库,可以看到其已经和Master节点一致了。在主从节点上分别执行“checksum table tb1.tk1”命令,可以看到对于目标数据库的校验和是一致的。

猜你喜欢
主从日志命令
只听主人的命令
一名老党员的工作日志
华人时刊(2021年13期)2021-11-27 09:19:02
扶贫日志
心声歌刊(2020年4期)2020-09-07 06:37:14
移防命令下达后
FANUC系统PROFIBUS主从功能应用
游学日志
基于主从控制的微电网平滑切换控制策略研究
这是人民的命令
基于飞行试验数据的仿真模型主从一体化检验
基于FPGA的机床数控系统主从控制器通信研究