菜单

波波
发布于 2025-07-11 / 0 阅读
0

【Docker】MySQL主从复制脚本

这里是系统是Centos7.6, MySQL版本8.0.24
目录结构
/mysql-gtid/
├── docker-compose.yml
├── master.cnf
├── slave.cnf
└── setup_gtid_replication.sh

1.docker-compase.yml

version: "3.8"

services:
  mysql-master:
    image: mysql:8.0.24
    container_name: mysql-master
    command:
      - --server-id=1
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --log-bin=mysql-bin
      - --binlog-format=ROW
      - --default-authentication-plugin=mysql_native_password
    volumes:
      - master_data:/var/lib/mysql
      - ./master.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "3306:3306"
    networks:
      - mysqlnet

  mysql-slave:
    image: mysql:8.0.24
    container_name: mysql-slave
    depends_on:
      - mysql-master
    command:
      - --server-id=2
      - --gtid-mode=ON
      - --enforce-gtid-consistency=ON
      - --log-bin=mysql-bin
      - --relay-log=mysql-relay-bin
      - --binlog-format=ROW
      - --default-authentication-plugin=mysql_native_password
    volumes:
      - slave_data:/var/lib/mysql
      - ./slave.cnf:/etc/my.cnf
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
    ports:
      - "3307:3306"
    networks:
      - mysqlnet

networks:
  mysqlnet:

volumes:
  master_data:
  slave_data:

2. master.cnf

[mysqld]
server-id=1
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
binlog-format=ROW

3. slave.cnf

[mysqld]
server-id=2
gtid-mode=ON
enforce-gtid-consistency=ON
log-bin=mysql-bin
relay-log=mysql-relay-bin
binlog-format=ROW

4.setup_gtid_replication.sh

#!/bin/bash
set -e

M_MASTER="mysql-master"
M_ROOT="root"
M_ROOT_PWD="rootpass"
REPL_USER="repl"
REPL_PWD="replpass"

docker exec mysql-master mysql -u$M_ROOT -p$M_ROOT_PWD -e "
CREATE USER IF NOT EXISTS '$REPL_USER'@'%' IDENTIFIED WITH mysql_native_password BY '$REPL_PWD';
GRANT REPLICATION SLAVE ON *.* TO '$REPL_USER'@'%';
FLUSH PRIVILEGES;
"

docker exec mysql-slave mysql -u$M_ROOT -p$M_ROOT_PWD -e "
STOP REPLICA;
CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='$M_MASTER',
  SOURCE_USER='$REPL_USER',
  SOURCE_PASSWORD='$REPL_PWD',
  SOURCE_AUTO_POSITION=1,
  GET_SOURCE_PUBLIC_KEY=1;
START REPLICA;
SHOW REPLICA STATUS\G
"


4的脚本内容可以自己在容器内手动执行。
可以手动指定source_host(主库的ip) 查看主从库的ip ,要使用主库的容器ip

docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-slave
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql-master

5.验证测试

docker exec mysql-master mysql -uroot -prootpass -e "
CREATE DATABASE IF NOT EXISTS testgtid;
USE testgtid;
CREATE TABLE t(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50));
INSERT INTO t(name) VALUES('X'),('Y');
"

docker exec mysql-slave mysql -uroot -prootpass -e "
USE testgtid;
SELECT * FROM t;
"

image