5.4.3 通用查询日志

常规查询日志是mysqld正在执行的常规记录。当 Client 端连接或断开连接时,服务器会将信息写入此日志,并记录从 Client 端收到的每个 SQL 语句。当您怀疑 Client 端中的错误并想确切了解 Client 端发送到mysqld的内容时,常规查询日志可能非常有用。

显示 Client 端连接时间的每一行还包括using connection_type,以指示用于构建连接的协议。 * connection_type *是TCP/IP(不使用 SSL 构建的 TCP/IP 连接),SSL/TLS(使用 SSL 构建的 TCP/IP 连接),Socket(Unix 套接字文件连接),Named Pipe(Windows 命名管道连接)或Shared Memory(Windows 共享内存)之一连接)。

mysqld以接收语句的 Sequences 将其写入查询日志,这可能与它们执行的 Sequences 不同。该日志记录 Sequences 与二进制日志相反,二进制日志的执行 Sequences 是在语句执行之后但释放任何锁之前。此外,查询日志可能包含仅选择数据的语句,而这些语句从未写入二进制日志。

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

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

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

Note

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

如果您没有为常规查询日志文件指定名称,则默认名称为host_name.log。除非给出绝对路径名以指定其他目录,否则服务器将在数据目录中创建文件。

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

启用常规查询日志后,服务器会将输出写入log_output系统变量指定的任何目标。如果启用日志,服务器将打开日志文件并向其中写入启动消息。但是,除非选择了FILE日志目标,否则不会进一步查询查询文件。如果目标是NONE,则即使启用了常规日志,服务器也不会写入查询。如果日志目标值不包含FILE,则设置日志文件名对日志记录无效。

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

shell> mv host_name.log host_name-old.log
shell> mysqladmin flush-logs
shell> 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选项启动服务器,可以抑制常规查询日志的密码重写。此选项可能对诊断目的很有用,可以查看服务器接收到的确切语句文本,但是出于安全原因,不建议将其用于生产。另请参见第 6.1.2.3 节“密码和日志记录”

密码重写的含义是,无法解析的语句(例如由于语法错误)不会写入通用查询日志,因为无法知道它们没有密码。需要记录所有语句(包括出错语句)的用例应使用--log-raw选项,请记住,这也绕过了密码重写。

仅当需要纯文本密码时才进行密码重写。对于语法要求密码哈希值的语句,不会进行重写。如果错误地为这种语法提供了纯文本密码,则将按给定的密码记录密码,而不进行重写。例如,记录以下语句,因为期望密码哈希值:

CREATE USER 'user1'@'localhost' IDENTIFIED BY PASSWORD 'not-so-secret';

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