一、数据库服务日志概述介绍

任何一种数据库中,都会有各种各样的日志,记录这数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件;

主要是针对数据库server层产生的数据信息,主要用于记录和数据库服务运行本身有关的日志、以及SQL语句操作执行相关的日志;

二、数据库服务日志常用分类

在MySQL数据库服务中,有4种不同的日志是最常用的日志类型,这些日志记录这数据库在不同方面的踪迹;

日志信息查看方法:

mysql> show variables like '%log%';
+------------------------------------------------+-----------------------------------------+
| Variable_name                                  | Value                                   |
+------------------------------------------------+-----------------------------------------+
| activate_all_roles_on_login                    | OFF                                     |
| back_log                                       | 151                                     |
| binlog_cache_size                              | 32768                                   |
| binlog_checksum                                | CRC32                                   |
| binlog_direct_non_transactional_updates        | OFF                                     |
| binlog_encryption                              | OFF                                     |
| binlog_error_action                            | ABORT_SERVER                            |
| binlog_expire_logs_seconds                     | 2592000                                 |
| binlog_format                                  | ROW                                     |
| binlog_group_commit_sync_delay                 | 0                                       |
| binlog_group_commit_sync_no_delay_count        | 0                                       |
| binlog_gtid_simple_recovery                    | ON                                      |
| binlog_max_flush_queue_time                    | 0                                       |
| binlog_order_commits                           | ON                                      |
| binlog_rotate_encryption_master_key_at_startup | OFF                                     |
| binlog_row_event_max_size                      | 8192                                    |
| binlog_row_image                               | FULL                                    |
| binlog_row_metadata                            | MINIMAL                                 |
| binlog_row_value_options                       |                                         |
| binlog_rows_query_log_events                   | OFF                                     |
| binlog_stmt_cache_size                         | 32768                                   |
| binlog_transaction_compression                 | OFF                                     |
| binlog_transaction_compression_level_zstd      | 3                                       |
| binlog_transaction_dependency_history_size     | 25000                                   |
| binlog_transaction_dependency_tracking         | COMMIT_ORDER                            |
| expire_logs_days                               | 0                                       |
| general_log                                    | OFF                                     |
| general_log_file                               | /data/3306/data/db01-51.log             |
| innodb_api_enable_binlog                       | OFF                                     |
| innodb_flush_log_at_timeout                    | 1                                       |
| innodb_flush_log_at_trx_commit                 | 1                                       |
| innodb_log_buffer_size                         | 16777216                                |
| innodb_log_checksums                           | ON                                      |
| innodb_log_compressed_pages                    | ON                                      |
| innodb_log_file_size                           | 50331648                                |
| innodb_log_files_in_group                      | 2                                       |
| innodb_log_group_home_dir                      | ./                                      |
| innodb_log_spin_cpu_abs_lwm                    | 80                                      |
| innodb_log_spin_cpu_pct_hwm                    | 50                                      |
| innodb_log_wait_for_flush_spin_hwm             | 400                                     |
| innodb_log_write_ahead_size                    | 8192                                    |
| innodb_log_writer_threads                      | ON                                      |
| innodb_max_undo_log_size                       | 1073741824                              |
| innodb_online_alter_log_max_size               | 134217728                               |
| innodb_print_ddl_logs                          | OFF                                     |
| innodb_redo_log_archive_dirs                   |                                         |
| innodb_redo_log_encrypt                        | OFF                                     |
| innodb_undo_log_encrypt                        | OFF                                     |
| innodb_undo_log_truncate                       | ON                                      |
| log_bin                                        | ON                                      |
| log_bin_basename                               | /data/3306/data/binlog                  |
| log_bin_index                                  | /data/3306/data/binlog.index            |
| log_bin_trust_function_creators                | OFF                                     |
| log_bin_use_v1_row_events                      | OFF                                     |
| log_error                                      | stderr                                  |
| log_error_services                             | log_filter_internal; log_sink_internal  |
| log_error_suppression_list                     |                                         |
| log_error_verbosity                            | 2                                       |
| log_output                                     | FILE                                    |
| log_queries_not_using_indexes                  | OFF                                     |
| log_raw                                        | OFF                                     |
| log_replica_updates                            | ON                                      |
| log_slave_updates                              | ON                                      |
| log_slow_admin_statements                      | OFF                                     |
| log_slow_extra                                 | OFF                                     |
| log_slow_replica_statements                    | OFF                                     |
| log_slow_slave_statements                      | OFF                                     |
| log_statements_unsafe_for_binlog               | ON                                      |
| log_throttle_queries_not_using_indexes         | 0                                       |
| log_timestamps                                 | UTC                                     |
| max_binlog_cache_size                          | 18446744073709547520                    |
| max_binlog_size                                | 1073741824                              |
| max_binlog_stmt_cache_size                     | 18446744073709547520                    |
| max_relay_log_size                             | 0                                       |
| relay_log                                      | db01-51-relay-bin                       |
| relay_log_basename                             | /data/3306/data/db01-51-relay-bin       |
| relay_log_index                                | /data/3306/data/db01-51-relay-bin.index |
| relay_log_info_file                            | relay-log.info                          |
| relay_log_info_repository                      | TABLE                                   |
| relay_log_purge                                | ON                                      |
| relay_log_recovery                             | OFF                                     |
| relay_log_space_limit                          | 0                                       |
| slow_query_log                                 | OFF                                     |
| slow_query_log_file                            | /data/3306/data/db01-51-slow.log        |
| sql_log_bin                                    | ON                                      |
| sql_log_off                                    | OFF                                     |
| sync_binlog                                    | 1                                       |
| sync_relay_log                                 | 10000                                   |
| sync_relay_log_info                            | 10000                                   |
| terminology_use_previous                       | NONE                                    |
+------------------------------------------------+-----------------------------------------+
90 rows in set (0.01 sec)

