MySQL主从同步错误解决3例(max_allowed_packet)

问题一:
1、网站用户系统上线后,因为运营需要统计注册用户数量,申请一个查询操作的帐号,登陆用户系统数据库的一个从库发现,查看主从同步状态,发现错误1153的错误提示:
mysql> show slave status\G
*************************** 1. row ***************************      
                   ···省略···
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
                   ···省略···                
                Last_IO_Errno: 1153
                Last_IO_Error: Got a packet bigger than 'max_allowed_packet' bytes  #从报错的字面上理解是因为从库的max_allowed_packet这个值设置的有点小。
                   ···省略···
1 row in set (0.00 sec)

2、查看slave的“max_allowed_packet”
mysql> show VARIABLES like '%max_allowed_packet%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 33554432 | #这里设置32M
+--------------------+----------+
1 row in set (0.00 sec)

#这里设置的并不是太小,但是出现了这个提示,在网上找了相关提示“是由于slave上的max_allowed_packet参数值比master上的max_allowed_packet值小”
#博客地址:http://blog.sina.com.cn/s/blog_53b45c4d01010dl5.html

3、查看master的“max_allowed_packet”
mysql> show variables like '%max_allowed_packet%';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 524288000 | #这里设置的500M!
+--------------------+-----------+
1 row in set (0.00 sec)

4、修改slave的“max_allowed_packet”为500M
1)配置文件修改:(重启MySQL生效)
[mysqld]
max_allowed_packet = 500M
命令修改:(即时生效)
正确写法:
mysql> Set global max_allowed_packet = 500*1024*1024;
mysql> Set global max_allowed_packet = 524288000;
错误写法:
mysql> Set global max_allowed_packet = 500M;
注意:
(1)直接修改配置文件需要重启MySQL
(2)我的从库现在只作备份服务器使用,所以我直接修改的配置文件
2)mysql> show VARIABLES like '%max_allowed_packet%';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 524288000 | ##已经修改成功了
+--------------------+-----------+
1 row in set (0.00 sec)

5、查看主从同步状态
mysql> show slave status\G
*************************** 1. row **************************
                 ···省略···
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                ···省略···
                Last_IO_Errno: 0
                Last_IO_Error: 
                ···省略···
1 row in set (0.00 sec)


问题二:
1、错误提示
1)错误日志
130517 11:02:47 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master', Error_code: 1236
130517 11:02:47 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000004', position 364825200

2)show slave status 提示
mysql> show slave status\G
*************************** 1. row ***************************
                 ···省略···
             Slave_IO_Running: No
            Slave_SQL_Running: Yes
                ···省略···
                Last_IO_Errno: 1236
                Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master'
                ···省略···
1 row in set (0.00 sec)

3)问题原因
1、主从服务器”max_allowed_packet” 不一致造成
2、主服务器生成的binlog时候的max_allowed_packet,比当前的主从服务器”max_allowed_packet”的值大(多次更改数据库这个值导致)

4)解决办法
提示:这个问题主要是主从的设置不一致造成的,第二种情况不少见,需要查看当前主库设置,如果尽可能设置大些,如果设置的小,还会出现这个错误。
主库:
set global max_allowed_packet=1024*1024*1024               1024*1024*1024 这个大小是1G=1024M
从库:
Stop slave;
set global max_allowed_packet=1024*1024*1024
Start slave;

问题三
1、错误提示
mysql> show slave status\G
*************************** 1. row ***************************
                        ···省略···

             Slave_IO_Running: Yes
            Slave_SQL_Running: No
                       ···省略···
                   Last_Errno: 3
                   Last_Error: Error 'Error writing file '/tmp/MLyTJyxm' (Errcode: 28)' on query. Default database: 'bcc'. Query: 'UPDATE `bcc_submit_logs` SET `compile_status`='1', `status`='1', `memory`='-963422952', `run_time`='2387', `code_length`='493', `output`='请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输
               Last_SQL_Errno: 3
                    ···省略···
               Last_SQL_Error: Error 'Error writing file '/tmp/MLyTJyxm' (Errcode: 28)' on query. Default database: 'bcc'. Query: 'UPDATE `bcc_submit_logs` SET `compile_status`='1', `status`='1', `memory`='-963422952', `run_time`='2387', `code_length`='493', `output`='请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输入你当前的位置(1<=a<=N):1446256452请输入你想到达的位置(1<=b<=N):1446256448请输入你想走几条路(1<=t<=100):1446256456请输
1 row in set (0.00 sec)

2、问题原因
1)tmp目录不可写
2)磁盘没有空间
l 磁盘没有物理空间
l 磁盘有物理空间,但是innode满了


总结
1)数据库服务器master和slave的max_allowed_packet这个值要保持一致(其他的值也会有此类问题)
2)在修改master服务器max_allowed_packet这个值的时候一定要和slave一起修改
3)运维修改任何配置都要做相应的记录,以便查找原因
4)运维之间一定要注重沟通


标签: MySQL

作者头像
南宫俊逸创始人

君子好学,自强不息~

上一篇:Dell MD 3200i存储 故障解决
下一篇:解决nginx+php-cgi 502Bad Gateway错误

发表评论

阿里云2021年 618 年中钜惠活动