MySQL主主复制详细教程

配置说明

主数据库1: 192.168.245.22
主数据库2: 192.168.245.33

1、修改MySQL配置文件:

vi /etc/my.cnf
  • 主数据库1:
server-id=1
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=1
binlog-ignore=mysql
binlog-ignore=information_schema
binlog-ignore=performance_schema
character_set_server=utf8
log-bin-trust-function-creators=1
  • 主数据库2:
port=3305
server-id=2
log-bin=mysql-bin
auto_increment_increment=2
auto_increment_offset=2
binlog-ignore=mysql
binlog-ignore=information_schema
binlog-ignore=performance_schema
character_set_server=utf8
log-bin-trust-function-creators=1
这里对上述添加的配置做详细说明:
  1. log_bin 启动mysql二进制日志,如果没有配置这个将无法远程链接
  2. binlog-ignore 指定不同步的数据库,如果有多个数据库不需要同步可以多个分别声明
  3. character_set_server=utf8 指定utf8为默认字符集
  4. server-id   可以为任意自然数,必须保证两台mysql主机不重复
  5. auto_increment_increment=2   步进值auto_imcrement。一般有n台主MySQL就填n
  6. auto_increment_offset   设定数据库中自动增长的起点,两台mysql的起点必须不同,这样才能避免两台服务器同步时出现主键冲突
  7. replicate-do-db  要同步的数据库,如果需要就填,指定数据库的名称即可,默认为所有库,声明了不同步就默认除了不同步数据库意外的所有库。这里我没写。
  8. log-bin-trust-function-creators=1 在默认情况下mysql会阻止主从同步的数据库function的创建,这会导致我们在导入sql文件时如果有创建function或者使用function的语句将会报错。

3、重启mysql

  • 主数据库1:
systemctl restart mysqld
  • 主数据库2:
systemctl restart mysqld

4、授权两个数据库相互授权

  • 主数据库1:新建数据库的用户,并进行相互授权
mysql -uroot -p //进入mysql
grant replication slave, replication client on *.* to '新用户名'@'主数据库2的IP' identified by '新密码'
flush privileges; //刷新MySQL的系统权限相关表,否则会无法用账号链接
  • 主数据库2:新建数据库的用户,并进行相互授权
mysql -uroot -p //进入mysql
grant replication slave, replication client on *.* to '新用户名'@'主数据库1的IP' identified by '新密码'
flush privileges; //刷新MySQL的系统权限相关表,否则会无法用账号链接

5、分别查看两台主机的日志节点

show master status;

6、相互设置同步的日志节点

  • 主数据库1
change master to 
master_host='192.168.245.33', 
master_user='主数据库2用户名',
master_password='主数据库2密码',
master_log_file='mysql-bin.000004', //对应主数据库2的File字段
master_log_pos=2873;  //对应主数据库2的Position字段
  • 主数据库2
change master to 
master_host='192.168.245.22', 
master_user='主数据库1用户名',
master_password='主数据库1密码',
master_log_file='mysql-bin.000004', //对应主数据库1的File字段
master_log_pos=2873;  //对应主数据库1的Position字段
说明:
  • 所有的内容都是另一台主机的内容,log_file和log_pos对于另一台主机的日志节点。还有,必须要说明的是,每次“flush privileges”和“stop slave”后日志节点的内容会改变,所以如果不确定,每次执行此操作前必须要查看日志节点——show master status。另外,执行此操作时slave必须没有启动,如果之前执行了,那就先停止,指令:stop slave;

7、在两台主机上启动slave服务

start slave;
  • 出现下图所示,表示成功

可能遇到的问题

  • master and slave have equal MySQL server UUIDs
    原因是:服务器的数据库UUID重复了,一般是虚拟机直接克隆会导致重复,数据库UUID存在auto.cnf里
    解决:
find/ -name auto.cnf //查找auto.cnf 的位置
mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak // 备份auto.cnf 
systemctl restart mysqld // 重启mysqld,会自动生成新的auto.cnf
评论