5.4.3 一般查询日志

general query log是 mysqld正在做什么的一般记录。当客户端连接或断开连接时,服务器将信息写入此日志,并记录从客户端收到的每个 SQL 语句。当您怀疑客户端有错误并想确切地知道客户端发送给mysqld的内容时,通用查询日志可能非常有用。

显示客户端何时连接的每一行还包括 指示用于建立连接的协议。 是 (不使用 SSL 建立的 TCP/IP 连接)、(使用 SSL 建立的 TCP/IP 连接)、(Unix 套接字文件连接)、(Windows 命名管道连接)或(Windows 共享内存连接)之一。 using connection_typeconnection_typeTCP/IPSSL/TLSSocketNamed PipeShared Memory

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

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

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

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

笔记

如果指定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
$> mv host_name-old.log backup-directory

在 Windows 上,使用重命名而不是 mv

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

SET GLOBAL general_log = 'OFF';

在禁用日志的情况下,从外部重命名日志文件(例如,从命令行)。然后再次启用日志:

SET GLOBAL general_log = 'ON';

此方法适用于任何平台,不需要重启服务器。

要为当前会话禁用或启用常规查询日志记录,请将会话 sql_log_off变量设置为 ONOFF。(这假定通用查询日志本身已启用。)

写入通用查询日志的语句中的密码由服务器重写,不会以纯文本形式出现。--log-raw通过使用该选项启动服务器,可以抑制一般查询日志的密码重写 。此选项可用于诊断目的,以查看服务器接收到的语句的确切文本,但出于安全原因,不建议在生产中使用。另请参阅 第 6.1.2.3 节,“密码和日志记录”

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

仅当需要纯文本密码时才会重写密码。对于具有期望密码散列值的语法的语句,不会发生重写。如果为此类语法错误地提供了纯文本密码,则会按给定的方式记录密码,而不会重写。

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