MySQL 错误日志

伍昱
2023-12-01

  • 错误日志(Error log):记录启动、运行或停止mysqld遇到的问题;
  • 通用查询日志(General query log):记录服务器接收到的每一个命令,包括客户端连接以及sql执行记录等
  • 二进制日志(Binary log):记录引起或可能引起数据更改的SQL,用于数据还原以及主从复制;
  • 中继日志(Relay log):从复制源服务器收到的数据更改日志;
  • 慢查询日志(Slow query log):执行时间超过long_query_time和没有使用索引的sql,用来发现并调优一些慢sql;
  • DDL日志(DDL log (metadata log)):DDL语句执行的元数据操作。

  错误日志包含mysqld启动和关闭时间的记录,它还包含诊断消息,例如错误,警告和注释,它们在服务器启动和关闭期间以及服务器运行期间发生。例如,如果mysqld注意到需要自动检查或修复表,它将向错误日志中写入一条消息。

  在某些操作系统上,如果mysqld异常退出,则错误日志包含堆栈跟踪,该跟踪可用于确定mysqld退出的位置。

  如果用于启动mysqld,则mysqld_safe可能会将消息写入错误日志,例如,当mysqld_safe注意到异常的mysqld退出时,它将重新启动mysqld并将mysqld restarted消息写入错误日志。

1. 错误日志组件配置

  错误日志子系统由执行日志事件过滤和写入的组件以及配置要启用哪些组件以实现所需的日志记录结果的系统变量组成,基于组件的错误日志记录提供以下功能:

  • 日志事件可以由过滤器组件过滤,以影响可用于写入的信息。

  • 日志事件由接收器(写入器)组件输出,可以启用多个接收器组件,错误日志写入多个目标。

  • 内置的过滤器和编写器组件结合起来可以实现默认的错误日志格式。

  • 可加载的编写器允许以JSON格式记录。

  • 可加载的编写器允许登录到系统日志。

  • 系统变量控制要启用的日志组件以及每个组件的运行方式。

  log_error_services控制哪个日志组件启用错误日志,该变量可以包含具有0、1或多组件列表;在后一种情况下,组件可以用分号或(从MySQL 8.0.12开始)逗号分隔,另外服务器按照列出的顺序执行组件。
默认情况下,log_error_services 具有以下值:

mysql> SELECT @@GLOBAL.log_error_services;
+----------------------------------------+
| @@GLOBAL.log_error_services            |
+----------------------------------------+
| log_filter_internal; log_sink_internal |
+----------------------------------------+
1 row in set (0.00 sec)

  该值表明日志事件首先通过内置过滤器组件 log_filter_internal,再通过内置日志写入器组件 log_sink_internal,格式化成特定的格式并写入到相关输出目标,如文件或系统日志;要使用系统日志编写器(log_sink_syseventlog)而不是默认编写器(log_sink_internal):

mysql> INSTALL COMPONENT 'file://component_log_sink_syseventlog';
Query OK, 0 rows affected (0.07 sec)

mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_syseventlog';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@GLOBAL.log_error_services;
+--------------------------------------------------------------+
| @@GLOBAL.log_error_services                                  |
+--------------------------------------------------------------+
| log_filter_internal; log_sink_internal; log_sink_syseventlog |
+--------------------------------------------------------------+
1 row in set (0.00 sec)

  恢复使用默认编写器并卸载系统日志编写器,请执行以下语句:

mysql> SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
Query OK, 0 rows affected (0.00 sec)

mysql> UNINSTALL COMPONENT 'file://component_log_sink_syseventlog';
Query OK, 0 rows affected (0.07 sec)

  JSON日志写入器配置:

mysql> INSTALL COMPONENT 'file://component_log_sink_json';
Query OK, 0 rows affected (0.05 sec)

mysql> SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
Query OK, 0 rows affected (0.00 sec)

mysql>  SELECT @@GLOBAL.log_error_services;
+-------------------------------------------------------+
| @@GLOBAL.log_error_services                           |
+-------------------------------------------------------+
| log_filter_internal; log_sink_internal; log_sink_json |
+-------------------------------------------------------+
1 row in set (0.00 sec)

  或者直接my.cnf里配置:

[mysqld]
log_error_services='log_filter_internal; log_sink_internal; log_sink_json'

2. 默认错误日志路径配置

2.1 Windows上的默认错误日志路径

  在Windows上,mysqld通过 --log-error、 --pid-file、 --console确定默认的错误日志路径:

  • 如果配置了 --console,则默认输出路径就是console,如果同时配置了 --log-error, --console优先于 --log-error。

  • 如果 --log-error未指定,或者未指定文件名,则默认目标是数据目录中的host_name.err,除非 --pid-file指定了该选项,在这种情况下,文件名是PID文件的基本名称,以.err为后缀。

  • 如果配置了 --log-error,文件默认在data目录下,除非使用了绝对路径进行指定。

  • 如果默认错误日志路径是console,则服务器将log_error系统变量设置为stderr;否则,默认目标是文件,服务器将设置log_error为文件名。

