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

相关推荐
这个DBA有点耶5 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
leeyi8 小时前
把软件装进不能上网的机房——一套建好了、还没上过战场的交付工程(第101篇)
docker·aigc·agent
YIAN10 小时前
Docker + Nginx 核心原理扫盲:从环境隔离到反向代理,运维面试必考点
后端·docker·面试
IT大白鼠12 小时前
Docker 实战 ELKF 日志监控:容器日志全栈收集分析方案
运维·docker·容器
九皇叔叔20 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
报错小能手1 天前
Kubernetes入门实战课 3
云原生·容器·kubernetes
愤怒的苹果ext1 天前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
小张同学a.1 天前
Docker 容器实战 1—— docker 基础与镜像构建
linux·运维·docker·容器
NJCloud1 天前
Docker 容器技术入门:部署、核心概念与基础命令
运维·docker·容器
2601_962072331 天前
docker自建rustdesk-server远程桌面
运维·docker·容器