您当前的位置:首页 > 电脑百科 > 数据库 > MYSQL

MySQL日志文件解析

时间:2022-11-29 11:54:44  来源:今日头条  作者:Java全栈修炼

前言

MySQL服务器运行过程中,除了会产生各种数据文件外,还会记录各种日志文件,这些日志文件不仅仅记录MySQL的数据库的运行情况、用户操作、错误信息等,还和MySQL服务器的数据息息相关。

MySQL日志文件

MySQL主要有以下几类日志文件:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log)、中继日志(relay log)

Redo Log (重做日志)

redo log也叫做重做日志,是保证事务持久性的重要机制。用于崩溃恢复,防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

redo log是在事务begin时就开始记录(并不是事务commit时才记录,因为整个事务做的操作可能很多,如果在commit的时候才写redo log,此时一旦发生异常,redo log还没写,这就太晚了,无法确保事务的持久性)。

redo log 是物理日志,记录的是“在某个数据页上做了什么修改”。另外,redo log是循环写入固定的文件,而且是顺序写入磁盘的。

在一个事务中,可能会发生多次的数据修改,对应的就是多个数据页多个偏移量位置的字段变更,也就是说会产生多条redo log,而且因为在同一个事物中,这些redo log,也是不可再分的,也就是说,一个组的redo log在持久化的时候,不能部分成功,部分失败,否则的话,就会破坏事务的原子性。

另外为了提升性能redo log是按照块组织在一起,然后写入到磁盘中的,类似于数据的页,而且引入了redo log buffer,默认的大小为16MB。buffer中分了很多的block,每个block的大小为512kb,每一个事务产生的所有redo log称为一个group。

Undo Log (回滚日志)

数据库事务开始之前,会将要修改的记录放到Undo日志里,当事务回滚时或者数据库崩溃时,可以利用UndoLog撤销未提交事务对数据库产生的影响。

Undo log的作用:

 

  1. 事务回滚 - 原子性:当事务回滚时或者数据库崩溃时,可以利用Undo Log来进行数据回滚。
  2. 多个行版本控制(MVCC)- 隔离性:即在InnoDB存储引擎中MVCC的实现是通过Undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过Undo读取之前的行版本信息,以此实现非锁定读取。
Binary Log (二进制日志)

 

binary 就是bin log,即二进制日志文件,这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复,增量备份,主主复制和主从复制等等。

 

  • binlog日志包括两类文件:
  1. 二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件。
  2. 二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句select)语句事件。

 

binlog日志

 

  • 查看binlog日志是否开启:
mysql> show variables like '%log_bin%'; +---------------------------------+----------------------------------+ | Variable_name | Value | +---------------------------------+----------------------------------+ | log_bin | ON | | log_bin_basename | /www/server/data/mysql-bin | | log_bin_index | /www/server/data/mysql-bin.index | | log_bin_tRust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+----------------------------------+ 6 rows in set (0.00 sec)

 

启用binlog,在 my.cnf 配置文件中加入 log-bin 配置,表示启用binlog,如果没有给定值,写成 log-bin=,则默认名称为主机名。(注:名称若带有小数点,则只取第一个小数点前的部分作为名称)

[mysqld] ## 我配置的文件名为mysql-bin log-bin=mysql-bin

  • 查看binlog日志master 状态:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000009 | 80774638 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)

 

上面的查询结果表示最后(最新)一个binlog日志的编号名称(mysql-bin.000009),及其最后一个操作事件pos结束点(Position)值

 

  • 查看binlog日志列表
mysql> show master logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000008 | 60794094 | | mysql-bin.000009 | 80774638 | +------------------+-----------+ 2 rows in set (0.00 sec)

 

表示,当前我的MySQL服务有两个binlog文件mysql-bin.000008mysql-bin.000009

Error Log (错误日志)

错误日志记录了MySQL 服务器运行过程中所有较为严重的警告和错误信息,以及MySQL服务器每次启动和关闭的详细信息。

在默认情况下,系统记录错误日志的功能是关闭的( 我所使用的 MySQL 5.6 是开启的 ),错误信息被输出到标准错误输出( stderr )。

 

  • 查看错误日志
mysql> show variables like "log_error"; +---------------+-----------------------+ | Variable_name | Value | +---------------+-----------------------+ | log_error | ./VM-16-15-centos.err | +---------------+-----------------------+ 1 row in set (0.00 sec)

 

根据查询结果可知,错误日志保存在数据目录下名为VM-16-15-centos.err的文件中。如果查询结果为stderr,则表示输出到屏幕,错误的信息只会输出到我们的终端屏幕,并不会记录在日志中。

 

  • 开启错误日志

 

