本文最后更新于 257 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com
MySQL主从复制
一、概述
主从复制是将主数据库(master)的DDL和DML操作通过二进制日志传到从库(slave)服务器中,然后在从库上将这些日志重新执行(重做),
从而使得从库和主库数据保持同步。
MySQL支持一台主库同时向多台仓库进行复制,从库同时也可以作为其他服务器的主库,实现链状复制。MySQL主从复制的优点:
- 1.主库出现问题,可以快速切换到从库提供服务;
- 2.实现读写分离,降低主库的访问压力;
- 3.可以在从库中执行备份,以避免备份期间影响主库服务。
二、原理
主从复制分为三步;
- 1.Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中;
- 2.从库读取主库的二进制文件Binlog,写入到从库的中继日志Relaylog中;
- 3.slave重做中继日志中的事件,将改变反映自己的数据。
三、搭建
3.1 服务器准备
- 第一步:准备两台服务器,一台做主库,一台做从库;
- 第二步:开放两台服务器指定的3306端口;
#开放指定3306端口
firewall-cmd --zone=public --add-port=3306/tcp -permanent
firewall-cmd-reload
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 第三步:两台服务器分别安装好MySQL,并完成基础初始化准备工作。
3.2 主库(Master)配置
第一步:修改配置文件/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=数据库名
第二步:重启MySQL服务器
第三步:登录MySQL,创建远程连接账号,并授予主从复制权限
#创建itcast用户,设置密码,该用户可以在任意主句连接MySQL服务
create user 'itcast'@'%' identified with mysql_native_password by 'Root@123456';
#为‘itcast'@'%'用户分配主从复制权限
grant replication slave on *.* to 'itcast'@'%';
第四步:通过指令查看二进制日志坐标
show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000001 | 663 | | | |
+---------------+----------+--------------+------------------+-------------------+
#字段说明:
file:从哪个日志文件开始推送日志文件
position:从哪个文件开始推送日志
binlog_ignore_db:指定不需要同步的数据库
3.3 从库(Slave)配置
第一步:修改配置文件/etc/my.cnf
#mysql服务ID,保证整个集群环境中唯一,取值范围:1-(2^32-1),和主库不同即可
server-id=2
#是否只读,1--只读,0--读写
read-only=1 --普通用户只读,超级管理员可读写
#super-read-only=1 --超级管理员可读
第二步:重启MySQL服务器
第三步:登录MySQL,设置主库配置
#MySQL8.0.23版本:
change replication source to source_host='主库ip地址', source_user='主库用户名',source_password='主库密码',source_log_file='二进制文件名',source_log_pos=二进制文件位置;
#MySQL8.0.23之前版本执行:
change master to master_host='',master_user='',master_password='',master_log_file='',master_log_pos=xxx;
第四步:启动同步操作
#8.0.22之后
start replica;
#8.0.22之前
start slave;
第五步:查看主从同步状态
#8.0.22之后
show replica status\G;
#出现提示:
#Replica_IO_Running: Yes
--出现No,检查/var/lib/mysql/auto.cnf 检查uuid是否重复
#Replica_SQL_Running: Yes
--出现No,可能是主从没开启前就在主库上进行操作,导致数据同步出错,或者重启造成数据回滚,解决方法:
1.关闭从库:stop slave;
2.跳过slave上的一个错误:set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
3.启动start slave;
#8.0.22之前
show slave status\G;