https://wen.lu/#q=mysql+%E4%BA%92%E4%B8%BA%E4%B8%BB%E4%BB%8E

http://svenman.blog.51cto.com/6867097/1363110

一、A、B双主模型的实现条件:

1. 开启二进制日志

2. 开启中继日志

3. 解决自动增长列的问题

如果A服务器上自动增长的列编号有一个35,此时还没有同步到B服务器上,在B服务器上插入一条数据,编号也是35。当同步A的35到B服务器上来的话,必然产生数据丢失。

解决办法:

让在A上插入的行的自动增长都为奇数,让B服务器上的自动增长都为偶数。这样就解决了自动增长的问题。

假设A是一台生产环境中的数据库,现在想添加B服务器,实现双主模型。

二、步骤:

1. 在A、B服务器上创建具有复制权限的帐号

2. 在A、B服务器上修改配置文件(开启二进制日志、中继日志等)

3. 将A服务器上存在的数据文件导入到B服务器中

注意:导入数据的时候,先关闭B服务器的二进制日志。

4. 让B先成为slave,再让A成为slave

5. 测试

三、开始配置

1. 创建授权用户

2. 编辑配置文件

重启服务

创建测试用的表

3. 将表导入到B服务器上

4. 让B服务器先成为slave

再让A服务器成为slave

查看A、B服务器的状态:

5. 测试:

这样双主模型就已经实现了。

项目要求

两台服务器互为主从,双向同步数据。当一台服务器上的数据有增删改等操作时,另一台服务器上的mysql同步的数据库也有同样的操作。利用MySQL主从同步原理,实现MySQL双向同步。

实施环境

服务器为windows 2008 R2,mysql版本为5.5.30,服务器server1:192.168.0.165 server2:192.168.0.166

1、配置数据库my.ini文件

修改server1:192.168.0.165的my.ini文件,增加以下内容:

server-id=1
binlog-do-db=ctbsdb
binlog-ignore-db=mysql
log-slave-updates
replicate-do-db=ctbsdb
replicate-ignore-db=mysql
log-bin=mysql-bin
auto_increment_offset=1
auto_increment_increment=2

修改server2:192.168.0.166的my.ini文件,增加以下内容:

server-id=2
binlog-do-db=ctbsdb
binlog-ignore-db=mysql
log-slave-updates
replicate-do-db=ctbsdb
replicate-ignore-db=mysql
log-bin=mysql-bin
auto_increment_offset=2
auto_increment_increment=2

重启两台机器的mysql服务。

配置项释义

server-id:标识,唯一,值范围在:1至2^23-1

binlog-do-db和replicate-to-db:要同步的数据库,多个需要同步的数据可以继续向下写

binlog-ignore-db和replicate-ignore-db:不需要同步的数据库

log-bin:配置是否在数据库有变动时写二进制日志

auto_increment_offset和auto_increment_increment:当同步断开,两台服务器分别有新数据进入,那么主键ID是自增长列会出现冲突的情况,会导致同步无法继续。加上上面两个设置后server1的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数,server2的为偶数。

2、在两台机器上新增同步用户

在两台服务器的mysql用户里新增用户名为slaveuser,密码为123456的同步用户。

在192.168.0.165上运行

grant replication slave on *.* to slaveuser@192.168.0.166 identified by '123456';

在192.168.0.166上运行

grant replication slave on *.* to slaveuser@192.168.0.165 identified by '123456';

3、设置主机并启动从服务器线程

在服务器server1:192.168.0.165上用MySQL命令行工具执行如下语句:

mysql> show master status;

得到的结果如下

+---------------------+------------+---------------------+--------------------------+
|              File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+------------+---------------------+--------------------------+
| mysql-bin.000020 |        107 |          ctbsdb       |             mysql            |
+---------------------+------------+---------------------+--------------------------+
1 row in set (0.00 sec)

再到服务器server2:192.168.0.166上打开mysql命令

mysql> stop slave;
mysql> change master to master_host='192.168.0.165',master_user='slaveuser',master_password='123456',master_port=3306,master_log_file='mysql-bin.000020',master_log_pos=107;
mysql> start slave;
mysql> show slave status\G

查看如下两项,得到的结果为Yes即表示正常。

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

操作到此步即已完成两台服务器的主从同步,接下来是把server1作为从,server2作为主服务器来设置。

4、执行与第三步同样的操作,只是机器反过来

在服务器server2:192.168.0.166上用MySQL命令行工具执行如下语句:

mysql> show master status;

得到如下结果

+---------------------+------------+---------------------+--------------------------+
|            File           |  Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+------------+---------------------+--------------------------+
| mysql-bin.000004 |    38026 |        ctbsdb         |             mysql            |
+---------------------+------------+---------------------+--------------------------+
1 row in set (0.00 sec)

再到服务器192.168.0.165上打开mysql命令

mysql> stop slave;

mysql> change master to master_host='192.168.0.166',master_user='slaveuser',master_password='123456',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=38026;

mysql> start slave;

mysql> show slave status\G

同样查看slave-io-running与slave-sql-running的结果是否为yes

做完上面的步骤,即完成两台服务器mysql数据库的主主同步。

写在最后

如果只是想完成主从同步,做到第三步就可以了,而且my.ini的配置文件也不用加上auto_increment_offset和auto_increment_increment,网上有很多资料也介绍了主主同步,但没写清楚所用的mysql使用的是什么版本。mysql5.5以后就在配置文件里不支持写master-host和master-user等方式了,如果my.ini配置文件没有写正确,重启mysql服务是不能正常启动的。所以在配置之前先看清楚使用的mysql是什么版本。