Linux下MySql主主复制

1、以两台MySql 5.7数据库(最好数据库版本保持一致,不然会出现各种奇葩问题,譬如字符集不一致的问题)为例,分为A和B,A的IP是
172.18.205.38 ,B的IP是
172.18.65.89 。在开始主主复制前,如果A数据库有数据,需要先手动导出A的数据结构及数据,再导入到B数据库,因为主主复制开启后,并不会同步之前的数据,只会同步开启之后的数据。

2、分别在A、B数据库上,创建供对方同步数据用的账号,并赋予权限:

A数据库上创建供B使用的mysql2的账号,账号IP指向B的服务器IP:

mysql>GRANT REPLICATION SLAVE ON *.* TO 'mysql2'@'172.18.65.89' IDENTIFIED BY 'mysql2';
mysql>FLUSH PRIVILEGES;

B数据库上创建供A使用的mysql1的账号,账号IP指向A的服务器IP:

mysql>GRANT REPLICATION SLAVE ON *.* TO 'mysql1'@'172.18.205.38' IDENTIFIED BY 'mysql1';
mysql>FLUSH PRIVILEGES;

注意:若mysql版本为8.0,mysql 8.0的命令有些差异,需要先创建账户,并指定账户不需SSL连接,再授权,分三步执行:

mysql> SET GLOBAL validate_password.policy = LOW;
mysql> create USER 'mysql1'@'172.18.205.38' IDENTIFIED WITH 'mysql_native_password' by 'mysql1';
mysql> ALTER USER 'mysql1'@'172.18.205.38' REQUIRE NONE;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'mysql1'@'172.18.205.38';
mysql> FLUSH PRIVILEGES;

3、修改A、B数据库配置文件my.cnf:

配置文件路径在/etc/mysql/mysql.conf.d/mysqld.cnf

A数据库配置为:

[mysqld]
server-id=1   #任意自然数n,只要保证两台MySQL主机不重复就可以了
log-bin=mysql-bin   #开启二进制日志
auto_increment_increment=2   #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=1   #起始值。一般填第n台主MySQL
#binlog-ignore=mysql   #忽略mysql库【我一般都不写】
#binlog-ignore=information_schema   #忽略information_schema库【我一般都不写】
replicate-do-db=currency   #要同步的数据库,默认所有库

B数据库配置为:

[mysqld]
server-id=2   #任意自然数n,只要保证两台MySQL主机不重复就可以了
log-bin=mysql-bin   #开启二进制日志
auto_increment_increment=2   #步进值auto_imcrement。一般有n台主MySQL就填n
auto_increment_offset=2   #起始值。一般填第n台主MySQL
#binlog-ignore=mysql   #忽略mysql库【我一般都不写】
#binlog-ignore=information_schema   #忽略information_schema库【我一般都不写】
replicate-do-db=currency   #要同步的数据库,默认所有库

若B库为Mysql 8.0,除了上述配置外,还要加上设置字符集为utf8的配置,否则A库同步B库数据时会报错:“Error ‘Character set ‘#255’ is not a compiled character set and is not specified in the ‘/usr/share/mysql/charsets/Index.xml’ file’ on query”

[mysqld]
character-set-server=utf8
collation-server=utf8_unicode_ci

[client]
default-character-set=utf8

配置好后重启MySQL

4、在A与B数据库上查看二进制日志名File和位置 Position

A上查看:

B上查看:

修改A的Master的Host二进制日志名与位置为B的Host、二进制日志名和位置 ,其中User与Password为在步骤2中为B创建的账户、密码:

mysql>CHANGE MASTER TO
MASTER_HOST='172.18.65.89',
MASTER_USER='mysql1',
MASTER_PASSWORD='mysql1',
MASTER_LOG_FILE='mysql-bin.000014',
MASTER_LOG_POS=19283;

修改B的Master的Host二进制日志名与位置为A的Host、二进制日志名和位置 ,其中User与Password为在步骤2中为A创建的账户、密码:

mysql>CHANGE MASTER TO
MASTER_HOST='172.18.205.38',
MASTER_USER='mysql2',
MASTER_PASSWORD='mysql2',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=193108;

5、开启start slave,并查看状态SHOW SLAVE STATUS\G

A库上执行:

B库上执行:

至此,两个库的Slave_IO_Running与Slave_SQL_Running状态都为Yes,表示配置成功!

发表评论

邮箱地址不会被公开。