环境

阿里云服务器:CentOS 7.9

本地:Windows 10 64

MYSQL:8.0.x

步骤

  1. 创建 msyql 实例 master,映射端口 3307;

    1
    2
    3
    4
    5
    docker run -p 3307:3306 --name="mysql-master" \
    -v /mydata/mysql-master/log:/var/log/mysql \
    -v /mydata/mysql-master/data:/var/lib/mysql \
    -v /mydata/mysql-master/conf:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 -d mysql

    启动错误:WARNING: IPv4 forwarding is disabled. Networking will not work

    没有开启转发,docker网桥配置完后,需要开启转发,不然容器启动后,就会没有网络;

    解决方案:

    1. vim /etc/sysctl.conf

      添加如下配置项;

      1
      net.ipv4.ip_forward=1
    2. 重启 network 和 docker 服务;

      1
      systemctl restart network && systemctl restart docker
    3. 查看是否修改成功;

      1
      sysctl net.ipv4.ip_forward

    参考来源:https://blog.csdn.net/cljdsc/article/details/115207336

  2. 进入/mydata/mysql-master/conf目录下新建文件my.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [mysqld]
    ## 设置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
  3. 重启 mysql;

    1
    docker restart mysql-master
  4. 进入 mysql-master,在 master 容器实例内创建数据同步用户;

    1
    2
    3
    4
    5
    CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%';

    ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123456'; #修改验证方式
    flush privileges; #刷新权限
  5. 新建从服务器 3308;

    1
    2
    3
    4
    5
    docker run -p 3308:3306 --name="mysql-slave" \
    -v /mydata/mysql-slave/log:/var/log/mysql \
    -v /mydata/mysql-slave/data:/var/lib/mysql \
    -v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
    -e MYSQL_ROOT_PASSWORD=123456 -d mysql
  6. 进入/mydata/mysql-slave/conf目录下新建文件my.cnf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    [mysqld]
    ##设置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
  7. 重启 slaver 实例;

    1
    docker restart mysql-slave
  8. 进入 master 数据库,查看主数据库中主从同步状态;

    1
    show master status;
  9. 进入 slave 数据库,配置主从复制;

    1
    change master to master_host='172.23.81.57', master_user='root', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=710, master_connect_retry=30;
  10. 在从数据库中查看主从同步状态;

    1
    show slave status \G
  11. 从数据库中开启主从同步;

    1
    start slave;

    再次查看主从同步状态中的下面两项是否变为「YES」;

    1
    2
    Slave_IO_Running: Connecting // 值应该为YES
    Slave_SQL_Running: Yes

    出现错误:

    Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection

    原因:

    MYSQL 8.0.x 修改了验证方式,无法在 slave 中使用 master 帐号通过 3307 端口登录主数据库,需要改回原本的验证方式;

    ALTER USER ‘root’ IDENTIFIED WITH mysql_native_password BY ‘123456’;

    注意是修改 master 数据库的帐号验证方式和密码(一定要仔细核对);

    核对完成后再在 slave 中重建主从配置

    1
    2
    3
    4
    stop slave;
    reset slave;

    change master to master_host='172.23.81.57', master_user='root', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000001', master_log_pos=710, master_connect_retry=30;

    参考文章:

  12. 验证,在 master 数据库中创建数据,查看 slave 中是否存在相同的数据;