MySQL主从复制
概述
主从复制是指将主数据库的DDl(主要由create、alter、drop、truncate),DML操作通过二进制日志传到从库服务器中,然后在从库上面对这些日志重新执行,从而使得从库和主库的数据保持同步
MySQL 复制的有点主要包含以下三个方面:
- 主库出现问题可以快速切换到从库提供服务
- 实现读写分离,降低主库的访问压力
- 可以在从库中执行备份,以免备份期间影响主库服务
原理
从上图来看,复制分为三步:
- master主库在事务提交操作时,会把数据变更记录在二进制日志文件Binlog中
- 从库读取主库的二进制日志文件Binlog ,写入到从库的中继日志relany log
- slave重做中继日志中的事件,将改变反应它自己的数据。
搭建
master为主库
node为从库
主库master配置
- 开启binlog日志
在MySQL8.0版本之后默认开启binlog二进制日志,查看主库的binlog二进制日志是否开启
1 | mysql> show variables like '%log_bin%'; |
修改mysql配置文件/etc/my.cnf
1 | [mysqld] |
- 修改mysql文件
/etc/my.cnf
1 | # mysql服务ID,保证整个集群环境中唯一。 |
- 登录mysql,创建远程连接的账号,拧授予主从复制权限
1 | # 创建yyt用户并设置密码,使用户可以在任意主机连接该mysql服务并分配主从复制权限 |
扩展
主从同步账号需要如下这些权限:
replication slave
拥有此权限可以查看从服务器,从主服务器读取二进制日志。
replication client
拥有此权限可以查询master server、slave server状态。
如果想要在Slave上有权限执行 “LOAD TABLE FROM MASTER” 或 “LOAD DATA FROM MASTER” 语句的话,必须授予全局的 FILE 和 SELECT 权限:
a、select
必须有select的权限,才可以使用select table。
b、file
拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。
- 通过指令,查看二进制日志坐标
1 | show master status; |
从库node配置
- 修改配置文件
/etc/my.cnf
1 | # mysql服务ID,保证整个集群环境中唯一。这里需要注意不能和主库ID一样 |
- 重启mysql服务
1 | systemctl restart mysqld |
- 登录mysql,设置主库配置
1 | change master to master_host='10.0.0.102',master_user='yyt',master_password='Yyt000000'; |
- 开启同步操作
1 | start replica status; # 8.0.22之后 |
- 验证操作
1 | show replica status\G # 8.0.22之后 |
- 查看
这里我遇到了一个错误,后面处理
1 | mysql> show slave status\G |
错误解决
Slave_IO_Running: No
# 负责与主机的io通信
Slave_SQL_Running: Yes
# 负责自己的slave mysql进程。
找到my.cnf里面配置的mysql错误异常日志文件位置,log-error
配置信息,我这里是/var/log/mariadb/mariadb.log
查看错误异常日志后发现
1 | 2023-03-28T10:16:46.124334Z 1 [ERROR] Slave I/O for channel '': Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: 1593 |
通过网上查询后发现是 由于uuid相同,而导致触发此异常,
原因:我的环境是vm虚拟机,克隆一台mysql虚拟机,mysql 有个uuid , 然而uuid 是唯一标识的,所以我克隆过来的uuid是一样的,只需要修改一下uuid 就可以了,找到auto.cnf 文件修改uuid
1 | [root@localhost ~]# find / -iname "auto.cnf" |
发现问题已解决
1 | mysql> show slave status\G |
参考资料