MySQL 8.0 重新定义了错误日志输出和过滤,改善了原来臃肿并且可读性很差的错误日志。
比如增加了 JSON 输出,在原来的日志后面以序号以及 JSON 后缀的方式展示
比如我机器上的 MySQL 以 JSON 保存的错误日志 mysqld.log.00.json:
以 JSON 输出错误日志后可读性和可 *** 作性增强了许多。这里可以用 Linux 命令 jq 或者把这个字串 COPY 到其他解析 JSON 的工具方便处理。
只想非常快速的拿出错误信息,忽略其他信息。
使用 JSON 输出的前提是安装 JSON 输出部件。
格式为:过滤规则;日志输出;[过滤规则]日志输出;
查看安装好的部件
现在设置 JSON 输出,输出到系统日志的同时输出到 JSON 格式日志。
来测试一把。我之前已经把表 a 物理文件删掉了。
现在错误日志里有 5 条记录。
JSON 日志里也有 5 条记录。
那可能有人就问了,这有啥意义呢?只是把格式变了,过滤的规则我看还是没变。
那我们现在给第二条日志输出加过滤规则
先把过滤日志的部件安装起来
只保留 error,其余的一律过滤掉。
检索一张误删的表
查看错误日志和 JSON 错误日志
发现错误日志里有一条 Warning,JSON 错误日志里的被过滤掉了。
再举个例子,每 60 秒只允许记录一个 Warning 事件
多次执行
现在错误日志里有三条 warning 信息
mysqld.log.00.json 只有一条
总结,我这里简单介绍了下 MySQL 8.0 的错误日志过滤以及 JSON 输出。MySQL 8.0 的 component_log_filter_dragnet 部件过滤规则非常灵活,可以参考手册,根据它提供的语法写出自己的过滤掉的日志输出。
日志是MySQL的重要组成部分,其中对于开发而言不得不关注三种重要的日志,分别是二进制日志(bin log)、事务日志(redo log、undo log)。接下来详细介绍这三种日志。
binlog叫做二进制日志,主要是用于记录MySQL表的逻辑变化过程。在实际应用过程中,通常被用于主从复制和数据恢复。
事务执行过程中,会先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。
事务提交后的写入只是写入到文件系统的page cache,并没有把数据持久化到磁盘。持久化磁盘由 *** 作系统决定调用fsync。
MySQL提供了配置决定fsync的时机,当sync_binlog=0的时候,每次提交事务只写入page cache,不执行fsync。当sync_binlog=1的时候,表示每次提交事务都会执行fsync。当sync_binlog = N的时候,每次提交事务都写入page cache,累计多个事务才进行fsync。
显然,当sync_binlog = 1的时候,binlog日志不会丢失。当sync_binlog = N的时候,如果发生异常重启,会丢失N个事务的binlog日志。
STATEMENT
记录数据 *** 作的原始SQL,可能引发主库备库因索引选择不一致,导致数据执行结果不一致。
ROW
ROW基于行复制,只记录哪条数据被修改.缺点:占空间。比如DELETE 语句,对于STATEMENT只占用1条SQL。而ROW格式则需要把所有记录的数据记录下来。
MIXED
对于可能引发主备不一致的命令使用ROW格式,否则使用STATEMTNT
对于每一次更新 *** 作,MySQL都需要写入磁盘,然后需要找到对应那条记录并更新。IO成本较高和查找成本都很高。为了提高性能,MySQL会将更新 *** 作写入redo log,并更新内存。INNODB引擎会在适当的时候将 *** 作记录更新到磁盘。
[图片上传失败...(image-c6a1f2-1627716309698)]
undo log主要是记录了数据的逻辑变化,比如对应一条insear语句,undo log会记录一条delete语方便回退到更新前的值。
时刻A发生故障的话,由于binlog未写入,redo log回滚数据,两个日志数据是一致的。
时刻B发生故障,则需要判断binlog是否完整来决定如何恢复。
redo log和bin log的区别?
为什么redo log crash-safe,而bin log不可以?
错误日志包含mysqld启动和关闭的时间信息,还包含诊断消息,如服务器启动和关闭期间以及服务器运行时出现的错误、警告和其他需要注意的信息。例如:如果mysqld检测到某个表需要检查或修复,会写入错误日志。
根据错误日志配置,错误消息还可能填充performance_schema.error_log表,以便为日志提供SQL接口,使错误日志能够查询。
如果用mysqld_safe启动mysqld,mysqld_safe会将消息写入错误日志。例如,当mysqld_safe注意到mysqld异常退出时,它会重新启动mysqld,并将mysqld重新启动的消息写入错误日志。
在MySQL 8.0中,错误日志使用MySQL组件(component) 架构。错误日志系统由执行日志事件过滤和写出组件以及系统变量组成,该系统变量配置启用哪些组件来实现所需的日志记录。
基于组件的错误日志记录提供了以下功能:
log_error_services系统变量控制为错误记录启用哪些日志组件。多个组件用逗号或分号分隔,日志系统按照此顺序依次执行。组件分过滤filter和写出sink两类。filter类组件过滤错误日志信息,sink类组件将错误日志写到不同的位置。
过滤器组件 过滤依据 相关系统变量 log_filter_internal 错误事件的优先级及错误代码 log_error_verbosity
log_error_suppression_listlog_filter_dragnet 用户定义的规则 dragnet.log_error_filter_rules
系统变量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.jsonlog_sink_test stderr 控制台log_sink_test file_name file_name log_sink_syseventlog stderr 系统日志log_sink_syseventlog file_name 系统日志
安装sink组件log_sink_json,修改log_error_services参数增加log_sink_json写出组件。
目标:配置log_sink_internal组件只记录ERROR类信息。
方法:修改启动参数文件,调整log_error_verbosity参数。
目标:配置log_sink_internal记录ERROR, WARNING, INFORMATION类错误,将 WARNING, INFORMATION中错误号MY-010001,MY-10002过滤掉。
方法:修改启动参数文件,调整log_error_verbosity和log_error_suppression_list参数
目标:配置过滤器,按照用户定义的规则过滤错误日志信息。
方法:使用log_filter_dragnet,配置变量dragnet.log_error_filter_rules添加过滤规则。
目标:将MySQL的错误日志写入Linux系统日志。
方法:使用log_sink_syseventlog组件,将错误日志写入Linux系统日志。
目标:保留原错误日志,让MySQL开始一个新的错误日志。
方法:使用FLUSH ERROR LOGS 或 FLUSH LOGS 或 mysqladmin flush-logs都可以关闭错误日志,然后重新创建错误日志,在此之前应该手工将错误日志改名或备份。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)