2.2 Unix和类似Unix的系统上的默认错误日志路径

  在Unix和类Unix系统上,mysqld使用该–log-error选项来确定默认错误日志目标是控制台还是文件,如果是文件,则使用文件名:

  • 如果 --log-error未给出,则默认输为console。

  • 如果 --log-error给出时未命名文件,则默认目标是host_name.err在数据目录中命名的文件。

  • 如果指定了 --log-error,则默认路径是data目录,除非给出绝对路径名以指定其他位置。

  • 如果在[mysqld], [server]或 [mysqld_safe]部分配置了 --log-error,mysqld_safe会查找并使用log-error选项,并将其传递到mysqld。

2.3 默认错误日志路径如何影响日志编写器

  服务器解释错误日志路径配置选项后,将设置log_error系统变量定义默认错误日志路径,日志编写器组件可以基于log_error,也可以独立于log_error。

   如果log_error为stderr,则默认错误日志路径是console,并且将其输出目标基于默认目标的日志编写器也将写入控制台:

  • log_sink_internal, log_sink_json, log_sink_test:默认写入到控制台,即使对于log_sink_json可以多次启用编写器也是如此,所有实例都写入控制台。

  • log_sink_syseventlog:无论log_error值如何,编写器都将写入系统日志 。

  如果log_error不是stderr,则默认错误日志目标是文件,log_error指定文件名。

3. 错误日志过滤的类型

  错误日志配置通常包括一个日志过滤器组件和一个或多个日志编写器组件,对于错误日志过滤,MySQL提供了以下组件选择:

  log_filter_internal:此过滤器组件与系统变量log_error_verbosity和 log_error_suppression_list结合,基于日志事件优先级和错误代码提供错误日志过滤,log_filter_internal内置并默认启用。

  log_filter_dragnet:此过滤器组件根据用户提供的规则结合dragnet.log_error_filter_rules系统变量提供错误日志过滤。

4. 错误日志消息格式

  每个错误日志写入组件都有一种特征输出格式,用于将消息写入目标文件,另外,如果在执行写入程序组件之前执行的日志过滤器组件删除了日志事件属性,则该属性不可用于写入,系统变量也可能会影响日志编写器。

  对于所有日志编写器,错误日志消息中包含的ID是mysqld中负责编写消息的线程ID,该ID表明服务器的哪个部分产生了该消息,并且与常规查询日志和慢查询日志消息一致,其中包括连接线程ID。

  • log_sink_internal的输出格式:

   内部日志记录器生成传统的错误日志输出,它使用以下格式编写消息:

timestamp thread_id [priority] [err_code] [subsystem] message

--例子
2020-07-27T06:50:36.677508Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2020-07-27T06:50:36.899839Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/usr/local/mysql8/mysqlx.sock' bind-address: '::' port: 33060
2020-07-27T06:50:36.979458Z 0 [System] [MY-010229] [Server] Starting XA crash recovery...
2020-07-27T06:50:36.986574Z 0 [System] [MY-010232] [Server] XA crash recovery finished.
2020-07-27T06:50:37.223089Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2020-07-27T06:50:37.286289Z 6 [ERROR] [MY-011268] [Server] Configuring persisted options failed: "Variable 'log_error_services' can't be set to the value of 'log_filter_internal; log_sink_internal; log_sink_json'".
  • log_sink_json的输出格式:

  JSON格式的日志编写器将消息生成为包含键值对的JSON对象,例如:

{
  "prio": 3,
  "err_code": 10051,
  "source_line": 533,
  "source_file": "event_scheduler.cc",
  "function": "run",
  "msg": "Event Scheduler: scheduler thread started with id 5",
  "time": "2020-03-19T12:30:20.297184Z",
  "ts": 1584621317167, --时间戳
  "thread": 5,
  "err_symbol": "ER_SCHEDULER_STARTED",
  "SQL_state": "HY000",
  "subsystem": "Server",
  "buffered": 1584621020297184,
  "label": "Note"
}
  • log_sink_syseventlog的输出格式:

  系统日志编写器产生的输出符合本地平台上使用的系统日志格式。

5. 错误日志文件刷新和重命名

  如果使用FLUSH ERROR LOGS,FLUSH LOGS或mysqladmin flush-logs刷新错误日志,则服务器将关闭并重新打开其正在写入的任何错误日志文件。要重命名错误日志文件,请在刷新前手动进行重命名,刷新日志,然后使用原始文件名打开一个新文件。例如,假设日志文件名为 host_name.err,重命名该文件并创建一个新文件,使用以下命令:

mv host_name.err host_name.err-old
mysqladmin flush-logs
mv host_name.err-old backup-directory

2020年07月27日

  以前上课怕被点名答题,现在开会怕被点名谈感想,然后墨菲定律发生了…

 类似资料: