MySQL 主从复制搭建手册(使用 Docker)
本手册提供了使用 Docker 搭建 MySQL 主从复制环境的详细步骤。适用于需要通过容器化方式快速部署和测试 MySQL 复制的场景。
前置准备
步骤 1: 创建所需文件夹
在宿主机上创建以下三个文件夹,用于存放 MySQL 的配置文件、数据文件和日志文件:
- 配置文件夹: /data/mydata/mysql/conf
- 数据文件夹: /data/mydata/mysql/data
- 日志文件夹: /data/mydata/mysql/log
步骤 2: 拷贝 MySQL 文件
- 启动一个临时的 MySQL 容器:
docker run --restart=always --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD='你的密码' -d mysql:8.0.19
- 从容器中拷贝 MySQL 的文件到宿主机指定的挂载目录:
docker cp mysql:/var/log/. /data/mydata/mysql/log # 拷贝日志文件
docker cp mysql:/var/lib/mysql/. /data/mydata/mysql/data # 拷贝数据文件
docker cp mysql:/etc/mysql/. /data/mydata/mysql/conf/ # 拷贝配置文件
步骤 3: 删除临时容器
停止并删除用于拷贝文件的临时容器:
docker stop mysql
docker rm mysql
主服务器配置
步骤 1: 修改配置文件
直接编辑 /data/mydata/mysql/conf/my.cnf 文件,配置如下:
[mysqld]
server-id = 1
log-bin = mysql-bin
步骤 2: 启动主服务器容器
使用以下命令启动主服务器容器,并挂载配置文件、数据目录和日志目录:
docker run --restart=always --name mysql-master -v /data/mydata/mysql/conf:/etc/mysql -v /data/mydata/mysql/data:/var/lib/mysql -v /data/mydata/mysql/log:/var/log -p 3306:3306 -e MYSQL_ROOT_PASSWORD='123456' -d mysql:8.0.19
步骤 3: 配置主服务器
- 登录到 MySQL 容器:
docker exec -it mysql-master mysql -u root -p
- 创建复制用户并授权:
CREATE USER 'replica'@'%' IDENTIFIED WITH 'mysql_native_password' BY 'replica_password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;
- 查看主服务器状态以获取复制所需信息:
SHOW MASTER STATUS;
记录下 File 和 Position 的值。
从服务器配置
步骤 1: 启动从服务器容器
使用与主服务器相似的命令启动从服务器容器,但确保 server-id 在配置文件中设置为不同的值(如 2)。
docker run --restart=always --name mysql-slave -v /data/mydata/mysql/conf:/etc/mysql -v /data/mydata/mysql/data:/var/lib/mysql -v /data/mydata/mysql/log:/var/log -p 3307:3306 -e MYSQL_ROOT_PASSWORD='123456' -d mysql:8.0.19
步骤 2: 配置从服务器
- 登录到 MySQL 容器:
docker exec -it mysql-slave mysql -u root -p
- 配置复制:
CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='replica', MASTER_PASSWORD='replica_password', MASTER_LOG_FILE='记录的File值', MASTER_LOG_POS=记录的Position值;
- 启动复制进程:
START SLAVE;
- 检查从服务器状态:
SHOW SLAVE STATUS\G
确认 Slave_IO_Running 和 Slave_SQL_Running 都是 Yes。
完成配置
至此,您已成功配置 MySQL 的主从复制环境。务必确保网络配置允许主从服务器之间的通信。