我是在/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
- #进入容器内部
- 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