文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  通用查询日志

7.4.3 通用查询日志

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

每行显示客户端连接时间时,还会包含 使用 连接类型,以指示用于建立连接的协议。连接类型TCP/IP(未经 SSL 建立的 TCP/IP 连接)、SSL/TLS(经 SSL 建立的 TCP/IP 连接)、套接字(Unix 套接字文件连接)、命名管道(Windows 命名管道连接)或 共享内存(Windows 共享内存连接)之一。

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

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

但是,当使用基于行的二进制日志记录时,更新将作为行更改而不是 SQL 语句发送,因此当 binlog_formatROW 时,这些语句永远不会写入查询日志。当此变量设置为 MIXED 时,也可能不会将给定的更新写入查询日志,具体取决于所使用的语句。有关更多信息,请参阅第 19.2.1.1 节“基于语句和基于行的复制的优缺点”

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

注意

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

如果未为通用查询日志文件指定名称,则默认名称为 主机名.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 系统变量。