Docker版MySQL主从

环境说明:

  • MySQL 版本:mysql:8.0.39

  • 宿主机 IP:192.168.7.7

  • 主库端口:3307,从库端口:3308

  • 数据目录:/mydata/mysql-master/ 和 /mydata/mysql-slave/

  • 因为版本是8.0的所以推荐使用GTID,此笔记用的不是GTID

一、准备工作

1.1 拉取 MySQL 镜像

 docker pull mysql:8.0.39

1.2 创建数据目录(Docker 会自动创建,手动创建更规范)

 mkdir -p /mydata/mysql-master/{conf,data,log}
 mkdir -p /mydata/mysql-slave/{conf,data,log}

二、搭建主库(Master)

2.1 启动主库容器

 docker run -p 3307:3306 --name mysql-master \
 -v /mydata/mysql-master/log:/var/log/mysql \
 -v /mydata/mysql-master/data:/var/lib/mysql \
 -v /mydata/mysql-master/conf:/etc/mysql/conf.d \
 -e MYSQL_ROOT_PASSWORD=root \
 -e MYSQL_ROOT_HOST='%' \
 -d mysql:8.0.39

2.2 配置主库 my.cnf

 cat > /mydata/mysql-master/conf/my.cnf <<'EOF'
 [mysqld]
 server_id=101
 log-bin=mysql-bin
 binlog_format=ROW
 binlog_ignore_db=mysql
 default_authentication_plugin=mysql_native_password
 character-set-server=utf8mb4
 collation-server=utf8mb4_unicode_ci
 EOF

2.3 重启主库使配置生效

 docker restart mysql-master

2.4 创建复制专用账户

 docker exec -it mysql-master mysql -uroot -proot

在 MySQL 命令行执行:

 CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
 FLUSH PRIVILEGES;

2.5 获取主库二进制日志坐标

 SHOW MASTER STATUS;

输出示例:

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

记下 File 和 Position 的值,配置从库时需要用到。

三、搭建从库(Slave)

3.1 启动从库容器

 docker run -p 3308:3306 --name mysql-slave \
 -v /mydata/mysql-slave/log:/var/log/mysql \
 -v /mydata/mysql-slave/data:/var/lib/mysql \
 -v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
 -e MYSQL_ROOT_PASSWORD=root \
 -e MYSQL_ROOT_HOST='%' \
 -d mysql:8.0.39

3.2 配置从库 my.cnf

 cat > /mydata/mysql-slave/conf/my.cnf <<'EOF'
 [mysqld]
 server_id=102
 relay-log=mysql-relay-bin
 read_only=1
 character-set-server=utf8mb4
 collation-server=utf8mb4_unicode_ci
 EOF

3.3 重启从库使配置生效

 docker restart mysql-slave

四、建立主从同步

4.1 登录从库

 docker exec -it mysql-slave mysql -uroot -proot

4.2 配置主从连接

将下面的 SOURCE_LOG_FILE 和 SOURCE_LOG_POS 替换为你刚才记下的值:

 CHANGE REPLICATION SOURCE TO
 SOURCE_HOST='192.168.7.7',
 SOURCE_USER='slave',
 SOURCE_PASSWORD='123456',
 SOURCE_PORT=3307,
 SOURCE_LOG_FILE='mysql-bin.000001',
 SOURCE_LOG_POS=849,
 SOURCE_CONNECT_RETRY=30;

4.3 启动复制

 START REPLICA;

4.4 验证同步状态

 SHOW REPLICA STATUS\G;

确认以下字段全部为预期值:

 Replica_IO_Running: Yes
 Replica_SQL_Running: Yes
 Last_IO_Errno: 0
 Last_IO_Error: 
 Last_SQL_Errno: 0
 Last_SQL_Error: 

五、测试主从同步

5.1 在主库创建测试数据

 docker exec -it mysql-master mysql -uroot -proot
 CREATE DATABASE test_db;
 USE test_db;
 CREATE TABLE users (id INT, name VARCHAR(50));
 INSERT INTO users VALUES (1, '张三'), (2, '李四');

5.2 在从库验证数据是否同步

 docker exec -it mysql-slave mysql -uroot -proot
 SHOW DATABASES;
 USE test_db;
 SELECT * FROM users;

如果能看到 test_db 和两条用户数据,说明主从复制搭建成功!✅

数据目录结构

 /mydata/
 ├── mysql-master/
 │   ├── conf/
 │   │   └── my.cnf          # 主库配置文件
 │   ├── data/               # 主库数据文件(持久化)
 │   └── log/                # 主库日志文件
 └── mysql-slave/
     ├── conf/
     │   └── my.cnf          # 从库配置文件
     ├── data/               # 从库数据文件(持久化)
     └── log/                # 从库日志文件