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_MasterExec_Master_Log_PosSHOW 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万次全表扫描在奴隶上只反映主人的一个删除声明,这导致奴隶滞后问题.