通用查询日志

来自泡泡学习笔记
BrainBs讨论 | 贡献2023年8月12日 (六) 12:56的版本 (创建页面,内容为“通用查询日志是记录mysqld正在进行的通用操作的日志。当客户端连接或断开连接时,服务器会将信息写入该日志,并记录从客户端接收到的每个SQL语句。当你怀疑客户端出现错误并想要确切了解客户端发送给mysqld的内容时,通用查询日志非常有用。 每条显示客户端连接的行还包括使用connection_type来指示建立连接所使用的协议。connection_type可以是TCP/IP…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

通用查询日志是记录mysqld正在进行的通用操作的日志。当客户端连接或断开连接时,服务器会将信息写入该日志,并记录从客户端接收到的每个SQL语句。当你怀疑客户端出现错误并想要确切了解客户端发送给mysqld的内容时,通用查询日志非常有用。

每条显示客户端连接的行还包括使用connection_type来指示建立连接所使用的协议。connection_type可以是TCP/IP(未使用SSL建立的TCP/IP连接)、SSL/TLS(使用SSL建立的TCP/IP连接)、Socket(Unix套接字文件连接)、Named Pipe(Windows命名管道连接)或Shared Memory(Windows共享内存连接)之一。

mysqld按照收到的顺序将语句写入查询日志,这可能与执行顺序不同。这种日志记录顺序与二进制日志的顺序相反,对于二进制日志,语句是在执行之后但在释放任何锁之前写入的。此外,查询日志可能包含仅选择数据的语句,而这些语句从不写入二进制日志。

在复制源服务器上使用基于语句的二进制日志记录时,复制副本接收到的语句会被写入每个复制副本的查询日志中。如果客户端使用mysqlbinlog实用程序读取事件并将其传递给服务器,则语句将被写入源的查询日志中。

然而,当使用基于行的二进制日志记录时,更新以行更改的形式发送,而不是作为SQL语句发送,因此当binlog_format为ROW时,这些语句永远不会被写入查询日志。当该变量设置为MIXED时,给定的更新也可能不会被写入查询日志,这取决于使用的语句。

默认情况下,通用查询日志是禁用的。要明确指定初始通用查询日志状态,请使用--general_log[={0|1}]。不带参数或参数为1时,--general_log启用日志。参数为0时,此选项禁用日志。要指定日志文件名,请使用--general_log_file=file_name。要指定日志目标,请使用log_output系统变量。

如果没有为通用查询日志文件指定名称,那么默认名称为host_name.log。服务器会在数据目录中创建该文件,除非指定了绝对路径名称以指定其他目录。

要在运行时禁用或启用通用查询日志或更改日志文件名称,请使用全局的general_log和general_log_file系统变量。将general_log设置为0(或OFF)以禁用日志,将其设置为1(或ON)以启用日志。将general_log_file设置为指定日志文件的名称。如果已经打开了一个日志文件,它将被关闭并打开新的文件。

当启用通用查询日志时,服务器会将输出写入由log_output系统变量指定的任何目标。如果启用了日志,服务器会打开日志文件并将启动消息写入其中。然而,除非选择了FILE日志目标,否则不会继续记录查询到该文件中。如果目标是NONE,则即使启用了通用日志,服务器也不会写入任何查询。如果日志目标值不包含FILE,则设置日志文件名称不会影响日志记录。

服务器重启和日志刷新不会导致生成新的通用查询日志文件(尽管刷新会关闭并重新打开它)。要重命名文件并创建一个新文件,请使用以下命令:

$> mv host_name.log host_name-old.log
$> mysqladmin flush-logs general
$> mv host_name-old.log backup-directory

在Windows上,请使用rename而不是mv。

您还可以通过禁用日志来在运行时重命名通用查询日志文件:

SET GLOBAL general_log = 'OFF';

禁用日志后,可以在外部重命名日志文件(例如,通过命令行)。然后再次启用日志:

SET GLOBAL general_log = 'ON';


这种方法适用于任何平台,不需要重新启动服务器。

要在当前会话中禁用或启用通用查询日志,请将会话sql_log_off变量设置为ON或OFF。(这假设通用查询日志本身已启用。)

写入通用查询日志的语句中的密码将由服务器重新编写,以避免以明文形式出现。通过使用--log-raw选项启动服务器,可以取消对通用查询日志的密码重写。此选项可能对诊断目的有用,以查看服务器接收到的语句的确切文本,但出于安全原因,不建议在生产环境中使用。

密码重写的一个影响是,无法解析的语句(例如,由于语法错误)不会被写入通用查询日志,因为无法确定是否不包含密码。需要记录包括错误语句在内的所有语句的用例应使用--log-raw选项,但要注意,这也会绕过密码重写。

密码重写仅在期望明文密码时发生。对于语法要求密码哈希值的语句,不会进行重写。如果错误地为此类语法提供了明文密码,该密码将作为给定的内容记录,而不进行重写。

log_timestamps系统变量控制写入通用查询日志文件(以及慢查询日志文件和错误日志)的消息中的时间戳的时区。它不会影响写入日志表的通用查询日志和慢查询日志消息的时区,但从这些表中检索的行可以通过CONVERT_TZ()或设置会话time_zone系统变量将其从本地系统时区转换为任何所需的时区。