我在主从设置中有 MySQL (5.5) 并创建了另一个从服务器。
我停止了原来的奴隶,转储数据,复制并重新导入,它工作正常。我记下了原始从站的 master_log 位置,并使用这些命令将其设置在新从站上
CHANGE MASTER TO MASTER_HOST='<ipaddress>',
MASTER_USER='<username>', MASTER_PASSWORD='<password>',
MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851',
MASTER_LOG_POS=15824150,
MASTER_CONNECT_RETRY=10;
当我开始新的奴隶时,我得到了
Last_IO_Error:从二进制日志中读取数据时,从 master 收到致命错误 1236:'日志事件条目超出 max_allowed_packet;增加 master 上的 max_allowed_packet'
但是,当我启动原始从属设备时,它赶上了就好了,现在已经同步了。
所以问题:
当前值为16M,我怎么知道要走多大?(我宁愿避免在生产服务器上反复试验)。
当原来的奴隶应付得很好时,为什么我需要增加主人的价值,问题真的出在新奴隶身上吗?
更新
我将 max_allowed_packet 增加到 1073741824,正如 Rolando 在 master、old slave 和 new slave 上建议的那样,然后重新启动它们(SET GLOBAL max_allowed_packet = 1073741824;
由于某种原因似乎没有接受)
现在最后一个 IO 错误和以前一样,但现在我明白了
Last_SQL_Error:中继日志读取失败:无法解析中继日志事件条目。可能的原因是:主服务器的二进制日志已损坏(您可以通过在二进制日志上运行“mysqlbinlog”来检查),从服务器的中继日志已损坏(您可以通过在中继日志上运行“mysqlbinlog”来检查),a网络问题,或者主从的 MySQL 代码中的错误。如果你想检查主服务器的二进制日志或从服务器的中继日志,你可以通过在这个从服务器上发出“SHOW SLAVE STATUS”来知道它们的名字。
如果我在主文件上执行 mysqlbinlog,它会很高兴地滚动过去很长时间 - 该文件是 722M - 如果我对从属中继日志执行此操作,我会得到
错误:Log_event::read_log_event() 中的错误:“完整性检查失败”,data_len:38916267,event_type:69
错误:无法读取偏移量 253 处的条目:日志格式错误或读取错误。
我检查了变量并且更改有效
mysql> 显示变量 LIKE '%max_allowed_packet%';
在新的奴隶上显示max_allowed_packet
ANDslave_max_allowed_packet
在哪里只有在主人身上max_allowed_packet
所以我对master进行了版本检查:
mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name | Value |
+-------------------------+--------------------------------------+
| innodb_version | 1.1.6 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.11-log |
| version_comment | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+--------------------------------------+
和新的奴隶
mysql> show variables LIKE '%version%';
+-------------------------+--------------------------------------+
| Variable_name | Value |
+-------------------------+--------------------------------------+
| innodb_version | 5.5.32 |
| protocol_version | 10 |
| slave_type_conversions | |
| version | 5.5.32-log |
| version_comment | MySQL Community Server (GPL) by Remi |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
+-------------------------+--------------------------------------+
这两个版本相差太远了吗?
充
max_allowed_packet
到1G就可以了。每当构造一个 MySQL Packet 时,它不会从一开始就跳到 1G。为什么?首先你需要知道什么是 MySQL Packet。本书第 99 页
在第 1-3 段中解释如下:
将其与 MySQL 文档进行比较
max_allowed_packet
:鉴于此信息,您应该很高兴 MySQL 将根据需要扩展和收缩 MySQL 数据包。因此,继续前进
max_allowed_packet
Master和Slave都设置为1Gnet_buffer_length
为最大值 1MMaster 和 Slave 在传输数据,尤其是 BLOB 数据方面应该匹配。
更新 2013-07-04 07:03 EDT
从您关于中继日志的消息来看,您似乎有以下内容
建议
运行
CHANGE MASTER TO
会清除所有中继日志并从新日志开始。您将从在 Slave 上执行的 Last Master BinLog 事件 (BinLog,Position) 进行复制。试试看 !!!
相当尴尬的是,问题是日志文件名不正确,导致奇怪的结果,使用正确的文件名重新导入,一切都很好,令人羞愧
如果您在 master 上看到 binlog,则表明 binlog 位置是错误的。有时错误并非看起来那样。不要更改最大数据包值。我们需要在这里做一些工作。因此,我的建议是,您可能需要重置从属复制坐标。在 master 上使用 mysqlbinlog 来识别事务开始的位置,并查找相邻事务。如下所述重置。
您可以在这篇mysql 故障排除文章中找到有关具体操作的更多详细信息。希望这会有所帮助。