参考链接:
http://note.eta.pub/2020/09/03/mysql-master-slave-setup/
https://www.cnblogs.com/LUA123/p/10776394.html
在原有安装完成的mysql环境下

原理介绍

  • MySQL的主从复制是一个异步的复制过程(虽然一般情况下感觉是实时的),数据将从一个MySQL数据库(我们称之为Master)复制到另一个MySQL数据库(我们称之为Slave),在Master与Slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和I/O线程)在Slave端,另外一个线程(I/O线程)在Master端。
  • 要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave从Master端获取binlog日志,然后再在Slave上以相同顺序执行获取的binlog日志中所记录的各种SQL操作。
  • 要打开MySQL的binlog记录功能,可通过在MySQL的配置文件my.cnf中的mysqld模块([mysqld]标识后的参数部分)增加“log-bin”参数选项来实现,具体信息如下。
1)在Slave服务器上执行start slave命令开启主从复制开关,开始进行主从复制

2)此时,Slave服务器的I/O线程会通过在Master上已经授权的复制用户权限请求连接Master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的)之后开始发送binlog日志内容。

3)Master服务器接收到来自Slave服务器的I/O线程的请求后,其上负责复制的I/O线程会根据Slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的I/O线程。返回的信息中除了binlog日志内容外,还有在Master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置

4)当Slave服务器的I/O线程获取到Master服务器上I/O线程发送的日志内容,日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新binlog日志时能够告诉Master服务器从新binlog日志的指定文件及位置开始请求新的binlog日志内容。

5)Slave服务器端的SQL线程会实时检测本地Relay Log中I/O线程新增加的日志内容,然后及时地把Relay Log文件中的内容解析成SQL语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这些SQL语句,并在relay-log.info中记录当前应用中继日志的文件名及位置点
  • 主从复制是异步的逻辑的SQL语句级的复制
  • 复制时,主库有一个I/O线程,从库有两个线程,即I/O和SQL线程
  • 实现主从复制的必要条件是主库要开启记录binlog功能
  • 作为复制的所有MySQL节点的server-id都不能相同。
  • binlog文件只记录对数据库有更改的SQL语句(来自主数据库内容的变更),不记录任何查询(如select,show)语句。

image.png
image.png

测试详解

修改配置文件

[root@mysql-03 ~]# cat /etc/my.cnf
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove the leading “# “ to disable binary logging
# Binary logging captures changes between backups and is enabled by
# default. It’s default setting is log_bin=binlog
# disable_log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#master-slave-replication
log-bin=mysql-log-bin
server-id=3
#binlog-do-db=test
#binlog-ignore-db=mysql
[root@mysql-03 ~]#
image.png

重启mysqld的服务

备注:
# server-id 服务器唯一标识,如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
# relay-log 启动MySQL二进制日志,可以用来做数据备份和崩溃恢复,或主服务器挂掉了,将此从服务器作为其他从服务器的主服务器。
# replicate-do-db 指定同步的数据库,如果复制多个数据库,重复设置这个选项即可。若在master端不指定#binlog-do-db,则在slave端可用replication-do-db来过滤。
# replicate-ignore-db 不需要同步的数据库,如果有多个数据库,重复设置这个选项即可。
# 其中需要注意的是,replicate-do-db和replicate-ignore-db为互斥选项,一般只需要一个即可。

创建主从复制用户

create user ‘rep’@’%’ identified by ‘999999’;
授复制权限
grant replication slave on . to ‘rep’@’%’;
刷新使其生效
flush privileges;
image.png

主库查看master状态及同步点

show master status;
image.png

从库配置同步

从库参考如上配置修改完,重启了mysqld服务之后,开始指定主从复制的master
change master to master_host=’192.168.0.111’,master_port=3306,master_user=’rep’,master_password=’999999’,master_log_file=’mysql-log-bin.000001’,master_log_pos=853,get_master_public_key=1;

备注:
master_host 对应主服务器的IP地址。
master_port 对应主服务器的端口。
master_log_file 对应show master status显示的File列:master-bin.000006
master_log_pos 对应show master status显示的Position列:156

启动从库slave
start slave
image.png

从库上查看slave同步状态

image.png
链接状态,这个状态其实是是不对的,下面error提示无法链接0.111机器
检测防火墙状态,确实没关,我以为是这个原因,但是关闭防火墙,重新设置链接主,还是IO connect: YES

记得某一次测试的时候提起过,学会看日志,找到mysql的日志,/var/log/mysqld.log 查看,发现是链接问题
image.png
这个报错,百度的翻译解释是:身份验证需要安全连接

之前看文档,他们的主从链接设置的时候,添加了一个flag:get_master_public_key=1
这个flag就是安全认证需要的,那么设置主从链接命令,加上这个flag再次查看
image.png
正常了

备注:
之所以设置get_master_public_key=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password

ERROR 2061 (HY000): Authentication plugin ‘caching_sha2_password’ reported error: Authentication requires secure connection
说明:
caching_sha2_passwordsha256_password认证插件提供比mysql_native_password插件更安全的密码加密,并且caching_sha2_password的性能比sha256_password更好。
MySQL 8.0中创建新用户默认使用caching_sha2_password插件,必须设置安全连接。
要使用加密连接传输复制期间所需的二进制日志,主服务器和从服务器都必须支持加密的网络连接。如果任一服务器不支持加密连接,则无法通过加密连接进行复制。

验证

添加个数据库 验证一下看看
show databases;
create database test_db01;
use test_db01;
create table home (renyuan char(10) not null,juese char(16) not null,primary key(juese));
insert into home(reyuan,juese) values(‘fanfan’,’laogong’);
select * from home;

master上创建数据库
image.png
从库上查看
image.png
image.png

说明:
第一次验证,数据库上建了库,表,不同步?我嚓…
各种排查,突然记起配置我吧节点配置一样的,而且有个参数
#binlog-do-db=test #同步的binlog名称是test了
#binlog-ignore-db=mysql #忽略同步的binlog名称是mysql了
我吧这个配置注释之后并重启,重新建表,建库,再次查看同步状态,成功了
这里也参考了其他文档
参考地址:
https://www.yuque.com/antigenmhc/mp7yfy/fgqqpu
#主服务器 id
server-id = 1
#启用二进制文件
log-bin = 本地MySQL安装路径/[子路径/]mysqlbin
#启用错误日志 (可选)
log-err = 本地MySQL安装路径/[子路径/]mysqlerr
#根目录 (可选)
basedir = 本地MySQL安装路径
#临时目录 (可选)
tmpdir = 本地MySQL安装路径
#数据目录 (可选)
datadir = 本地MySQL安装路径/Data/
#设置不要复制的数据库 (可选)
binlog-ignore-db = 不需要复制的数据库名字
#设置需要复制的主数据库名字 (可选),多个数据库之间不能以, 分割
binlog-do-db = 需要复制的主数据库名字

重置方法

如果发现失败,先重置参数,然后重新配置
mysql> stop slave;
mysql> reset slave;