浅谈MySQL日志文件|手撕MySQL系列

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 我打算接下来一段时间潜心学习一下MySQL数据库相关的知识点,写作一系列MySQL相关的文章,并且配合实操,希望等这个系列完成之后,可以**将MySQL所有重要的知识点全部覆盖**,下一次直接对线面试官。
关注微信公众号【程序员白泽】,进入白泽的知识分享星球🌍

前言

上周五面试了字节的第三面,深感数据库知识的重要,我也意识到在平时的学习中,自己对于数据库的学习较为薄弱。甚至在有过一定实习经验之后,依旧因为开发分工的原因,对数据库方面的知识掌握依旧不多。我也相信,很多人对MySQL的索引日志多版本并发控制ACID等等都只停留在八股文的阶段。

因此我打算接下来一段时间潜心学习一下MySQL数据库相关的知识点,写作一系列MySQL相关的文章,并且配合实操,希望等这个系列完成之后,可以将MySQL所有重要的知识点全部覆盖,下一次直接对线面试官。

作为系列地第一篇文章,本文将重点介绍MySQL的日志文件类型,并讲解其作用,并结合一定实操演示,相信跟着做下来你会对MySQL有更深的理解

文件的概念

在开始讲MySQL日志文件之前,首先我们要明确一下文件的概念。MySQL数据库是存放在硬盘上的,用户进程通过和一个运行的MySQL实例进程通信(也就是需要一个运行的MySQL服务),通过这个服务去操作磁盘上的MySQL数据库文件,实现数据存取修改的目的,因此,我们先来看看都有哪些文件。

# 在MySQL登录状态下,执行这个命令可以查看我们数据库主要数据文件的位置
mysql> show variables like 'datadir';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| datadir       | /usr/local/mysql/data/ |
+---------------+------------------------+
# 得知路径之后在Linux终端进行查看
sudo ls -lh /usr/local/mysql/data/
# 下面是执行了命令之后的部分展示(这里列出了MySQL的各种日志文件、索引相关的文件、你建立的数据库的文件等,先有个概念,等阅读下面讲到的各种文件时可以回上来看一看)
-rw-r-----    1 _mysql  _mysql   6.7K  1 19 10:51 binlog.000006
-rw-r-----    1 _mysql  _mysql   179B  1 24 15:04 binlog.000007
-rw-r-----    1 _mysql  _mysql    48B  1 24 15:05 binlog.index
-rw-r-----    1 _mysql  _mysql   4.1K  1 24 15:04 ib_buffer_pool
-rw-r-----    1 _mysql  _mysql    48M  2 26 14:06 ib_logfile0
-rw-r-----    1 _mysql  _mysql    48M 10 11 11:37 ib_logfile1
drwxr-x---    5 _mysql  _mysql   160B 10 13 15:01 blog
-rw-r-----    1 _mysql  _mysql    12M  2 26 14:04 ibdata1
-rw-r-----    1 _mysql  _mysql    12M  1 24 15:05 ibtmp1
-rw-r-----    1 _mysql  _mysql   180B  3  2 17:28 lilithgamesdeMacBook-Pro-42-slow.log
-rw-r-----    1 _mysql  _mysql   249B  3  2 17:55 lilithgamesdeMacBook-Pro-42.log
-rw-r-----    1 _mysql  _mysql    24M  2 26 14:04 mysql.ibd
-rw-r-----    1 _mysql  _mysql    11K  1 24 15:05 mysqld.local.err
-rw-r-----    1 _mysql  _mysql     4B  1 24 15:05 mysqld.local.pid
-rw-r-----    1 _mysql  _mysql    16M  2 26 14:06 undo_001
-rw-r-----    1 _mysql  _mysql    16M  2 26 14:06 undo_002

参数文件

MySQL登录状态下使用show variables命令查看所有参数(key-value形式),这些参数控制着MySQL的各种状态属性。这个命令在我们需要获取MySQL的各种状态时会被高频使用到。

# 查询所有参数
mysql> show variables;
# 也可以使用like参数指定需要查询的参数
mysql> show variables like 'warning_count';
# 设置全局参数值,键值对的形式
mysql> set global 参数名=参数值

