温馨提示:建议在PC端浏览~
-
主从复制
-
概述
- 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。
- MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。
- 主库称为Master,从库称为Slave。
- MySQL复制的优点主要包含以下三个方面:
- 1、主库出现问题,可以快速切换到从库提供服务。
- 2、实现读写分离,降低主库的访问压力。
- 3、可以在从库中执行备份,以避免备份期间影响主库服务。
-
原理
- MySQL的主从复制原理如下:
- 从上图来看,复制分成三步:
- Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
- 从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log。
- slave重做中继日志中的事件,将改变反映到它自己的数据。
- 从上图来看,复制分成三步:
- MySQL的主从复制原理如下:
-
搭建
-
服务器准备
cmd# 开放指定的3306端口号(生产中): firewall-cmd --zone=public --add-port=3306/tcp --permanent firewall-cmd --reload # 关闭服务器的防火墙(练习时,简单): systemctl stop firewalld systemctl disable firewalld- 准备好两台服务器之后,在上述的两台服务器中分别安装好MySQL,并完成基础的初始化准备工作。
-
主库配置
-
1、修改配置文件/etc/my.cnf
cmd#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服务器
cmdsystemctl restart mysqld -
3、登录mysql,创建远程连接的账号,并授予主从复制权限
sql#创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务 CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456'; #为'itcast'@'%'用户分配主从复制权限 GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%'; -
4、通过指令,查看二进制日志坐标
sqlshow master status;
- 字段含义说明:
- file:从哪个日志文件开始推送日志文件
- position:从哪个位置开始推送日志
- binlog_ignore_db:指定不需要同步的数据库
- 字段含义说明:
-
-
从库配置
-
1、修改配置文件/etc/my.cnf
cmd#mysql服务ID,保证整个集群环境中唯一,取值范围:1~2^32-1,和主库不一样即可 server-id=2 #是否只读,1代表只读,0代表读写 #(注意,这里的读写权限只针对于普通用户,即使将read-only设置为1,超级管理员还是可以进行读写操作的, #要禁止超级管理员的写权限,需要单独设置super-read-only=1) read-only=1 -
2、重新启动MySQL服务
cmdsystemctl restart mysqld -
3、登录mysql,设置主库配置
sqlCHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx.xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;-
上述是8.0.23及其之后版本的语法。如果mysql是8.0.23之前的版本,执行如下SQL:
sqlCHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx; -
参数说明:
-
-
4、开启同步操作
sqlstart replica; #8.0.22之后 start slave; #8.0.22之前 -
5、查看主从同步状态
sqlshow replica status; #8.0.22之后 show replica status\G; #将每一列数据转化为每一行来展示(便于查看) show slave status; #8.0.22之前
- 参数说明:
- 只要Replica_IO_Running和Replica_SQL_Running都为Yes,就说明主从复制状态是正常的。
- Replica_IO_Running:指主从复制的那一组IO线程是否运行正常。IO线程用于读取主库的二进制日志,并将其写入自身的中继日志。
- Replica_SQL_Running:指主从复制的那一组SQL线程是否运行正常。SQL线程用于读取自身的中继日志,并将数据反映到自身变化。
- 参数说明:
-
-
-
测试
-
1、在主库上创建数据库、表,并插入数据
sqlcreate database db01; use db01; create table tb_user( id int(11) primary key not null auto_increment, name varchar(50) not null, sex varchar(1) )engine=innodb default charset=utf8mb4; insert into tb_user(id,name,sex) values(null,'Tom','1'),(null,'Trigger','0'),(null,'Dawn','1'); -
2、在从库中查询数据,验证主从是否同步
-
-
注意:前面所演示的主从复制是从二进制日志的当前位置往后进行主从复制,如果需要把主库之前的数据也同步到从库,可以先把主库的数据导出到一个SQL脚本中,然后在从库中执行这个SQL脚本,这样就可以保证主库与从库的初始数据一致,最后再从当前位置往后进行同步。
-

