docker-MySQL 8 主从搭建

一.目录结构:

我是在/home目录下,建立个sql文件夹:

二、配置文件

1.mysql配置

mysql-master下.conf文件配置

bash 复制代码
######
[mysqld]
server-id=1
# 启用二进制日志
log-bin=master-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON

mysql-slave下.conf文件配置

bash 复制代码
#######
[mysqld]
server-id=2
# 启用二进制日志
log-bin=master-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON

注意: 要同步的数据库名:test_db

2.docker-compose.yml配置

在/home/mysql文件夹下建立docker-compose.yml

bash 复制代码
version: '3.8'
 
services:
  mysql-master:
    image: mysql:8.0
    container_name: mysql-master
    environment:
      MYSQL_ROOT_PASSWORD: 123456  # MySQL root 用户的密码
      MYSQL_DATABASE: test_db  # 要创建的数据库名称
    ports:
      - "3001:3306"  # 映射到主服务器的端口
    volumes:
      - ./mysql-master/data:/var/lib/mysql  # 挂载数据目录
      - ./mysql-master/config/mysql.conf:/etc/mysql/conf.d/mysql.conf  # 挂载主服务器的配置文件
      - ./mysql-master/log:/var/log/mysql  # 挂载日志目录
    command: --server-id=1 --log-bin=master-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON  # 主服务器的命令参数
 
  mysql-slave:
    image: mysql:8.0
    container_name: mysql-slave
    environment:
      MYSQL_ROOT_PASSWORD: 123456  # MySQL root 用户的密码
      MYSQL_DATABASE: test_db  # 要创建的数据库名称
    ports:
      - "3002:3306"  # 映射到从服务器的端口
    volumes:
      - ./mysql-slave/data:/var/lib/mysql  # 挂载数据目录
      - ./mysql-slave/config:/etc/mysql/conf.d  # 挂载从服务器的配置文件
      - ./mysql-slave/log:/var/log/mysql  # 挂载日志目录
    command: --server-id=2 --log-bin=slave-bin --binlog-do-db=test_db --binlog-format=row --gtid-mode=ON --enforce-gtid-consistency=ON --skip-slave-start  # 从服务器的命令参数
    depends_on:
      - mysql-master  # 确保主服务器先启动

注意:****--binlog-do-db=test_db

三、主从配置

获取主服务器状态信息

在/home/mysql下执行,进入容器

docker-compose exec mysql-master bash(等效于 docker exec -it <containerid> /bin/bash)

bash 复制代码
#进入容器内部
docker-compose exec mysql-master bash
 
#输入用户密码
mysql -u root -p
 
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
 
# 查看状态
SHOW MASTER STATUS;

显示如下:

如上图所示,需要记下 FilePosition 的值。

同样,在mysql 下执行:

bash 复制代码
#进入容器
docker-compose exec mysql-slave bash
 
#输入用户密码
mysql -u root -p
 
#配置从服务器复制
CHANGE MASTER TO MASTER_HOST='172.16.10.227', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=760;

配置成功的话

mysql> 执行一下:SHOW REPLICA STATUS\G;

++++

注意成功的话 Running:Yes

如果时no的话 ,执行

mysql> slave stop;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> slave start;

之后再看是否成功。

**注意:**如果不小心在slave上进行了写操作,或者是slave重启事务回滚了,那么同步就不好使了。

需要手动再执行

mysql> slave stop;

查看主服务后,在从服务器执行

bash 复制代码
CHANGE MASTER TO MASTER_HOST='172.16.10.227', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master-bin.000004', MASTER_LOG_POS=xxxx;

mysql> slave start;

最后、设置从数据库为只读

ALTER SCHEMA test_db READ ONLY = 1;

查看结果 INFORMATION_SCHEMA**.**SCHEMATA_EXTENSIONS

相关推荐
shelby_loo3 小时前
通过 Docker 部署 MySQL 服务器
服务器·mysql·docker
prcyang6 小时前
Docker Compose
运维·docker·容器
蜗牛^^O^7 小时前
Docker和K8S
java·docker·kubernetes
脚踏实地的大梦想家7 小时前
【Docker】安装全流程与配置完整镜像源(可安装 nginx)
运维·docker·容器
Zww08917 小时前
docker部署个人网页导航
运维·docker·容器
PeterJXL7 小时前
Docker-compose:管理多个容器
运维·docker·容器
海王正在撒网8 小时前
用 Docker 部署 Seafile 社区版
运维·docker·容器
sleP4o9 小时前
Python操作MySQL
开发语言·python·mysql
晓星航9 小时前
Docker本地部署Chatbot Ollama搭建AI聊天机器人并实现远程交互
人工智能·docker·机器人