2011-12-17 89 views
10

我的MySql数据库有一个主/从复制。MySql复制 - 从站落后于主

我的奴隶DB被关闭了几个小时,然后又重新备份(主人一直在上),当发出show slave status时,我可以看到奴隶在主人后面X秒。

的问题是,从似乎没有赶上师傅,师傅身后的X秒不似乎下降...

我如何能帮助从追赶什么想法?

+0

你有锁定表吗? – 2011-12-17 21:01:24

+0

不是我所知道的 – Ran 2011-12-17 21:06:40

+0

最终奴隶会赶上,除非你有大量的查询,如更新和插入主人。你有很多来自服务器的查询吗? – 2011-12-17 21:14:43

回答

13

这是一个想法

为了让你知道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仍在正确复制。

+0

有点奇怪,但停止线程并没有帮助我,而是监视Exec_Master_Log_Pos和来自系统用户的两个连接让我不会吓坏了。重新启动从站后,一切都恢复正常。感谢罗兰多。 – 2017-02-10 20:01:37

3

“秒后”不是一个非常好的工具,可以找出你真正的主人背后有多少。它说的是“我刚刚执行的查询是在X秒前在主服务器上执行的”。这并不意味着你会在下一秒赶上主人。

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

1

只是检查,如果你有相同的时间和两个服务器上的时区,即主以及奴隶。

6

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

SHOW GLOBAL VARIABLES LIKE 'binlog_format'; 

如果您正在使用的行作为一个二进制日志格式,请确保所有表具有原发性或唯一键:

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或唯一密钥的表上的一百万条记录,那么只有一个全表扫描将在主服务器端发生,而从服务器则不是这种情况。

当使用ROW binlog_format时,MySQL将行更改写入二进制日志(不像STATEMENT binlog_format这样的语句),并且该更改将逐行应用于从属端,这意味着一个100万的全表扫描将发生在从属设备上,以反映主设备上只有一条删除语句,并导致从设备滞后问题。

0

我们从最近的备份设置了站后有完全一样的问题。

我们已经改变了我们的奴隶的配置更加碰撞安全:

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

我认为,特别是sync_binlog = 1导致问题,因为这从设备的规格是不会这么快在大师。这个配置选项强制从机在执行之前将每个事务存储在二进制Lo中(而不是每10k次事务的默认值)。

将这些配置选项再次禁用为默认值后,我发现从站正在重新启动。

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 
0

如果你有多个模式考虑使用多线程从属复制。这是一个相对较新的功能。

这可以动态完成,而无需停止server.Just停止从属SQL线程。

STOP SLAVE SQL_THREAD; 
SET GLOBAL slave_parallel_threads = 4; 
START SLAVE SQL_THREAD;