MySQL中的Bin-log是什么?有什么作用?

news2024/11/23 12:41:01

Bin-log日志也被称之为二进制日志,作用与Redo-log类似,主要是记录所有对数据库表结构变更和表数据修改的操作,对于select、show这类读操作并不会记录。bin-log是MySQL-Server级别的日志,所有引擎都能用的日志,而redo-log、undo-log都是InnoDB引擎专享的,无法跨引擎生效。bin-log也由内存日志缓冲区+本地磁盘文件两部分组成,也就是:写bin-log日志时,也会先写缓冲区,然后由后台线程去刷盘。

1. Bin-log的缓冲区

Bin-log和redo-log、undo-log的缓冲区并不同,前面分析的两种日志缓冲区,都位于InnoDB创建的共享BufferPool中,而bin_log_buffer是位于每条线程中的,关系图如下:

MySQL-Server会给每一条工作线程,都分配一个bin_log_buffer,并不是放在共享缓冲区中,MySQL设计时要兼容所有引擎,直接将bin-log的缓冲区,设计在线程的工作内存中,这样就能够让所有引擎通用,并且不同线程/事务之间,由于写的都是自己工作内存中的bin-log缓冲,因此并发执行时也不会冲突!

2. Bin-log本地日志文件的格式

bin-log的本地日志文件,采用追加写的模式,一直向文件末尾写入新的日志记录,当一个日志文件写满后,会创建一个新的bin-log日志文件,每个日志文件的命名为mysql-bin.000001、mysql-bin.000002、mysql-bin.00000x....,可以通过show binary logs;命令查看已有的bin-log日志文件。

bin-log的本地文件中,其中存储的日志记录共有Statment、Row、Mixed三种格式:

  1. Statment:

每一条会对数据库产生变更的SQL语句都会记录到bin-log中,所以不会产生太大的日志量,节约空间,恢复数据时因为数据量小,磁盘IO次数少,因此性能会比较不错。同时做主备等高可用架构时,数据同步也会较小,因此比较节省带宽。但缺点也很明显,即恢复数据、主从同步数据时,有时会出现数据不一致的情况,如SQL中使用了sysdate()、now()这类函数。

例如:当执行一条插入语句时,由于对表进行了变更操作会被记录到bin-log中,当主从架构之间做数据同步时,这条插入语句同步到从机上执行,sysdate()函数会获取机器的当前时间,显然主机和从机执行这条sql时间不同,在主机和从机的用户表中,注册时间会出现不一致。

  1. Row:

这种模式就是为了解决Statment模式的缺陷,Row模式中不再记录每条造成变更的SQL语句,而是记录具体哪一个分区中的、哪一个页中的、哪一行数据被修改了。

因为不记录SQL,而是记录修改后的值,因此有个很大的好处是:当主从同步数据时,复制的是主机上的数据,因此不会出现主从数据不一致的情况。

但缺陷同样很明显,比如表中有800W数据,现在我对ID<600W的所有数据进行了修改操作,哪也就意味着会有600W条记录写入bin-log日志,这个数据量其磁盘IO、网络带宽开销会很高。

  1. Mixed:

这种被称为混合模式,即Statment、Row的结合版,因为Statment模式会导致数据出现不一致,而Row模式数据量又会很大,因此Mixed模式结合了两者的优劣势,对于可以复制的SQL采用Statment模式记录,对于无法复制的SQL采用Row记录,即保留了Statment模式的数据量小,又具备Row模式的数据精准性。

3. 为什么有了Bin-log还需要Redo-log?

Redo-log、Bin-log都是记录更新数据库的操作,MySQL-Server、MyISAM是出自于官方的产品,因此MyISAM中并未设计记录变更操作的日志,记录变更操作由MySQL-Server来通过Bin-log完成。因为MyISAM不支持事务,所以MySQL-Server设计的Bin-log无法用于灾难恢复,因此InnoDB在设计时,又重新设计出Redo-log日志,可以利用该日志实现crash-safe灾难恢复能力,确保任何事务提交后数据都不会丢失。

4. Redo-log和Bin-log两者的区别

Redo-log、Bin-log两者的区别,主要可以从四个维度上来说:

  • ①生效范围不同,Redo-log是InnoDB专享的,Bin-log是所有引擎通用的。
  • ②写入方式不同,Redo-log是用两个文件循环写,而Bin-log是不断创建新文件追加写。
  • ③文件格式不同,Redo-log中记录的都是变更后的数据,而Bin-log会记录变更SQL语句。
  • ④使用场景不同,Redo-log主要实现故障情况下的数据恢复,Bin-log则用于数据灾备、同步。
5. 不小心删库后应该跑路吗?

误删了数据就要想办法恢复,可以通过日志恢复。Redo-log、Bin-log都会记录数据库的变更操作,但Bin-log会更加适合,因为Redo-log采用循环写的方式,一边写会一边擦,里面无法得到完整的数据,而Bin-log是追加写的模式,不去主动删除磁盘的日志文件,并且磁盘的空间还足够,一般Bin-log日志文件都会在本地,当你删库后,可以直接去本地找Bin-log的日志文件,然后拷贝出来一份,再打开最后一个文件,把里面删库的记录手动移除,再利用mysqlbinlog工具导出xx.SQL文件,最后执行该SQL文件即可恢复删库前的数据。

