MySql Replication - 奴隶落后于主人

时间:2011-12-17 20:50:27

标签: mysql replication mysql-management

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

我的奴隶数据库已经关闭了几个小时并且又重新启动(主人员一直在上升),当发出show slave status时,我可以看到奴隶在主人身后X秒。

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

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

9 个答案:

答案 0 :(得分:16)

这是一个想法

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

STOP SLAVE IO_THREAD;

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

另一个称为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;时,应该有两个数据库连接,其用户名为system user。其中一个数据库连接将通过复制处理当前的SQL语句。只要每次运行SHOW PROCESSLIST;时都可以看到不同的SQL语句,就可以相信mysql仍然可以正常复制。

答案 1 :(得分:7)

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

SHOW GLOBAL VARIABLES LIKE 'binlog_format';

如果您使用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;

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

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

答案 2 :(得分:3)

“秒落后”并不是一个很好的工具,可以找出你真正掌握了多少。它说的是“我刚刚执行的查询是在X秒前在主人身上执行的”。这并不意味着你会在下一秒内赶上主人,直到主人身后。

如果你的奴隶通常没有落后并且主人的工作量大致保持不变,你会赶上,但可能需要一些时间,甚至可能需要“永远”,如果奴隶通常只是勉强跟上大师。从属设备在一个线程上运行,因此它的设计速度比主设备慢得多,如果在主设备上有一些查询需要一段时间,它们将在从设备上运行时阻止复制。

答案 3 :(得分:1)

只需检查两台服务器上是否有相同的时间和时区,即Master和Slave。

答案 4 :(得分:1)

如果您正在使用INNODB表,请检查您是否将innodb_flush_log_at_trx_commit设置为与SLAVE不同的值。

http://dev.mysql.com/doc/refman/4.1/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit

答案 5 :(得分:0)

从最近的备份设置我们的奴隶后,我们遇到了完全相同的问题。

我们已经将奴隶的配置更改为更安全的崩溃:

sync_binlog = 1
sync_master_info = 1
relay_log_info_repository = TABLE
relay_log_recovery = 1

我认为特别是sync_binlog = 1会导致问题,因为这个奴隶的规格并不像主人那么快。此配置选项强制从属服务器在执行之前将每个事务存储在二进制文件中(而不是默认的每10k事务)。

再次禁用这些配置选项到默认值后,我看到奴隶再次赶上。

答案 6 :(得分:0)

只是在我的类似案例中添加调查结果。

主站中发生了大量临时表插入/更新/删除,从从站中继日志占用了大部分空间。而在Mysql 5.5中,由于是单线程的,因此CPU始终处于100%状态,并且需要花费大量时间来处理这些记录。

我所做的就是在mysql cnf文件中添加这些行

replicate-ignore-table=<dbname>.<temptablename1>
replicate-ignore-table=<dbname>.<temptablename2>

一切都变得平稳了。

为了确定哪些表在中继日志中占用更多空间,请尝试以下命令,然后在文本编辑器中打开。你可能会得到一些提示

cd /var/lib/mysql
mysqlbinlog relay-bin.000010 > /root/RelayQueries.txt
less /root/RelayQueries.txt

答案 7 :(得分:0)

如果您有多个架构,请考虑使用多线程从属复制。这是一个相对较新的功能。

这可以在不停止服务器的情况下动态完成。只需停止从属sql线程。

install.packages('e1071')

答案 8 :(得分:0)

我有一个与此类似的问题。以及我的两个MySQL服务器都托管在AWS EC2上(主服务器和复制服务器)。通过增加MySQL从服务器的EBS磁盘大小(自动增加IOPS),对我来说是解决方案。 R / W吞吐量和带宽增加,R / W延迟减少。

 R/W Throughput and bandwidth is increased R/W latency were decreased, lagging behind master, Seconds_Behind_Master increased

现在,我的MySQL数据库复制正在赶上主服务器。和Seconds_Behind_Master减少了(每天都增加了)。

因此,如果您在EC2上托管了MySQL。我建议您尝试增加从站上的EBS磁盘大小或其IOPS。