mysql5.6主从复制报错以及解决方法
1.Mysql数据库slave同步报错信息1366:
1.原因是数据库表的字符集和表中的字段的字符集不一致导致的
下面四分析过程和解决办法:
参考文档:http://www.cnblogs.com/zhoujinyi/p/4568663.html
表字段字符集和表字符集不一致导致mysql主从同步报错:1366
修改表字段字符集:
参考资料:
http://www.2cto.com/database/201308/235153.html
在主库操作:
http://blog.csdn.net/dqchouyang/article/details/50012203
2.mysql数据库slave同步报错1061
原因是主库上某表的索引已经在slave对应表上存在,主库继续同步到slave上,会提示slave上某表索引已经存在而导致同步报错。
下面是解决办法:
接下来又出现,主库上某表已经创建索引,但是从库已经创建了同样的索引,导致复制报错1061
从库报错:
到此同步正常,接下来又出现1366报错:
解决:
mysql 主库:
参考文档:
http://blog.itpub.net/15456724/viewspace-682681/
3.mysql主从复制报错:1060
原因是slave上表字段重复
4.mysql同步报错1396
6.mysql主从复制报错1007
slave 上报错:
原因是:
slave上早已经存在master上同名的的库,所以master上再次创建库,slave上会提示库已经存在,导致报错;
解决办法:
7.mysql主从复制报错1008
slave上提示:
原因是从库提前删除数据库wjw02,然后在master上再次删除wjw02库,slave上提示为wjw02库不存在,导致复制报错:
解决方法:
在slave上执行:
8.将slave_skip_errors=参数写入配置文件
.将slave_skip_errors=参数写入slave上的配置文件my.cnf
[root@localhost ~]# grep slave_skip_errors /etc/my.cnf
slave_skip_errors=1007,1008
[root@localhost ~]# /etc/init.d/mysqld restart
这样可以直接忽略slave同步报错信息
####注意:生产环境考虑到主从库数据的一致性,是不允许不分情况的set global sql_slave_skip_counter=1; slave_skip_errors 操作这样的参数来忽略错误的,如果遇到主从同步失败的话,就让他卡到那了,人工介入进行手动恢复故障
9.slave_exec_mode参数可以动态自动处理同步复制错误
注意:此参数的设置只能忽略错误1032和1062的错误。
此参数默认是STRICT严格模式;
将该参数设置为IDEMPOTENT模式,slave同步出现1032错误(记录没找到)和1062错误(主键重复),就会自动跳过次错误,并且记录到错误日志里面,其实此参数和slave_skip_errors作用是一样的。
只不过slave_skip_errors参数必须写入配置文件my.cnf,重启mysql,然而IDEMPOTENT默认不需要重新启动slave的mysql服务。
演示:
slave上操作:
在master上操作:
mysql> show slave status\G
但是在slave上查看此时同步时,mysql的错误日志:
[root@localhost logs]# tail -1/data/mysql/logs/mysql-error.log
10.mysql同步报错1062(主键重复)
slave上表记录重复,导致slave复制报错1062主键重复
查看某表的建表语句
slave上表中插入一条记录
在master上插入这个表同样的一条表记录:
insert into dr_user_info (id,dev_id,tel,updatetime,pwd)values (24,'qwertyuiop','18234131383','1491177726','111111');
在slave上擦看报错:
是主键重复导致的
解决办法是删除slave上表dr_user_info重复的id为24的记录
11.在master上更新一条表记录然而在slave上找不到这条记录报错1032
演示:
slave上查看表记录
slave上删除记录24
mysql> delete from dr_user_info where id=24;
然后在master上删除dr_user_info表记录24
此时slave上同步报错:1032,提示slave上找不到表记录
解决办法:
在master上查看mysql-bin.000010日志上的sql语句,分析出错处5296175,sql语句在干嘛
[root@localhost binlog]# mysqlbinlog --no-defaults -v -v--base64-output=DECODE-ROWS mysql-bin.000010 |grep -A '20' 5295947
红色字体提示在master上执行delete了删除表记录:24
所以此处的报错可以在slave上忽略跳过这个错误
解决此问题
####注意:如果是执行的update语句,此时slave同步报错1032的话,是不允许set global sql_slave_skip_counter=1;进行忽略这个错误的,建议查看binlog日志看下是卡在什么地方,然后在slave库上把这条不存在的记录insert,然后在start slave开启同步;
12.slave的中继日志relay-log损坏导致mysql同步报错
原因是当slave意外宕机时,有可能会损坏中继日志relay-log,再次开启同步复制时,报错信息如下:
解决办法:找到同步的binlog日志和pos点。然后重新同步,
提示:在mysql5.5版本及以上版本,已经考虑到slave宕机导致relay-log损坏的问题造成mysql同步失败。
即在slave的my.cnf配置文件中加入参数relay_log_recovery=1,就可以了
13. master上的server-id等于slave上的server-id
人为的失误在配置mysql主从复制时,的数值等于slave上的server-id的数值。
解决办法是:保证server-id的数值不一样
14.mysql主从复制报错:2003
原因有多种,可能是slave上防火墙开启限制了3306端口,也可能是在slave上执行change master to 时,指定的连接复制数据库的账户和密码不对导致的。也可能是对端的master开启防火墙做了3306端口的的限制等,也有可能是服务器之间网络的问题导致的
还有就是master上的my.cnf配置文件使用参数:binlog_ignore_db=mydb1,slave上的my.cn配置文件使用参数:replicate-ignore-db =mydb1,也可以导致mysql同步报错2003
slave上:
slave上的mysql错误日志:
[root@localhost~]# tail -3 /data/mysql/logs/mysql-error.log
15.binlog_ignore_db引起的同步复制故障
一个网友的案例:
在mysql的master上采用binlog_ignore_db命令忽略了一个库以后,使用mysql –e 执行的所有的语句就不写入binlog了,原因是在进行主从复制时,有一个库不复制,查看了一下他的配置,binlog格式为row模式,跟他要了当时的sql语句:
mysql -e ‘create table db.tb like db.tb1’;
查看mysql的手册知道忽略某个数据库的复制有两个参数,一个是binlog_ignore_db,另一个是replicate-ignore-db,他们是有区别的:
binlog_ignore_db参数是设置在master上的,例如:binlog_ignore_db=test,那么针对test库下的所有的操作(增删改)都不会记录下来,这样slave上接受主库上的binlog时文件量就会减少,这样做好处是可以减少网络io,减少slave端I/O线程的I/O量,从而最大程度的优化复制性能,。但是也存在一个隐患,在下面会提到。
replicate-ignore-db是设置在slave上的replicate-ignore-db=test1,那么针对test1库下的所有的操作(增删改)都不会被sql线程执行,
结论:如果想在slave上忽略一个库的复制,最好不要采用binlog_ignore_db这个参数,使用replicate-ignore-db= db来代替
16.mysql5.5.19/mysql5.5.20同步的一个bug
当我们使用低版本的mysql5.1.43(slave)向高版本的mysql5.5.19(master)同步复制时,会遇到主机master上的mysql一直在重启。后面经过排查,得知低版本的mysql向高版本的mysql同步复制,只要同步的复制点指错,主机master的mysql服务就会一直重启,但是版本一致的就没有这样的现象。比如:master上的binlog和pos点是mysql-bin.000010 ,107
那么你在slave上执行如下操作:
change master TO master_LOG_FILE=’mysql-bin.000010’.master_LOG_POS=106,这样就会促发这个样的bug.,目前mysql5.5.25a版本以后这样的问题已经修复了
注释:mysql手册上介绍,mysql支持从高版本向低版本同步(即,低版本是master,高版本是slave,那么slave向master同步复制时是兼容的,没问题的)
但是反过来,就会出现问题。有其是字符集设置这一块。