MySQL的主从复制

1. 环境说明
    * docker启动
        docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=HeXXXX mysql:8.0.18 --lower_case_table_names=1
    
    * mysql.cnf中修改默认时区为上海
        /etc/mysql/my.cnf
        [mysqld]
        default-time-zone='+8:00'

    * 主机: 阿里云的MySQL数据库
        - mysql8.0.18
        - mysql.hepengju.com 101.132.97.183
        - root/HeXXXX

    * 从机: 腾讯云的MySQL数据库
        - mysql=8.0.18
        - mysql.hepengju.cn  118.24.46.154
        - root/HeXXXX

2. 备份主机数据并再从机恢复
    * 主机备份: docker exec mysql8 sh -c 'exec mysqldump --all-databases -uroot -pHeXXXX' > all_$(date +%Y%m%d).sql
    * 从机恢复: docker exec -i mysql8 sh -c 'exec mysql -uroot -pHeXXXX' < all_$(date +%Y%m%d).sql

3. 理论说明, 参考: https://www.cnblogs.com/hahahehexixihoho/p/10116061.html
    * 主机
        1) 配置唯一的server-id
        2) 开启二进制日志
        3) 获得master二进制日志文件名及位置
        4) 创建一个用于slave和master通信的用户账号
    * 从机
        1) 配置唯一的server-id
        2) 使用master分配的用户账号读取master二进制日志
        3) 启动slave服务

4. 操作步骤
    * 主机
        1) 修改mysql.cnf文件, [mysqld]之后加入以下配置
            ```
            [mysqld]
            server-id=1
            log-bin=mysql-bin
            ```
        2) 重启mysql, 并创建用于同步的用户账号并分配权限
            ```
            CREATE USER 'repl'@'118.24.46.154' IDENTIFIED BY 'repl';
            GRANT REPLICATION SLAVE ON *.* TO 'repl'@'118.24.46.154';
            flush privileges;
            ```
        3) 查看master状态, 记录二进制文件名和位置
            ```
            show master status
            ```
    * 从机
        1) 修改mysql.cnf
            ```
            [mysqld]
            server-id=2
            ```
        2) 重启MySQL,打开mysql会话,执行同步语句(注意二进制文件和位置参数)
            ## 注意: MySQL8的参考手册 P240页 caching_sha2_password and Replication 部分
            ```
            change master to 
                master_host='101.132.97.183',
                GET_MASTER_PUBLIC_KEY = 1,
                master_user='repl',
                master_password='repl',
                master_log_file='mysql-bin.000001',
                master_log_pos=872;
            ```
        3) 启动slave同步进程并查看状态
            ```
            start slave;
            show slave statusG;
            # 当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了
            ```
原文地址:https://www.cnblogs.com/hepengju/p/12500845.html