欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > MySQL相关日志详解

MySQL相关日志详解

2025/3/21 3:23:10 来源:https://blog.csdn.net/m0_75235246/article/details/146241950  浏览:    关键词:MySQL相关日志详解

前言:

        mysql作为数据库,有着存储数据、读写数据的基本功能,当然作为数据库,必须具备有安全性、可靠性等相关基础功能。

        以我个人的理解,mysql多被用在分布式集群、高并发情景等数据量较大的地方,此时能够支撑mysql完成一系列事务的原因之一就是"日志"。

        mysql中有着庞大的日志体系,有二进制日志、重做日志、回滚日志等。这些日志起到了不同的作用。接下来就来深入探究一下这些日志的作用以及相关的作用原理。

MySQL数据目录:

        MySQL 服务器的管理信息、业务数据、日志⽂件、磁盘缓冲⽂件默认存储在数据目录下:

        管理信息:1.用户名和密码 2.用户的授权 3.系统变量的默认值 4.用户创建的库和表等

        业务数据:1.用户创建的库和表以及表中的数据

         MySQL工作时主要操作的目录,最重要的目录!!

        一般在以下文件中,可以通过ll指令查看:

/var/lib/mysql

    数据⽬录下的每个⼦录都是⼀个数据库⽬录,对应服务器管理的⼀个数据库,包括MySQL 安装成功后创建的标准数据库:

a. mysql⽬录对应于mysql系统库,包含mysql服务器运⾏时所需的信息,该数据库包含数据字典表和系统表;
b. performance_schema⽬录对应于Performance Schema,提供了在运⾏时⽤于检查服务器内部执⾏的信息;
c. sys⽬录对应于sys系统库,提供⼀组对象来帮助解释性能模式相关信息;
d. 其他⼦⽬录对应于⽤⼾或应⽤程序创建的数据库,也就是说我们每创建⼀个数据库,就会在数据⽬录⽣成⼀个同名的⽬录来保存对应的数据。
1.服务器写⼊的⽇志⽂件
2.InnoDB 表空间和⽇志⽂件
3.默认或⾃动⽣成的 SSL 和 RSA 证书和密钥⽂件
4.服务器进程 ID ⽂件(当服务器运⾏时)
5.mysqld-auto.cnf ⽂件⽤来存储持久化全局系统变量设置
6.通过选项重新配置服务器,可以将上述某些项⽬重新定位到指定⽬录。
7.使⽤ --datadir 选项允许更改数据⽬录本⾝的位置
......

日志介绍:

        mysql server涉及以下几种日志:

        

⽇志类型                                                                                     ⽇志信息
错误⽇志 (Error log)                                            mysqld在启动、运⾏或停⽌时遇到的问题
⼀般查询⽇志 (General query log)                    已建⽴的客⼾端连接和从客⼾端接收到的语句
慢查询⽇志 (Slow query log)                              执⾏时间超过 long_query_time 指定秒数的查询
⼆进制⽇志 (Binary log)                                     更改数据的语句(也⽤于主从复制)
中继⽇志 (Relay log)                                                  从源服务器接收到的数据更改
DDL⽇志(metadata log)                                               DDL 语句执⾏的操作
回滚⽇志/撤销⽇志(undo log)                                             ⽤于事务的回滚操作
重做⽇志(redo log)                                                             ⽤于服务器崩溃恢复

        上述日志是作为mysql的核心之一!!

Linux下默认开启错误日志和⼆进制⽇志

在服务器运⾏期间可以控制⼀般查询和慢查询⽇志的禁⽤与开启,也可以更改⽇志⽂件名 

 ⼀般查询⽇志和慢查询⽇志记录可以写⼊⽇志表、⽇志⽂件或两者同时写⼊

默认情况下,所有启⽤的⽇志将写⼊数据⽬录,可以通过刷新⽇志强制服务器关闭并重新打开⽇志⽂件

通过 FLUSH LOGS 语句刷新⽇志来强制服务器关闭并重新打开⽇志⽂件 ,也可以使⽤
mysqladmin 的 flush-logs refresh 参数,或mysqldump 的 --flush-logs --master-data 选项

一般查询日志和慢查询日志的输出形式:

        如果启⽤⼀般查询⽇志和慢查询⽇志,⽇志的输出⽅式可以指定为⽇志⽂件或 mysql 系统库中的 general_log slow_log 表,也可以两者同时指定。

