学静思语
Published on 2025-06-23 / 0 Visits
0
0

MySQL实现主从复制

MySQL实现主从复制

1. 使用docker compose文件配置启动镜像

  • docker-compose.yml配置文件
version: '3'

services:
    mysql-master:
        # 镜像
        image: mysql:8.0.30
        # 设置容器名称
        container_name: mysql-master
        # 设置映射端口
        ports:
            - "3306:3306"
        # 设置挂载目录
        volumes:
            - 主机目录:/etc/mysql/conf.d
            - 主机目录:/var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=密码
        restart: unless-stopped
        healthcheck: # 为主库添加健康检查
            test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            - mysql-network


    mysql-slave1:
        image: mysql:8.0.30
        container_name: mysql-slave1
        ports:
            - "3307:3306"
        volumes:
            - 主机目录:/etc/mysql/conf.d
            - 主机目录:/var/lib/mysql
       # 配置主服务健康的状态下部署
       depends_on:
          mysql-master:
            condition: service_healthy
        environment:
            - MYSQL_ROOT_PASSWORD=目录
        restart: unless-stopped
        healthcheck: # 为从库添加健康检查
            test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            - mysql-network


    mysql-slave2:
        image: mysql:8.0.30
        container_name: mysql-slave2
        ports:
            - "3308:3306"
        volumes:
            - 主机目录:/etc/mysql/conf.d
            - 主机目录:/var/lib/mysql
        depends_on:
          mysql-master:
            condition: service_healthy
        environment:
            - MYSQL_ROOT_PASSWORD=密码
        restart: unless-stopped
        healthcheck: # 为从库添加健康检查
            test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p@&oGQXVz)Y&e6EpUpy4H4rQuXy2EDxGsvQ8"]
            interval: 10s
            timeout: 5s
            retries: 5
        networks:
            - mysql-network


networks:
    mysql-network:
        driver: bridge                       

2. 主机配置

1. my.cnf配置文件

  • my.cnf文件配置

    [mysqld]
    # 服务器唯一id,默认值1
    server-id=1
    # 设置日志格式,默认值ROW
    binlog_format=STATEMENT
    #设置密码默认加密方式
    default_authentication_plugin=mysql_native_password
    
    
    # 二进制日志名,默认binlog
    # log-bin=binlog
    # 设置需要复制的数据库,默认复制全部数据库
    #binlog-do-db=database
    #binlog-do-db=mydb
    # 设置不需要复制的数据库
    #binlog-ignore-db=mytestdb3
    #binlog-ignore-db=mytestdb4
    
  • binlog_format说明

    • row(默认):日志记录的是主机数据库写后的数据,批量操作性能较差,解决NOW()或者user()或者@@hostname等操作在主从机不一致的问题。
    • statement:日志记录的是主数据库的写指令,性能高,但是NOW()之类的函数和获取系统参数的操作会造成主从不同步问题。
    • mixed:是rowstatement的两种日志格式的混合使用,有函数使用row,没有函数使用statement

2.mysq服务配置

  • 配置主从复制账号并设置权限

    -- 创建用户
    create user '用户名'@'%';
    -- 设置密码,密码最高长度为32位
    alter user '用户名'@'%' identified with mysql_native_password by '密码';
    -- 设置你限
    grant replication slave on *.* to '用户名'@'%';
    -- 刷新权限
    flush privileges;
    

3. 查看主机此时的状态

  • 查看主机转状态,后面从机需要配置

    show master status;
    

    image-20250616220450723

3. 从机配置

1. 从机的my.cnf配置文件配置

  • my.cnf文件配置
[mysqld]
# 不可以重复
server-id=从机id
# 配置密码加密方式
default_authentication_plugin=mysql_native_password

2. 配置主从关系

change master to 
# 主机地址,这里使用docker网络可以直接填主机的容器名称
master_host='主机地址',
master_user='在主机中创建的主从复制账号',
master_password='密码',
master_psot=主机端口,
# 主机show master status 指令查询出的file字段
master_log_fiel='binlog.xxxx',
# 主机show master status 指令查询出的position字段
master_log_pos=position字段

Comment