在配置文件[mysqld]组添加如下一行配置:

# log_error记录了错误日志所在位置 log_error = /www/server/data/VM-16-15-centos.err Slow Query Log (慢查询日志)

慢查询日志是记录查询时长超过指定时间的日志,慢查询日志主要用来记录时间较长的查询语句,通过慢查询日志可以找出查询时间较长的、执行效率较低的语句,以便进行优化。

默认情况下,慢查询日志功能是关闭的。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影响。

 

  • 查看慢查询日志
mysql> show variables like "%slow_query%"; +---------------------+---------------------------------+ | Variable_name | Value | +---------------------+---------------------------------+ | slow_query_log | ON | | slow_query_log_file | /www/server/data/mysql-slow.log | +---------------------+---------------------------------+ 2 rows in set (0.00 sec)

 

MySQL通过long_query_time参数来指定慢查询时间,时间以秒为单位。如果查询时间超过了这个时间值,这个查询语句将被记录到慢查询日志,如果不设置,默认时间为 10 秒。

mysql> show variables like "%long_query_time%"; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 3.000000 | +-----------------+----------+ 1 row in set (0.00 sec)

  • 开启和关闭慢查询日志
#开启慢查询日志 0关闭 1开启 SET GLOBAL slow_query_log=1; #修改慢日志记录SQL的最低阈值时间,单位秒 SET GLOBAL long_query_time=3; General Log (一般查询日志)

 

一般查询日志会记录MySQL所有的SQL语句,不管是查询语句,还是DML语句,还是DDL语句,还是DCL语句,这些语句统统都会被记录在general log文件中。就连我们连接和断开MySQL数据库的这些语句。

MySQL会把它收到的所有SQL语句按照接收的顺序依次记录在general log中。默认情况下一般查询日志是关闭的(OFF状态),并且默认保存在数据包目录中。

 

  • 查看一般查询日志
mysql> show variables like "%general%"; +------------------+--------------------------------------+ | Variable_name | Value | +------------------+--------------------------------------+ | general_log | OFF | | general_log_file | /www/server/data/VM-16-15-centos.log | +------------------+--------------------------------------+ 2 rows in set (0.01 sec)

 

genral_log:用于控制是否开启general log。等于0表示关闭,等于1表示开启。默认是0。

general_log_file:指定general log日志的保存路径和文件名,如果不配置这个参数的话,默认会以MySQL服务器的hostname作为general log日志的文件名称,具体文件为:.log。日志的存放路径,如果不指定,则默认放在datadir参数所指定的目录下,也可以在这个参数中指定具体的路径+名称

 

  • 开启一般查询日志

 

通用日志有一个默认的保存路径,和我们的数据库文件在同一个目录下,我们只需要开启即可。

mysql> set @@global.general_log = 1; Query OK, 0 rows affected (0.03 sec)

然后我们在查看一般查询日志的状态,就会发现已经是ON。

Relay Log (中继日志)

一般情况下它在MySQL主从同步读写分离集群的从节点才开启。主节点一般不需要这个日志。

MySQL主从同步

如上图,master主节点的binlog传到slave从节点后,被写到relay log里,它是一个临时的日志文件,用于存储从master节点同步过来的binlog日志内容,它里面的内容和master节点的binlog日志里面的内容是一致的。然后slave从节点从这个relaylog日志文件中读取数据应用到数据库中,来实现数据的主从复制

总结

MySQL日志文件是数据库的重要组成部分,本文介绍的七种日志文件,随便一种都可以延伸出很多知识点。但是作为MySQL基础入门文章,我们只对日志文件做简单的了解,并没有进行深入的探索,虽然偏理论性知识,但是对使用和学习MySQL非常重要。

结束语

你知道的越多,不知道的就越多。

 

程序员的修养就是对技术发自内心的欣赏和敬畏!倘若文中表述有误,还请谅解,并欢迎与我讨论,自主思考永远比被动接受更有效!



