首页 > 数据库 >MySQL的几种日志

MySQL的几种日志

时间:2023-10-23 12:32:59浏览次数:39  
标签:binlog log SQL 几种 MySQL 日志 redo

 

MySQL的几种日志_数据

 

重做日志(redolog)

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

MySQL的几种日志_MySQL_02

InnoDB会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。

Redo log可以简单分为以下两个部分:

(1) 重做日志的缓冲 (redo log buffer) ,保存在内存中,是易失的。
(2) 重做日志文件 (redo log file) ,保存在硬盘中,是持久的。
参数设置:innodb_log_buffer_size:
redo log buffer 大小,默认16M ,最大值是4096M,最小值为1M。
重做日志文件 (redo log file) ,保存在硬盘中,是持久的。

redo log 整体流程

MySQL的几种日志_数据_03

MySQL的几种日志_MySQL_04

第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
第2步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
第3步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加 写的方式
第4步:定期将内存中修改的数据刷新到磁盘中

redolog 刷盘策略

InnoDB给出innodb_flush_log_at_trx_commit 参数,该参数控制 commit提交事务时,如何将 redo log buffer 中的日志刷新到 redo log file 中。它支持三种策略:

设置为0 :表示每次事务提交时不进行刷盘操作。(系统默认master thread每隔1s进行一次重做日 志的同步)
设置为1:表示每次事务提交时都将进行同步,刷盘操作( 默认值)
设置为2 :每次事务提交时mysql都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作

回滚日志(undolog)

二进制日志(binlog)

binlog是一个二进制格式的文件,用于记录用户对数据库更新的SQL语句信息,例如:更改数据库表和更改内容的SQL语句都会记录到binlog里,但是不会记录SELECT和SHOW这类操作

binlog的特点

  • binlog在MySQL的Server层实现(引擎共用)
  • binlog为逻辑日志,记录的是一条SQL语句的原始逻辑
  • binlog不限制大小,追加写入,不会覆盖以前的日志
  • 默认情况下,binlog日志是二进制格式的,不能使用查看文本工具的命令(比如,cat,vi等)查看,而使用mysqlbinlog解析查看

开启Binlog日志有以下两个最重要的使用场景

  • 主从复制:在主库中开启binlog功能,这样主库就可以把Binlog传递给从库,从库拿到binlog后实现数据恢复达到主从数据一致性
  • 数据恢复:通过mysqlbinlog工具来恢复数据

binlog日志的三种模式

  • row: 日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改
    优点:能清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。而且不会出现某些特定情况下存储过程或function,以及trigger的调用和触发器无法被正确复制的问题文章地址https://www.yii666.com/blog/437030.html
    缺点:批量操作,会产生大量的日志,尤其是alter table会让日志暴涨
  • statement:记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件), slave在复制的时候SQL进程会解析成和原来master端执行过相同的SQL再次执行。简称SQL语句复制
    优点:日志量小,减少磁盘IO,提升存储和恢复速度
    缺点:在某些情况下会导致主从数据不一致,比如last_insert_id()、now()等函数
  • MySQL的几种日志_MySQL_05


  • mixed:以上两种模式的混合使用,一般会使用statement模式保存binlog,对于statement模式无法复制的操作时,使用row模式保存binlog,MySQL会根据执行的SQL语句选择写入模式

企业场景如何选择binlog的模式

  • 如果生产中使用MySQL的特殊功能相对少(存储过程、触发器、函数)。选择默认的语句模式statement
  • 如果生产中使用MySQL的特殊功能较多的,可以选择mixed模式
  • 如果生产中使用MySQL的特殊功能较多,又希望数据最大化一致,此时最好Row 模式;但是要注意,该模式的binlog日志量增长非常快

binlog写入机制

  • binlog文件结构
    MySQL的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event。不同的修改操作对应的不同的log event , 比较常用的log event有: Query event 、 Row event 、 Xid event 等。binlog文件的内容就是各种Log event的集合
  • MySQL的几种日志_数据_06

  • binlog落盘策略:

    binlog 的写入顺序: binlog cache (write) -> OS cache -> (fsync) disk
    write表示: 写入文件系统缓存,fsync表示持久化到磁盘的时机
    binlog刷数据到磁盘由参数sync_binlog进行配置:
  • sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync
  • sync_binlog=1 的时候,表示每次提交事务都会执行 fsync
  • sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync
  • binlog 写入流程
  • 根据记录模式和操作触发event事件生成log event
  • 事务执行过程中,先把日志(log event) 写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中
  • binlog cache,系统为每个线程分配了一片binlog cache内存 (每个线程都有自己的binlog cache,共用一份binlog文件)
  • 事务提交的时候,执行器把binlog cache里完整的事务写入binlog中。并清空binlog cache