日志文件

错误日志(error log)

错误日志记录了MySQL的启动、运行、关闭的过程。遇到例如MySQL无法正常启动,可以查看错误日志文件。而且错误日志会记录MySQL运行过程中的警告(warning) ,通过查看这些警告⚠️可以针对出现警告的原因进行优化,从而达到优化数据库的目的。

# 在MySQL登录状态下,使用下面命令可以查看error log在服务器上的位置
mysql> show variables like 'log_error';
+---------------+----------------------------------------+
| Variable_name | Value                                  |
+---------------+----------------------------------------+
| log_error     | /usr/local/mysql/data/mysqld.local.err |
+---------------+----------------------------------------+
# 然后通过tail -n 50 查看倒数50行的错误日志内容去定位错误(不是在MySQL登录状态下,而是在Linux用户态下,sudo获取访问权限)
sudo tail -n 50 /usr/local/mysql/data/mysqld.local.err
# 具体日志内容不作展示

慢查询日志(slow query log)

慢查询日志的作用是将运行时间超过设定值的所有SQL语句都记录到慢查询日志中,通过定期检查慢查询日志,通过定位到慢SQL语句之后,对其进行分析,是否是因为索引未生效的等原因导致查询过慢,可以对查询过慢的SQL语句进行优化。

# 在MySQL登录状态下查看慢查询日志阈值,执行时间超过这个值的SQL会被记录下来
mysql> show variables like 'long_query_time';
+-----------------+-----------+
| Variable_name   | Value     |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
# 查询是否开启慢查询日志(默认关闭)
mysql> show variables like 'slow_query_log';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| slow_query_log | OFF   |
+----------------+-------+
# 开启慢查询日志
mysql> set global slow_query_log=on;

一个和慢查询日志有关的参数是log_queries_not_using_indexes,开启之后。如果运行的SQL没有使用索引,则MySQL数据库同样会将这条SQL语句记录到慢查询日志文件中。

# 查询是否将未执行索引的SQL加入到慢查询日志当中(默认关闭)
mysql> show variables like 'log_queries_not_using_indexes';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF   |
+-------------------------------+-------+
# 开启参数
mysql> set global log_queries_not_using_indexes=on;

查看慢查询日志的路径,以及通过linux命令查看慢查询日志内容。

# 确保在MySQL登录状态下
mysql> show variables like 'slow%';
+---------------------+------------------------------------------------------------+
| Variable_name       | Value                                                      |
+---------------------+------------------------------------------------------------+
| slow_launch_time    | 2                                                          |
| slow_query_log      | ON                                                         |
| slow_query_log_file | /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42-slow.log |
+---------------------+------------------------------------------------------------+
# 在Linux用户终端查看慢查询日志文件后50页的内容(这个命令我们在上面查看错误日志的时候也用到了)
sudo tail -n 50 /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42-slow.log

除此之外,MySQL还提供了其他参数用于控制每分钟允许插入到慢查询日志中的未使用索引的SQL的语句次数(防止慢查询日志增长过快),以及提供了命令用于筛选慢查询日志中的数据,如展示执行时间最长的10条SQL等等功能,在此不多赘述,大家用到时再多作了解。

查询日志(log)

查询日志记录了所有MySQL数据库的请求信息,如论请求是否得到执行。因为有慢查询日志的存在,一般情况下对查询日志的使用依赖较小,开启后也会有一定的性能损耗,默认关闭。

# 查看查询日志的开启状态和位置
mysql> show variables like 'general_log%';
+------------------+-------------------------------------------------------+
| Variable_name    | Value                                                 |
+------------------+-------------------------------------------------------+
| general_log      | OFF                                                   |
| general_log_file | /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42.log |
+------------------+-------------------------------------------------------+
# 开启查询日志
mysql> set global general_log = on;
# 查看查询日志文件(在Linux用户终端,而不是MySQL登录态)
sudo tail -n 50 /usr/local/mysql/data/lilithgamesdeMacBook-Pro-42.log

二进制日志(binary log)

