docker 安装mysql8 实现互为主从

目录结构

先按照这个目录结构创建。

mysql.conf 配置,mysql的基础可以在此添加

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=slave-bin
# 指定需要复制的数据库
binlog-do-db=test_db
# 指定二进制日志的格式为行级别
binlog-format=row
# 启用 GTID 模式
gtid-mode=ON
# 强制 GTID 一致性检查
enforce-gtid-consistency=ON

注意我指定了数据库为test_db

docker一键部署配置

bash 复制代码
version: '3.8'

services:
  mysql-master:
    image: mysql:latest
    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:latest
    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  # 确保主服务器先启动

注意:我使用的mysql用户为默认root,可以自行创建其他用户访问数据库。

在mysql文件夹下执行

复制代码
docker-compose up -d

如上图所示表示mysql创建成功。

主从配置

获取主服务器状态信息

在主服务下执行,进入容器

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 的值。

如不配置ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

会出现 如下错误

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.3.150' IDENTIFIED BY '123456'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '123456'' at line 1

配置从服务器复制

在从服务器下执行,进入容器

bash 复制代码
#进入容器
docker-compose exec mysql-slave bash

#输入用户密码
mysql -u root -p

#配置从服务器复制
CHANGE MASTER TO MASTER_HOST='192.168.3.150', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3001, MASTER_LOG_FILE='master1-bin.000003', MASTER_LOG_POS=478;

注意

  1. MASTER_HOST='192.168.3.150': 如果在同一个docker 环境下,可以替换成主容器名称,即mysql-master
  2. MASTER_PORT=3001:如果不指定端口默认端口为3306。
  3. MASTER_LOG_FILE='master1-bin.000003', MASTER_LOG_POS=478; 必须指定主服务器的FilePosition 值。

配置成功后可以查看主从状态:

bash 复制代码
#查看主从配置状态
SHOW REPLICA STATUS\G;

如果从服务器正在运行作为主服务器的复制进程,则应该会看到 Slave_IO_RunningSlave_SQL_Running 字段都显示为 Yes。您还可以查看 Master_Log_FileRead_Master_Log_Pos 字段,以获取关于当前复制位置的信息。如上图所示,已经配置成功。

可能会出现的错误:

Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'

这个错误通常意味着从服务器无法找到在二进制日志索引文件中找到主服务器的第一个日志文件名。

重新初始化从服务器并重新开始复制过程就可以解决。

bash 复制代码
#停止复制
STOP SLAVE;
#清除从服务器上的复制信息
RESET SLAVE;
#启动复制
START SLAVE;

现在mysql-master为主数据库,mysql-slave为从数据库。实现互为主从,反过来再配置一遍即可。

获取从服务器状态信息

从服务器下执行

bash 复制代码
#为了避免从服务复制出现权限不足的情况需要执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

# 查看状态
SHOW MASTER STATUS;

如上图所示,主从信息是有变化的,同时记录 FilePosition 的值。

配置主服务器复制

在主服务下执行

bash 复制代码
#配置主服务器复制
CHANGE MASTER TO MASTER_HOST='192.168.3.150', MASTER_USER='root', MASTER_PASSWORD='123456',MASTER_PORT=3002, MASTER_LOG_FILE='slave-bin.000003', MASTER_LOG_POS=1855;

#开始复制
START SLAVE;

#查看主从配置状态
SHOW REPLICA STATUS\G;

如上图所示,即主从配置成功。

测试主从复制

在其中一个数据添加数据

另外一个数据库查询

做了个gif。

相关推荐
chy0000131 分钟前
MySQL
mysql
ん贤34 分钟前
数据库事务
数据库·mysql·事务
爱学习的小邓同学39 分钟前
MySQL --- MySQL库和表的操作
数据库·mysql
Bert.Cai2 小时前
MySQL简介
数据库·mysql
摇滚侠2 小时前
Redis 和 MySQL 数据同步方案,ElasticSearch 和 MySQL 数据同步方案
java·redis·mysql
披着羊皮不是狼2 小时前
(9)批量生成文章并同步存入 MySQL 和 Redis
数据库·redis·mysql
七夜zippoe3 小时前
DolphinDB SQL查询:从简单到复杂
数据库·sql·mysql·查询·dolphindb
WAIT_TIME3 小时前
昇腾910B虚拟卡(vNPU)创建以及Docker挂载
docker·容器·昇腾·runtime·虚拟显卡·vnpu
大大杰哥3 小时前
Docker笔记
java·docker
wuyikeer4 小时前
如何在docker中的mysql容器内执行命令与执行SQL文件
sql·mysql·docker