1. 准备工作


  • 确认网络连通性:确保两个 Docker 容器所在的系统能够相互通信,你可以使用 ping 命令测试网络连接。

  • 记录数据库信息:记录两个 MySQL 数据库的 IP 地址、端口、用户名和密码等信息。

2. 配置主数据库(Master)

2.1 进入主数据库容器


收起

bash

docker exec -it <master_container_name> bash


其中 <master_container_name> 是主数据库容器的名称。

2.2 修改 MySQL 配置文件


编辑 my.cnf 或 my.ini 文件(位置可能因 MySQL 版本和容器配置而异,通常在 /etc/mysql/my.cnf),添加或修改以下配置:


收起

ini

[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-do-db = <database_name>  # 指定需要复制的数据库名称


  • server-id:每个 MySQL 实例必须有一个唯一的 ID。

  • log-bin:开启二进制日志,用于记录数据库的更改操作。

  • binlog-do-db:指定需要复制的数据库,如果不指定,将复制所有数据库。

2.3 重启主数据库容器


退出容器并重启主数据库容器,使配置生效:


收起

bash

exit
docker restart <master_container_name>

2.4 创建复制用户


进入主数据库容器并登录 MySQL:


收起

bash

docker exec -it <master_container_name> mysql -u root -p


在 MySQL 中创建一个用于复制的用户,并授予复制权限:


收起

sql

CREATE USER 'repl_user'@'%' IDENTIFIED BY 'repl_password';
GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%';
FLUSH PRIVILEGES;


  • repl_user:复制用户的用户名。

  • repl_password:复制用户的密码。

2.5 查看二进制日志信息


在 MySQL 中执行以下命令,记录二进制日志文件名和位置:


收起

sql

SHOW MASTER STATUS;


输出结果类似于:


收起

plaintext

+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1234     | test_db      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+


记录 File 和 Position 的值,后续配置从数据库时会用到。

3. 配置从数据库(Slave)

3.1 进入从数据库容器


收起

bash

docker exec -it <slave_container_name> bash


其中 <slave_container_name> 是从数据库容器的名称。

3.2 修改 MySQL 配置文件


编辑 my.cnf 或 my.ini 文件,添加或修改以下配置:


收起

ini

[mysqld]
server-id = 2


确保 server-id 与主数据库的 server-id 不同。

3.3 重启从数据库容器


退出容器并重启从数据库容器,使配置生效:


收起

bash

exit
docker restart <slave_container_name>

3.4 配置从数据库复制


进入从数据库容器并登录 MySQL:


收起

bash

docker exec -it <slave_container_name> mysql -u root -p


在 MySQL 中执行以下命令,配置从数据库连接到主数据库并开始复制:


收起

sql

CHANGE MASTER TO
    MASTER_HOST = '<master_ip>',
    MASTER_USER = 'repl_user',
    MASTER_PASSWORD = 'repl_password',
    MASTER_LOG_FILE = '<master_log_file>',
    MASTER_LOG_POS = <master_log_pos>;


  • <master_ip>:主数据库的 IP 地址。

  • <master_log_file>:主数据库 SHOW MASTER STATUS 命令输出的 File 值。

  • <master_log_pos>:主数据库 SHOW MASTER STATUS 命令输出的 Position 值。

3.5 启动从数据库复制


收起

sql

START SLAVE;

3.6 检查从数据库复制状态


收起

sql

SHOW SLAVE STATUS\G


确保 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,表示复制正常工作。

4. 验证复制


在主数据库中创建、修改或删除数据,然后检查从数据库中是否同步更新。如果一切正常,从数据库将自动复制主数据库的操作。

注意事项