6. bin-log相关的参数
  • log_bin:是否开启bin-log日志,默认ON开启,表示会记录变更DB的操作。
  • log_bin_basename:设置bin-log日志的存储目录和文件名前缀,默认为./bin.0000x。
  • log_bin_index:设置bin-log索引文件的存储位置,因为本地有多个日志文件,需要用索引来确定目前该操作的日志文件。
  • binlog_format:指定bin-log日志记录的存储方式,可选Statment、Row、Mixed。
  • max_binlog_size:设置bin-log本地单个文件的最大限制,最多只能调整到1GB。
  • binlog_cache_size:设置为每条线程的工作内存,分配多大的bin-log缓冲区。
  • sync_binlog:控制bin-log日志的刷盘频率。
  • binlog_do_db:设置后,只会收集指定库的bin-log日志,默认所有库都会记录。
7. Redo-log的两阶段提交

是指Redo-log分两次写入,如果redo-log只写一次,那不管谁先写,都有可能造成主从同步数据时的不一致问题出现,为了解决该问题,redo-log就被设计成了两阶段提交模式,设置成两阶段提交后,整个执行过程有三处崩溃点:

  • redo-log(prepare):在写入准备状态的redo记录时宕机,事务还未提交,不会影响一致性。
  • bin-log:在写bin记录时崩溃,重启后会根据redo记录中的事务ID,回滚前面已写入的数据。
  • redo-log(commit):在bin-log写入成功后,写redo(commit)记录时崩溃,因为bin-log中已经写入成功了,所以从机也可以同步数据,因此重启时直接再次提交事务,写入一条redo(commit)记录即可。

通过这种两阶段提交的方案,就能够确保redo-log、bin-log两者的日志数据是相同的,bin-log中有的主机再恢复,如果bin-log没有则直接回滚主机上写入的数据,确保整个数据库系统的数据一致性。

因为记录日志时,MySQL写入的是二进制数据,而并非字符数据,也就意味着直接用cat/vim这类工具是无法打开的,必须要通过MySQL提供的mysqlbinlog工具解析查看,所以bin-log也称为二进制日志。

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

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

相关文章

LKD-Net: Large Kernel Convolution Network for Single Image Dehazing

LKD-Net&#xff1a;用于单幅图像去噪的大型核卷积网络 摘要 基于深度卷积神经网络(CNN)的单幅图像去噪方法已经取得了很大的成功。以往的方法致力于通过增加网络的深度和宽度来提高网络的性能。目前的方法侧重于增加卷积核的大小&#xff0c;以受益于更大的接受野来增强其性能…

【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析

本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先&#xff0c;我们通过简单的文本处理任务&#xff0c;如分词和分句&#xff0c;来展示scaPy的基本功能。接着&#xff0c;我们利用scaPy的命名实体识别和词性标注功能&#xff0c;分析了Jane Austen的经典小说《傲…

LabVIEW技术交流-控件的禁用属性与Mouse Up事件的一个坑

问题来源 我们平时对控件Mouse Up事件触发使用场景不多&#xff0c;可能在按钮控件上会偶尔用到。在一些场景中&#xff0c;我们用按钮的Mouse Up触发事件&#xff0c;但是又希望在某些限制条件下&#xff0c;按钮会被禁用而不能触发事件。 可是当我们禁用按钮时&#xff0c;它…

网页设计的意义何在?最后一个你绝对没想到!

在当今时代&#xff0c;网页已经成为我们日常生活中不可或缺的一部分。网页的支持对于搜索信息、购物、社交娱乐、在线学习和工作至关重要。网页设计作为网页的重要组成部分之一&#xff0c;在实现网页的各种功能和目的方面发挥着至关重要的作用。那么&#xff0c;网页设计的目…

力扣算法-9.回文数

9.回文数 个人思考 首先从示例2可以看出符号也算在整数这个整体内&#xff0c;可以先判断整数若为负数则返回false其次很容易就会想到遍历两次&#xff0c;从头以及从尾&#xff0c;遍历得到的结果相比较&#xff0c;相同则为回文数 public class Alee9 {public static void …

天花板国际幼儿园是怎样的?一起来听听天津惠灵顿幼儿园园长分享

上周&#xff0c;天津惠灵顿幼儿园举行了精彩的毕业典礼。一如往常&#xff0c;这是一个回顾过去、展望未来的机会。这届毕业班有一些孩子是四年前园长加入惠灵顿学校的时入园的。他们从小小班启航&#xff0c;在这所天津国际幼儿园开始了他们的惠灵顿之旅。四年来&#xff0c;…

Web APIs-DOM-事件相关整理(完成网页交互)

目录 1.事件监听 2.事件监听绑定 3.事件类型 4.实例注意 5.事件对象 6.环境对象 7.回调函数 1.事件监听 &#xff08;绑定事件/注册事件&#xff09;: 程序检测有没有事件产生&#xff08;事件&#xff1a;比如单机一个按钮&#xff08;编程时系统发生的动作或者事情&a…