启动时的日志控制:

log_output 系统变量指定⽇志输出的形式,但并不会真正的启用日志 log_output 可以有
三个值,分别是: TABLE (表)、 FILE (⽂件)、 NONE (不输出),可以同时指定多个值,并⽤逗
号隔开,未指定值时默认是 FILE ,如果列表中存在 NONE 则其他的不⽣效,也就是说 NONE
优先级最⾼。
通过设置 general_log 系统变量的值来控制⼀般查询⽇志的 开启 1 禁⽤ 0 ,如果要为⽇
志指定⾃定义的路径或⽂件名可以使⽤ general_log_file 系统变量
通过设置 slow_query_log 系统变量的值来控制慢查询⽇志的 开启 1 禁⽤ 0 ,如果要为
⽇志指定⾃定义的路径或⽂件名可以使⽤ slow_query_log_file 系统变量
⽰例,以选项⽂件中的配置为例:
将⼀般查询⽇志写⼊⽇志表和⽇志⽂件
[mysqld]
# ⽇志写⼊表和⽂件
log_output=TABLE,FILE
# 开启⼀般查询⽇志
general_log=1
仅将⼀般查询⽇志和慢查询⽇志写⼊⽇志表
[mysqld]
log_output=TABLE # ⽇志写⼊表
general_log=1 # 开启⼀般查询⽇志
slow_query_log=1 # 开启慢查询⽇志
仅将慢查询⽇志写⼊⽇志⽂件,并指定⾃定义的⽇志路径
[mysqld]
log_output=FILE # ⽇志⽂件
slow_query_log=1 # 开启慢查询⽇志
将⼀般查询⽇志和慢查询⽇志写⼊⽇志⽂件,并指定⾃定义的⽇志路径
[mysqld]
# ⽇志⽂件
log_output=FILE
# 开启⼀般查询⽇志
general_log=1
# 指定⾃定义的⽂件名
general_log_file=/var/lib/mysql/general.log
# 开启慢查询⽇志
slow_query_log=1
# 指定⾃定义的⽂件名
slow_query_log_file=/var/lib/mysql/slow_query.log

运行时日志控制:

在运⾏时修改 log_output 的值,以更改⽇志的输出形式,通过语句控制
语法: SET [GLOBAL|SESSION] variable_name =value
1 SET GLOBAL log_output=[FILE, TABLE, NONE]
总结如下:
1.general_log[={0|1}] 和 slow_query_log[={0|1}] 可以表⽰启⽤和禁⽤⼀般查询日志和慢查询⽇志
2.general_log_file 和 slow_query_log_file 表⽰通⽤查询⽇志和慢查询⽇志⽂件名称
只对当前会话禁⽤或启⽤⼀般查询⽇志记录,将 SESSION 作⽤域的 sql_log_off 变量设置为 ON 或 OFF

使用日志表优点:

可以通过 SQL 语句的条件查询过滤⽇志内容,从⽽选择满⾜特定条件的⽇志记录。⽐如,某个客户端的⽇志;
可以通过客⼾端程序连接到服务器并查询表中的⽇志信息,⽆需登录服务器主机访问⽂件系统。
⽇志记录具有标准格式,可看⽇志表的结构,可以使⽤以下语句:
SHOW CREATE TABLE mysql.general_log; # ⼀般查询⽇志
SHOW CREATE TABLE mysql.slow_log; # 慢查询⽇志

一般查询日志:

General query log - ⼀般查询⽇志, 记录客⼾端连接或断开连接的信息,也会记录从客户端接收的
每个SQL语句 。如果开启将会产⽣⼤量的内容,⾮常耗费服务器资源,所以默认为关闭(不开启),
要启⽤⼀般查询⽇志可以使⽤:请使⽤ -- general_log[={0|1}]
默认⽇志⽂件名为 host_name .log ,可以使⽤ general_log_file= file_name 修改;
记当客户端连接的⽇志⾏,使⽤ connection_type 来指示用于建⽴连接的协议。 TCP/IP
⽰不使⽤SSL建⽴的TCP/IP连接、 SSL/TLS 表⽰使⽤SSL建⽴的TCP/IP连接、 Socket 表⽰
Unix套接字⽂件连接、 Named Pipe 表⽰Windows命名管道连接、 Shared Memory 表⽰
Windows共享内存连接。
Mysqld按照接收到SQL语句的顺序将语句写入查询日志,这个顺序可能与语句执行的顺序不同。

