MySQL内建的复制功能是构建大型,高性能应用程序的基础
通过将MySQL的某一台主机 (master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器
为什么要做主从复制
1.灾备
2.数据分布
3.负载平衡
4.读写分离
5.提高并发能力
1.主从复制的原理
主节点(Master):主节点是数据库的源,其中包含要被复制到从节点的数据。
从节点(Slave):从节点是主节点的副本,它通过复制主节点的数据来实现数据同步。从节点可以用于读取数据、备份和负载均衡。
MySQL主从复制是基于二进制日志实现的,主要包括三个线程,包括两个I/O线程和一个SQL线程。
- 主节点将数据变化记录在二进制日志中
- 从节点将二进制日志拷贝到从节点的中继日志中
- 从节点将中继日志的事件再做一次,将数据变化反应到自身的数据库中
2.完成MySQL主从复制
主要步骤:
主节点:
- 启用二进制日志
- 选择唯一的server_Id
- 创建具有复制权限的用户
从节点:
- 启用中继日志(可启用也可不起用)
- 选择唯一的server_id
- 连接至主节点,开始复制
MySQL主从复制----一主一从
环境准备:两台虚拟机、主节点ip:192.168.1.140,从节点ip:192.168.1.141
主节点配置:
#开启二进制日志,设置唯一的server_id
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
server_id=140
#重启mysql服务
systemctl restart mysqld
#进入mysql
mysql -uroot -p123456
#创建用户并赋予复制权限
mysql> grant replication slave on *.* to 'rep'@'192.168.1.%' identified by '123456';
#锁表设置只读
mysql> flush tables with read lock;
mysql> show variables like '%timeout%';
#查看主库状态,主要看当前日志文件名以及二进制日志偏移量
mysql> show master status;
#备份数据库数据
mysqldump -uroot -p -A -B |gzip > /backup/mysql_bak.$(date +%F).sql.gz
#解锁
mysql>unlock tables;
#将备份后的数据库文件传到从节点上,传输的位置可以自己更改
scp /backup/mysql_bak.2023-07-23.sql.gz 192.168.1.141:/opt
从节点配置:
#设置唯一的server_id
vim /etc/my.cnf
[mysqld]
server_id=141
#重启数据库服务
systemctl restart mysqld
#还原从主库备份的数据
cd /opt
gzip -d mysql_bak.2023-07-23.sql.gz
mysql -uroot -p123456 < mysql_bak.2023-07-23.sql
#检查是否还原:
mysql -uroot -p123456 -e 'show databases;'
#进入mysql数据库并设置从主库同步
mysql>change master to
>master_host='192.168.1.140'
>master_user='root'
>master_password='123456'
>master_log_file='mysql-bin.000002'
>master_log_pos=446;
#如果没指定端口号,那默认是3306
#启动从库同步开关
mysql>start slave;
#检查状态
mysql>show slave status\G
检查slave状态,当I/O线程与SQL线程都打开时,即成功,如下图:
需要注意的是,如果克隆了一台虚拟机的话,两台虚拟机的uuid不能相同。
修改uuid需要到auto.cnf文件中修改,可以先用find / -iname 'auto.cnf'
找到文件后再用vim
编辑器进行修改。
另外,在主从复制前,应先关闭防火墙,systemctl stop firewalld
总结
MySQL主从复制有主从类型、主主类型以及级联类型,本文只介绍了一主一从的方式,但掌握了一主一从,那么剩下的几种掌握起来也没有太大的困难了。