我们有一个MySQL 5.0.77
主从复制。过去几周,复制运行不正常,并且出现Duplicate entry error 1062
。该Set Global Skip-counter
选项没有帮助,所以我不得不error no.1062
通过将其添加到/etc/my.cnf
文件中来跳过 ,然后它报告了一个特定数据库中的表不存在错误。
上周末,我取出了mysqldump
该数据库,并在 Slave 中恢复。然后,Slave IO_Thread
和Slave_SQL
都开始正常运行,看起来复制又回到了正轨。该Seconds_behind_master
值非常高,然后在过去 4 天内开始减少。
今天检查slave的复制状态,发现seconds_behind_master
从早上开始这个值就一直在增加,我停了一次slave IO_Thread
,然后seconds_behind_master就变成Null了,然后我启动之后,这个IO_thread
值就和原来一样了,并且一直在增加。
我看到一个进程从早上开始运行
system user gss-app Connect 9535736 copy to tmp table ALTER TABLE
queue_clicks ADD INDEX(
puid)
请帮我解决这个问题。谢谢。
#mysql> show slave status\G;
`*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 203.x.x.x
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000990
Read_Master_Log_Pos: 185674180
Relay_Log_File: mysqld-relay-bin.000224
Relay_Log_Pos: 9286354
Relay_Master_Log_File: mysql-bin.000774
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 472142385
Relay_Log_Space: 112995681998
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 9533355
1 row in set (0.00 sec)`
答案1
如果 IO 和 SQL 正在运行,并且正在Relay_Master_Log_File
赶上,我不会担心它Master_Log_File
。我相信延迟是因为您的总中继日志文件很大,大约 105G -Relay_Log_Space: 112995681998
并且考虑到从属位于 000774 位置,主位于 000990 位置,共有 214 个二进制日志,每个大约 468M(105G/214)等待在从属上重播。
我的建议是密切关注Relay_Master_Log_File
并确保它正在运行并赶上Master_Log_File
。我还看到主主机位于公共 IP 地址中,此复制是通过公共网络还是慢速 WAN 进行的?这可能会引起延迟,链接越快越好。
答案2
当您停止 IO_Thread 并且 SQL_Thread 赶上可用的中继日志数据时,Seconds_Behind_Master 将变为 NULL,因此在这种情况下无法反映正确的延迟。您可以在不同情况下找到正确的方式来解释 Seconds_Behind_Master 的值:https://scalegrid.io/blog/mysql-tutorial-understanding-the-seconds-behind-master-value/
答案3
我以前也遇到过完全相同的问题。
请进行以下更改,以纠正从属启动后“Seconds_Behind_Master”增加的问题。
首先检查从服务器上的“trx”值
- 显示类似‘%trx%’的变量;
如果“innodb_flush_log_at_trx_commit”的值为“1”,如下所示
变量名称 | 值 |
innodb_api_trx_level | 0 |
默认情况下,innodb_flush_log_at_trx_commit 设置为 1。
innodb_use_global_flush_log_at_trx_commit | 开启 |
然后将此值更改为“2”
- 设置全局innodb_flush_log_trx_commit = 2;
一旦您在 mysql 客户端中更改了这一点,也请在 my.cnf 文件中更改这一点,以确保一旦 mysql 重新启动,该值仍然存在。
- 修改 /etc/mysql/my.cnf
搜索“innodb_flush_log_at_trx_commit=1”
并将其值也改为“2”。
这将解决您的“Seconds_Behind_Master”问题。