数据库日志

数据库日志:

首先,在MySQL中默认只开启了错误日志

MySQL中的日志文件:

  • 错误日志(errorlog):
  • 一般查询日志(general log)
  • 慢查询日志(slow query log)
  • 二进制日志(binlog)
  • 中继日志(relay log)
  • 重做日志(redo log)
  • 回滚日志(undo log)

这里先谈一下重做日志以及回滚日志以及二进制日志之间得关系,他们都与事务操作相关。

重做日志:

作用:

确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。(脏页:linux 内核中的概念,高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的。)

内容:

物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

什么时候产生:

事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。

之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M,Innodb存储引擎先将重做日志写入innodb_log_buffer中。然后通过其他方式将innodb日志缓冲区的日志刷新到磁盘。

什么时候释放:

当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。

对应的物理文件:

默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2(默认文件组的数量是2)

回滚日志:

作用:

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

内容:

逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

什么时候产生:

事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性。

什么时候释放:

当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。

对应的物理文件:

MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。

MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数
如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

二进制日志:

作用:

用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。用于数据库的基于时间点的还原。

内容:

逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。

但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

在使用mysqlbinlog解析binlog之后一些都会真相大白。

因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。

什么时候产生:

事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。

这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。

因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。

这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。

什么时候释放:

binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。

对应的物理文件:

配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。

对于每个binlog日志文件,通过一个统一的index文件来组织。

错误日志:

存放服务器启动和关闭过程中的信息,服务器运行过程中的错误信息,事件调度器运行一个事件时产生的信息、在从服务器上启动从服务器进程时产生的信息。

查询日志:

这是最不应该记录的日志。因为一个非常繁忙的数据库服务器,其查询会有很多,每一次都记录日志会导致系统性能下降。而且还会有额外的空间开销。MySQL默认没有开启这个日志。注意不仅仅是SELECT。

慢查询日志:

查询执行时长超过指定时长的查询,即为慢查询。这里的慢不一定是语句自身执行慢,如果一个操作锁定了某张表,尤其是独占锁锁定了这张表,那么其他人对于这张表的查询就阻塞掉了。但不管怎么讲,慢查询日志是我们通常拿来定位系统上查询操作执行速度过慢时常用到的一个评估工具。所以在生产环境中有时是很有必要启用慢查日志的。

中继日志:

在从服务器上的日志。就是说主从复制的时候,主服务器任何能够产生数据修改的操作,在写入数据文件的同时,还会把这个语句(也可能是行)记录到二进制日志文件中一份。从服务器就是使用一个用户帐号不断的去连接主服务器,并尝试去读取主服务器上二进制日志中的每一个条目,从服务器将这些挨个的读到从服务器上,在执行之前,先要将这些读到的保存在本地的日志文件中,而后从本地日志文件中读一条执行一条。这个日志文件就叫做中继日志。

Original: https://www.cnblogs.com/xiuercui/p/13415700.html
Author: 程序界第一佳丽
Title: 数据库日志

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577555/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java50个关键字之final

    1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)。 final属性:被final修饰的变量不可变,由于不可变有两重含义,…

    Linux 2023年6月7日
    097
  • MySQL里的那些日志们

    该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sq…

    Linux 2023年6月14日
    0107
  • 尤娜,我去面试了

    前情回顾 从前,有一个简单的通道系统叫尤娜…… 尤娜系统的第一次飞行中换引擎的架构垂直拆分改造 四种常用的微服务架构拆分方式 面试前几天 尤娜系统经过一次拆…

    Linux 2023年6月14日
    0108
  • 安装完Ubuntu启动时自动进入grub命令行模式的解决办法

    1.先使用ls命令,找到Ubuntu的安装在哪个分区: grub>ls 会罗列所有的磁盘分区信息,比方说: (hd0,1),(hd0,5),(hd0,3),(hd0,2) 2…

    Linux 2023年6月13日
    093
  • centos挂载windows共享目录

    背景 在linux环境下访问远程windows的共享目录,将windows上的目录挂载到linux目录下。如下图: 一、windows上新建共享文件夹 windows设置共享目录 …

    Linux 2023年6月6日
    0107
  • SpringSecurity 新版2.7以上 快速入门

    SpringSecurity 快速入门 1、导入依赖 org.springframework.boot spring-boot-starter-security 2、测试三种权限 …

    Linux 2023年6月7日
    0111
  • IOC容器模拟实现

    运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载、自动装配和根据全限定类名获取Bean的功能。 1-1 IOC容器的本质 IOC容器可理解为是一个map,其中的一个en…

    Linux 2023年6月8日
    097
  • 表中添加唯一字段报错解决方案

    添加唯一字段的迁移 应用向具有现有行的表添加唯一不可为空字段的”普通”迁移将引发错误,因为用于填充现有行的值仅生成一次,从而破坏了唯一约束。 因此,应采取以…

    Linux 2023年6月14日
    094
  • LyScript 从文本中读写ShellCode

    LyScript 插件通过配合内存读写,可实现对特定位置的ShellCode代码的导出,或者将一段存储在文本中的ShellCode代码插入到程序堆中,此功能可用于快速将自己编写的S…

    Linux 2023年5月28日
    095
  • Windows10公钥远程连接Linux服务器

    前言 一、环境准备 二、使用步骤 – 1.服务器安装并配置OpenSSH 2. 本地生成密钥 3. 服务器ssh添加密钥 三 总结 前言 使用公钥远程登陆Linux十分…

    Linux 2023年6月7日
    0102
  • Linux远程连接管理(命令)

    1.ftp服务器的搭建 ftp的作用:文件的上传和下载,不允许操作目录,如果想操作目录只能用tar打包。 (1)服务器端: ①.输入”sudo apt-get inst…

    Linux 2023年6月8日
    0117
  • Golang环境安装

    一、下载地址 Golang: Downloads – The Go Programming Language GoLand编辑器: Download GoLand: A…

    Linux 2023年6月13日
    0107
  • .NET使用StackExchange.Redis

    csharp;gutter:true; using StackExchange.Redis; using System; using System.Collections.Gene…

    Linux 2023年5月28日
    095
  • web框架底层原理;django介绍

    目录 纯手撸web框架 基于wsgiref模块 优化处理 动静态网页 基于jinja2模板语法 框架请求流程 python主流web框架 *django框架介绍 内容 纯手撸web…

    Linux 2023年6月7日
    098
  • Linux机器自建账号并赋予sudo权限,同时修改远程端口

    默认使用root账号来操作Linux有一定风险,因此需要自建账号并赋予sudo权限,方便使用 登录为root用户后,创建账号 adduser <username>&lt…

    Linux 2023年6月6日
    0136
  • 【C++基础】通讯录管理系统

    系统需求 通讯录是一个可以记录亲人、好友信息的工具 本教程主要利用C++来实现一个 通讯录管理系统 系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名、性别…

    Linux 2023年6月13日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球