Docker安装Mysql8.0主从复制

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1使用portainer快速创建mysql

在这里插入图片描述

2.mysql-master

version: '3.3'
services:
  mysql-app:
    image: 'mysql:8.0'
    container_name: 'mysql'
    restart: always
    ports:
      - '3307:3306'
    environment:
      MYSQL_ROOT_PASSWORD: '123456'  # root用户的密码
      MYSQL_ROOT_HOST: '%'       # 访问权限
     # MYSQL_USER: test           # 创建新用户
     # MYSQL_PASSWORD: test       # 新用户的密码
    volumes:
      - '/etc/localtime:/etc/localtime:ro'  #同步宿主机日期时间到容器
      - '/opt/app/mysqlmaster/data:/var/lib/mysql'
      - '/opt/app/mysqlmaster/conf:/etc/mysql/conf.d'
      - '/opt/app/mysqlmaster/logs:/logs'
    command:
      
      # default-authentication-plugin=mysql_native_password   mysql5为mysql_native_password, 支持较好, mysql8为默认为caching_sha2_password, 部分旧软件不支持;
      # character-set-server=utf8mb4                          默认创建新数据的新建字符集
      # collation-server=utf8mb4_general_ci                   默认创建新数据的新建排序规则
      # default-time-zone='+8:00'                             选择正8
      # max_connections=1000                                  设置最大连接数
      # innodb_lock_wait_timeout=500                          innodb的dml操作的行级锁的等待时间
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --lower_case_table_names=1
      --collation-server=utf8mb4_general_ci
      --default-time-zone='+8:00'
      --max_connections=1000
      --innodb_lock_wait_timeout=500


3.mysql slave

version: '3.3'
services:
  mysql-app:
    image: 'mysql:8.0'
    container_name: 'mysqlslave'
    restart: always
    ports:
      - '3308:3306'
    environment:
      MYSQL_ROOT_PASSWORD: '123456'  # root用户的密码
      MYSQL_ROOT_HOST: '%'       # 访问权限
     # MYSQL_USER: test           # 创建新用户
     # MYSQL_PASSWORD: test       # 新用户的密码
    volumes:
      - '/etc/localtime:/etc/localtime:ro'  #同步宿主机日期时间到容器
      - '/opt/app/mysqlslave/data:/var/lib/mysql'
      - '/opt/app/mysqlslave/conf:/etc/mysql/conf.d'
      - '/opt/app/mysqlslave/logs:/logs'
    command:
      
      # default-authentication-plugin=mysql_native_password   mysql5为mysql_native_password, 支持较好, mysql8为默认为caching_sha2_password, 部分旧软件不支持;
      # character-set-server=utf8mb4                          默认创建新数据的新建字符集
      # collation-server=utf8mb4_general_ci                   默认创建新数据的新建排序规则
      # default-time-zone='+8:00'                             选择正8
      # max_connections=1000                                  设置最大连接数
      # innodb_lock_wait_timeout=500                          innodb的dml操作的行级锁的等待时间
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --lower_case_table_names=1
      --collation-server=utf8mb4_general_ci
      --default-time-zone='+8:00'
      --max_connections=1000
      --innodb_lock_wait_timeout=500


4.部署在这里插入图片描述

在这里插入图片描述

编写主从的配置文件my.cnf

编写主数据库

vi my.cnf
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
## 设置server_id同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小事务
binlog_cache_size=1M  
## 设置使用的二进制日志格式mixed,statement,row
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误避免slave端复制中断。
## 如1062错误是指一些主键重复1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# 设置默认时区
default-time_zone='+8:00'

编写从数据库

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
## 设置server_id同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin  
## 设置二进制日志使用内存大小事务
binlog_cache_size=1M  
## 设置使用的二进制日志格式mixed,statement,row
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误避免slave端复制中断。
## 如1062错误是指一些主键重复1032错误是因为主从数据库数据不一致
slave_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin  
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读具有super权限的用户除外
read_only=1
# 设置默认时区
default-time_zone='+8:00'

进入主数据库

-- 创建slave用户以及设置密码
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授权slave
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';

在这里插入图片描述
说明 mysql8版本需要手动设置密码校验为 mysql_native_password
忘记设置通过修改的方式进行

mysql8版本设置账号要加一步ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

重启主从数据库

docker restart 主库;
docker restart 从库;

在主库中查看状态

在这里插入图片描述

在从数据库配置主从复制

change master to master_host='主库主机ip地址', master_user='步骤4创建的账号', master_password='步骤4创建的密码', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=2625, master_connect_retry=30;

在从数据库查看主从同步状态

SHOW SLAVE STATUS;

在从数据库开启主从同步

start slave;

该命令启动后可能会发现错误

此类报错和max_allowed_packet相关。首先max_allowed_packet控制着主从复制过程中一个语句产生的二进制binlog event大小它的值必须是1024的倍数 。

1 该参数在主备库的配置大小不一样主库的配置值大于从库的配置值。 从主库传递到备库的binlog event大小超过了主库或者备库的max_allowed_packet大小。

2 主库有大量数据写入时比如在主库上执行 laod datainsert into … select 语句产生大事务。

Got fatal error 1236 from master when reading data from binary log: 'binlog truncated in the middle of event; consider out of disk space on master; the first event 'mall-mysql-bin. 000001' at 1146, the last event read from './mall-mysql-bin. 000001' at 125, the last byte read from './mall-mysql-bin. 000001' at 1446.'

设置一下同步日志允许大小就行了
在主从数据库上均执行

set global max_allowed_packet =1*1024*1024*1024;
-- 重启
stop slave;
start slave;

在从数据库再次查看状态

SHOW SLAVE STATUS;
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: mysqlDocker