redo log 和 binlog的区别

  • redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用
  • redo log是物理日志,记录的是“在XXX数据页上做了XXX修改”;binlog是逻辑日志,记录的是原始逻辑,其记录是对应的SQL语句
  • redo log是循环写的,空间一定会用完,需要write pos和check point搭配;binlog是追加写,写到一定大小会切换到下一个,并不会覆盖以前的日志
  • redo log作为服务器异常宕机后事务数据自动恢复使用,binlog可以作为主从复制和数据恢复使用。binlog没有自动crash-safe能力

错误日志(error log)

慢查询日志(slow query log)

一般查询日志(general log)

中继日志(relay log)

唯有热爱方能抵御岁月漫长。



标签:binlog,log,SQL,几种,MySQL,日志,redo
From: https://blog.51cto.com/u_15724848/7985903

相关文章

  • mysql增量备份
    一、备份计划以下是MySQL数据库增量备份的一般计划:创建完整备份:在自动备份计划开始前,先创建一次完整备份。这个备份将包含所有数据和表结构。保存增量备份:在每次备份计划完成后,保存增量备份。这个备份将包含从完整备份之后的所有更改操作。定期清理备份:为了节约磁盘空间,定期......
  • 延迟导入Python模块的几种方法
    延迟导入Python模块的几种方法-知乎(zhihu.com)#__init__.pyimportimportlib__all__=['complicated']def__getattr__(name):ifnamein__all__:returnimportlib.import_module("."+name,__name__)else:raiseAttributeError(f&qu......
  • mysql导入.cvs
    workbench新建1张表,没有import按钮,原因是没有设置主键将一个字段设置为主键后,即可导入数据将要导入的数据文件改为utf-8的格式,使用记事本打开查看选择文件选择数据库表查看字段与数据是否对应开始导入......
  • mysql case when then else 语法
    update`badges`set`cat_point`=CASEWHENlevel>=1THENPOW(2,`level`-1)ELSE0ENDwherenamenotlike'%Steam%'; if level>=1:  cat_point=POW(2,`level`-1)else:  cat_point=0......
  • MYSQL语句
    MySQL常用基础语句cmd登录mysql-hlocalhost-uroot-pSHOW语句返回可用数据库列表showdatabases;返回当前选择数据库内可用表的列表showtables;显示表中的所有列(xxx:表名)showcolumnsfromxxx;ordescribexxx;显示服务器状态信息showstatus;显示创建特定......
  • MYSQL
    什么是事务事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,......
  • MySQL分享
    本次分享主要涉及InnoDB如何在磁盘上保存数据InnoDB表空间结构:介绍了InnoDB表文件中的一些组件,比如段、区、页、行记录。除了告诉你怎样存之外,更重要的是希望解释为什么要这样索引页结构:数据以及索引都存在于索引页中,介绍索引页如何组织,当数据删除、更新时会发生啥索引分裂、......
  • MySQL存储引擎
    showengines;查看支持的存储引擎。mysql表的存储引擎:InnoDBmyISAMMemoryMRG_MYISAMarchivefederated,CSV,BLACKHOLE1、InnoDB支持事务和外键:InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSER......
  • java 日志框架
    日志框架:什么是日志框架? a.是一套能实现日志输出的工具包. b.能够记录系统运行状态的所有时间的日志.场景: 用户下线、接口超时、数据库崩溃、HelloWorld日志框架的能力:定制输出目标: 并不只是输出到控制台,如文件、数据库、第三方日志服务.运行时选择性输出: ......
  • mysql8解决null, message from server: “Host is not allowed to connect to this My
    1.登录mysql(注意:账号密码不包括,-u和-p)mysql-uroot-proot2.切换到mysql库:usemysql;3.查询root用户的host值:selectuser,hostfromuser;如果host的值是localhost,说明只支持本地连接,不能远程登录。4.更改host的值为%:updateusersethost='%'whereuser='root';5.刷......