详解MySQL非常重要的日志—bin log

news2025/1/16 5:35:58

前言

bin log想必大家多多少少都有听过,它是MySQL中一个非常重要的日志,所以各位架构师们,如果有不了解的,一定要好好学习了,因为它涉及到数据库层面的主从复制、高可用等设计。

bin log是什么?

bin log全称binary log,二进制日志文件,它记录了数据库所有执行的 DDLDML 等数据库更新的语句,但是不包含select或者show等没有修改任何数据的语句。它是MySQL级别的日志,也就是说所有的存储引擎都会产生bin log,而redo log或者undo log事务日志只有innoDB存储引擎才有。

bin log有什么用呢?

  • 数据恢复,如果MySQL数据库意外挂了,可以利用bin log进行数据恢复,因为该日志记录所有数据库所有的变更,保证数据的安全性。
  • 数据复制,利用一定的机制将主节点MySQL的日志数据传递给从节点,实现数据的一致性,实现架构的高可用和高性能。

所以bin log对于数据备份主从主主等都都起到了关键作用。

bin log和redo log区别?

看了上面的bin log介绍,是不是感觉和事务日志redo log特别像呢?也是在事务执行的时候记录日志,但是他们还是有区别的。

你知道redo log吗, 如果不了解的话请参考这篇文章:详解MySQL事务日志——redo log

我们现在从多个角度对比下他们俩究竟有什么不一样?

使用场景角度来说:

  • redo log主要实现故障情况下的数据恢复,保证事务的持久性
  • bin log主要用于数据灾备、同步

数据内容角度来说:

  • redo log是"物理日志", 记录的是具体数据页上做了什么修改
  • bin log是"逻辑日志", 记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 name 改为alvin”

生成范围角度来说:

  • redo logInnoDB存储引擎生成的事务日志,其他存储引擎没有
  • bin log是MySQL Server生成的日志,所有的存储引擎都有

生成时机角度来说:

  • redo log是在事务执行过程中就会write
  • bin log是在事务提交的时候write

bin log怎么写的?

bin log是什么时候写的,写入的机制又是怎么样的呢?

bin log写入的整体流程如下图所示:

  • 为了保证写的效率,会将事务的bin log先写到binlog cache中,注意,这个cache位于事务线程的内存中,主要是一个事务的bin log不能被拆开,是一个整体
  • 在提交事务的时候,将binlog cache中的数据统一写道文件系统缓存page cache中,这个过程速度也很快
  • 然后根据不同的策略,将文件系统缓存中的bin logfsync刷到磁盘中,这里的策略后面详细讲解。

3种刷盘策略:

bin logredo log类似,都有3种刷盘策略, bin log的write和fsync时机是由参数 sync_binlog 控制,默认是 0 。

  1. sync_binlog = 0

为0的时候,表示每次提交事务都只 write,由系统自行判断什么时候执行fsync。虽然性能得到提升,但是机器宕机,page cache里面的 binglog 会丢失。

  1. sync_binlog = 1

  • 表示每次提交事务都会执行fsync,更加安全
  1. sync_binlog = N

  • 可以设置为N(N>1),表示每次提交事务都write,但累积N个事务后才fsync

我们已经知道,事务执行时会同时记录redo logbin log两种日志,那会有日志出错不一致问题吗?

  • redo log在事务执行过程中可以不断写入
  • bin log只有在提交事务时才写入

假如事务执行sqlupdate T set c = 1 where id = 2,在写完redo log日志后,bin log日志写期间发生了异常,会出现什么情况呢?

由于bin log没写完就异常,这时候bin log里面没有对应的修改记录。因此,之后用bin log日志恢复数据时,就会少这一次更新,恢复出来的这一行c值为0,而原库因为redo log日志恢复,这一行c的值是1,最终数据不一致。

那有什么解决方案吗?二阶段提交方案。

为了解决两份日志之间的一致性问题,InnoDB存储引擎使用两阶段提交方案。将redo log的写入拆成了两个步骤preparecommit

  • 假如现在写入bin log时MySQL发生异常,这时候的redo log还处于prepare阶段,重启MySQL后,根据redo log记录中的事务ID,发现没有对应的bin log日志,回滚前面已写入的数据。
  • 如果redo logcommit阶段发生移除,但是能通过事务id找到对应的bin log日志,所以MySQL认为是完整的,就会提交事务恢复数据。

bin log写到哪了?

前面讲解了bin log写入的过程,那么它写到了哪里去了呢?

  1. 查看bin log位置

