MYSQL8.0主从复制SLAVE搭建

环境准备:两个mysql服务器分别运行以下命令:

show VARIABLES like 'log_bin'

出现以下信息表示支持

如果value字段是false,需要配置bin_log日志开启

linux下 找到my.cnf在[mysqld]下加入以下配置

log-bin=mysql-bin
#主从库此值不能相等 从库 server-id=2
server-id=1

windos下.exe安装的mysql

找到my.ini配置相同配置

重启mysql服务

linux: service mysql restart

docker: docker restart 容器id

windos: 

 

右键 重新启动

再次运行

show VARIABLES like 'log_bin'

完成以上操作后

查看mysql 端口是否开放

先看防火墙是否开启

systemctl status firewalld

 以上表示防火墙关闭,跳过端口开放过程

lsof -i:端口号

lsof -i:3306

 以上表示端口开放

上面命令执行不了的 可以运行下面的命令

firewall-cmd --query-port=3306/tcp

打开端口号

firewall-cmd --add-port=3306/tcp --permanent

重启一下防火墙

firewall-cmd --reload

环境准备好后 开始主从搭建

一、在主服务上创建一个slave用户

        根据自己的mysql版本创建

        mysql 5.7 默认身份验证插件default_authentication_plugin是:mysql_native_password
        mysql 8.0 默认身份验证插件default_authentication_plugin是:caching_sha2_password

CREATE USER 'slave'@'ip地址' IDENTIFIED WITH caching_sha2_password BY 'password';
CREATE USER 'slave'@'ip地址' IDENTIFIED WITH mysql_native_password BY 'password';

        以防万一这里可以执行以下刷新权限

flush privileges;

        查询是否创建成功

SELECT Repl_slave_priv,Repl_client_priv FROM user WHERE User= 'slave';

        给slave用户授权

grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;

GRANT replication slave,replication client ON *.* TO 'slave'@'ip地址';

刷新权限

flush privileges;

再次执行

SELECT Repl_slave_priv,Repl_client_priv FROM user WHERE User= 'slave'

二、配置从库

       查看当前是否有主库

show slave status;

        若Slave_IO_State不为空,需停止,并清除相关信息

STOP SLAVE;
RESET SLAVE;

        创建连接主库

change master to master_host='主库ip地址',master_user='slave',master_password='连接密码',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=57733409;

        相关字段说明

        master host:MySQL主的地址
        master_user:备份的用户名
        master_password:备份的用户密码
        master_log_file:bin-log的文件名
        master_log_pos:bin-log的位置

        查询主库master_log_file、master_log_pos

        在主库上运行

        

SHOW MASTER STATUS;

         开始运行从库连接

        

START SLAVE;

        查看从库连接主库状态

show slave status;

        主要查看以下三个字段

表示成功了

接下来自己测试下吧

常见问题

 (1)Slave I/O for channel '': error connecting to master 'slave@XXXXX:3306' - retry-time: 60 retries: 1 message: Access denied for user 'slave'@'XXXXX' (using password: YES), Error_code: MY-001045

 很明显是从库配置的用户-密码不对

从库运行

STOP SLAVE;

RESET SLAVE;

change master to master_host='主库ip地址',master_user='slave',master_password='连接密码',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=57733409;
START SLAVE;

(2)Slave I/O for channel '': error connecting to master 'slave@XXXXX:3306' - retry-time: 60 retries: 20 message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061

主库运行

ALTER USER 'slave'@'主库ip' IDENTIFIED WITH mysql_native_password BY '密码';

刷新权限

flush privileges;

从库运行

STOP SLAVE;

START SLAVE;

若还不成功,建议重复二、配置从库

(3)Slave failed to initialize relay log info structure from the repository

slave_relay_log_info表中依然保留之前relay_log的信息,所以导致启动slave报错

STOP SLAVE;

RESET SLAVE;

(4)Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000004' position 157

我遇到这个错误是因为命令

change master to master_host='主库ip地址',master_user='slave',master_password='连接密码',master_port=3306,master_log_file='mysql-bin.000004',master_log_pos=57733409;

的master_log_pos 配置错误

建议重复二、配置从库