一.目录结构:
我是在/home目录下,建立个sql文件夹:
二、配置文件
1.mysql配置
mysql-master下.conf文件配置
######
[mysqld]
server-id=1
# 启用二进制日志
log-bin=master-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
mysql-slave下.conf文件配置
#######
[mysqld]
server-id=2
# 启用二进制日志
log-bin=master-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON
注意:要同步的数据库名:test_db
2.docker-compose.yml配置
在/home/mysql文件夹下建立docker-compose.yml
version: '3.8'
services:
mysql-master:
image: mysql:8.0
container_name: mysql-master
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: test_db # 要创建的数据库名称
ports:
- "3001:3306" # 映射到主服务器的端口
volumes:
- ./mysql-master/data:/var/lib/mysql # 挂载数据目录
- ./mysql-master/config/mysql.conf:/etc/mysql/conf.d/mysql.conf # 挂载主服务器的配置文件
- ./mysql-master/log:/var/log/mysql # 挂载日志目录
command: --server-id=1 --log-bin=master-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON # 主服务器的命令参数
mysql-slave:
image: mysql:8.0
container_name: mysql-slave
environment:
MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码
MYSQL_DATABASE: test_db # 要创建的数据库名称
ports:
- "3002:3306" # 映射到从服务器的端口
volumes:
- ./mysql-slave/data:/var/lib/mysql # 挂载数据目录
- ./mysql-slave/config:/etc/mysql/conf.d # 挂载从服务器的配置文件
- ./mysql-slave/log:/var/log/mysql # 挂载日志目录
command: --server-id=2 --log-bin=slave-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON --skip-slave-start # 从服务器的命令参数
depends_on:
- mysql-master # 确保主服务器先启动
注意:--binlog-do-db=test_db
三、主从配置
获取主服务器状态信息
在/home/mysql下执行,进入容器
docker-compose exec mysql-master bash(等效于 docker exec -it <containerid> /bin/bash)
#进入容器内部
docker-compose exec mysql-master bash
#输入用户密码
mysql -u root -p
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
# 查看状态
SHOW MASTER STATUS;
显示如下:
如上图所示,需要记下 File
和 Position
的值。
同样,在mysql 下执行:
#进入容器
docker-compose exec mysql-slave bash
#输入用户密码
mysql -u root -p
#配置从服务器复制
CHANGE MASTER TO MASTER_HOST='172.16.10.227', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=760;
配置成功的话
mysql> 执行一下:SHOW REPLICA STATUS\G;
注意成功的话 Running:Yes
如果时no的话 ,执行
mysql> slave stop;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;
之后再看是否成功。
注意:如果不小心在slave上进行了写操作,或者是slave重启事务回滚了,那么同步就不好使了。
需要手动再执行
mysql> slave stop;
查看主服务后,在从服务器执行
CHANGE MASTER TO MASTER_HOST='172.16.10.227', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=xxxx;
mysql> slave start;
最后、设置从数据库为只读
ALTER SCHEMA test_db READ ONLY = 1;
查看结果 INFORMATION_SCHEMA.SCHEMATA_EXTENSIONS