MySQL主从复制是一种常用的数据库复制技术,可以实现数据的高可用性和负载均衡。通过主从复制,我们可以将数据从一个MySQL主服务器复制到一个或多个从服务器,从而实现数据的冗余备份和读写分离。本文将介绍MySQL主从复制的原理、配置步骤以及常见问题的解决方法。
传统主从复制的基本过程如下:
1)、Mysql Slave端的IO进程连接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2)、Master接收到来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。并将本次请求读取的bin-log文件名及位置一起返回给Slave端。
3)、Slave的IO进程接收到信息后,将接收到的日志内容依次添加到Slave端的relay-log文件的最末端,并将读取到的Master端的 bin-log的文件名和位置记录到master-info文件中,以便在下一次读取的时候能够清楚的告诉Master"我需要从某个bin-log的哪个位置开始往后的日志内容,请发给我";
4)、Slave的Sql进程检测到relay-log中新增加了内容后,会马上解析relay-log的内容成为在Master端真实执行时候的那些可执行的内容,并在自身执行。
简单来说就是:
主:I/O进程
从:I/O进程 从服务器通过I/O进程跟主服务器的I/O进程通信将主服务器的BINLOG日志同步过来,并且根据BINLOG日志的内容通过SQL进程往从库写数据
准备两台干净的虚拟机(CentOS 7),不建议使用克隆,并且要在同一网段。每台虚拟机都要安装MySQL 5.7版本的数据库。
再实验之前关闭防火墙和SELinnx
systemctl stop firewalld #关闭防火墙
setenforce 0 #关闭selinux
给两台分别改名为master和slave
hostnamectl set-hostname master
hostnamectl set-hostname slave
对两台机器做映射处理,进行ip解析方便两台连接,但是这一步不是一定要做,没有强制要求。
vim到/etc/hostd文件下,再尾行添加上
master的ip地址 master
slave的ip地址 slave
#两台机器都要分别添加上
做到这里我们的环境就算准备完成,接下来我们就可以进行配置了
修改配置文件
在/etc/my.conf目录下添加
log-bin=/var/lib/mysql/master
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1
添加完成后我们要重启一下mysql服务
systemctl restart mysqld
mysql数据库重启完成后我们要登录mysql中创建一个用户并授权
grant replication slave,super,reload on *.* to slave@'%' identified by '创建用户的密码';
完成上述操作,master的配置就结束,接下来我们就可以配置slave了
修改配置文件
在/etc/my.conf目录下添加
log-bin=/var/lib/mysql/master
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
完成配置我们同样要重启mysql数据库
systemctl restart mysqld
和配置master一样,我们同样要登录mysql,但不是创建用户,而是与master中的mysql用户进行连接
change master to master_host='slave',master_user='slave',master_password='密码',master_auto_position=1;
开启slave
start slave
开启后我们可以使用show命令查看是否成功
show slave status \G
看到下面的yes就表示成功了
我们现在就可以再master主机上写,就可以同步到slave主机上了,可以实现读写分离和备份.
主从复制实验的过程我们可能遇到很多问题,我下面来说一下常见的问题
先在master上查看现在的gtid号
mysql> show master status\G
....
Executed_Gtid_Set: 130fc529-a688-11ec-9793-000c2922001e:1-2,f5d2ff8f-a688-11ec-981d-000c29a7f0ed:1-2
....
在slave上操作
# mysql -u root -p'密码'
mysql> set @@global.GTID_PURGED='130fc529-a688-11ec-9793-000c2922001e:1-2,f5d2ff8f-a688-11ec-981d-000c29a7f0ed:1-2';
如果master上拿到的是一个gtid,那么按照上面的语法,重复两次就可以,比如:
mysql> set @@global.GTID_PURGED='f24c3ee0-7a88-11ed-a20e-000c29988ddf:1-3,f24c3ee0-7a88-11ed-a20e-000c29988ddf:1-3';
解决:
1.全新机器
或者
2.直接修改文件/var/lib/mysql/auto.cnf 内的uuid
使用命令 # uuidgen 生成全新uuid直接替换文件内的旧uuid即可
MySQL主从复制是一种强大的数据库复制技术,可以提供数据的高可用性、冗余备份和负载均衡。通过正确配置和管理主从复制,我们可以确保数据的一致性和可靠性,提高系统的性能和可用性。希望本文对你理解和实施MySQL主从复制有所帮助,并能在你的项目中发挥作用。
如果你对MySQL主从复制还有其他问题或需要更深入的学习,建议你继续探索MySQL的官方文档和相关资源,以获得更多的指导和实践经验。祝你在使用MySQL主从复制的过程中取得成功!