Tags:MySQL   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  Search: MySQL  点击:(7)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  Search: MySQL  点击:(11)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  Search: MySQL  点击:(10)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  Search: MySQL  点击:(25)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10  Search: MySQL  点击:(9)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  Search: MySQL  点击:(28)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  Search: MySQL  点击:(49)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  Search: MySQL  点击:(53)  评论:(0)  加入收藏
为什么高性能场景选用Postgres SQL 而不是 MySQL
一、 数据库简介 TLDR;1.1 MySQL MySQL声称自己是最流行的开源数据库,它属于最流行的RDBMS (Relational Database Management System,关系数据库管理系统)应用软件之一。LAMP...【详细内容】
2024-02-19  Search: MySQL  点击:(38)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  Search: MySQL  点击:(54)  评论:(0)  加入收藏
▌简易百科推荐
MySQL 核心模块揭秘
server 层会创建一个 SAVEPOINT 对象,用于存放 savepoint 信息。binlog 会把 binlog offset 写入 server 层为它分配的一块 8 字节的内存里。 InnoDB 会维护自己的 savepoint...【详细内容】
2024-04-03  爱可生开源社区    Tags:MySQL   点击:(7)  评论:(0)  加入收藏
MySQL 核心模块揭秘,你看明白了吗?
为了提升分配 undo 段的效率,事务提交过程中,InnoDB 会缓存一些 undo 段。只要同时满足两个条件,insert undo 段或 update undo 段就能被缓存。1. 关于缓存 undo 段为了提升分...【详细内容】
2024-03-27  爱可生开源社区  微信公众号  Tags:MySQL   点击:(11)  评论:(0)  加入收藏
MySQL:BUG导致DDL语句无谓的索引重建
对于5.7.23之前的版本在评估类似DDL操作的时候需要谨慎,可能评估为瞬间操作,但是实际上线的时候跑了很久,这个就容易导致超过维护窗口,甚至更大的故障。一、问题模拟使用5.7.22...【详细内容】
2024-03-26  MySQL学习  微信公众号  Tags:MySQL   点击:(10)  评论:(0)  加入收藏
从 MySQL 到 ByteHouse,抖音精准推荐存储架构重构解读
ByteHouse是一款OLAP引擎,具备查询效率高的特点,在硬件需求上相对较低,且具有良好的水平扩展性,如果数据量进一步增长,可以通过增加服务器数量来提升处理能力。本文将从兴趣圈层...【详细内容】
2024-03-22  字节跳动技术团队    Tags:ByteHouse   点击:(25)  评论:(0)  加入收藏
MySQL自增主键一定是连续的吗?
测试环境:MySQL版本:8.0数据库表:T (主键id,唯一索引c,普通字段d)如果你的业务设计依赖于自增主键的连续性,这个设计假设自增主键是连续的。但实际上,这样的假设是错的,因为自增主键不...【详细内容】
2024-03-10    dbaplus社群  Tags:MySQL   点击:(9)  评论:(0)  加入收藏
准线上事故之MySQL优化器索引选错
1 背景最近组里来了许多新的小伙伴,大家在一起聊聊技术,有小兄弟提到了MySQL的优化器的内部策略,想起了之前在公司出现的一个线上问题,今天借着这个机会,在这里分享下过程和结论...【详细内容】
2024-03-07  转转技术  微信公众号  Tags:MySQL   点击:(28)  评论:(0)  加入收藏
MySQL数据恢复,你会吗?
今天分享一下binlog2sql,它是一款比较常用的数据恢复工具,可以通过它从MySQL binlog解析出你要的SQL,并根据不同选项,可以得到原始SQL、回滚SQL、去除主键的INSERT SQL等。主要...【详细内容】
2024-02-22  数据库干货铺  微信公众号  Tags:MySQL   点击:(49)  评论:(0)  加入收藏
如何在MySQL中实现数据的版本管理和回滚操作?
实现数据的版本管理和回滚操作在MySQL中可以通过以下几种方式实现,包括使用事务、备份恢复、日志和版本控制工具等。下面将详细介绍这些方法。1.使用事务:MySQL支持事务操作,可...【详细内容】
2024-02-20  编程技术汇    Tags:MySQL   点击:(53)  评论:(0)  加入收藏
MySQL数据库如何生成分组排序的序号
经常进行数据分析的小伙伴经常会需要生成序号或进行数据分组排序并生成序号。在MySQL8.0中可以使用窗口函数来实现,可以参考历史文章有了这些函数,统计分析事半功倍进行了解。...【详细内容】
2024-01-30  数据库干货铺  微信公众号  Tags:MySQL   点击:(54)  评论:(0)  加入收藏
mysql索引失效的场景
MySQL中索引失效是指数据库查询时无法有效利用索引,这可能导致查询性能显著下降。以下是一些常见的MySQL索引失效的场景:1.使用非前导列进行查询: 假设有一个复合索引 (A, B)。...【详细内容】
2024-01-15  小王爱编程  今日头条  Tags:mysql索引   点击:(85)  评论:(0)  加入收藏
站内最新
站内热门
站内头条