草庐IT

#yyds干货盘点#盘点MySQL中的那些日志文件

7small7 2023-03-28 原文

简介

该篇文章对MySQL中的日志进行总结与简单介绍,不会涉及的太深。主要的目的是为了对MySQL中的日志文件有一个体系化的了解。后面会对每一种日志文件做具体的分析与总结。

日志分类

MySQL中的日志文件,配置文件、错误日志文件、二进制文件(binary log)、慢查询日志(slow-query-log)、全量日志(genera log)、审计日志(audit log)、数据库文件&数据表文件、存储引擎文件、中继日志(relay log)、进程文件(PID)和Socket文件。

参数文件

参数文件就是MySQL中的配置文件,在Linux下的my.cnf文件、Windows下的my.ini文件。文件内容主要分为server和client两个模块。server模块配置的是有关MySQL的服务信息,例如慢查询日志。client模块配置的是有关MySQL客户端连接信息,例如客户端连接的端口号。 文件格式大致如下:

[client] port = 3306 default-character-set = utf8mb4 [mysqld] user = mysql port = 3306 sql_mode = "" default-storage-engine = InnoDB default-authentication-plugin = mysql_native_password character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4' slow_query_log long_query_time = 3 slow-query-log-file = /var/lib/mysql/mysql.slow.log log-error = /var/lib/mysql/mysql.error.log default-time-zone = '+8:00'

错误日志文件

错误日志文件记录了MySQL从启动、运行和关闭几个环节中的日志信息。例如连接MySQL连接失败、查询命令错误、SQL执行流程等等。对于定位MySQL错误有着很大的帮助。 文件大致内容如下:

Version: '5.7.28-log' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) 2021-04-17T21:23:00.865868Z 3 [Note] Aborted connection 3 to db: 'exam_wechat' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-17T21:23:00.865969Z 2 [Note] Aborted connection 2 to db: 'exam_wechat' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-19T22:33:24.137143Z 0 [Note] InnoDB: page_cleaner: 1000ms intended loop took 18415ms. The settings might not be optimal. (flushed=0 and evicted=0, during the time.) 2021-04-20T07:03:21.765208Z 79 [Note] Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T07:03:23.825044Z 81 [Note] Aborted connection 81 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got an error reading communication packets) 2021-04-20T07:14:25.033983Z 82 [Note] Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T07:14:27.442608Z 84 [Note] Aborted connection 84 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got an error reading communication packets) 2021-04-20T07:27:13.971644Z 83 [Note] Aborted connection 83 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 2021-04-20T07:41:02.916249Z 85 [Note] Aborted connection 85 to db: 'unconnected' user: 'root' host: '172.18.0.1' (Got timeout reading communication packets) 如何开始错误日志。只要在MySQL中的配置文件中配置意向log_error即可。

mysql root@127.0.0.1:(none)> show variables like '%log_error%'; +---------------------+--------------------------------+ | Variable_name | Value | +---------------------+--------------------------------+ | binlog_error_action | ABORT_SERVER | | log_error | /var/lib/mysql/mysql.error.log | | log_error_verbosity | 3 | +---------------------+--------------------------------+ 3 rows in set Time: 0.010s

全量日志文件

全量日志文件记录的是MySQL所有的SQL操作日志记录。例如增删改查等操作都会被记录下来。

mmysql root@127.0.0.1:(none)> show variables like '%general%'; Reconnecting... +------------------+---------------------------------+ | Variable_name | Value | +------------------+---------------------------------+ | general_log | OFF | | general_log_file | /var/lib/mysql/7fdc5f723ff9.log | +------------------+---------------------------------+ 配置项有三种值,table,none和file。配置file则会记录在日志文件中,配置none则不会记录,配置table则会在MySQL默认的MySQL数据中创建一张表(表名叫做general-log)来记录日志。

不推荐开启,记录的日志文件太多,不仅仅有性能消耗同时也占用太多无效空间。

# 日志记录文件格式 mysqld, Version: 5.7.28-log (MySQL Community Server (GPL)). started with: Tcp port: 3306 Unix socket: /var/run/mysqld/mysqld.sock Time Id Command Argument 2021-04-20T09:16:48.572888Z 88 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:48.574591Z 88 Connect Access denied for user 'root'@'172.18.0.1' (using password: NO) 2021-04-20T09:16:50.325379Z 89 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:50.329894Z 89 Query select connection_id() 2021-04-20T09:16:50.335222Z 89 Query SELECT @@VERSION 2021-04-20T09:16:50.339432Z 90 Connect root@172.18.0.1 on using TCP/IP 2021-04-20T09:16:50.339621Z 89 Query SELECT @@VERSION_COMMENT 2021-04-20T09:16:50.343525Z 90 Query select connection_id() 2021-04-20T09:16:50.347115Z 90 Query SHOW DATABASES 2021-04-20T09:16:50.380236Z 90 Query select TABLE_NAME, COLUMN_NAME from information_schema.columns where table_schema = 'None' order by table_name,ordinal_position 2021-04-20T09:16:50.391019Z 90 Query SELECT CONCAT("'", user, "'@'",host,"'") FROM mysql.user 2021-04-20T09:16:50.415062Z 90 Query SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE="FUNCTION" AND ROUTINE_SCHEMA = "None" 2021-04-20T09:16:50.432015Z 90 Query SELECT name from mysql.help_topic WHERE name like "SHOW %" 2021-04-20T09:16:52.572608Z 89 Query show variables like '%general%' 2021-04-20T09:17:13.532046Z 89 Query show variables like '%general%'

