使用docker配置MySQL8主从复制包含数据卷

使用docker配置MySQL8主从复制包含数据卷(参考B站尚硅谷教程)

  1. docker安装完成后。

  2. 运行一个MySQL8主数据库(宿主机)

    ## -v /file1/mysql_master/log:/var/log/mysql :将日志映射到宿主机
    ## -v /file1/mysql_master/data:/var/lib/mysql:将主要数据映射
    ## -v /file1/mysql_master/conf:/etc/mysql/conf.d:将配置文件映射
    ##  -e MYSQL_ROOT_PASSWORD=password:配置MySQL的密码
    ##  -d mysql:latest:拉取最新的版本MySQL8  -p端口映射,宿主机端口:容器内数据库端口(注意防火墙要开启这些宿主机端口)端口自行选择未被占用端口
    ## docker run 命令会自动拉取镜像 ,--name 为主容器起个别名 
    docker run -p 3307:3306 --name mysql_master --privileged=true -v /file1/mysql_master/log:/var/log/mysql -v /file1/mysql_master/data:/var/lib/mysql -v /file1/mysql_master/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
  3. 配置主数据库的my.cnf配置文件,在/宿主机path/mysql/conf,就是上面一条命令中映射的/file1/mysql_master/conf(如需其他配置自行添加)(宿主机)

    [client]
          ##设置MySQL客户端默认字符集(有这个可能使用mysqlbinlog会报字符集错误,可以删除,然后重启容器)
          default-character-set=UTF8MB4
    [mysqld]
            ##设置server_id,同一局域网需要唯一
            server_id=101
            ##服务端字符集默认是latin1.修改
            character-set-server=UTF8MB4
            ##指定不需要同步的数据库名
            binlog-ignore-db=mysql
            ##开启二进制日志功能(这是二进制log文件前缀,名字任意)
            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
  4. 重启主容器(宿主机)

    ##查看容器信息
    docker ps
    ##会有这么一条d8eb9356865d   mysql:latest   "docker-entrypoint.s…"   54 minutes ago   Up 50 minutes   33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp   mysql_master
    ## 重启容器,因为起了别名所以可以用别名重启
    docker restart mysql_master
  5. 进入主容器(主数据库)(宿主机)

    ## 进入master容器(这里就将从宿主机进入主容器)
    docker exec -it mysql_master bash
    ##进入主数据库(这里进入主容器的MySQL数据库)
    mysql -u root -ppassword
  6. 在主数据库中(master容器)创建数据同步用户(用户名slave)(主容器的数据库中)

    ## 一定要有这条 mysql_native_password。mysql8.0 引入了新特性 caching_sha2_password;这种密码加密方式客户端不支持;客户端支持的是mysql_native_password 这种加密方式;还有就是'slave'@'%'这种方式是让所有地址均可访问,实际上这样不安全,最好设置特定的IP地址。
    CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
    ## 授权
    grant replication slave,replication client on *.* to 'slave'@'%';
  7. 新建从容器(数据库)(宿主机)

    ##和主配置基本一样。别名不能一样。端口自行选择未被占用端口
    docker run -p 3308:3306 --name mysql_slave --privileged=true -v /file1/mysql_slave/log:/var/log/mysql -v /file1/mysql_slave/data:/var/lib/mysql -v /file1/mysql_slave/conf:/etc/mysql/conf.d  -e MYSQL_ROOT_PASSWORD=password -d mysql:latest
  8. 配置从数据库的my.cnf(在上一步创建的数据卷映射位置/file1/mysql_slave/conf)(宿主机)

    [client]
        ##设置MySQL客户端默认字符集
        default-character-set=UTF8MB4
    [mysqld]
        ##设置server_id,同一局域网需要唯一
        server_id=102
        
        ##服务端字符集默认是latin1.修改
        character-set-server=UTF8MB4##指定不需要同步的数据库名
        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表示允许备库将其重放的事件也写进自己的二进制日志,好处是可以再从这个备库拓扑更多的备库。
        log_slave_updates=1
        ##设置slave为只读,只有super权限的用户除外
        read_only=1
  9. 重启从容器(宿主机)

    ## 在宿主机使用别名重启从容器
    docker restart mysql_slave
  10. 在主数据库中查看主从同步状态(里面的数据是下一步的基础)(主容器的数据库)

    ## 显示同步状态
    show master status \G;
    ##会显示 *************************** 1. row ***************************
    #            File: mall-mysql-bin.000004
    #         Position: 947
    #     Binlog_Do_DB: 
    # Binlog_Ignore_DB: mysql
    #Executed_Gtid_Set: 
    #1 row in set (0.01 sec)
    
    #ERROR: 
    #No query specified
    ##这个数据File: mall-mysql-bin.000004和Position: 947是配置下一步的数据源,根据这条Binlog_ignore_DB:mysql 也可以看出my.cnf 是否起作用。
    
    
  11. 进入从容器数据库slave(宿主机)

    ## 进入slave容器(这里开始进入从容器)
    docker exec -it mysql_slave bash
    ##进入从数据库(这里进入从容器的数据库)
    mysql -u root -ppassword
  12. 在从数据库中配置主从复制(从容器的数据库)

    #master_host:主数据库IP地址(宿主机)
    #master_port:主数据库端口
    #master_user:在主数据库中创建的从数据库用于同步的用户名:CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'MYSQL@1';
    #master_password:在主数据库中创建的从数据库用于同步的密码:CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY 'MYSQL@1';
    #master_log_file:指定要从数据库要复制的数据库日志文件,通过查看主数据库的状态(show master status;),获取File参数
    #master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据库的状态(show master status;),获取Position参数
    #master_connect_retry:连接失败隔多少秒重试
    change master to master_host='192.168.31.25', master_user='slave', master_password='password',master_port=3307, master_log_file='上步的参数', master_log_pos=上步的参数,master_connect_retry=30;
  13. 在从数据库中开启主从同步(从容器的数据库)

    start slave;
  14. 在从数据库中查看主从状态(从容器数据库)

    ##\G:以键值对的形式看结果,(默认Slave_IO_Running: No Slave_SQL_Running: No)都是No状态
    ##如果Slave_IO_Running和Slave_SQL_Running都为yes就可以了
    ##如果创建从用户的时候没有IDENTIFIED WITH mysql_native_password可能会这样Slave_IO_Running: Connecting
    show slave status \G;
  15. 基本可以简单使用了

    ##安装的时候可以多开几个客户端,方便操作
    #
    #主数据库的访问地址是 宿主机IP:3307 (注意端口是否开放)
    ##从数据库的访问地址是 宿主机IP:3308 ##read_only 参数默认不开启,开启后会阻止没有 super 权限的用户执行数据库变更操作 ##配置完成后容器重启也可使用 ##使用show variables like 'server_id'; 命令查看主从数据库的server_id 是否都一样,一样不行。如果不一样说明配置文件my.cnf没有生效。 ##出现问题要重新运行镜像的时候要清空/file1/mysql_slave/data和/file1/mysql_master/data两个文件夹下面的全部数据,否则重新运行的镜像还会保存之前的表结构等配置。 ##如果不删除这两个文件夹,可以保证再次运行的容器数据库的数据永久保存,但是数据库版本需一致。

     

posted @ 2022-08-18 20:07  一只大猫呢  阅读(217)  评论(0编辑  收藏  举报