(七)React:useEffect的理解和使用

1. useEffect的概念理解 useEffect是一个React Hook函数&#xff0c;用于React组件中创建不是由事件引起而是由渲染本身引起的操作&#xff0c;比如发送AJAX请求&#xff0c;更改DOM等等 说明&#xff1a;上面的组件中没有发生任何的用户事件&#xff0c;组件渲染完毕之后就需…

Android使用DevRing框架搭建数据库实体类以及使用

一、引用DevRing依赖 //导入DevRing依赖implementation com.ljy.ring:devring:1.1.8创建数据库表的依赖implementation org.greenrobot:greendao:3.2.2 // add libraryimplementation org.greenrobot:greendao-generator:3.0.0 二、修改工程目录下的.idea->gradle.xml文件&…

游戏服务器研究二:大世界的 scale 问题

这是一个非常陈旧的话题了&#xff0c;没什么新鲜的&#xff0c;但本人对 scale 比较感兴趣&#xff0c;所以研究得比较多。 本文不会探讨 MMO 类的网游提升单服承载人数有没有意义&#xff0c;只单纯讨论技术上如何实现。 像 moba、fps、棋牌、体育竞技等 “开房间类型的游戏…

《mysql篇》--mysql常用命令

数据库操作 显示当前数据库 show databases;(database 后面要加s) 这行命令用来显示当前有多少个数据库 //mysql中有自带的四个库 创建数据库 create database 数据库名(name); 创建一个数据库 create dabase if not exists <数据库名(name)>; //如果系统有与当前创建…

13017.win10安装WSL2及CUDA开发环境

文章目录 1 win10版本1.1 关键项不能忽略 2 安装WSL2 ubuntu20.042.1 打开控制面板&#xff0c;开启虚拟子系统功能2.2 离线安装ubuntu2.2 WSL2 启动 ubuntu2.3 修改默认启动用户 3 ubuntu中安装vscode-server3.1 win10 中安装vscode3.2 ubuntu中安装vscode-server3.3 启动WSL2…

思科交换机基本配置命令

01进入特权模式enable switch>enable switch# 02进入全局配置模式configure terminal switch>enable switch#configure terminal switch(conf)# 03交换机命名hostname aptech2950以aptech2950为例 switch>enable switch#configure terminal switch(conf)#hostname apt…

如何挑选洗地机?盘点口碑最好的四大洗地机

在购买洗地机这种智能家电时&#xff0c;大家都应该格外谨慎。毕竟&#xff0c;洗地机价格不菲&#xff0c;精打细算&#xff0c;确保物尽其用才是最重要的。谁都不想花了高价买回来却让它闲置在墙角落灰尘。买之前我们还是需要对自己的需求做一个清晰的判断&#xff0c;实用性…

Webpack: 如何借助预处理器、PostCSS 等构建现代 CSS 工程环境

概述 在开发 Web 应用时&#xff0c;我们通常需要编写大量 JavaScript 代码 —— 用于控制页面逻辑&#xff1b;编写大量 CSS 代码 —— 用于调整页面呈现形式。问题在于&#xff0c;CSS 语言在过去若干年中一直在追求样式表现力方面的提升&#xff0c;工程化能力薄弱&#xff…

代码随想录算法训练营第三十四天|56. 合并区间、738.单调递增的数字、968.监控二叉树

56. 合并区间 题目链接&#xff1a;56. 合并区间 文档讲解&#xff1a;代码随想录 状态&#xff1a;无语&#xff0c;这题从右边界排序做不了&#xff01; 思路&#xff1a; 排序&#xff1a;按照区间的起始位置进行排序&#xff0c;这样后面处理时可以顺序合并重叠区间。合并…

【zabbix】zabbix 自动发现与自动注册、proxy代理

1、配置zabbix自动发现&#xff0c;要求发现的主机不低于2台 zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数量多&#xff0c;zabbi…

YOLOv8改进 | 主干网络| 可变形卷积网络C2f_DCN【CVPR2017】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录&#xff1a;《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容&#xff0c;内含各种Head检测头、损失函数Loss、B…

基于 ESP8266 和 MQ 气体传感器的微信告警系统设计与实现

接线: ESP8266MQ3vVCCGND GND A0 A0微信通知截图: 摘要:本文主要探讨了一种利用 ESP8266 微控制器与 MQ 气体传感器构建的气体检测微信告警系统。详细阐述了系统的硬件组成、软件设计以及与微信平台的交互机制。通过该系统,能够实时监测环境中的气…

vxe-表尾单元格进行合并后更改其表尾背景颜色

1.场景 在vxe-table的官网API中可以使用footer-cell-class-name给单元格添加背景颜色或者其他样式&#xff0c;但是本人场景进行了表尾合并的操作&#xff1b;参考API进行更改背景颜色失败&#xff1b; 2.解决 利用表尾css类名的区别&#xff0c;用子类选择器进行对应的选择设…