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.391.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.392.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
EOF2.3 重启主库使配置生效
docker restart mysql-master2.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.393.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
EOF3.3 重启从库使配置生效
docker restart mysql-slave四、建立主从同步
4.1 登录从库
docker exec -it mysql-slave mysql -uroot -proot4.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/ # 从库日志文件
原创
Docker版MySQL主从
本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
评论交流
欢迎留下你的想法