Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  The General Query Log

7.4.3 普通查询日志

普通查询日志是记录mysqld所做的所有操作的日志。当客户端连接或断开连接时,服务器将信息写入该日志,并记录来自客户端的每个 SQL 语句。如果您怀疑客户端出现错误并想知道客户端发送给mysqld的确切内容,该日志非常有用。

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

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

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

然而,当使用基于行的二进制日志时,更新将作为行更改而不是 SQL 语句发送,因此这些语句在 binlog_format 设置为 ROW 时从不写入查询日志。当该变量设置为 MIXED 时,给定的更新也可能不会被写入查询日志,具体取决于使用的语句。请参阅 第 19.2.1.1 节,“基于语句和基于行的复制的优缺点”,以获取更多信息。

默认情况下,普通查询日志是禁用的。要明确指定普通查询日志的初始状态,请使用 --general_log[={0|1}]。如果没有参数或参数为 1,则 --general_log 启用日志。如果参数为 0,则禁用日志。要指定日志文件名,请使用 --general_log_file=file_name。要指定日志目标,请使用 log_output 系统变量(如 第 7.4.1 节,“选择普通查询日志和慢查询日志输出目标” 中所述)。

Note

如果您指定了 TABLE 日志目标,请参阅 日志表和“打开文件太多”错误

如果您没有指定普通查询日志文件的名称,默认名称为 host_name.log。服务器将文件创建在数据目录中,除非指定了绝对路径名以指定不同的目录。

要在运行时禁用或启用普通查询日志或更改日志文件名,请使用全局 general_loggeneral_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 变量为 ONOFF。(假设通用查询日志本身已启用。)

在通用查询日志中,语句中的密码将被服务器重写,不会以明文形式出现。可以通过在服务器启动时使用 --log-raw 选项来禁止密码重写。这可能对诊断有用,以查看服务器收到的语句的确切文本,但出于安全原因,不建议在生产环境中使用。另见 第 8.1.2.3 节,“密码和日志记录”

密码重写的隐含结果是,无法解析的语句(例如,语法错误)不会被写入通用查询日志,因为它们不能确定是否包含密码。需要记录所有语句,包括错误语句的用例,应该使用 --log-raw 选项,请注意这也会绕过密码重写。

密码重写仅在明文密码预期时发生。对于语法期望密码哈希值的语句,不会发生重写。如果明文密码错误地提供了这种语法,密码将被记录为给定,不会被重写。

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