mysql 数据库主-主模式常见问题以及修复方式
上面的图就是主-主模式原理简介
数据库A可以读(R)可以写(W),数据库B同样可以读(R)写(W)。
应用在会将数据随机的写入数据库A或者是数据库B,然后数据再将自己拥有的数据同步到彼此。比如现在在数据库A中的Test表中写入了一条记录,那么数据库A会将这条记录同步到B。但是主-主模式因为是双写双读,所以容易产生同步问题:
比如说数据库中有一张表,表的数据结构中有一个联合主键 ,假设一种情况,如果在设计接口的时候不是幂等的情况下,很有可能将两条相同联合主键的记录写入到数据库中;
但是两条相同的数据恰巧是A中写入一条B中写入一条,此时A向数据库B中同步数据的时候,因为数据库B中已经存在了一条相同主键的数据,所以就会导致B中主键冲突,同理数据库B中向A中同步的时候,也会出现这种问题。
解决办法如下:
mysql在主从复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。
slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。
slave_skip_errors选项有四个可用值,分别为:off,all,ErorCode,ddl_exist_errors。
默认情况下该参数值是off,我们可以列出具体的error code,也可以选择all,mysql5.6及MySQL Cluster NDB 7.3以及后续版本增加了参数ddl_exist_errors,该参数包含一系列error code(1007,1008,1050,1051,1054,1060,1061,1068,1094,1146)
一些error code代表的错误如下:
- 1007:数据库已存在,创建数据库失败
- 1008:数据库不存在,删除数据库失败
- 1050:数据表已存在,创建数据表失败
- 1051:数据表不存在,删除数据表失败
- 1054:字段不存在,或程序文件跟数据库有冲突
- 1060:字段重复,导致无法插入
- 1061:重复键名
- 1068:定义了多个主键
- 1094:位置线程ID
- 1146:数据表缺失,请恢复数据库
- 1053:复制过程中主服务器宕机
- 1062:主键冲突 Duplicate entry '%s' for key %d
my.cnf中的写法:
slave_skip_errors=1062,1053
slave_skip_errors=all
slave_skip_errors=ddl_exist_errors
作为mysql启动参数的写法:
--slave-skip-errors=1062,1053
--slave-skip-errors=all
--slave-skip-errors=ddl_exist_errors
从数据库中查看该参数的值:
mysql> show variables like 'slave_skip%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| slave_skip_errors | 1007 |
+-------------------+-------+
网友评论