mkdir -p /data/mysql-cluster/{master/conf,master/data,slave/conf,slave/data}
cd /data/mysql-cluster/
#① 创建主库配置文件
cat << 'EOF' > master/conf/my.cnf
[mysqld]
server-id=110                   # 主库唯一ID
log-bin=mysql-bin               # 开启二进制日志
binlog_format=ROW               # GTID 必须使用 ROW 格式
# GTID 核心配置
gtid_mode=ON                    # 开启 GTID 模式
enforce_gtid_consistency=ON     # 强制 GTID 一致性检查
# 基础配置
default-authentication-plugin=mysql_native_password # 降低主从认证复杂度
character-set-server=utf8mb4
EOF
#② 创建从库配置文件
cat << 'EOF' > slave/conf/my.cnf
[mysqld]
server-id=120                   # 从库唯一ID,不能与主库冲突
log-bin=mysql-bin               # 从库也开启binlog,方便以后做级联或主备切换
binlog_format=ROW
# GTID 核心配置
gtid_mode=ON
enforce_gtid_consistency=ON
# 从库专有配置
relay-log=mysql-relay-bin       # 开启中继日志
skip-replica-start=1            # 关键:防止容器启动时自动连接主库导致报错,等我们配置完再启动
# 基础配置
default-authentication-plugin=mysql_native_password
character-set-server=utf8mb4
EOF

vim docker0-compose.yml
version: '3.8'

services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword123  # 主库 root 密码
    ports:
      - "3316:3306"
    volumes:
      - ./master/conf/my.cnf:/etc/mysql/my.cnf
      - ./master/data:/var/lib/mysql
    networks:
      - mysql-net

  mysql-slave:
    image: mysql:8.0
    container_name: mysql-slave
    restart: always
    depends_on:
      - mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword123  # 从库 root 密码
    ports:
      - "3307:3306"
    volumes:
      - ./slave/conf/my.cnf:/etc/mysql/my.cnf
      - ./slave/data:/var/lib/mysql
    networks:
      - mysql-net

networks:
  mysql-net:
    driver: bridge
#启动编排工具
docker compose up -d

docker exec -it mysql-master mysql -uroot -prootpassword123
-- 1. 彻底清理可能存在的旧残留
DROP USER IF EXISTS 'repl'@'%';
-- 2. 重新创建账号(密码必须跟你在从库配置的 'ReplPassword123' 严格一致,注意大小写)
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'ReplPassword123';
-- 3. 赋予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 4. 刷新权限使其生效
FLUSH PRIVILEGES;
-- 5. 退出主库
EXIT;

docker exec -it mysql-master/mysql-slave mysql -uroot -prootpassword123
CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_PORT=3306,
  MASTER_USER='repl',
  MASTER_PASSWORD='ReplPassword123',
  MASTER_AUTO_POSITION=1;
START SLAVE;

docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "STOP SLAVE; START SLAVE;"
docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "SHOW SLAVE STATUS\G" | grep -E "Slave_IO_Running|Slave_SQL_Running"
#验证
docker exec -it mysql-master mysql -uroot -prootpassword123 -e "
CREATE DATABASE IF NOT EXISTS gu_world;
USE gu_world;
CREATE TABLE IF NOT EXISTS characters (id INT PRIMARY KEY, name VARCHAR(50));
INSERT INTO characters VALUES (1, '古月方源');
"
docker exec -it mysql-slave mysql -uroot -prootpassword123 -e "SELECT * FROM gu_world.characters;"

更多推荐