1. 主服务器(IP:192.168.186.77)
1.1 docker-compose.yml
services: mysql-master: image: mysql:latest # 使用最新版本的 MySQL 镜像 container_name: mysql-master # 容器的名称 environment: MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码 MYSQL_DATABASE: masterdb # 初始化时创建的数据库 MYSQL_USER: master # 初始化时创建的用户 MYSQL_PASSWORD: 123456 # 初始化时创建的用户密码 ports: - "3306:3306" # 端口映射,将容器内的 3306 端口映射到主机的 3306 端口 volumes: - mysql-master-data:/var/lib/mysql # 数据卷映射,用于数据持久化 command: --server-id=1 --log-bin=mysql-bin --binlog-format=ROW # MySQL 的启动命令,配置二进制日志和服务器 ID volumes: mysql-master-data: # 定义数据卷,用于存储 MySQL 数据文件,保证数据库数据的持久性
1.2. 启动命令
docker-compose up -d
1.3 测试连接
注:可以使用初始化用户进行测试连接,本文为了方便演示直接连接root用户。
2. 从服务器(IP:192.168.186.216)
2.1 docker-compose.yml
services: mysql-slave: image: mysql:latest # 使用最新版本的 MySQL 镜像 container_name: mysql-slave # 容器的名称 environment: MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码 MYSQL_DATABASE: slavedb # 初始化时创建的数据库 MYSQL_USER: slave # 初始化时创建的用户 MYSQL_PASSWORD: 123456 # 初始化时创建的用户密码 ports: - "3306:3306" # 端口映射,将容器内的 3306 端口映射到主机的 3306 端口 volumes: - mysql-slave-data:/var/lib/mysql # 数据卷映射,用于数据持久化 command: --server-id=2 --log-bin=mysql-bin --binlog-format=ROW # MySQL 的启动命令,配置二进制日志和服务器 ID volumes: mysql-slave-data: # 定义数据卷,用于存储 MySQL 数据文件,保证数据库数据的持久性
2.2 启动命令
docker-compose up -d
2.3 测试连接
3. 配置主从复制
3.1 在主服务器上,为从服务器创建一个具有复制权限的用户
CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL; GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%'; FLUSH PRIVILEGES;
运行结果:
> CREATE USER 'master_slave'@'%' IDENTIFIED BY '123456' REQUIRE SSL
[2024-07-23 17:34:23] 在 20 ms 内完成
> GRANT REPLICATION SLAVE ON *.* TO 'master_slave'@'%'
[2024-07-23 17:34:23] 在 26 ms 内完成
> FLUSH PRIVILEGES
[2024-07-23 17:34:23] 在 21 ms 内完成
3.2 获取主服务器的二进制日志位置信息
SHOW MASTER STATUS;
注:记下File
和Position
的值,从服务器需要配置。
3.3 在从服务器上,配置复制指向主服务器
CHANGE MASTER TO MASTER_HOST ='192.168.186.77', # 主服务器的 IP 地址 MASTER_USER ='master_slave', # 主服务器上配置的复制用户 MASTER_PASSWORD ='123456', # 复制用户的密码 MASTER_LOG_FILE ='mysql-bin.000004', # 主服务器的日志文件名 MASTER_LOG_POS =4494, # 日志文件的位置 MASTER_SSL=1;
运行结果:
> CHANGE MASTER TO
MASTER_HOST ='192.168.186.77', # 主服务器的 IP 地址
MASTER_USER ='master_slave', # 主服务器上配置的复制用户
MASTER_PASSWORD ='123456', # 复制用户的密码
MASTER_LOG_FILE ='mysql-bin.000004', # 主服务器的日志文件名
MASTER_LOG_POS =4494, # 日志文件的位置
MASTER_SSL=1
[2024-07-23 17:38:19] [HY000][1287] 'CHANGE MASTER' is deprecated and will be removed in a future release. Please use CHANGE REPLICATION SOURCE instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_HOST' is deprecated and will be removed in a future release. Please use SOURCE_HOST instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_USER' is deprecated and will be removed in a future release. Please use SOURCE_USER instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_PASSWORD' is deprecated and will be removed in a future release. Please use SOURCE_PASSWORD instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_LOG_FILE' is deprecated and will be removed in a future release. Please use SOURCE_LOG_FILE instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_LOG_POS' is deprecated and will be removed in a future release. Please use SOURCE_LOG_POS instead
[2024-07-23 17:38:19] [HY000][1287] 'MASTER_SSL' is deprecated and will be removed in a future release. Please use SOURCE_SSL instead
[2024-07-23 17:38:19] [HY000][1760] Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.
[2024-07-23 17:38:19] 在 73 ms 内完成
3.4 启动从服务器上的复制过程
START SLAVE;
运行结果:
> START SLAVE
[2024-07-23 17:39:28] [HY000][1287] 'START SLAVE' is deprecated and will be removed in a future release. Please use START REPLICA instead
[2024-07-23 17:39:28] 在 71 ms 内完成
3.5 检查从服务器的复制状态
SHOW SLAVE STATUS;
注:查看Slave_IO_Running
和Slave_SQL_Running
都应为Yes,说明配置成功。
4. 进行验证
4.1 主服务器执行语句
-- 创建数据库 CREATE DATABASE IF NOT EXISTS replication_test; -- 使用新创建的数据库 USE replication_test; -- 创建表 CREATE TABLE replication_table ( id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入数据 INSERT INTO replication_table (message) VALUES ('你好,这是一条测试消息。');
运行结果:
> CREATE DATABASE IF NOT EXISTS replication_test
[2024-07-23 17:48:19] 33 ms 中有 1 行受到影响
> USE replication_test
[2024-07-23 17:48:19] 在 6 ms 内完成
replication_test> CREATE TABLE replication_table
(
id INT AUTO_INCREMENT PRIMARY KEY,
message VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
[2024-07-23 17:48:19] 在 69 ms 内完成
replication_test> INSERT INTO replication_table (message)
VALUES ('你好,这是一条测试消息。')
[2024-07-23 17:48:19] 53 ms 中有 1 行受到影响
4.2 从服务器执行语句
-- 使用数据库 USE replication_test; -- 查询表以验证复制 SELECT * FROM replication_table;
5. 总结
基于IDEA和Docker-Compose简化操作过程,仅供学习参考,欢迎评论交流。