MySQL一主多从复制(基于二进制日志)

嘉美伯爵

MySQL MySQL 308

环境准备

  • 准备MySQL配置文件 my.cnf

应该注意的是每个MySQL服务器配置的 server_id 应是唯一不同的,把binlog-do-db后面的值修改为需要同步的数据库即可

[mysqld]
log_bin = mysql-bin
binlog-do-db = blogapi # 注意这儿仅仅复制blogapi数据库
server_id = 4168

datadir=/var/lib/mysql
symbolic-links=0

default-storage-engine=innodb
innodb_force_recovery=0  
max_allowed_packet=1024M
bind-address = 0.0.0.0
  • Docker容器

下载mysql docker 镜像,并运行,主要注意的两点:第一个 -v 后面是我们需要往宿主机同步的MySQL数据库信息;第二个 -v 后面的是往docker镜像内同步的mysql配置信息

# 分别在三台机器运行一下命令,若不具备多机条件,可以使用虚拟机或者给docke映射不同的端口
docker run --name master -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --restart=always -d --network=host -v /home/slave/data:/var/lib/mysql -v /home/slave/mysql/:/etc/mysql  mysql:5.7.22
docker run --name slave1 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --restart=always -d --network=host -v /home/slave/data:/var/lib/mysql -v /home/slave/mysql/:/etc/mysql  mysql:5.7.22
docker run --name slave2 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 --restart=always -d --network=host -v /home/slave/data:/var/lib/mysql -v /home/slave/mysql/:/etc/mysql  mysql:5.7.22
  • 进入master容器
# 进入master容器
docker exec -it master /bin/bash
mysql -uroot -p123456
# 分配从MySQL账号
GRANT replication slave ON *.* TO 'slave1'@'%' IDENTIFIED BY '123456';
GRANT replication slave ON *.* TO 'slave2'@'%' IDENTIFIED BY '123456';
flush privileges;
# 查看master状态,记住File和Position两个值,后面会用到
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |   278290 | blogapi      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
  • 表结构及数据同步

需要注意的是在你启动slave复制之前我们需要使用mysqldump命令对表结构和数据往slave同步

# 导出
mysqldump -u username -p dbname > dbname.sql
# 导入
mysqldump -u username -p dbname < dbname.sql
  • 进入slave容器
# 分别进入两个slave容器,执行以下命令,注意需要将上面的字段做一下替换(你的机器显示的值)
change master to master_host='172.19.62.136', master_user='slave1', master_password='123456',master_log_file='mysql-bin.000001', master_log_pos=278290;
# 开启同步
start slave;
# 查看状态,当Slave_IO_Running和Slave_SQL_Running都为yes说明同步成功
show slave status\G
--------
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

相关命令

  • start slave; # 开启同步
  • stop slave; # 停止同步

参考文档