MySQL8.0错误日志Error log介绍

2023年 8月 15日 42.9k 0

理论知识

错误日志内容

错误日志包含 mysqld 启动和关闭的时间信息,还包含诊断消息,如服务器启动和关闭期间以及服务器运行时出现的错误、警告和其他需要注意的信息。

例如:如果 mysqld 检测到某个表需要检查或修复,会写入错误日志。

根据错误日志配置,错误消息还可能填充 performance_schema.error_log 表,以便为日志提供SQL接口,使错误日志能够查询。

如果用 mysqld_safe 启动 mysqld,mysqld_safe 会将消息写入错误日志。

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

错误日志组件架构

在 MySQL 8.0 中,错误日志使用 MySQL 组件(component) 架构。

错误日志系统由执行日志事件过滤和写出组件以及系统变量组成,该系统变量配置启用哪些组件来实现所需的日志记录。

基于组件的错误日志记录提供了以下功能:

  • 过滤器组件可以过滤日志事件,以影响写入的信息。
  • 日志事件由sink(写出)组件输出。可以启用多个写出组件,以将错误日志输出到多个目标。
  • 内置的过滤和写出组件结合起来实现默认的错误日志格式。
  • 支持JSON格式的日志记录。
  • 支持记录到操作系统日志。

log_error_services系统变量控制为错误记录启用哪些日志组件。

多个组件用逗号或分号分隔,日志系统按照此顺序依次执行。组件分过滤filter和写出sink两类。filter类组件过滤错误日志信息,sink类组件将错误日志写到不同的位置。

filter类组件

过滤器组件 过滤依据 相关系统变量
log_filter_internal 错误事件的优先级及错误代码 log_error_verbosity
log_error_suppression_list
log_filter_dragnet 用户定义的规则 dragnet.log_error_filter_rules

sink类组件

系统变量log_error指定错误日志的缺省目的地,日志组件根据该系统变量决定自己的日志输出目的地。

sink类日志组件 log_error值 目的地
log_sink_internal(缺省) file_name file_name
log_sink_internal stderr 控制台
log_sink_json stderr 控制台
log_sink_json file_name file_name.00.json
file_name.01.json
log_sink_test stderr 控制台
log_sink_test file_name file_name
log_sink_syseventlog stderr 系统日志
log_sink_syseventlog file_name 系统日志

2. 运维操作

查询当前的错误日志配置(示例为缺省值)

mysql> SELECT @@GLOBAL.log_error_services;+----------------------------------------+| @@GLOBAL.log_error_services         |+----------------------------------------+| log_filter_internal; log_sink_internal |+----------------------------------------+

查询已安装的组件

mysql> select * from mysql.component;+--------------+--------------------+----------------------------------------+| component_id | component_group_id | component_urn             |+--------------+--------------------+----------------------------------------+|       1     |          1         | file://component_log_sink_syseventlog  |+--------------+--------------------+----------------------------------------+1 row in set (0.00 sec)

配置错误日志写出json格式

安装sink组件log_sink_json,修改log_error_services参数增加log_sink_json写出组件。

INSTALL COMPONENT 'file://component_log_sink_json';SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';

配置log_sink_internal组件

目标:配置log_sink_internal组件只记录ERROR类信息。

方法:修改启动参数文件,调整log_error_verbosity参数。

[mysqld]log_error_verbosity=1   

目标:配置 log_sink_internal 记录 ERROR, WARNING, INFORMATION 类错误,将 WARNING, INFORMATION 中错误号 MY-010001,MY-10002 过滤掉。

方法:修改启动参数文件,调整 log_error_verbosity 和 log_error_suppression_list 参数

[mysqld]log_error_verbosity=3   log_error_suppression_list='MY-010001,10002'

配置使用log_filter_dragnet过滤器

目标:配置过滤器,按照用户定义的规则过滤错误日志信息。

方法:使用 log_filter_dragnet,配置变量 dragnet.log_error_filter_rules 添加过滤规则。

INSTALL COMPONENT 'file://component_log_filter_dragnet';SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';SET GLOBAL dragnet.log_error_filter_rules = ' IF prio>=INFORMATION THEN drop. IF prio>=WARNING THEN throttle 1/60. IF EXISTS source_line THEN unset source_line.';

配置错误日志写入Linux系统日志

目标:将MySQL的错误日志写入Linux系统日志。

方法:使用 log_sink_syseventlog 组件,将错误日志写入 Linux 系统日志。

INSTALL COMPONENT 'file://component_log_sink_syseventlog';SET PERSIST log_error_services = 'log_filter_internal; log_sink_syseventlog';

刷新错误日志

目标:保留原错误日志,让MySQL开始一个新的错误日志。

方法:使用FLUSH ERROR LOGSFLUSH LOGSmysqladmin flush-logs 都可以关闭错误日志,然后重新创建错误日志,在此之前应该手工将错误日志改名或备份。

#备份日志文件mv /greatCluster/logs/error19000.log /greatCluster/logs/error19000.log.`date +%Y%m%d`#刷新error logmysqladmin flush-logs或mysql>flush error logs;

将InnoDB状态信息写入错误日志

目标:配置将InnoDB的状态信息写入错误日志。

方法:开启系统变量 innodb_status_output 和 innodb_status_output_locks,系统每隔约 15 秒将InnoDB的监控信息写入到错误日志中。

#开启SET GLOBAL innodb_status_output=ON;SET GLOBAL innodb_status_output_locks=ON;#关闭SET GLOBAL innodb_status_output=OFF;SET GLOBAL innodb_status_output_locks=OFF;

Enjoy GreatSQL 🙂

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论