常用日志信息介绍:

序号 日志名称 解释说明
01 general_log 表示查询日志(通用日志),默认日志状态处于关闭,可以进行在线调整配置
作用:记录了客户端从会话连接开始,执行过的所有SQL语句信息;
02 log_error 表示错误日志(运行日志),默认日志状态处于激活
作用:记录了数据库服务启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息;
03 log_bin 表示二进制日志(binlog日志),默认日志状态处于激活(8.0之后)
作用:记录了所有的DDL语句和DML语句,但是不包括数据库查询语句;语句以事件的形式保存,描述了数据的更改过程,此日志对于灾难时的数据恢复起着极其重要的作用。
04 slow_query_log 表示慢查询日志,记录了所有执行时间超过参数long_query_time设置值并且扫描记录数小于min_examined_row_limit的所有SQL语句的日志。

三、数据库服务日志信息配置

3.1 分类日志信息配置:通用日志(general_log)

01 日志信息基本配置:

-- 默认日志功能处于关闭,建议在需要做调试工作时(功能测试、语句审计)可以打开;
general_log=OFF

-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
general_log_file=/data/3306/logs/general.log

-- 临时修改日志默认状态(激活日志):
mysql > set global general_log=1;

-- 永久修改,在配置文件中添加如下两行配置即可
[root@master ~]# vim /data/3306/data/my.cnf
...
...
general_log=ON
general_log_file=/data/3306/logs/general.log
[root@master ~]# systemctl restart mysqld3306.service

-- 不论临时修改还是永久修改,进行结果验证
[root@master ~]# ll /data/3306/logs/general.log
-rw-r----- 1 mysql mysql 180 Mar  9 10:10 /data/3306/logs/general.log

说明:企业真实环境,由于日志记录量比较大,所以不建议打开此日志记录功能,可以在有需要时打开,支持在线配置调整;

3.2 分类日志信息配置:错误日志(log_error)

错误日志信息说明

正常情况下,错误日志信息如果我们不指定的话,则默认会生成,一般是以数据库名字开头的error文件,且存储在数据目录中。

[root@master ~]# ll /data/3306/data/db01-51.err
-rw-r----- 1 mysql mysql 14038 Mar  9 09:15 /data/3306/data/db01-51.err

有时候我们在查看错误日志的时候,回显内容不是具体的错误的日志文件,而是stderr。这表明错误日志记录是开启的,但是没有正常输出到具体的文件中,一般会输出到屏幕中。像这种情况下,一般具体查看

-- 不显示错误日志文件,而是显示stderr
mysql> select @@log_error;
+-------------+
| @@log_error |
+-------------+
| stderr      |
+-------------+
1 row in set (0.00 sec)

mysql> show variables like '%log_error%';
+----------------------------+----------------------------------------+
| Variable_name              | Value                                  |
+----------------------------+----------------------------------------+
| binlog_error_action        | ABORT_SERVER                           |
| log_error                  | stderr                                 |
| log_error_services         | log_filter_internal; log_sink_internal |
| log_error_suppression_list |                                        |
| log_error_verbosity        | 2                                      |
+----------------------------+----------------------------------------+
5 rows in set (0.01 sec)

错误日志信息基本配置

-- 定义日志文件存储的路径信息,建议日志文件路径与数据存放路径进行分离;
log_error=./db-01.edu.err

-- 修改日志存储路径(永久配置),配置文件编写完毕后,需要重启数据库服务生效
[root@master ~]# vim /data/3306/data/my.cnf
...
...
log_error=/data/3306/logs/mysql3306.err

-- 结果验证
mysql> select @@log_error;
+-------------------------------+
| @@log_error                   |
+-------------------------------+
| /data/3306/logs/mysql3306.err |
+-------------------------------+
1 row in set (0.00 sec)

# 模拟故障日志应用
[root@master ~]# systemctl stop mysqld3306.service
[root@db01-51 ~]# ll /data/3306/data/ibdata1
-rw-r----- 1 mysql mysql 12582912 Mar  9 10:33 /data/3306/data/ibdata1
[root@master ~]# chmod 000 /data/3306/data/ibdata1
[root@master ~]# systemctl restart mysqld3306.service
Shutting down MySQL............................... SUCCESS!
Starting MySQL......................................... ERROR! The server quit without updating PID file (/data/3306/data/oldboyxiaoq.com.pid).
-- 根据错误日志的错误提示信息,进行错误信息进行分析,从而排查故障可能出现的原因;
[root@oldboyxiaoq ~]# tail -20 /data/3306/logs/mysql3306.err
2025-03-09T02:35:02.189438Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2025-03-09T02:35:02.189470Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system data file 'ibdata1' must be writable
2025-03-09T02:35:02.189506Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2025-03-09T02:35:02.189614Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2025-03-09T02:35:02.189664Z 0 [ERROR] [MY-010119] [Server] Aborting
2025-03-09T02:35:02.189941Z 0 [System] [MY-010910] [Server] /usr/local/mysql/bin/mysqld: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.

-- 环境复原
[root@master ~]# systemctl stop mysqld3306.service
[root@master ~]# chmod 640 /data/3306/data/ibdata1
[root@master ~]# systemctl restart mysqld3306.service

说明:企业真实环境,日志处于默认激活记录状态,可以使用错误日志信息做故障诊断,记录错误信息级别为note warning error;