可以通过命令show variables like '%log_bin%';查看bin log最终输出的位置。

  • log_bin_basename: 是bin log日志的基本文件名,后面会追加标识来表示每一个文件
  • log_bin_index: 是binlog文件的索引文件,这个文件管理了所有的binlog文件的目录

通过 SHOW BINARY LOGS;查看当前的二进制日志文件列表及大小,如下图:

  1. 修改 bin log位置

修改MySQL的my.cfgmy.ini配置

#启用二进制日志
log-bin=cxw-bin
binlog_expire_logs_seconds=600
max_binlog_size=100M
复制代码
  • log-bin: bin log日志保存的位置
  • binlog_expire_logs_seconds: bin log日志保存的时间,单位是秒
  • max_binlog_size: 单个bin log日志的容量

bin log内容长啥样?

我们已经知道了bin log的位置了,那它里面的内容长什么样呢?

我们可以用show binlog events命令工具查看bin log日志中的内容。

show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
复制代码
  • IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
  • FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
  • LIMIT [offset] :偏移量(不指定就是0)
  • row_count :查询总条数(不指定就是所有行)

bin log 格式

实际上bin log输出的格式类型有3种,默认是ROW类型,就是上面例子中的格式。

  1. Statement格式:每一条会修改数据的sql都会记录在bin log
  • 优点:不需要记录每一行的变化,减少了bin log日志量,节约了IO,提高性能。
  • 缺点:比如sql中存在函数如now()等,依赖环境的函数,会导致主从同步、恢复数据不一致
  1. ROW格式:为了解决Statement缺点,记录具体哪一个分区中的、哪一个页中的、哪一行数据被修改了
  • 优点:清楚的记录下每一行数据修改的细节,不会出现某些特定情况下 的存储过程,或function无法被正确复制的问题。
  • 缺点:比如对ID<600的所有数据进行了修改操作,那么意味着很多数据发生变化,最终导致同步的log很多,那么磁盘IO、网络带宽开销会很高。
  1. Mixed格式: 混合模式,即Statment、Row的结合版
  • 对于可以复制的SQL采用Statment模式记录,对于无法复制的SQL采用Row记录。

总结

本文讲解了MySQL中的一个非常重要的日志bin log,它主要用来做数据恢复和同步的,所以作为程序员的我们,还是很有必要对它有一个深入的认识。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【博客538】BGP优雅重启机制

bgp优雅重启机制 背景 以BGP为代表的路由协议&#xff0c;从设计之初&#xff0c;就关注路由表的正确性&#xff0c;因为这是确保整个网络系统正常工作的最基本要求。因此每个BGP路由器&#xff0c;总是会以最快的速度收敛到整个网络最新的状态上。当一个BGP peer的BGP连接断开…

一种PEG衍生物Azide-PEG-Biotin|N3-PEG-Biotin|叠氮-PEG-生物素|956748-40-6

1、名称 英文&#xff1a;N3-PEG-Biotin&#xff0c;Azide-PEG-Biotin 中文&#xff1a;叠氮-聚乙二醇-生物素 2、CAS编号&#xff1a;956748-40-6 3、所属分类&#xff1a; Azide PEG Biotin PEG 4、分子量&#xff1a;可定制 5、质量控制&#xff1a;95% 6、储存&…

[附源码]java毕业设计食堂线上点餐系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

玩转MySQL:命令大全~忘记了SQL该怎么写就回来看看~

引言 相信大家在编写SQL时一定有一个困扰&#xff0c;就是明明记得数据库中有个命令/函数&#xff0c;可以实现自己需要的功能&#xff0c;但偏偏不记得哪个命令该怎么写了&#xff0c;这时只能靠盲目的去百度&#xff0c;以此来寻找自己需要的命令。 时间是最厉害的武器&…

Anaconda3安装部署(二) 百篇文章学PyQT

本文章是百篇文章学PyQT的第二篇&#xff0c;本文讲述如何安装Anaconda3工具&#xff0c;Anaconda3 在安装过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决方案…

实战十八:通过ItemKNN算法实现基于协同过滤的商品推荐 代码+数据

项目概述: 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。ItemKNN推荐…

【专栏】基础篇05| Redis 该怎么保证数据不丢失(下)

前言 上一小节我们讲了AOF是什么以及它是如何保证Redis的Crash Safe的&#xff0c;这一节我们再来看一看Redis的RDB和AOF有何不同&#xff0c;两者是怎么样的关系 RDB的工作模式 RDB全称Redis Database&#xff0c;我们也常叫做Redis的内存快照&#xff0c;它与AOF最大的不同在…

基于java+ssm幼儿园教学网站管理系统vue-计算机毕业设计

