Docker搭建MySQL8.0.30主从数据库

拉取mysql 镜像

docker pull mysql:8.0.30

创建项目目录

mysql/
├── common
│   ├── mysql-master (配置文件路径)
│   │   ├── conf
│   │   │   └── my.conf
│   │   └── sql
│   │       └── create_user.sql
│   └── mysql-slave    (配置文件路径)
│       ├── conf
│       │   └── my.conf
│       └── sql
│           └── conn_master.sql
├── DATA                  (数据文件路径)
│   ├── mysql-master
│   └── mysql-slave
└── docker-compose.yml  (启动文件)

查看配置

查看docker-compose.yml

version: "3"
networks:
  db_network:

services:
  master:
    image: mysql:8.0.30
    container_name: master
    restart: always
    ports:
      - "3316:3306"
    mem_limit: 2gb
    env_file: ./common/mysql-master/.env  (数据库密码=111111)
    volumes:
      - ./common/mysql-master/conf/:/etc/mysql/conf.d/
      - ./DATA/mysql-master:/var/lib/mysql
    networks:
      db_network:

  slave:
    image: mysql:8.0.30
    container_name: slave
    restart: always
    ports:
      - "3326:3306"
    mem_limit: 2gb
    env_file: ./common/mysql-slave/.env  (数据库密码=111111)
    volumes:
      - ./common/mysql-slave/conf/:/etc/mysql/conf.d/
      - ./DATA/mysql-slave:/var/lib/mysql
    networks:
      db_network:
    depends_on:
      - master

查看mysql配置文件

关于配置文件中的参数及解释,借用的CSDN其他博主的,感谢博主大大。

master mysql配置

cat common/mysql-master/conf/my.conf
[mysqld]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
symbolic-links=0
secure-file-priv= NULL

#设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin

#服务器唯一id,默认为1,主数据库和从数据库的server-id不能重复
server-id=1

# 设置默认时区
default-time_zone='+8:00'

# 最大连接数
max_connections=10000

# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1


innodb_redo_log_capacity = 16M
#########可选配置#######

#主从复制的数据库名
#binlog-do-db=tmd
#指定忽略同步的数据库
#binlog-ignore-db=mysql

#为每个session分配的内存
binlog_cache_size=1M

#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row

#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。这里设置为7天
expire_logs_days=7

#跳过主从同步中遇到的所有错误或指定类型的错误,避免slave端复制中断,1062错误是指一些主键重复
slave_skip_errors=1062

!includedir /etc/mysql/conf.d/

slave mysql配置

cat common/mysql-slave/conf/my.conf
[mysqld]
##############################slave从配置##############################
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/run/mysqld/mysqld.sock
datadir=/var/lib/mysql
lower_case_table_names=1
symbolic-links=0

#设置同步的binarylog二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin

#服务器唯一ID,主数据库和从数据库的server-id不能重复
server-id=22

# 最大连接数
max_connections=10000

# 设置默认时区
default-time_zone='+8:00'

innodb_redo_log_capacity = 16M
###############################可选配置#################################
#需要主从复制的数据库
#replicate-do-db=tmd
#忽略同步的数据库
#binlog-ignore-db=mysql

#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M

#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row

#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
expire_logs_days=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,1062错误是指一些主键重复
slave_skip_errors=1062

#relay_log配置中继日志,默认采用主机名-relay-bin的方式保存日志文件
relay_log=replicas-mysql-relay-bin

#log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1

#防止改变数据(只读操作,除了特殊的线程)
read_only=1


!includedir /etc/mysql/conf.d/

查看数据目录

注: 容器启动前,必须保证数据目录为空

[root@localhost mysql]# tree DATA/
DATA/
├── mysql-master
└── mysql-slave

启动

启动容器

[root@localhost mysql]# docker-compose up -d
Creating network "mysql_db_network" with the default driver
Creating master ... done
Creating slave  ... done

查看容器信息

[root@localhost mysql]# docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                               NAMES
5b18f41527b1   mysql:8.0.30   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:3326->3306/tcp, :::3326->3306/tcp   slave
c66b356bcbf1   mysql:8.0.30   "docker-entrypoint.s…"   3 minutes ago   Up 3 minutes   33060/tcp, 0.0.0.0:3316->3306/tcp, :::3316->3306/tcp   master

获取master 容器IP地址

[root@localhost mysql]# docker inspect master|grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "",
                    "IPAddress": "172.23.0.2",

配置数据库

分别链接数据库

在这里插入图片描述

master 配置

进入master数据库,执行以下sql语句

CREATE USER 'master'@'%' IDENTIFIED WITH mysql_native_password BY 'master123';
GRANT REPLICATION SLAVE ON *.* TO 'master'@'%';
show master status;

在这里插入图片描述
(图 1-1)

获取字段 File = binlog.000002

在这里插入图片描述
(图 1-2)

slave 配置

我们上面已经获取到master 的IP,及File字段值,将在这里使用,

CHANGE MASTER TO
MASTER_HOST='172.23.0.2',
MASTER_USER='master',
MASTER_PASSWORD='master123',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=1163;

在这里插入图片描述

开始同步

1.同步

start slave;

在这里插入图片描述

show slave status;

在这里插入图片描述

2.排错

1.查看错误信息

发现上图中Slave_IO_Running = No
查看slave 容器日志,发现报错信息

docker logs -n 5 -f slave

[ERROR] [MY-013117] [Repl] Slave I/O for channel '': Fatal error: The slave I/O thread \n
 stops because master and slave have equal MySQL server ids; these ids must be different \n
for replication to work (or the --replicate-same-server-id option must be used on \n
slave but this does not always make sense; please check the manual before using it). Error_code: MY-013117

2. 解决错误

1.查看server_id
在 master、slave 数据库中分别执行
show variables like 'server_id'; 
发现 master、slave 的id 都是server_id = 1 

在这里插入图片描述

在这里插入图片描述

2.修改slave 的server_id
 set global server_id = 2;
 再次查询slave 的server_id
 show variables like 'server_id';

在这里插入图片描述

3. 重新开始同步
stop slave;
reset slave;
start slave;
show slave status 
下图中查看到Slave_IO_Running = Yes,说明问题解决

在这里插入图片描述

3. 验证

1. master 创建数据库表

2. 查看结果

数据库同步成功
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44157851/article/details/127795850