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;

客户端

1
在对应使用客户端进行操作

导出指定库

在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 
  • 使用对应客户端(使用数据同步工具)
    1
    可以使用 navicat 客户端,提供对应工具

解锁表 (使用命令行则需要进行此步)

1
UNLOCK TABLES;

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
START replica;

查看复制状态

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