MySQL之主从复制

MySQL之主从复制

今天我们带大家一起学习MySQL的主从复制。

提到主从一致性,肯定就会想到主从节点,那么为什么需要主从节点呢?我们先来简单了解下读写分离和主从复制。

一、读写分离

读写分离,简单地说就是把对数据库的读和写分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

一般情况下,我们都会选择一主多从,也就是一台主数据库负责写,其他的从数据库负责读。主库和从库之间会进行数据同步,以保证从库中数据的准确性。这样的架构实现起来比较简单,并且也符合系统的写少读多的特点。

如何实现读写分离?

读写分离的实现的大致流程如下:

  1. 部署多台数据库,选择其中的一台作为主数据库,其他的可以作为从数据库。
  2. 保证主数据库和从数据库之间的数据是实时同步的,也就是主从复制。
  3. 系统将写请求交给主数据库,读请求交给从数据库处理。

我们在实际应用中主要分为两种方式:

  • 代理方式:我们在应用层和数据库之间添加一个代理层,应用程序将所有的请求交给代理层,代理层负责分离读写请求,将它们路由到对应的数据库中。主要有MyCatMySQL Router等。
  • 组件方式:可以通过引入第三方组件来帮助我们读写请求。主要有sharding-jdbc

二、主从复制

主从复制时将主数据库的DDL和DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制,从库同时也可以作为其他从服务器的主库,实现链状复制。

MySQL复制的要点主要包括以下三个方面:

1、主库出现问题,可以快速切换到从库提供服务。

2、实现读写分离,降低主库的访问压力。

3、可以在从库中执行备份,以避免备份期间影响主库服务。

主从复制的原理

在这里插入图片描述

从上图来看,复制分为三步:

1、Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。

2、从库读取主库的二进制日志文件Binlog,写入到从库的中继日志Relay Log

3、slave重做中继日志中的事件,将改变反映它自己的数据。

从图中我们可以看到,MySQL的主从复制依赖于Binlog。另外,补充一下,常见的一些MySQL同步数据到其他数据源的工具的底层一般也是依赖于Binlog。

三、binlog详解

binlog也叫二进制日志,记录了所有的DDL(数据定义语言)语句和DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。

作用主要有两个:

  • 灾难时的数据恢复
  • MySQL的主从复制

3.1 日志文件

在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数如下:

show variables like '%log_bin%';

在这里插入图片描述

binlog.index是日志索引文件,我们可以查看该文件的内容
cat /var/lib/mysql/binlog.index

在这里插入图片描述

3.2 日志格式

MySQL服务器中提供了多种格式来记录二进制日志,具体格式及特点如下:

日志格式含义
STATEMENT基于SQL语句的日志记录,记录的是SQL语句,对数据进行修改的SQL都会记录在日志文件中
ROW基于行的日志记录,记录的是每一行的数据变更(默认)
MIXED混合了STAMENTROW两行格式,默认采用STATEMENT,在某些特殊情况下会自动切换为ROW进行记录

查看命令:

show variables like '%binlog_format%';

在这里插入图片描述

由于binlog是以二进制的方式进行存储的,不能直接读取,需要通过二进制日志查询工具mysqlbinlog来查看,具体语法:

mysqlbinlog [参数选项] logfilename
参数选项
	-d	指定数据库名称,直馏出指定的数据库相关操作
	-o	忽略掉日志中的前n行命令
	-v	将行事件(数据变更)重构为SQL语句
	-w	将行事件(数据变更)重构为SQL语句,并输出注释信息

查看ROW格式的日志文件

MySQL默认的日志格式就是ROW,所以我们可以进行测试。

1、我们首先执行一条SQL,修改tb_user表中的一个字段。

update tb_user set age = 25 where id = 1;

2、然后我们去查看binlog日志内容

mysqlbinlog -v binlog.000006

在这里插入图片描述

查看STATEMENT格式的日志文件

1、由于MySQL默认的日志文件格式配置是ROW,所以我们首先需要修改配置文件中日志文件的格式

//修改配置文件
vim /etc/my.cnf
//指定日志文件格式
binlog_format=STATEMENT
//重新启动mysql
systemctl restart mysqld

2、MySQL服务启动成功后,又生成了一个新的binlog.00000x文件,因为已经更改了Mysql的日志格式,所以不会再往之前的日志文件中继续写入日志了。

3、再次执行SQL

update tb_user set age = 25 where id = 1;

4、查看日志文件

在这里插入图片描述

更新、删除SQL都会被记录在二进制文件中,甚至建表语句也会被更新在二进制文件中,但是查询SQL并不会记录在二进制文件中。

3.3 日志删除

对于比较繁忙的业务系统,每天生成的binlog数据量巨大,如果长时间不清除,将会占用大量磁盘空间。可以通过以下几种方式清理日志:

指令含义
reset master删除全部binlog日志,删除之后,日志编号将从binlog.000001重新开始
purge master logs to 'binlog.000001'删除000001编号之前的所有日志,不包括binlog.000001
purge master logs before 'yyyy-mm-dd hh24:mi:ss'删除日志为’"yyyy-mm-dd hh24:mi:ss"之前产生的所有日志

另外,我们也可以在mysql的配置文件中配置二进制日志的过期事件,设置了之后,二进制日志过期会自动删除。

show variables like '%binlog_expire_logs_seconds%';

在这里插入图片描述

  • 34
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
MySQL数据库主从复制是一种用于解决MySQL单点故障和提高整体服务性能的技术。它的原理是通过将主数据库的更新操作复制到从数据库,使得从数据库可以保持与主数据库的数据一致性。[1] 在实际的生产环境中,主从复制被广泛应用于增加MySQL的可用性和性能。通过配置主从复制,可以实现数据的备份和读写分离,从而提高整体的系统性能。 主从复制MySQL中具有很多优势,它可以提供高可用性、高性能和灵活性。通过主从复制,可以简化MySQL的部署过程,并根据不同的业务需求进行灵活的调整。 总结来说,MySQL数据库主从复制是一种解决单点故障和提高性能的技术,它通过复制主数据库的更新操作到从数据库来实现数据的备份和读写分离。这种技术可以提供高可用性、高性能和灵活性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL数据库——主从复制](https://blog.csdn.net/qq_41808387/article/details/107009748)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL主从复制](https://blog.csdn.net/m0_62473957/article/details/124140928)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值