文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

7.4.3 通用查询日志

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

显示客户端连接时间的每行还包括 using 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_formatROW 时,这些语句永远不会写入查询日志。当此变量设置为 MIXED 时,给定的更新也可能不会写入查询日志,具体取决于所使用的语句。有关更多信息,请参见 第 19.2.1.1 节,“基于语句和基于行的复制的优缺点”

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

注意

如果您指定了 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 系统变量将从这些表中检索到的行从本地系统时区转换为任何所需时区。