表结构如下:

mysql> SHOW CREATE TABLE mysql.general_log;
CREATE TABLE `general_log` (
# 发⽣时间
`event_time` timestamp ( 6 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 6 ) ON UPDATE
CURRENT_TIMESTAMP ( 6 ),
`user_host` mediumtext NOT NULL ,
`thread_id` bigint unsigned NOT NULL ,
`server_id` int unsigned NOT NULL ,
`command_type` varchar ( 64 ) NOT NULL ,
`argument` mediumblob NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8mb3 COMMENT= 'General log'

慢查询日志:

慢查询日志由执⾏时间超过系统变量 long_query_time 指定的秒数的 SQL 语句组成,并且检查的行数⼤于系统变量 min_examined_row_limit 指定值。被记录的慢查询需要进⾏优化,可以使⽤ mysqldumpslow客⼾端程序对慢⽇志进⾏分析汇总。获取初始锁的时间不计⼊执⾏时间,mysqld在执行完SQL语句并释放所有锁后才将符合条件的语句写⼊慢速查询日志,因此⽇志顺序可能与执行顺序不同

慢查询日志参数:

1.long_query_time 的默认值是10,最⼩值是0;
2.默认情况下,不记录管理语句,也不记录不使⽤索引的查询
3.默认为关闭(不开启),要启⽤慢查询⽇志可以使⽤:请使⽤ --slow_query_log[={0|1}] .
4.默认⽇志⽂件名为 host_name -slow.log ,可以使⽤
slow_query_log_file= file_name 修改;
5.使⽤ --log-short-format 选项,以简要格式记录慢查询⽇志
6.要记录管理语句,启⽤ log_slow_admin_statements 系统变量。管理语句包括 ALTER
TABLE ANALYZE TABLE CHECK TABLE CREATE INDEX DROP INDEX
OPTIMIZE TABLE REPAIR TABLE
7.要记录不使⽤索引的查询,启⽤ log_queries_not_using_indexes 系统变量。当记录不使
⽤索引的查询时,⽇志会快速增⻓,通过设置系统变量 log_throttle_queries_not_using_indexes 限制每分钟写⼊慢查询⽇志同类查询的数
量,默认值是0,表示无限制。

慢查询日志内容:

FILE格式
如果启⽤慢查询⽇志并将 FILE 作为输出⽬标,每条语句前⾯都⽤⼀⾏来表示日志的字段,该行
# 字符开头并包含以下内容:
1.Query_time: SQL语句的执行时间,单位秒
2.Lock_time: 获取锁的时间,单位秒
3.Rows_sent: 发送到客⼾端的⾏数
4.Rows_examined: 服务器检查的⾏数
5.启用--log-slow-extra[={OFF|ON}]系统变量会将以下额外字段写⼊到FILE中,TABLE形式不受影响
6.Thread_id: 线程标识符
7.Errno: 错误码,没有发⽣错误则为 0
8.Killed: 如果语句被终⽌,⽤错误码表示原因,如果语句正常终止则为 0。
9.Bytes_received: 接收到SQL语句的Bytes值。
10.Bytes_sent: 返回给客⼾端的Byte值。
11.Read_first: 索引中第⼀个条⽬被读取的次数,如果这个值很⾼,表明服务器正在执⾏⼤量完整索引扫描
12.Read_last: 读取索引中最后⼀个键的请求数,使⽤ ORDER BY 时关注
13.Read_key: 基于索引读取⼀⾏数据的请求数。如果这个值很⾼,表明表为当前查询建⽴了正确的索引
14.Read_next: 按索引排序读取下一行的请求数,查询具有范围约束的索引列,或者进⾏索引扫描,此值将递增。
15.Read_prev: 按索引排序读取前一行的请求数。主要⽤于优化ORDER BYRDESC。
16.Read_rnd: 基于固定位置读取一行的请求数。这个值很⾼表⽰,正在执⾏⼤量需要对结果进⾏排序的查询,可能有很多查询进⾏了全表扫描整,或者没有正确使⽤索引的连接。
17.Read_rnd_next: 读取数据⽂件中下一行的请求数。如果进⾏⼤量的表扫描,这个值会很⾼。通常,表示表没有建⽴正确地索引,或者查询没有利⽤索引。
18.Sort_merge_passes: 排序算法完成的归并次数,如果这个值很⼤,考虑增加 sort_buffer_size 系统变量的值。
19.Sort_range_count: 使⽤范围进⾏排序的次数。
20.Sort_rows: 排序的⾏数。
21.Sort_scan_count: 通过扫描表完成的排序数。
22.Created_tmp_disk_tables: 服务器在执⾏语句时创建内部磁盘临时表的数量。
23.Created_tmp_tables: 服务器在执⾏语句时创建的内部临时表的数量。
24.Start: 执⾏SQL语句开始时间
25.End: 执⾏SQL语句结束时间
TABLE格式
慢查询⽇志表的表结构如下:
mysql> SHOW CREATE TABLE mysql.slow_log;
CREATE TABLE `slow_log` (
`start_time` timestamp ( 6 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 6 ) ON UPDATE
CURRENT_TIMESTAMP ( 6 ),
`user_host` mediumtext NOT NULL ,
`query_time` time ( 6 ) NOT NULL ,
`lock_time` time ( 6 ) NOT NULL ,
`rows_sent` int NOT NULL ,
`rows_examined` int NOT NULL ,
`db` varchar ( 512 ) NOT NULL ,
`last_insert_id` int NOT NULL ,
`insert_id` int NOT NULL ,
`server_id` int unsigned NOT NULL ,
`sql_text` mediumblob NOT NULL ,
`thread_id` bigint unsigned NOT NULL
ENGINE=CSV DEFAULT CHARSET=utf8mb3 COMMENT= 'Slow log'

 错误日志:

        错误日志⼀般会记录mysqld 启动和关闭的次数、诊断消息,以及服务器运行期间发⽣的错误和警告;例如MySQL需要⾃动检查或修复⼀个表,就会在错误⽇志中写⼊⼀条记录。错误⽇志默认使⽤UTF-8 ( utf8mb3 )编码格式,并使用英语生成记录。
Unix 和Linux 系统的默认错误日志路径
在 Unix 和Linux 系统中,mysqld使⽤ --log-error 选项来指定默认错误⽇志⽬标,可以指定控制
台或是⽂件,如果是⽂件,规则如下:
1.如果错误⽇志输出⽬标是控制台,则服务器将 log_error 系统变量设置为 stderr . 否则,将
以⽂件形式输⼊错误⽇志,并以 log_error 的值为⽂件名。
2.如果显⽰写出 - -log-error 但没有指定具体⽂件,则默认路径是数据⽬录中
host_name .err 的⽂件;
3.可以通过指定绝对路径,来更改默认的⽇志位置。
[mysqld]
log-error=/var/log/mysql/error_log.err # ⾃定义错误⽇志的路径

错误日志中事件的字段

核⼼错误事件字段:
time :件时间戳,精度为微秒;
msg :事件消息字符串;
prio :事件优先级,包括 System event - 系统(0)、 Error event - 错误(1)、 Warning
event - 警告(2)或 Note/information event - 通知/提⽰事件(3),值越⼩优先级越⾼;
err_code :事件错误代码;
err_symbol :以字符串形式表⽰的事件错误符,例如 'ER_DUP_KEY'
SQL_state :事件 SQLSTATE 值,与 err_symbol 对应,例如 'ER_DUP_KEY' 对应的
SQLSTATE为23000
subsystem :事件发⽣的⼦系统。可能的值: InnoDB (InnoDB存储引擎)、 Repl (复制⼦系
统)、 Server (其他)。

二进制日志:

⼆进制日志包含数据库更改的"事件",不会记录 SELECT SHOW ,例如:记录表的创建操作或
表数据的更改,⼆进制⽇志还包含每个语句更新数据时花费的时间信息,启动⼆进制⽇志,对服务
器性能稍微有些影响;
除了基于行的日志模式,它还包含可能进⾏更改数据的语句事件,例如 DELETE 操作没有匹配到
查找到的⾏;
⼆进制日志的作用:
主从节点数据复制 :从节点服务器读取主节点服务器上的⼆进制⽇志⽂件,并根据⼆进制⽇志中记录的事件在从节点上执⾏相同的操作,保证主从节点服务器上数据⼀致,实现数据复制功能。在主从复制专题中我们重点讲解复制过程;
数据恢复: 从某个时间点恢复备份数据后,将重新执行备份时间点之后记录在⼆进制日志中的事件。这些事件使数据库从备份点更新到当前最新状态

 ⼆进制日志的语句中如果涉及用户的密码,则由服务器进行加密,不会以纯⽂本形式出现。

查看二进制日志相关的系统变量:

查看⼆进制⽇志相关的系统变量
mysql> show variables like '%bin%';
+ ------------------------------------------------+-----------------------------
---+
| Variable_name | Value
|
+ ------------------------------------------------+-----------------------------
---+
| binlog_cache_size | 32768
|
| binlog_checksum | CRC32
|
| binlog_direct_non_transactional_updates | OFF
|
| binlog_encryption | OFF
|
| binlog_error_action | ABORT_SERVER
|
| binlog_expire_logs_auto_purge | ON
|
| 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
|
| innodb_api_enable_binlog | OFF
|
| log_bin | ON
|
| log_bin_basename | D:\log\MySQL\ 8.0 \bin_log
|
| log_bin_index |
D:\log\MySQL\ 8.0 \bin_log.index |
| log_bin_trust_function_creators | OFF
|
| log_bin_use_v1_row_events | OFF
|
| log_statements_unsafe_for_binlog | ON
|
| max_binlog_cache_size | 18446744073709547520
|
| max_binlog_size | 1073741824
|
| max_binlog_stmt_cache_size | 18446744073709547520
|
| sql_log_bin | ON
|
| sync_binlog | 1
|
+ ------------------------------------------------+-----------------------------
---+
38 rows in set , 1 warning ( 0.00 sec)

查看⼆进制日志相关的状态变量:

mysql> show status like '%bin%';
+ ----------------------------+-------+
| Variable_name | Value |
+ ----------------------------+-------+
| Binlog_cache_disk_use | 0 |
| Binlog_cache_use | 0 |
| Binlog_stmt_cache_disk_use | 0 |
| Binlog_stmt_cache_use | 0 |
| Com_binlog | 0 |
| Com_show_binlog_events | 0 |
| Com_show_binlogs | 0 |
+ ----------------------------+-------+
7 rows in set ( 0.00 sec)

 特别说明:

1.默认情况下启⽤⼆进制⽇志, log_bin 系统变量为 ON
2.禁⽤⼆进制⽇志,可以指定 --skip-log-bin --disable-log-bin 选项。如果同时指
定了 --log-bin 则后指定的选项优先;
3.选项 --log-bin[= base_name ] ⽤于指定⼆进制⽇志⽂件的基本名称,如果不指定 --log
bin 选项,默认基本名称为 binlog ,建议为⼆进制⽇志指定⼀个基本名;
4.⼆进制⽇志⽂件名是由基本名+数字扩展名组成的,服务器每次创建⼀个新的⽇志⽂件时,数字扩展名都会增加,从⽽保证有序的⽂件系列,发⽣以下事件时,服务器都会在创建⼀个新的⽇志⽂件:
5.服务器已启动或重新启动
6.服务器刷新⽇志
7.当前日志⽂件的⼤⼩达到 max_binlog_size (单个⽇志⽂件的最⼤字节数,最⼩值 4096 字

节,最⼤值和默认值 1GB).

8.mysqld还会创建⼀个包含⼆进制⽇志⽂件名的⽇志索引⽂件,默认情况下,这与⼆进制⽇志⽂件具有相同的基本名称,扩展名为 .index . 可以使⽤选项 --log-bin-index[= file_name ]
修改索引⽂件名;
9.⼆进制日志⽂件和索引⽂件的默认位置是数据⽬录。可以使⽤ --log-bin[= file_name ] 选项
指定⾃定义路径, file_name 格式 = 绝对路径+基本名。 --log-bin 对应的系统变量是
log_bin_basename
查看⼆进制日志
使⽤客⼾端⼯具mysqlbinlog查看
mysqlbinlog binlog.000001 > binlog.000001
通过SQL语句查看
mysql> show binlog events in 'binlog.000001' from N limit S;

Redo Log 和 Undo Log

Redo Log :重做⽇志,⽤于恢复数据;
Undo Log :撤消⽇志⽤于回滚操作;

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词