美文网首页
docker mysql主从复制

docker mysql主从复制

作者: 卫泽洪_70a7 | 来源:发表于2022-07-04 14:51 被阅读0次

    1、新建主服务器实例3307

    mkdir -p /mydata/mysql-master/log
    mkdir -p /mydata/mysql-master/data
    mkdir -p /mydata/mysql-master/conf
    
    docker run -p 3307:3306 --privileged=true \
    --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=weizehong1987 \
    -d mysql:8.0.29 \
    --lower_case_table_names=1
    

    启动失败,怎么办?
    我们可以通过如下命令来获取容器的日志地址

    docker inspect --format '{{.LogPath}}' 97069f94437b
    
    image.png

    看看日志就知道问题了

    客户端链接出现了问题:


    image.png

    出现这种问题的原因是:此时的MySQL配置不支持[远程连接]。
    解决:
    https://blog.csdn.net/qq_40181114/article/details/123591068

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

    [client]
    default_character_set=utf8mb4
    [mysqld]
    collation_server=utf8mb4_bin
    character_set_server=utf8mb4
    sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    log_bin_trust_function_creators=1
    
    ## 设置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错误是因为主从数据库数据不一致
    replica_skip_errors=1062
    
    
    

    3、修改完配置后重启master实例

    docker restart mysql-master
    

    4、进入mysql-master容器

    docker exec -it mysql-master /bin/bash
    
    mysql -uroot -p
    

    5、master容器实例内创建数据同步用户

    create user 'slave'@'%' identified by '123456';
    grant replication slave,replication client on *.* to 'slave'@'%';
    

    6、新建从服务器容器实例3308

    mkdir -p /mydata/mysql-slave/log
    mkdir -p /mydata/mysql-slave/data
    mkdir -p /mydata/mysql-slave/conf
    
    docker run -p 3308:3306 --privileged=true \
    --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=weizehong1987 \
    -d mysql:8.0.29 \
    --lower_case_table_names=1
    

    7、进入/mydata/mysql-slave/conf 目录下新建my.cnf

    [client]
    default_character_set=utf8mb4
    [mysqld]
    collation_server=utf8mb4_bin
    character_set_server=utf8mb4
    sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    log_bin_trust_function_creators=1
    
    ## 设置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错误是因为主从数据库数据不一致
    replica_skip_errors=1062
    ## relay_log配置中继日志
    relay_log=mall-mysql-relay-bin
    ## log_slave_updates 表示slave将复制事件写进自己的二进制日志
    log_slave_updates=1
    ## slave设置为只读(具有super权限的用户除外)
    read_only=1
    

    8、修改完配置后重启slave实例

    docker restart mysql-slave
    

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

    show master status;
    
    image.png

    10、进入mysql-slave容器

    docker exec -it mysql-slave /bin/bash
    

    11、在从数据库中配置主从复制

    change master to master_host='宿主机ip',master_user='slave',master_password='123456',master_port=3307,
    master_log_file='mall-mysql-bin.000002',master_log_pos=705,master_connect_retry=30,
    GET_MASTER_PUBLIC_KEY=1;
    

    说明:mysql8复制用户的身份验证插件是:caching_sha2_password,则需要指定GET_MASTER_PUBLIC_KEY=1;
    12、在从数据库中查看主从同步状态

    show slave status \G;
    
    image.png

    13、在从数据库中开启主从同步

    start slave;
    

    执行完之后,这里需要稍微等一会

    14、查看从数据库状态发现已经同步

    show slave status \G;
    
    image.png

    15、主从复制测试
    在主机新建数据库,新建数据表,新增数据,然后在从机查看

    16、问题


    image.png

    mysql 5.7 默认身份验证插件default_authentication_plugin是:mysql_native_password
    mysql 8.0 默认身份验证插件default_authentication_plugin是:caching_sha2_password

    在master执行

    create user 'slave'@'%' identified with mysql_native_password by '123456';
    create user 'slave'@'%' identified with mysql_native_password by '123456';
    

    相关文章

      网友评论

          本文标题:docker mysql主从复制

          本文链接:https://www.haomeiwen.com/subject/llalbrtx.html