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

相关推荐
想学习java初学者1 分钟前
Docker compose部署elasticsearch(单机版)
运维·docker·容器
微刻时光2 小时前
Docker部署Nginx
运维·nginx·docker·容器·经验
小安运维日记2 小时前
CKA认证 | Day3 K8s管理应用生命周期(上)
运维·云原生·容器·kubernetes·云计算·k8s
陈小肚2 小时前
k8s 1.28.2 集群部署 docker registry 接入 MinIO 存储
docker·容器·kubernetes
A陈雷2 小时前
springboot整合elasticsearch,并使用docker desktop运行elasticsearch镜像容器遇到的问题。
spring boot·elasticsearch·docker
小扳2 小时前
Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)
运维·spring boot·后端·mysql·spring cloud·docker·容器
politeboy3 小时前
关于k8s中镜像的服务端口被拒绝的问题
云原生·容器·kubernetes
weixin_438197383 小时前
K8S创建云主机配置docker仓库
linux·云原生·容器·eureka·kubernetes
锐策9 小时前
〔 MySQL 〕数据库基础
数据库·mysql
日月星宿~11 小时前
【MySQL】summary
数据库·mysql