1、准备docker-compose脚本
version: "3"
services:
master:
image: mysql:5.7.44
container_name: master
restart: always
#容器内赋予root权限
privileged: true
ports:
- 3307:3306
environment:
MYSQL_ROOT_PASSWORD: password123.
#用于从服务器同步
MYSQL_USER: slave
MYSQL_PASSWORD: password123.
volumes:
#同步时间配置
- /etc/localtime:/etc/localtime:ro
#表数据、bin-log,第一次先注释掉,使用docker cp命令从容器里拷贝出数据卷
#- ./master/data:/var/lib/mysql
#错误日志、慢日志
- ./master/logs:/var/log/mysql
command:
--server-id=1
--character-set-server=utf8mb4
--log-bin=mysql-bin
--expire_logs_days=30
--binlog-ignore-db=information_schema
--binlog-ignore-db=performation_schema
--binlog-ignore-db=sys
--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
--lower_case_table_names=1
--event_scheduler=ON
--max_allowed_packet=1024M
--slow_query_log=1
--slow_query_log_file=/var/log/mysql/mysql-slow.log
--long_query_time=8
--log-error=/var/log/mysql/mysql-error.log
slave:
image: mysql:5.7.44
container_name: slave
restart: always
#容器内赋予root权限
privileged: true
ports:
- 3308:3306
environment:
MYSQL_ROOT_PASSWORD: password123.
TZ: Asia/Shanghai
#用于从服务器查询sql,从服务器不要用带有修改权限的账号,免得不小心修改导致数据不同步
MYSQL_USER: query
MYSQL_PASSWORD: password123.
command:
--server-id=2
--character-set-server=utf8mb4
--relay-log=relay-log
--read-only=ON
--sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
--lower_case_table_names=1
--event_scheduler=ON
--max_allowed_packet=1024M
--slow_query_log=1
--slow_query_log_file=/var/log/mysql/mysql-slow.log
--long_query_time=8
--log-error=/var/log/mysql/mysql-error.log
volumes:
#同步时间配置
- /etc/localtime:/etc/localtime:ro
#表数据、bin-log,第一次先注释掉,使用docker cp命令从容器里拷贝出数据卷
#- ./slave/data:/var/lib/mysql
#错误日志、慢日志
- ./slave/logs:/var/log/mysql
2、启动容器
docker-compose up -d
3、拷贝数据卷
当前路径和目录层级如下:
执行拷贝数据卷命令:
docker cp master:/var/lib/mysql ./master/mysql && mv ./master/mysql ./master/data && chmod 755 ./master/data
docker cp slave:/var/lib/mysql ./slave/mysql && mv ./slave/mysql ./slave/data && chmod 755 ./slave/data
4、放开注释,重新构建容器
执行命令: docker-compose up -d
5、在master主数据库中给予slave账号权限
#给slave账号权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
6、在master主数据库查看master日志,并记下最后一条记录,从库将从此开始复制
#查看master日志
SHOW MASTER LOGS;
7、切换到slave从数据库,此时需要用root账户登录,执行如下sql
CHANGE MASTER TO
#主库ip
MASTER_HOST='192.168.31.229',
#主库端口
MASTER_PORT=3307,
#主库同步账户
MASTER_USER='slave',
#主库同步账户密码
MASTER_PASSWORD='password123.',
#上一个步骤记录的最后一条记录Log_name
MASTER_LOG_FILE='mysql-bin.000003',
#上一个步骤记录的最后一条记录File_size
MASTER_LOG_POS=505;
8、查看slave同步设置是否成功
#查看slave状态
SHOW SLAVE STATUS;
9、若步骤8成功,执行sql开启同步
#开始同步主库
START SLAVE;
10、验证主从同步,在主库新建数据库test
从库同步成功,至此主从搭建已成功。