项目介绍 要想做好幼升小的衔接工作&#xff0c;首先我们要明确小学生相对于幼儿园来说的不同之处。在幼儿园阶段&#xff0c;我们更多的是让小朋友做游戏&#xff0c;培养他们的学习兴趣等。而进入小学后&#xff0c;课程种类增加了&#xff0c;阅读信息不再是简单的图片&…

PHP房屋租售信息管理系统可以用wamp、phpstudy运行定制开发mysql数据库BS模式

一、源码特点 PHP房屋租售信息管理系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库系统主要采用B/S模式开发,开发环境为PHP APACHE&#xff0c;数据库为mysql5.0&#xff0c;使用php语言开发 PHP房屋租售信…

kubernetes组件再认知

背景 之前学习k8s的各组件还是感觉不深入, 只停留在名字解释上面。总是不能深入理解&#xff0c;例如应用部署后kuber-proxy会在master 和node上添加什么样的iptables规则、部署一个应用的完整流程( 手画各组件功能并介绍10分钟以上 )、schedule具体是怎么调度的、limit reque…

计算机视觉|针孔成像,相机内外参及相机标定,矫正的重要性

计算机视觉读书笔记|相机内外参及相机标定&#xff0c;矫正的重要性 这篇博客将介绍针孔成像&#xff0c;透镜&#xff08;弥补了针孔成像曝光不足成像速度慢的缺点&#xff0c;但引进了畸变&#xff0c;主要是径向畸变和切向畸变&#xff0c;径向畸变主要是离中心越远越弯曲&…

Tableau指标排行

2022年11月15日&#xff0c;深圳数据交易所举行揭牌暨数据交易成果发布活动。 文章目录前言一、整体数据排行二、数据排行TOP N三、根据需要也可以显示具体排名总结前言 分享Tableau指标排行制作过程中遇到的问题及其解决方式&#xff0c;供各位小伙伴参考。 一、整体数据排行…

谷粒学院(二) 讲师管理模块

一、讲师管理模块配置 1、在service下面service-edu模块中创建配置文件 2. resources目录下创建文件 application.properties # 服务端口 server.port8001 # 服务名 spring.application.nameservice-edu# 环境设置&#xff1a;dev、test、prod spring.profiles.activedev# my…

java基于ssm网上超市购物商城-计算机毕业设计

项目介绍 网上超市是商业贸易中的一条非常重要的道路&#xff0c;可以把其从传统的实体模式中解放中来&#xff0c;网上购物可以为消费者提供巨大的便利。通过网上超市这个平台&#xff0c;可以使用户足不出户就可以了解现今的流行趋势和丰富的商品信息&#xff0c;为用户提供…

MySQL8.0优化 - 锁 - 从数据操作的粒度划分:表级锁、页级锁、行锁

文章目录学习资料锁的不同角度分类锁的分类图如下从数据操作的粒度划分&#xff1a;表级锁、页级锁、行锁表锁&#xff08;Table Lock&#xff09;表级别的S锁、X锁意向锁&#xff08;intention lock&#xff09;自增锁&#xff08;AUTO-INC锁&#xff09;元数据锁&#xff08;…

算法刷题介绍

算法刷题介绍 课程大纲 Python 作为实现语言。 快速排序算法 0 (nlogn) 实际工作中要根据实际情况选择最优解。 有可能没有完美方案&#xff0c;需要做平衡。 数据有啥特征&#xff1f; 举例&#xff1a;对一组数据进行排序 是否包含大量重复元素&#xff08;三路快排&#x…

【微服务治理之监控APM】系统监控架构概述

APM 简介 APM 通常认为是 Application Performance Management 的简写&#xff0c;它主要有三个方面的内容&#xff0c;分别是 Logs(日志)、Traces(链路追踪)Metrics(报表统计)。 以后大家接触任何一个 APM 系统的时候&#xff0c;都可以从这三个方面去分析它到底是什么样的…

vue中scoped原理与样式穿透原理

是什么 在vue组件中的style标签上有一个特殊属性&#xff1a;”scoped“ 为什么 当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染。 怎么样实现的 1.为组件实例生成一个唯一…

[附源码]SSM计算机毕业设计智能视频推荐网站JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

codeforces:F. All Possible Digits【贪心 + 模拟进位】

目录题目截图题目分析ac code总结题目截图 题目分析 注意是只能再最后一位加我们要使得0到p - 1都出现至少一次统计出现的数字aset考虑最后一位pivot情况1&#xff1a;如果pivot前都出现了&#xff0c;就不用进位了&#xff0c;pivot只需要加到最大的未出现在aset的num即可情况…