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。

相关推荐
我是哈哈hh2 小时前
【MySQL】在UBuntu环境安装以及免密码登录入门
linux·数据库·mysql·ubuntu
喪彪3 小时前
MySQL新手教学
数据库·mysql·adb
__lll_5 小时前
手把手教你用 Docker 部署 Vue 项目(含国内镜像加速 + 踩坑指南)
docker
HMBBLOVEPDX6 小时前
MySQL的多版本并发控制(MVCC):
数据库·mysql·mvcc
幽络源小助理7 小时前
MySQL实战优化高手教程 – 从架构原理到生产调优
数据库·mysql·架构
神仙别闹8 小时前
基于 JSP+Mysql实现MVC房屋租赁系统
java·mysql·mvc
科大饭桶10 小时前
C++入门自学Day11-- String, Vector, List 复习
c语言·开发语言·数据结构·c++·容器
HMBBLOVEPDX10 小时前
MySQL的锁:
数据库·mysql
掉头发的王富贵12 小时前
ShardingSphere-JDBC入门教程(上篇)
spring boot·后端·mysql
程思扬12 小时前
Nextcloud容器化部署革新:Docker+Cpolar构建高效私有云远程访问新架构
docker·容器·架构