聊聊数据库~6.SQL运维中篇

PS:版本查询select version();

1.MySQL常用日志

服务器层日志(存储引擎层有自己的日志)

日志类型 描述
error_log(错误日志)   记录MySQL启动、运行或停止时出现的问题  
general_log(常规日志)   记录所有发送给MySQL的请求(耗性能)  
slow_query_log(慢查日志)   记录符合条件的查询(eg:超过10s、没有使用索引等)  
binary_log(二进制日志)   记录全部有效的数据修改日志(老版本数据库不会开启)  
relay_log(中继日志)   用于主从复制,临时存储主从同步的二进制日志(增量复制)  

知识扩展:https://blog.csdn.net/zhang123456456/article/details/72811875

实时查看文件:tail -f /var/log/mysqld.log

tail -f 用于监视文件增长(默认是末尾10行)

2.error_log(错误日志)

一般记录MySQL运行错误和和未授权的访问

老版:log_error + log_warnings

常用:log_error + log_error_verbosity

新版:log_error + log_error_verbosity + log_error_services

查询MySQL配置:show variables like '%log_error%';

SQL查询可以这么干:

-- Ubuntu下默认是:`/var/log/mysql/error.log` -- CentOS下默认是:`/var/log/mysqld.log` | `/var/log/mariadb/mariadb.log` select @@log_error; -- 尽可能和Data分开存储 -- 0:不记录警告信息,1:告警信息写入错误日志,2:各类告警信息都写入(eg:网络故障和重连信息) select @@log_warnings; -- MySQL8中已经移除(MySQL5.7默认是2,MariaDB5.5.60默认是1) -- 错误级别(1:Error,2:Error、Warning,3:Error、Warning、Info select @@log_error_verbosity; -- MySQL8默认是2,MySQL5.7默认是3 -- PS:从MySQL 5.7.2开始,首选`log_error_verbosity`系统变量 -- 默认是`log_filter_internal; log_sink_internal` select @@log_error_services; -- MySQL8.0中新增

PS:其实MySQL在市面上有很多成熟解决方案(基本上都是基于5.6、5.7的)

这也是为什么我开篇主推MySQL5.7系列和MariaDB5.5.60(很多时候不是不用最新DB,而是架构依赖做不到啊)

知识拓展:https://www.cnblogs.com/kerrycode/p/8973285.html

MySQL8.0新增参数:log_error_services

日志服务组件

日志服务组件名 描述
log_sink_internal   默认的日志输出组件(依赖log_error)  
log_filter_internal   默认的日志过滤组件(依赖log_error_verbosity)  
log_sink_json   将错误日志输出到json文件  
log_sink_syseventlog   将错误日志输出到系统日志文件  

PS:log_filter_internal:过滤错误信息(达不到级别的不记录

日记格式一般是这样的:UTC时间戳 进程id [日志级别] [错误代码] [由什么产生的日志(Server or Client)] 详细信息

eg:2019-05-19T09:54:11.590474Z 8 [Warning] [MY-010055] [Server] IP address '192.168.36.144' could not be resolved: Name or service not known

一般log_sink_json用的比较多

官方文档参考:https://dev.mysql.com/doc/refman/8.0/en/error-log-json.html

PS:第一次使用需要安装一下json组件:install component 'file://component_log_sink_json';

常用设置:set persist log_error_services='log_filter_internal;log_sink_json';

时间戳相关的小知识点

上面的时间默认是UTC的时间戳,和我们是有时差的,这个时间戳可以通过设置log_timestamps来本地化:

-- 查询 select @@log_timestamps; -- MySQL5.7新增 -- 从8开始,可通过SET PERSIST命令将全局变量的修改持久化到配置文件中 set persist log_timestamps='SYSTEM'; -- 需要root权限

PS:set persist生成的配置文件路径在:/var/lib/mysql/mysqld-auto.cnf

3.general_log(常规日志)

以前开发调试的时候基本上都是会开启的,上线后关闭(系统V1初期的时候也会开启一段时间)

现在开发可以使用go-sniffer来抓包查看客户端执行的SQL

-- 是否打开常规日志(0不打开,1打开) -- 一般不打开(性能) select @@general_log; -- 默认为0 -- Ubuntu默认:/var/lib/mysql/ubuntuserver.log -- CentOS默认:/var/lib/mysql/localhost.log select @@general_log_file; -- 常规日志的路径 -- 日志的存储方式(FILE | TABLE | NONE) select @@log_output; -- 默认是文件存储

简单看一下常规日志在数据库中的结构:

2.常规日志.png

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxwsz.html