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 status\G;
# 当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了
```