您当前的位置:首页 > 互联网教程

mysql的几种日志记录

发布时间:2025-05-11 19:30:36    发布人:远客网络

mysql的几种日志记录

一、mysql的几种日志记录

防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

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

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

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

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

innodb_log_group_home_dir指定日志文件组所在的路径,默认./,表示在数据库的数据目录下。

innodb_log_files_in_group指定重做日志文件组中文件的数量,默认2

关于文件的大小和数量,由一下两个参数配置:

innodb_log_file_size重做日志文件的大小。

innodb_mirrored_log_groups指定了日志镜像文件组的数量,默认1

很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。

之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,

原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。

保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(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文件的个数

如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。

关于MySQL5.7之后的独立undo表空间配置参数如下

innodb_undo_directory=/data/undospace/--undo独立表空间的存放目录

innodb_undo_logs= 128--回滚段为128KB

innodb_undo_tablespaces= 4--指定有4个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文件来组织。

慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。

show variables like“long_query_time”;默认10s

show variables like“%slow%”;

标签:basename逻辑最大的指定bin判断purgeselectredo

二、MySQL三种重要日志

1、日志是MySQL的重要组成部分,其中对于开发而言不得不关注三种重要的日志,分别是二进制日志(bin log)、事务日志(redo log、undo log)。接下来详细介绍这三种日志。

2、 binlog叫做二进制日志,主要是用于记录MySQL表的逻辑变化过程。在实际应用过程中,通常被用于主从复制和数据恢复。

3、事务执行过程中,会先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

4、事务提交后的写入只是写入到文件系统的page cache,并没有把数据持久化到磁盘。持久化磁盘由操作系统决定调用fsync。

5、 MySQL提供了配置决定fsync的时机,当sync_binlog=0的时候,每次提交事务只写入page cache,不执行fsync。当sync_binlog=1的时候,表示每次提交事务都会执行fsync。当sync_binlog= N的时候,每次提交事务都写入page cache,累计多个事务才进行fsync。

6、显然,当sync_binlog= 1的时候,binlog日志不会丢失。当sync_binlog= N的时候,如果发生异常重启,会丢失N个事务的binlog日志。

7、记录数据操作的原始SQL,可能引发主库备库因索引选择不一致,导致数据执行结果不一致。

8、 ROW基于行复制,只记录哪条数据被修改.缺点:占空间。比如DELETE语句,对于STATEMENT只占用1条SQL。而ROW格式则需要把所有记录的数据记录下来。

9、对于可能引发主备不一致的命令使用ROW格式,否则使用STATEMTNT

10、对于每一次更新操作,MySQL都需要写入磁盘,然后需要找到对应那条记录并更新。IO成本较高和查找成本都很高。为了提高性能,MySQL会将更新操作写入redo log,并更新内存。INNODB引擎会在适当的时候将操作记录更新到磁盘。

11、 [图片上传失败...(image-c6a1f2-1627716309698)]

12、 undo log主要是记录了数据的逻辑变化,比如对应一条insear语句,undo log会记录一条delete语方便回退到更新前的值。

13、时刻A发生故障的话,由于binlog未写入,redo log回滚数据,两个日志数据是一致的。

14、时刻B发生故障,则需要判断binlog是否完整来决定如何恢复。

15、为什么redo log crash-safe,而bin log不可以?

三、MySQL日志问题为什么MySQL不生成日志mysql不生成日志

MySQL日志问题:为什么MySQL不生成日志?

MySQL是一种流行的开源关系型数据库管理系统,在数据库运维中扮演着重要的角色。MySQL提供了多个不同类型的日志,如二进制日志、错误日志、慢查询日志等,但有时候会遇到MySQL不生成日志的问题,这会导致查询问题的跟踪变得困难,使问题排查变得更加困难。那么,为什么MySQL会出现不生成日志的情况呢?本文将对此进行探讨。

在分析MySQL不生成日志问题之前,让我们首先了解MySQL日志的作用。MySQL日志是记录数据库操作过程的信息和各种事件的日志,主要包括:

*错误日志:用于记录数据库的错误日志;

*二进制日志:用于记录所有的数据库更改操作,包括INSERT、UPDATE和DELETE等;

*事务日志:用于记录提交的事务,以及回滚的事务;

*慢查询日志:用于记录执行时间超过阈值的查询;

*查询日志:用于记录MySQL服务器接收到的所有请求,以及服务器的响应。

通过MySQL日志,可以方便地追踪问题,了解数据库的运行情况,对于优化数据库性能以及排除故障非常有帮助。

那么,为什么MySQL不生成日志呢?原因可能有以下几点:

在MySQL中,日志开关默认是关闭的。如果没有打开日志开关,那么MySQL就不会生成任何日志。要检查和打开MySQL日志开关,可以编辑MySQL配置文件 my.cnf或 my.ini,按照需求滚动找到下面的行:

slow_query_log=1#慢查询日志开关

long_query_time=2#慢查询日志记录阈值

如果日志开关被注释了或者关闭了,MySQL就不会生成任何日志。

当MySQL日志的目录没有足够的权限时,MySQL就无法写入日志文件。要检查权限,可以使用以下命令:

sudo chown-R mysql:mysql/var/log/mysql

sudo chmod-R 755/var/log/mysql

如果你没有足够的权限,可以使用以上命令进行更改。

不同版本的MySQL可能有不同的日志设置方法和参数,因此在不同版本的MySQL中可能会出现不生成日志的问题。在进行MySQL升级之前,需要检查是否需要更新日志设置。

MySQL会在开启日志功能时生成日志文件,当日志文件达到最大值时,MySQL会停止继续写入该日志文件。如果MySQL没有将日志文件自动清理,则无法继续写入日志文件。在这种情况下,你可以手动清理日志文件。

针对MySQL不生成日志问题,可以采取以下解决方案:

检查 MySQL的配置文件是否正确,并找到并打开日志开关,确保日志文件正常生成。

检查 MySQL日志文件目录的权限是否正确,MySQL可以写入所需的日志文件。

如果 MySQL版本较旧,则可能需要更新 MySQL版本。在更新版本之前,请查看版本升级步骤和日志设置方法,以确保日志功能可以正确使用。

如果 MySQL不再生成新的日志文件,则可以尝试手动删除日志文件。请注意,在删除日志文件时,请小心,不要删除任何正在使用的日志文件。

MySQL是广泛使用的关系型数据库管理系统,日志功能对于快速排除问题以及优化性能非常有帮助。但是,当 MySQL不生成日志时,会给故障排除带来极大的困难。在本文中,我们了解到了 MySQL日志的作用,以及不生成日志的原因,为排除 MySQL日志问题提供了解决方法。在数据库维护过程中,应注重监控 MySQL日志文件,确保 MySQL运行正常。