用docker快速搭建mysql主从复制环境

建立项目文件夹

mkdir -p /data/docker/mst

创建docker-compose.yml文件内容如下:

master:
  image: mysql:5.7
  environment:
    - MYSQL_ROOT_PASSWORD=123456
  ports:
    - "3306:3306"
  volumes:
    - ./mysql/data-master:/var/lib/mysql
  command: mysqld --lower_case_table_names=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --server-id=101 --log-bin=mysql-bin
  
slave:
  image: mysql:5.7
  environment:
    - MYSQL_ROOT_PASSWORD=123456
  ports:
    - "3316:3306"
  volumes:
    - ./mysql/data-slave:/var/lib/mysql
  command: mysqld --lower_case_table_names=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --server-id=102 --log-bin=mysql-bin --relay_log=relay-bin --read_only=on --super_read_only=on

启动主从数据库

docker-compose up -d

查看容器运行情况

docker-compose ps

登录主库操作:

#登录数据库,输入密码123456
docker exec -it mst_master_1 mysql -p

#关闭GROUP BY合法性检查
SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

#创建备份账户,用户从库连接主库复制数据
GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

#显示主库状态,从库配置时需要该配置
show master status;

登录从库操作:

#连接登录从库,输入密码123456
docker exec -it mst_slave_1 mysql -p

#关闭GROUP BY合法性检查 SET sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

#设置被同步的主数据库
change master to master_host='192.168.56.101',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=439;

#master_host为docker的地址不能写127.0.0.1,填写主数据库的服务器IP

#master_user是在主库创建的用于同步的用户
#master_log_pos是主库show master status;查询出的Position 

#启动服务
start slave;

#查看服务状态
show slave status\G

Slave_IO_State状态为
Waiting for master to send event就是成功了
Connecting to master多半是连接不通

接下来我们测试一下主从同步情况,在主库创建测试数据

登录主库

docker exec -it mst_master_1 mysql -p

---创建数据库
CREATE DATABASE mst; USE mst;

---创建数据表
CREATE TABLE `tb_user` ( `id` int NOT NULL , `username` varchar(255) NULL , PRIMARY KEY (`id`) );

---插入测试数据
INSERT INTO `mst`.`tb_user` (`id`, `username`) VALUES ('1', 'itmx');
INSERT INTO `mst`.`tb_user` (`id`, `username`) VALUES ('2', 'tc');
INSERT INTO `mst`.`tb_user` (`id`, `username`) VALUES ('3', 'xiaomo');

登录从库

docker exec -it mst_slave_1 mysql -p

#查询测试表中的数据
SELECT * FROM `mst`.`tb_user`;

如果同步正常,从库执行sql会出现以下结果:

完事!