MySQL的主从复制

本文详细介绍了MySQL的主从复制模型,包括工作过程、具体实现步骤和测试方法。在主从复制中,主服务器的数据变更先写入二进制日志,再由I/O线程传输到从服务器,通过SQL线程写入数据库。主从复制能提高系统承载力,缩短故障恢复时间,确保业务连续性。同时,文章提及了事务日志和二进制日志在复制和恢复中的关键作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们不小心将数据库误操作,导致数据库不能用时,之前的话会立刻想到用mysqldump备份策略去恢复,但在恢复的过程中,业务是中断的,在此过程中我们的服务器无法向客户提供服务,这样势必会对我们的业务影响,所以,我们为了使其承载力提升,故障恢复时间减少,就采用数据库主从架构模型;

一:数据库主从模型的工作过程;                                                  


master上:先将数据写进二进制日志里(binlog,由dump线程将二进制日志以一定的形式传给slave上的I/O线程;

slave上:I/O线程一直监视着master上的二进制日志,当有变化时就拽过来,写入中继日志(relaylog)中,由SQL线程从中继日志中拉出日志再写入数据库,也可以再写入一个二进制日志中(为了以后的slave用);

在主服务器上将数据写入二进制日志之前的操作是:将数据先写入事务日志,然后写入内存,再写入二进制日志文件,再由二进制日志文件定期的往磁盘上更新数据;

事务日志:是innodb引擎特有的,存储对数据库进行的所有更改,并全部记录插入、更新、删除、提交、回退和数据库模式变化。事务日志还称作回滚日志undo或重做日志redo。是备份和恢复的重要组件;默认是开启的;

Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0和ib_logfile1;

Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录在表空间中的(共享表空间或者独享表空间);

二进制日志又叫变更日志,主要记录修改数据或者有可能引起数据改变的mysql语句,记录了语句发生的时间、执行时长、操作的数据等,可通过二进制日志进行数据恢复;

二:主从复制的具体实现;                                                                 

1、首先在主服务器master上更改配置文件,开启二进制日志;

	Vim /etc/my.cnf
		[mysqld]
		datadir=/var/lib/mysql#数据库存放的目录(现是默认的路径);
		server-id = num       #唯一识别服务器的标志;
		log-bin = mysql-bin   #打开二进制日志(默认放在数据库所在的目录下,并起名为mysql-bin);
      skip-name-resolve       #关闭名称解析(可有可无)

2、在master上授权,使slave有复制权限,即创建一个带有密码的账号;

grant replication slave,replication client on *.* to slave@‘%’identified by ‘magedu’;
其中replication slave replication client :是专门针对数据库的主从复制权限;

3、查看主服务器二进制日志状态

show master status;
4、配置从服务器slave;

	Vim /etc/my.cnf
		[mysqld]
		server-id = 2
		relay-log = mysql-relay-bin #开启中继日志,格式为二进制
		ready-only = 1              #设置只读权限
		log-bin = mysql-bin         #也可以开启二进制日志
     log-slave-updates = 1       #使relaylog日志中更新的数据写入二进制日志

5、启动从服务器复制线程,slave连接master,并开始重做二进制日志中的事件;

		CHANGE MASTER TO MASTER_HOST='192.168.242.246', 	#master的ip
		MASTER_USER='slave',              #连接master的数据库的用户名
		MASTER_PASSWORD='magedu',         #连接master数据库的密码
		MASTER_LOG_FILE='mysql-bin.000002',      #需要复制的二进制文件名
		MASTER_LOG_POS=405;             #起始的position位置
其中MASTER_LOG_FILE和MASTER_LOG_POS这两项可在master上通过“ show master status ”查看到当前的文件名和位置号;

然后执行

start slave    #开启I/O线程和SQL线程

6、查看从服务器状态;

Show slavestatus\G;
注意:若是在第五步中文件名和位置号两个中的其中一个不对应,在这里显示时,就不是下面的结果,然后也不能实现主从复制;

Slave_IO_Running: Yes
Slave_SQL_Running: Yes
我碰到的一个问题就是其中的IO线程时Connecting状态,然后我在master的数据库上创建数据库,在slave上也不能同步,后来发现原来是文件名和位置号写错了,我一直以为要从头开始,即文件要写第一个文件,位置号要写最开始的;其实不然,在执行第五步操作时,要先在master上查看一下主服务器的状态,把当时显示的文件名和位置号写下来就好了!

三:主从复制的测试;                                                                   

在做测试之前,要确保我们slave上的IO线程和SQL线程是Yes的状态,然后关闭防火墙和SElinux;


1、在master上的数据库中可以去创建数据库或者在某个数据库中创建一个表;

2、在slave上的数据库中相应的位置上查看是否生成master上刚执行的操作结果(创建的数据库或者表);
3、若是两台机器上的数据库完全一样,那就证明主从复制的模拟实验成功;

4、若是没有同步就去查看一下slave的状态,IO线程和SQL线程是否都是Yes;查看一下防火墙;













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值