MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
MySQL复制过程分成三步:
简单点来说,就是,所有的增删改查都请求一个数据库,负荷压力太大,为了解决这个问题,我们可以设置多个从数据库,从数据库复制主数据库的内容,从数据库做操作量最多的查询请求,主数据库做增删改,主数据库进行操作后会产生日志,从数据库会根据日志解析,然后再在从数据库做相同的操作,来达到数据库数据相同。
这个我之前的博客中写过了,可以参考:https://blog.csdn.net/m0_63684495/article/details/128748229
注意:这里需要两个虚拟机,分别安装MYSQL,其中一个充当主数据库,另一个充当从数据库
安装完成MYSQL后记得启动服务。
systemctl start mysqld
同样的之前写过,不再赘述,请参考:https://blog.csdn.net/m0_63684495/article/details/128713019
先拿出一个需要做主数据库的虚拟机,修改mysql配置
vim /etc/my.cnf
在配置文件中[mysqld]下插入(记得用ROOT权限):
服务器唯一ID,ID编号可以自行更改,我是根据我的ip来设置的
log-bin=mysql-bin #[必须]启用二进制日志
server-id=123 #[必须]服务器唯一ID
systemctl restart mysqld
登录数据库,执行下面命令:
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
注:上面SQL的作用是创建一个用户xiaoming
,密码为Root@123456
,并且给xiaoming用户授予REPLICATION SLAVE权限
。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
查看主库的状态:
show master status;
记录下结果中File
和Position
的值,后面要用。
从数据库,修改配置文件:
vim /etc/my.cnf
在配置文件中[mysqld]下插入(记得用ROOT权限):
server-id=124 #[必须]服务器唯一ID
重启mysql服务:
systemctl restart mysqld
change master to master_host='主库ip',master_user='xiaoming',master_password='Root@123456',master_log_file='主库的File',master_log_pos=主库的Position;
注意:替换主库ip
,主库的File
,主库的Position
的时候要清除空格,不然会错误
start slave;
show slave status \G;
如果你的两个虚拟机是克隆来的,那就是Slave_IO_Running: NO
,因为你复制过来后,另外一个MySQL在运行,会导致占用。
如果你的不是克隆来的,可以直接下一步了。
解决方案:
分别查看两台的UUID:
select uuid();
如果一样,选择从库的虚拟机,进行操作。
查找auto.cnf
find / -iname "auto.cnf"
rm /var/lib/mysql/auto.cnf
删除后登录数据库
mysql -uroot -p
停止slave链路
start slave;
开启slave链路
start slave;
查看状态
show slave status \G;
我先用Navicat for MySQL
连接上这两个数据库。
目前是最初始的状态,我现在先在主库创建一个数据库。
我现在刷新一下从库,看看效果。
这样就完成了,数据库的主从分离。
当然你的从数据库,可以不止一台,你可以多台,配置步骤大致相同,但是你的id要唯一。