mysql 8.23之后主从复制
master节点
修改配置文件
/etc/my.cnf
1 2 3 4
| // mysql节点id,如果主节点已经启动,不方便重启,可以不修改master server-id = 1 // binlog配置,一般已经开启,如果未开启,则增加下放配置即可 log_bin = /var/lib/mysql/mysql_bin
|
检查是否开启bin_log
1 2
| SHOW VARIABLES LIKE 'log_bin'; 显示值为 on,则已开启
|
重启mysql
创建备份账号
命令行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| // {userName} 账号 {ip}指定允许ip,也可以设置%,则任意ip userPass 密码 create user '{userName}'@'{ip}' identified by 'userPass';
// {userName} 账号 {ip}指定允许ip,也可以设置%,则任意ip grant replication slave on *.* to {userName}@{ip};
// 检查是否创建成功 select * from mysql.user where User='{userName}';
// 检查当前用户获得的授权
show grants for {userName}@{ip};
// 使新建账号生效 flush privileges;
|
客户端
导出指定库
在mysql中锁定表并查看当前位置,后续从库会使用
1 2 3 4
| // 锁表 FLUSH TABLES WITH READ LOCK; // 查看bin_log 最新位置 , 需要使用 File Position 两个字段 SHOW BINARY LOG STATUS;
|
导出指定库(如果存在很多数据,如果是空数据库,则在从库创建对应数据库与表即可)
- 命令行
1
| mysqldump -u root -p {database} > mybase_all.sql
|
- 使用对应客户端(使用数据同步工具)
解锁表 (使用命令行则需要进行此步)
slave从库
配置文件
/etc/my.cnf
1 2 3 4
| // 节点id,从库 一定要改,默认值会与master冲突 server-id = 2 replicate-do-db = 要复制的库名 read_only = 1
|
导入主库导出的sql(如果使用数据同步工具,则跳过,或者导入工具直接导入从库)
1
| mysql -u root -p {database} < my_base_all.sql
|
从库启动复制
设置复制
1 2 3 4 5 6 7 8
| // masterIp 主节点ip // userName 主节点创建用户 // userPass 密码 // masterPort 主节点端口 // log_file 在 导出指定库 查询出的 file 字段内容 , 如果相隔时间比较久,则建议在执行该命令时重新获得 // log_pos 在 导出指定库 查询出的 Position 字段内容 , 如果相隔时间比较久,则建议在执行该命令时重新获得 CHANGE REPLICATION SOURCE TO SOURCE_HOST='{masterIp}', SOURCE_USER='{userName}', SOURCE_PASSWORD='{userPass}', SOURCE_PORT={masterPort}, SOURCE_LOG_FILE='{log_file}', SOURCE_LOG_POS={log_pos};
|
启动复制
查看复制状态
1 2 3 4 5 6
| // mysql 8.4版本前使用这条命令查看 show master status;
// MySQL 8.4版本后使用这条命令查看 SHOW replica STATUS; // 注意是否有error_no ,存在则需要查看对应内容,进行解决
|
其他命令,根据需要使用
1 2 3 4
| // 停止 STOP replica; // 重置,需要在 stop命令之后执行 RESET replica;
|
其他错误
从节点登录主节点失败
1 2 3 4 5
| reported error: Authentication requires secure connection. 一般发生在版本差别较大的情况, 解决方案 在从节点使用mysql cli 登录一次 主节点,加入 --get-server-public-key 参数即可 mysql -h xxx -u {userName} -p --get-server-public-key
|