web前端培训MySQL面试题binlog日志的作用

开源布道者
• 阅读 232

关于MySQL的学习,市场上经常有什么千万级优化,亿级别的优化什么的,我暂且不评论好坏如何,我想要说的,千里之行,始于脚下,打好基础是学习任何知识的前提,MySQL的内容不止是有增删改查,还有很多其他的增加的时候,触发什么锁操作,查的时候,如何优化,集群如何实现,如何实现高并发等,所有的一切都是需要把基础原理给搞清楚的,搞不清楚原理,你对知识的理解只是停留在表面,没有深入研究就容易忘记掉,死记硬背是不行的,在实际的项目开发中,你会遇到很多关于MySQL的瓶颈,今天,我们聊一个知识点,那就是MySQL的binlog日志。

1:什么是binlog日志

MySQL中有好几种日志,binlog属于最重要的日志了,主要用来记录DDL(数据库定义语言)和DML(数据库操纵)语句,以事件形式记录,包含了语句所执行的时间,并且是事务安全型的。

简单思考一下,MySQL主要用来存储数据,表数据存储在磁盘上,并且高可用架构中,经常使用主从模式,任何一个系统,都需要进行稳定性保证和数据安全保证,那么MySQL系统中使用什么样的方式来保证呢,很简单的, 主要是使用日志来保存的。前端培训任何对数据表的操作包括create,alter,drop,update,insert,delete这些语句都会以日志的形式保存下来。

既然我们知道了binlog日志,是用来保存数据库操作语句的,那么我们就可以引申出binlog日志的两个主要作用 主从复制 和 数据恢复,主从复制是比较常见的高可用架构模型,master把它的二进制日志传递给slaves数据库,来达到数据一致的目的,关于MySQL的主从复制我们后面还会比较详细的讲解,数据恢复主要通过mysqlbinlog日志工具来恢复数据。

2:如何操作binlog日志

// 查看日志开启状态

show variables like 'log_%';

web前端培训MySQL面试题binlog日志的作用

// 只查看第一个binlog文件的内容

show binlog events;

web前端培训MySQL面试题binlog日志的作用

// 查看所有的binlog

show master logs;

web前端培训MySQL面试题binlog日志的作用

// 查看当前正在写入的binlog

show master status;

web前端培训MySQL面试题binlog日志的作用

// 查看指定binlog文件内容

show binlog events in 'mysql_bin_000025';

web前端培训MySQL面试题binlog日志的作用

3:binlog的写入机制

binlog写入逻辑比较简单:事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中,一个事务的binlog是不能被拆开的,因此无论这个事务多大,都要确保一次性写入。因此这里就涉及到一个优化的问题,在实际的项目开发中,要减少大事务的出现,因为实际项目中,都是主从复制,大事务频繁出现,容易导致主从延迟,并且需要一次性写入大量的binlog日志,导致性能下降。

系统给binlog cache分配了一片内存,每个线程都有一个,参数binlog_cache_size用于控制单个线程内binlog cache所占内存的大小,如果超过了这个参数规定的大小,就要暂存到磁盘。事务提交的时候,执行器把binlog cache里的完整事物写到binlog中,并且清空binlog cache。每个线程都有自己的binlog cache,但是他们共用同一份binlog文件_web前端培训

// 查看binlog日志相关的配置

show global variables like '%binlog%';

web前端培训MySQL面试题binlog日志的作用

这里重点说一下sync_binlog配置项,这个配置项取值可以是0,1,N

值为0:表示每次提交事务都只write,不fsync同步到磁盘

值为1:表示每次提交事物都会执行 fsync

值为N:表示每次提交事物都write,但累积N个事务后才fsync

在实际的项目开发中,一般设置sync_binlog=1,每次提交事物都将数据持久化到磁盘,fsync的过程是一个消耗性能的过程,因此这里有一个优化点:出现IO瓶颈的场景里,可以将fsync_binlog设置成一个比较大的值,可以提高性能。

4:binlog日志主从复制

MySQL的主从复制,恐怕是面试中经常会遇到的问题了,是出题率比较高的一项考察点,在实际的项目开发中,很多公司也都是采用主从复制架构来实现的。

面试题:
1:主从复制是如何实现的?
2:有没有遇到主从延迟的情况,如何解决的?

主从复制如何实现?

主从延迟是通过slave数据复制master数据库的binlog日志来实现的,这里面涉及到三个MySQL线程

首先,master数据库将数据的改变记录到二进制binlog日志中

slave数据库会监控探测master二进制日志是否发生改变,如果改变,则开始一个I/O线程请求master二进制事件

同时master节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并且将binlog日志保存到中继日志中,从节点会启动SQL线程读取二进制日志,在本地重新执行,保持和主节点的数据一致,最后I/O和SQL线程进入到睡眠状态,等待下一次被唤醒。

主从延迟如何避免?

主从延迟的出现是不可避免的,当主数据库数据量太大的时候,会导致线程阻塞,出现延迟,业务上就会出现较大的影响,根据业务场景,实时性要求高的和实时性要求不高的场景。

解决方案如下:

1:业务上对数据的写入,批量写入增加时间间隔,例如写入500条数据后,sleep(1)时间

2:业务上出现短暂的延迟,可以通过前端增加倒计时功能来视觉上避免

3:业务上,如果请求量不是很大的情况,可以在短时间内请求主数据库

4:MySQL采用分库架构,服务平行扩展,分散压力

5:MySQL提高数据库版本,使用多线程复制binlog日志

6:提高服务器硬件设备,选中更多核更多内存的服务器

7:增加缓存层,在MySQL主数据更新的时候,将更新写入到cache中,读数据的时候先读区缓存层数据,过期之后再读取从数据库数据。

文章来源于mamba架构算法

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
3年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Wesley13 Wesley13
3年前
0基础前端开发需要学什么?
  0基础前端开发需要学什么?零基础学员入门前端需要了解前端行业的发展趋势、学习前端的方法、前端学习路线详解以及前端案例展示等内容;有老师指导的情况下,可以结合学员自身情况制定前端学习路线,明确学习前端的路径、未来发展趋势。提前为学员打好基础,避免小白学员走弯路。  小白学员面临的前端如何入门、如何开始学习前端、前端能够做什么等问题。因此入门前要明确学习
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(