二进制日志记录了对MySQL数据库执行更改的所有操作(不包括select和show命令,但这些会被记录到查询日志中)。二进制日志主要作用有以下几点:

  • 数据恢复:用户可以通过二进制日志进行精确的数据恢复。
  • 主从复制:通过复制和执行二进制日志使得一台远程的MySQL数据库与另一台提供数据的MySQL数据库进行实时同步。
# 通过命令查看二进制日志的开启状态
mysql> show variables like '%log_bin%';
+---------------------------------+------------------------------------+
| Variable_name                   | Value                              |
+---------------------------------+------------------------------------+
| log_bin                         | ON                                 |
| log_bin_basename                | /usr/local/mysql/data/binlog       |
| log_bin_index                   | /usr/local/mysql/data/binlog.index |
| log_bin_trust_function_creators | OFF                                |
| log_bin_use_v1_row_events       | OFF                                |
| sql_log_bin                     | ON                                 |
+---------------------------------+------------------------------------+

结束语

本文初步介绍了MySQL拥有的日志文件的类型及其作用,其中慢查询日志二进制日志两个点也是面试的高频重点,因此光掌握到本文讲解的程度是略微不够的,后面的文章我讲用例子讲述慢查询日志定位SQL问题的实操(定位到慢SQL之后就要优化它,那么就牵扯到索引设置和优化,又是一个重要知识点‼️)和二进制日志进行数据恢复和同步的实操(也是很重要的知识点‼️)。

八股文不是学习的终点,而是一个提纲,是我们学习的起点~

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
15天前
|
SQL 存储 关系型数据库
Mysql并发控制和日志
通过深入理解和应用 MySQL 的并发控制和日志管理技术,您可以显著提升数据库系统的效率和稳定性。
67 10
|
11天前
|
安全 关系型数据库 MySQL
MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!
《MySQL崩溃保险箱:探秘Redo/Undo日志确保数据库安全无忧!》介绍了MySQL中的三种关键日志:二进制日志(Binary Log)、重做日志(Redo Log)和撤销日志(Undo Log)。这些日志确保了数据库的ACID特性,即原子性、一致性、隔离性和持久性。Redo Log记录数据页的物理修改,保证事务持久性;Undo Log记录事务的逆操作,支持回滚和多版本并发控制(MVCC)。文章还详细对比了InnoDB和MyISAM存储引擎在事务支持、锁定机制、并发性等方面的差异,强调了InnoDB在高并发和事务处理中的优势。通过这些机制,MySQL能够在事务执行、崩溃和恢复过程中保持
38 3
|
25天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
27天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
26天前
|
安全 关系型数据库 MySQL
解决MySQL删除/var/lib/mysql下的所有文件后无法启动的问题
删除 `/var/lib/mysql` 下的所有文件后,需要重新初始化数据目录,确保正确的权限设置,并重新启动 MySQL 服务。通过按照上述步骤操作,可以解决 MySQL 无法启动的问题,并恢复数据库的正常运行。初始化数据目录后,别忘了配置安全设置,并根据需要恢复备份数据。这些步骤不仅能够恢复 MySQL 的正常运行,还能确保数据库的安全性和完整性。
39 2
|
29天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
2月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的参数文件
MySQL启动时会读取配置文件my.cnf来确定数据库文件位置及初始化参数。该文件分为Server和Client两部分,包含动态与静态参数。动态参数可在运行中通过命令修改,而静态参数需修改my.cnf并重启服务生效。文中还提供了相关代码示例和视频教程。
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的全量日志文件
MySQL全量日志记录所有操作的SQL语句,默认禁用。启用后,可通过`show variables like %general_log%检查状态,使用`set global general_log=ON`临时开启,执行查询并查看日志文件以追踪SQL执行详情。
|
2月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
163 6
|
2月前
|
SQL 关系型数据库 MySQL
【赵渝强老师】MySQL的慢查询日志
MySQL的慢查询日志用于记录执行时间超过设定阈值的SQL语句,帮助数据库管理员识别并优化性能问题。通过`mysqldumpslow`工具可查看日志。本文介绍了如何检查、启用及配置慢查询日志,并通过实例演示了慢查询的记录与分析过程。
175 3