Pwner's Blog

能全力以赴不尽力而为

0%

MySQL 基础 - 6 - 日志

错误日志

内容

  1. 服务器启动和关闭过程中的信息

    未必是错误信息,比如 MySQL 是如何去初始化存储引擎的过程

  2. 服务器运行过程中的错误信息

    比如 sock 文件找不到,无法加载 MySQL 数据库的数据文件,忘记初始化 MySQL 或 data dir 路径找不到,或权限不正确等

  3. 事件调度器运行一个事件时产生的信息

    MySQL 调度启动一个计划任务的时候也会将相关信息记录

  4. 在从服务器上启动从服务器进程时产生的信息

    在复制环境下,从服务器进程的信息也会被记录

使用

查看配置

1
show variables like 'log_error';

修改配置

是否开启错误日志

1
log_error = ON|OFF

设置错误日志路径

1
log_error = 日志路径

是否记录 warnings 信息

各版本不同,MySQL5。7.2 开始,首选 log_error_verbosity 系统变量,而不是使用 --log-warnings 选项或 log_warnings 系统变量,log_warning 参数在 MySQL8.0.3 开始被移除。

log_warnings 含义
0 不记录告警信息
1 告警信息写入错误日志
>1 各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志
  • MySQL 5.6-log_warnings
Property Value
Command-Line Format –log-warnings[=#]
System Variable log_warnings
Scope (>= 5.6.4) Global
Scope (<= 5.6.3) Global, Session
Dynamic Yes
Type (64-bit platforms) integer
Type (32-bit platforms) integer
Default Value (64-bit platforms) 1
Default Value (32-bit platforms) 1
Minimum Value (64-bit platforms) 0
Minimum Value (32-bit platforms) 0
Maximum Value (64-bit platforms) 18446744073709551615
Maximum Value (32-bit platforms) 4294967295
  • MySQL 5.7-log_warnings
Property Value
Command-Line Format –log-warnings[=#]
Deprecated 5.7.2
System Variable log_warnings
Scope Global
Dynamic Yes
Type (64-bit platforms) integer
Type (32-bit platforms) integer
Default Value (64-bit platforms, >= 5.7.2) 2
Default Value (64-bit platforms, <= 5.7.1) 1
Default Value (32-bit platforms, >= 5.7.2) 2
Default Value (32-bit platforms, <= 5.7.1) 1
Minimum Value (64-bit platforms) 0
Minimum Value (32-bit platforms) 0
Maximum Value (64-bit platforms) 18446744073709551615
Maximum Value (32-bit platforms) 4294967295
  • MySQL 8.0-log_error_verbosity
Property Value
Command-Line Format –log-error-verbosity=#
System Variable log_error_verbosity
Scope Global
Dynamic Yes
SET_VAR Hint Applies No
Type integer
Default Value (>= 8.0.4) 2
Default Value (<= 8.0.3) 3
Minimum Value 1
Maximum Value 3

查看错误日志内容

进入错误日志存储路径

执行以下命令显示最近 10 条错误日志,

1
tail mysqld.log

执行以下命令显示最近的 n 条错误日志,

1
tail -{n} mysqld.log

如果需要即时刷新错误日志,详见【关于 tail 命令:原文链接

1
2
3
4
5
6
7
8
9
10
2021-01-26T11:43:05.963492Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-01-26T11:43:06.131013Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/lib/mysql/mysqlx.sock
2021-01-26T11:43:06.445555Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2021-01-26T11:43:06.445840Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2021-01-26T11:43:06.475187Z 0 [System] [MY-010931] [Server] /usr/libexec/mysqld: ready for connections. Version: '8.0.21' socket: '/var/lib/mysql/mysql.sock' port: 3306 Source distribution.
2021-01-26T11:43:11.680363Z 0 [System] [MY-013169] [Server] /usr/libexec/mysqld (mysqld 8.0.21) initializing of server in progress as process 71280
2021-01-26T11:43:11.681764Z 0 [ERROR] [MY-010457] [Server] --initialize specified but the data directory has files in it. Aborting.
2021-01-26T11:43:11.681797Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove all files that the server added to it.
2021-01-26T11:43:11.681862Z 0 [ERROR] [MY-010119] [Server] Aborting
2021-01-26T11:43:11.681956Z 0 [System] [MY-010910] [Server] /usr/libexec/mysqld: Shutdown complete (mysqld 8.0.21) Source distribution.

删除日志

⚠️此为敏感操作,请在三确认后再执行!

⚡在 MySQL 5.5.7 之前

数据库管理员可以删除很长时间之前的错误日志,以保证 MySQL 服务器上的硬盘空间。使用 mysqladmin 命令开启新的错误日志。mysqladmin 命令的语法如下:

1
mysqladmin –u root –pflush-logs

也可以执行以下命令开启新的日志

1
flush logs

以上命令会对全局的日志进行操作,请注意!

⚡在 MySQL 5.5.7 之后

服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志,创建新的日志:

1
mv xxx.err  xxx.err.old   #重命名原来的日志,进行备份
1
mysqladmin flush-logs     #开启新的日志

一般查询日志

内容

查询日志不仅仅记录 select 语句,也会记录其他的语句的执行。

例如:

  • 执行 delete 语句的时候也需要查询和选择符合条件的数据

  • 执行 update 也需要筛选某一块数据

  • 执行 insert 的时候为了避免数据冲突,需要验证待插入的数据是否存在主键重复的情况

因此会产生大量的查询日志,高并发情况下开启查询日志会导致 IO 较大,从而影响 MySQL 性能。非调试环境下一般不建议开启查询日志。查询日志有助于分析出密集执行的 select 语句,考虑是否对密集型的 select 语句开启缓存,在考虑开启查询日志的 IO 开销下,合理利用查询日志。

使用

查看是否开启查询日志(默认关闭查询日志)

1
show variables like '%general_log%';

开启 / 关闭日志

1
set GLOBAL general_log='ON';
1
set GLOBAL general_log='OFF';

二进制日志

中继日志

慢查询日志

DDL 日志

重做日志

回滚日志

如果文章对你有用,可以请我喝杯咖啡~
  • 本文作者: Pwner
  • 本文链接: https://pwner.cn/posts/e8f8d45.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!