MySql Replication - 奴隶落后于主人

Ran*_*Ran 11 mysql replication mysql-management

我的MySql DB上有主/从复制.

我的奴隶数据库已经停机了几个小时并且又重新启动(主机一直在运行),当发出时show slave status我可以看到奴隶在主人后面X秒.

问题是,奴隶似乎没有赶上主人,主人身后的X秒似乎没有下降......

关于如何帮助奴隶赶上的任何想法?

Rol*_*DBA 17

这是一个想法

为了让您知道MySQL正在从中继日志中完全处理SQL.请尝试以下方法:

STOP SLAVE IO_THREAD;
Run Code Online (Sandbox Code Playgroud)

这将阻止复制将新条目从主服务器下载到其中继日志中.

另一个称为SQL线程的线程将继续处理从主服务器下载的SQL语句.

当你跑步时SHOW SLAVE STATUS\G,请注意Exec_Master_Log_Pos.再跑SHOW SLAVE STATUS\G一次.如果Exec_Master_Log_Pos一分钟后没有移动,你可以继续运行START SLAVE IO_THREAD;.这可能会减少数量Seconds_Behind_Master.

除此之外,除了以下情况外,你真的无能为力:

  • 信任复制
  • 监控 Seconds_Behind_Master
  • 监控 Exec_Master_Log_Pos
  • 运行SHOW PROCESSLIST;,记下SQL线程以查看它是否正在处理长时间运行的查询.

BTW请记住,当您运行SHOW PROCESSLIST;复制时,应该有两个用户名为的DB Connections system user.其中一个数据库连接将通过复制处理当前的SQL语句.只要每次运行SHOW PROCESSLIST;时都可以看到不同的SQL语句,您就可以相信mysql仍然可以正常复制.


小智 7

你使用什么二进制日志格式?你在使用ROW还是STATEMENT?

SHOW GLOBAL VARIABLES LIKE 'binlog_format';
Run Code Online (Sandbox Code Playgroud)

如果您使用ROW作为binlog格式,请确保所有表都具有主键或唯一键:

SELECT t.table_schema,t.table_name,engine
FROM information_schema.tables t
INNER JOIN information_schema .columns c
on t.table_schema=c.table_schema
and t.table_name=c.table_name
and t.table_schema not in ('performance_schema','information_schema','mysql')
GROUP BY t.table_schema,t.table_name
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;
Run Code Online (Sandbox Code Playgroud)

如果在主服务器上执行例如一个删除语句以删除没有PK或唯一密钥的表上的100万条记录,那么在主服务器端将只进行一次全表扫描,这在从服务器上不是这种情况.

当使用ROW binlog_format时,MySQL会将行更改写入二进制日志(而不是像STATEMENT binlog_format这样的语句),并且该更改将逐行应用于从属端,这意味着将进行100万次全表扫描在奴隶上只反映主人的一个删除声明,这导致奴隶滞后问题.