慢查询日志

慢查询日志是定位SQL语句查询快与慢而记录的一种日志文件。当某一条SQL语句查询时间超过一个固定的阈值,这条SQL语句将被定义为慢查询的SQL语句,被记录在慢查询日志文件中。

慢查询的配置主要有如下三个参数。

是否开启慢查询与慢查询日志文件。

mysql root@127.0.0.1:(none)> show variables like '%slow%'; +---------------------------+-------------------------------+ | Variable_name | Value | +---------------------------+-------------------------------+ | slow_query_log | ON | | slow_query_log_file | /var/lib/mysql/mysql.slow.log | +---------------------------+-------------------------------+ 5 rows in set Time: 0.014s 慢查询时间阈值。

mysql root@127.0.0.1:(none)> show variables like '%long_query_time%'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | long_query_time | 3.000000 | +-----------------+----------+ 1 row in set Time: 0.013

二进制日志文件

二进制日志(binary log)文件用于记录MySQL的DML语句,记录了操作之后的物理日志内容,不会记录MySQL中的select、show等语句。二进制日志文件主要的作用如下:

  1. 用户主从复制,主服务器将二进制文件中的物理日志发送给从服务器,从服务器在将日志写入到自身。

  2. 用于数据恢复。根据物理日志,找回数据丢失之前的操作日志。

可以通过如下几个参数进行配置:

mysql root@127.0.0.1:(none)> show variables like '%log_bin%'; Reconnecting... +---------------------------------+--------------------------------+ | Variable_name | Value | +---------------------------------+--------------------------------+ | log_bin | ON | | log_bin_basename | /var/lib/mysql/mysql-bin | | log_bin_index | /var/lib/mysql/mysql-bin.index | +---------------------------------+--------------------------------+ 6 rows in set Time: 0.015s
log_bin是否开启二进制日志文件,log_bin_basename存储的目录以及日志文件前缀,log_bin_index存储日志文件索引(日志文件名称)。如果日志文件没有指定文件名称,则默认使用本机名称。

日志文件列表。

-rw-r----- 1 mysql root 154 Apr 12 09:31 mysql-bin.000041 -rw-r----- 1 mysql root 154 Apr 12 19:45 mysql-bin.000042 -rw-r----- 1 mysql root 1459325 Apr 17 20:26 mysql-bin.000043 -rw-r----- 1 mysql mysql 24576 Apr 17 22:18 mysql-bin.000044 # cat mysql-bin.index ./mysql-bin.000001 ./mysql-bin.000002 ./mysql-bin.000003 ./mysql-bin.000004 ./mysql-bin.000005 ./mysql-bin.000006

审计日志

审计日志用来记录MySQL的网络活动,对MySQL的操作记录做统计、分析与报告等。属于对MySQL安全监控记录类的日志文件。

MySQL自身不包含该功能的,并且该功能在MySQL官网也是收费的。这里也不做具体的演示。

中继日志

中继日志是MySQL主从复制,在从服务器上的一个重要角色。当主服务器将二进制文件发送给从服务器时,从服务器不会立马执行,而是放在一个指定的一类日志文件中,从服务器在开启一个SQL线程去读取中继日志文件内容并写入到自身数据中。

PID文件

PID是一个MySQL实例的进程文件号。MySQL属于单进程服务,在启动一个MySQL实例,就会创建一个PID文件。

Socket文件

Socket也是MySQL通信的一种方式。MySQL通信有两种方式,TCP和Socket方式。TCP是走网络通信,可以将服务部署到任意可以访问的服务器上。Socket是走的文件通信方式,必须在同一台服务器上。

# TCP模式 mysql -hxxxx -pxxxx -uxxxx -Pxxx mysql -uxxxx -pxxxx -s /path/socket

数据库与表

数据库与表值的就是MySQL中的表结构文件、数据文件和索引文件。 InnoDB存储引擎的数据表结构

-rw-r----- 1 mysql root 13650 Apr 13 09:46 wechat_user.frm -rw-r----- 1 mysql mysql 98304 Apr 17 13:43 wechat_user.ibd MyISAM存储引擎的数据表结构

-rw-r----- 1 mysql mysql 0 Apr 20 17:53 users.MYD -rw-r----- 1 mysql mysql 1024 Apr 20 17:53 users.MYI -rw-r----- 1 root root 8586 Apr 20 17:53 users.frm

存储引擎文件

不同的存储引擎,实现起来也不同。InnoDB存储引擎分为redolog和undolog两种日志文件。

有关#yyds干货盘点#盘点MySQL中的那些日志文件的更多相关文章

  1. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  4. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  5. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  6. ruby-on-rails - Rails 3 中的多个路由文件 - 2

    Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题

  7. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  8. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  9. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  10. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

随机推荐