MariaDB主从库一致性的检查主要根据从库上的io进程(Slave_IO_Running)和sql进程(Slave_SQL_Running)是否都为yes,sql进程是否出现延迟(Seconds_Behind_Master)来判断。
同时检查从库上io读取的二进制日志文件与位置是否和主库完全一致(如果io进程为yes的话,很少会不一致)。但是position位置变化很快,远程连接主库和从库进行比较的功夫,说不定position已经变化了。(即检查 Master_Log_File
与 Relay_Master_Log_File
是否一致。 以及 Read_Master_Log_Pos
与 Exec_Master_Log_Pos
是否一致。
1. 检查从库上Slave_IO_Running与Slave_SQL_Running
进入mysql的命令行状态,执行show slave status\G
命令:
MariaDB [(none)]>
show slave status\G
Slave_IO线程:负责把主库的bin日志(Master_Log)内容,抄写到从库的中继日志上(Relay_Log)。Slave_IO线程比较简单,一般不容易出错,如果Slave_IO_Running显示为No,多为网络连接不上,权限不够等环境问题;
Slave_SQL线程:负责把中继日志上的语句在从库上执行一遍,相对于Slave_IO,Slave_SQL线程是比较容易出错的
示例:
- 手动在从库中插入一条数据,造成主从不一致,此时两个线程的状态依旧是正常的;
- 然后在主库也插入一条同样的数据,通知从库做相同操作,从库会出现主键重复的错误,这时候Slave_SQL_Running的状态会变为No,而Last_SQL_Error和Last_SQL_Error_Timestamp会记录错误的原因和发生时间;
- Slave_SQL线程会停止后续的SQL语句执行,因为它意识到往后执行会导致错误修复的难度增加;
- 但Slave_IO线程会继续抄log的工作,所以中继log依然是最新的;
- 这时候Master_Log_File: mysql-bin.000145和Relay_Master_Log_File: mysql-bin.000144之间就产生了偏差。
当错误修复后,只需用stop slave
和start slave
重启下同步,Slave_SQL线程会重新的尝试工作,如果没有问题,那么Slave_SQL的状态会变回Yes(但此时主从并没有完全同步,需要一点时间)。
2. 检查从库上的Master_Log_File与Master_Log_File
进入mysql的命令行状态,执行show slave status\G
命令:
MariaDB [(none)]>
show slave status\G
Master_Log_File和Relay_Master_Log_File所指向的文件必须一致
3. 检查从库上的Read_Master_Log_Pos和Exec_Master_Log_Pos
进入mysql的命令行状态,执行show slave status\G
命令:
MariaDB [(none)]>
show slave status\G
也可以使用 shell命令
来获取远程 Read_Master_Log_Pos
的值
mysql -h172.16.5.70 -P3306 -uroot -phzxy00yz -e 'show master status \G' |awk 'NR==3{print $2}'
或:
mysql -h172.16.5.70 -P3306 -uroot -phzzxy00yz -e 'show master status \G' |grep -w "Position:"
使用 shell命令
来获取本地 Exec_Master_Log_Pos
的值
mysql -e 'show slave status \G' |awk 'NR==23{print $2}'
或:
mysql -e 'show slave status \G' |grep -w "Exec_Master_Log_Pos:"
4. 附录
1) The position, ON THE MASTER, from which the I/O thread is reading: Master_Log_File/Read_Master_Log_Pos.
相对于主库,是从库读取主库的二进制日志的位置,是IO线程。即io_thread读取主库master_log_file与master_log_pos
2) The position, ON THE MASTER, at which the SQL thread is executing: Relay_Master_Log_File/Exec_Master_Log_Pos
相对于主库,是从库的sql线程执行到的位置,是sql线程。即sql_thread执行主库的master_log_file和master_log_pos
3) The position, IN THE RELAY LOGS, at which the SQL thread is executing:Relay_Log_File/Relay_Log_Pos
相对于从库,是从库的sql线程执行到的位置。