文章目录
- 前言
- MySQL主从复制的实战案例
- 1、环境搭建
- 2、主库配置,进入vim /etc/my.cnf
- 3、重启数据库
- 4、建立同步账号
- 5、锁表设置只读
- 6、设置主库状态
- 7、备份数据库资料
- 8、解锁
- 9、主库备份数据上传到从库
- 10、slave从库设置
- 11、还原数据的备份
- 12、设定从主库同步
前言
首先,我们提取几个问题,什么是MySQL的主从复制?我们为什么要去使用MySQL的主从复制?MySQL的主从复制的原理是什么?如何实现MySQL的主从复制呢?
其次,
MySQL内建的复制功能是构建大型,高性能应用程序的基础
通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行
复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器
1. MySQL支持的复制类型
基于语句(statement)的复制
在主服务器上执行SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。
基于行(row)的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0开始支持。
混合型(mixed)的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。
2. 为什么要使用MySQL的主从复制?
1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表;
2、做数据的热备;
3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能;
3. 主从复制原理图
1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库
详细步骤:
1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge
4. MySQL复制常用的拓扑结构
主从类型(Master-Slave)
主主类型(Master-Master)
级联类型(Master-Slave-Slave)
MySQL主从复制的实战案例
1、环境搭建
构建两个虚拟机,一主一从
主库(MySQL master):[ip为192.168.95.100 port为3306]
从库(MySQL slave ):[ip为192.168.40.110 port为3306]
2、主库配置,进入vim /etc/my.cnf
在[mysqld]下面配置日志记录
[mysqld]
log_bin = mysql-bin
server_id = 120
3、重启数据库
4、建立同步账号
在主库上面创建出从库的同步账号
mysql>grant replication slave on *.* to 'rep'@'192.168.40.%' identified by 'redhat'
mysql>show grants for 'rep'@'192.168.40.%';
5、锁表设置只读
这里的作用是:为后面备份准备,注意生产环境要提前申请停机时间
mysql> flush tables with read lock;
提示:如果超过设置时间不操作会自动解锁。
mysql> show variables like '%timeout%';
6、设置主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
7、备份数据库资料
首先可以在自己的根目录或者说是其他目录下面创建一个目录来装备份后的文件数据,我这里是在根目录下创建的backup
然后再备份自己的数据库中的随机一个数据库中的表就行了,我这里是shcool1
[root@master ~]# mysqldump -uroot -p -B school1 |gzip > /backup/mysql_bak.$(date +%F).sql.gz
备份成功!
8、解锁
mysql》 unlock tables;
9、主库备份数据上传到从库
我这里为了方便,又在从库中的根目录下创建了一个一模一样的backup目录
mysql> scp /backup/mysql_bak.2023.07-22.sql.gz 192.168.40.110:/backup/
这里就表示数据传到成功了,现在我们来看从库中是否有相同的mysql_bak.2023-07-22.sql.gz这个文件
一查看,有!就说明都正确了!但是在这儿还没有结束,继续看!
10、slave从库设置
同样的在/etc/my.cnf中加入以下语句
[root@slave ~]# #log_bin = /data/mysql/data/mysql-bin
设置server-id值并关闭binlog参数
server_id = 130
然后重启数据库
[root@slave ~]# systemclt restart mysqld
11、还原数据的备份
可以将主库的shcool1删除掉,在进行备份还原
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
————————————————
[root@slave]# mysql -uroot -p < mysql_bak.2023-07-23sql
再去查看就会发现,备份已经还原欧克!
12、设定从主库同步
mysql> change master to
MASTER_HOST='192.168.95.120',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=329;