一、数据库服务日志概述介绍¶
任何一种数据库中,都会有各种各样的日志,记录这数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件;
主要是针对数据库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;