MySQL Server 日志
慢查询日志,slow qurey log
https://dev.mysql.com/doc/refman/8.4/en/slow-query-log.html
慢日志中记录所有执行实践超过long_query_time(单位为秒)的所有SQL语句的日志。默认情况下,慢查询日志没有开启,慢查询日志long_query_time默认值为10s。
# m.cnf
-- 设置开启慢查询日志,0表示关闭,1表示开启,默认值为0
slow_query_log=1
-- 设置慢查询阈值,单位为秒,默认值为10
long_query_time=2
日志
https://dev.mysql.com/doc/refman/8.0/en/server-logs.html
Mysql七大日志
- 一般查询日志,general query log
- 错误日志,error log
- 慢查询日志,slow query log
- 回滚日志,undo log
- 重做日志,redo log
- 二进制日志,binlog
- 中继日志,relay log
一般日志,general log
该日志记录 MySQL 服务器的启动和关闭信息、客户端的连接信息、更新、查询数据记录的 SQL 语句等。
错误日志,error log
该日志文件会记录 MySQL 服务器的启动、关闭和运行错误等信息。
慢查询日志,slow query log
记录执行事件超过指定时间的操作,通过工具分析慢查询日志可以定位 MySQL 服务器性能瓶颈所在。
重做日志,redo log
作用:
重做日志(redo log)的作用是确保事务的持久性,防止在发生故障的时间点,尚有脏页未写入磁盘。在重启 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。
回滚日志,undo log
作用
保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。
内容
逻辑格式的日志,在执行 undo 的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于 redo log 的。
什么时候产生
事务开始之前,将当前时的版本生成 undo log,undo 也会产生 redo 来保证 undo log 的可靠性。
什么时候释放
当事务提交之后,undo log 并不能立马被删除,而是放入待清理的链表,由 purge 线程判断是否由其他事务在使用 undo 段中表的上一个事务之前的版本信息,决定是否可以清理 undo log 的日志空间。
对应的物理文件
MySQL 5.6 之前,undo 表空间位于共享表空间的回滚段中,共享表空间的默认名称是 ibdata,位于数据文件目录中
MySQL 5.6 之后,undo 表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变 undo log 文件的个数。
如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。
这样如果用户执行的事务或语句由于某种原因失败了,又或者用户用一条ROLLBACK语句请求回滚,就可以利用这些undo信息将数据回滚到修改之前的样子。
二进制日志,binlog
二进制日志文件就是常说的binlog。二进制日志记录了MySQL所有修改数据库的操作,不记录查询语句,然后以二进制的形式记录在日志文件中,其中还包括每条语句所执行的时间和所消耗的资源,以及相关的事务信息。默认情况下,二进制日志功能是开启的,启动时可以重新配置–log-bin[=file_name]选项,修改二进制日志存放的目录和文件名称。
作用
用于复制,在主从复制中,从库利用主库上的 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 配置的天数之后,会被自动删除。
中继日志,relay log
中继日志(relay log)只在主从服务器架构的从服务器上存在。从服务器(slave)为了与主服务器(Master)保持一致,要从主服务器读取二进制日志的内容,并且把读取到的信息写入本地的日志文件中,这个从服务器本地的日志文件就叫中继日志。然后,从服务器读取中继日志,并根据中继日志的内容对从服务器的数据进行更新,完成主从服务器的数据同步。
总结
- 一般日志、错误日志、慢查询日志
- 回滚日志、重做日志、二进制日志
- 中继日志
redo log用来保证事务的持久性,undo log用来帮助事务回滚及MVCC的功能。redo log基本上都是顺序写的,在数据库运行时不需要对redo log的文件进行读取操作。而undo log是需要进行随机读写的。
redo存放在重做日志文件中,与redo不同,undo存放在数据库内部的一个特殊段(segment)中,这个段称为undo段(undo segment),undo段位于共享表空间内。