文章目录
一、准备
两台服务器准备好了后,我们还需要在这两台服务器中去对防火墙做一个处理,由于在这两台服务器中我们都需要去安装MySQL,MySQL默认端口号为3306,所以我们需要开启防火墙中的3306端口号,或者直接将防火墙关闭。
那么在我们测试学习阶段建议直接将防火墙关闭就行了,而我们在具体生产环境中,那么还是建议只开放指定端口即可。
在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备(安装、 密码配置等操作)工作。 其中:
- 192.168.200.200 作为主服务器master
- 192.168.200.201 作为从服务器slave
二、主库配置
1、修改配置文件
/etc/my.cnf
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2的32次方-1,默认为1
server-id=1#是否只读,1 代表当前服务器只读(不能做增删改操作), 0代表读写read-only=0#下面两个选项大家可以不设置,但可以了解下。我们这里不指定这两个参数,也就是说我们现在创建的所有数据库都需要同步。#忽略的数据, 指不需要同步的数据库#binlog-ignore-db=mysql#指定同步的数据库#binlog-do-db=db01
2、重启MySQL服务器
systemctl restart mysqld
3、登录mysql,创建远程连接的账号,并授予主从复制权限
#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务CREATEUSER'itcast'@'%' IDENTIFIED WITH mysql_native_password BY'Root@123456';#为 'itcast'@'%' 用户分配主从复制权限GRANTREPLICATION SLAVE ON*.*TO'itcast'@'%';
4、通过指令,查看二进制日志坐标
show master status;
字段含义说明:
file : 从哪个日志文件开始推送日志文件,即我们写到哪个日志文件了
position: 从哪个位置开始推送日志,稍后我们只需要从当前这个日志文件的这个位置往后再来同步就行了
binlog_ignore_db : 指定不需要同步的数据库
三、从库配置
1、修改配置文件
/etc/my.cnf
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可,并且在这个范围之内即可
server-id=2#是否只读,1 代表只读, 0 代表读写。对于从库来说,我们只需要从从库中进行查询即可,不需要从从库中进行写入操作,所以直接把read-only设置为1就行了。#PS:这个read-only=1,仅仅代表的是对普通用户是只读的,如果这个用户具有超级管理员super的权限,那么它也是可以进行读写的。如果想要禁用超级管理员的读写功能,此时我们也可以去设置一个参数:super-read-only=1(使用-和_都可以)read-only=1
2、重新启动MySQL服务
systemctl restart mysqld
3、登录mysql,设置主库配置
SOURCE_HOST
:原主机地址;
SOURCE_USER
原主机上对应的MySQL的用户名是什么;
SOURCE_PASSWORD
:原主机密码是什么;
SOURCE_LOG_FILE
:我从哪个二进制文件开始读;
SOURCE_LOG_POS
:代表position,我要从这份日志中的哪个位置开始读
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.200.200', SOURCE_USER='itcast', SOURCE_PASSWORD='Root@123456', SOURCE_LOG_FILE='binlog.000004', SOURCE_LOG_POS=663;
上述是8.0.23中的语法。如果mysql是 8.0.23 之前的版本,执行如下SQL:
含义:当前从库关联的主库是192.168.200.200,访问主库的用户名是itcast,密码是Root@123456,在进行主从复制的时候,我要从当前binlog.000004的日志文件,当前663位置开始同步。
如果我们要将之前的数据也需要同步到从库,那么这个时候我们可以先把主库的数据导出到一个SQL脚本中,然后在从库中把SQL脚本执行,这样先保证主库和从库的初始数据是一致的,然后再从当前位置往后再进行同步。
CHANGE MASTER TO MASTER_HOST='192.168.200.200', MASTER_USER='itcast', MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000004', MASTER_LOG_POS=663;
其实也就是参数名不同而已,在8.0.23之后也是兼容8.0.23之前的语法的。
参数名含义8.0.23 之前SOURCE_HOST主库 IP 地址MASTER_HOSTSOURCE_USER连接主库的用户名MASTER_USERSOURCE_PASSWORD连接主库的密码MASTER_PASSWORDSOURCE_LOG_FILEbinlog 日志文件名MASTER_LOG_FILESOURCE_LOG_POSbinlog 日志文件位置MASTER_LOG_POS
改参数的时候我们可以复制到记事本,在记事本上改好,再粘贴复制到Linux中执行
这里的数据就是我们刚才在主库中查询到的参数
4、开启同步操作
start replica;#8.0.22之后start slave;#8.0.22之前,新版本也是兼容老版本的
5、查看主从同步状态
show replica status;#8.0.22之后show slave status;#8.0.22之前,新版本也是兼容老版本的
但是由于查询出来的表比较大,展示出来的数据比较乱,所以我们还是需要在后面加上
\G
,把我们的每一列数据转换成每一行进行展示。
在这里面就可以看到主从复制的状态,当前关联的主库的ip地址、主库的端口号、主库的用户名是什么、当前从主库的哪个日志文件、哪个位置开始读取,以及在当前这个里面所涉及到的中继日志是哪个
locakhost-relay-bin.00002
。
在这里面,别的东西都不需要去关注,你要去验证主从复制是否正常,主要看两个参数即可,如下图红框中的,只要这两个为Yes,那就表示主从复制时正常的。
Replica_IO_Running
指的是那一组IO线程运行是否正常;
Replica_SQL_Running
指的是那一组SQL线程运行是否正常。
IO线程是用来读取二进制日志以及写入中继日志的,SQL线程是用来读取中继日志,并且把数据反应到自身变化的。
四、测试
1、在主库 192.168.200.200(master) 上创建数据库、表,并插入数据
createdatabase db01;use db01;createtable tb_user(
id int(11)primarykeynotnullauto_increment,
name varchar(50)notnull,
sex varchar(1))engine=innodbdefaultcharset=utf8mb4;insertinto tb_user(id,name,sex)values(null,'Tom','1'),(null,'Trigger','0'),(null,'Dawn','1');
2、在从库 192.168.200.201(slave) 中查询数据,验证主从是否同步
版权归原作者 洛上言 所有, 如有侵权,请联系我们删除。