### 5.4.3 通用查询日志

[](<>)[](<>)

一般查询日志是对什么的一般记录[**mysqld**](mysqld.html)是在做。服务器在客户端连接或断开连接时将信息写入此日志，并记录从客户端接收到的每个 SQL 语句。当您怀疑客户端中存在错误并想确切了解客户端发送到的内容时，通用查询日志可能非常有用[**mysqld**](mysqld.html).

显示客户端连接时间的每一行还包括`使用 *`连接类型`*`指示用于建立连接的协议。*`连接类型`*是其中之一`TCP/IP`（在没有 SSL 的情况下建立 TCP/IP 连接），`SSL/TLS`（使用 SSL 建立的 TCP/IP 连接），`插座`（Unix套接字文件连接），`命名管道`（Windows 命名管道连接），或`共享内存`（Windows 共享内存连接）。

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

在复制源服务器上使用基于语句的二进制日志记录时，其副本收到的语句将写入每个副本的查询日志。如果客户端使用[**mysqlbinlog**](mysqlbinlog.html)实用程序并将它们传递给服务器。

但是，当使用基于行的二进制日志时，更新是作为行更改而不是 SQL 语句发送的，因此这些语句永远不会写入查询日志[`binlog_format`](replication-options-binary-log.html#sysvar_binlog_format)是`排`.当此变量设置为时，给定的更新也可能不会写入查询日志`混合`，取决于使用的语句。看[第 17.2.1.1 节，“基于语句和基于行的复制的优缺点”](replication-sbr-rbr.html)， 了解更多信息。

默认情况下，通用查询日志被禁用。要显式指定初始常规查询日志状态，请使用[`--general_log[={0|1}]`](server-system-variables.html#sysvar_general_log).没有参数或参数为 1，[`--general_log`](server-system-variables.html#sysvar_general_log)启用日志。如果参数为 0，此选项将禁用日志。要指定日志文件名，请使用[`--general_log_file=*`文件名`*`](server-system-variables.html#sysvar_general_log_file).要指定日志目标，请使用[`日志输出`](server-system-variables.html#sysvar_log_output)系统变量（如中所述[第 5.4.1 节，“选择通用查询日志和慢查询日志输出目标”](log-destinations.html)）。

笔记

如果您指定`桌子`记录目的地，见[日志表和“打开的文件太多”错误](log-destinations.html#log-destinations-tables-open-files).

如果没有为通用查询日志文件指定名称，则默认名称为`*`主机名`*。日志`.服务器在数据目录中创建文件，除非给出绝对路径名来指定不同的目录。

要在运行时禁用或启用通用查询日志或更改日志文件名，请使用全局[`通用日志`](server-system-variables.html#sysvar_general_log)和[`general_log_file`](server-system-variables.html#sysvar_general_log_file)系统变量。放[`通用日志`](server-system-variables.html#sysvar_general_log)为 0（或`离开`) 禁用日志或 1 (或`在`) 来启用它。放[`general_log_file`](server-system-variables.html#sysvar_general_log_file)指定日志文件的名称。如果日志文件已打开，则将其关闭并打开新文件。

启用通用查询日志后，服务器将输出写入由[`日志输出`](server-system-variables.html#sysvar_log_output)系统变量。如果启用日志，服务器将打开日志文件并将启动消息写入其中。但是，不会进一步记录对文件的查询，除非`文件`选择日志目的地。如果目的地是`没有`，即使启用了通用日志，服务器也不会写入任何查询。如果日志目标值不包含，则设置日志文件名对日志记录没有影响`文件`.

服务器重新启动和日志刷新不会导致生成新的通用查询日志文件（尽管刷新会关闭并重新打开它）。要重命名文件并创建一个新文件，请使用以下命令：

```
$> 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`](server-system-variables.html#sysvar_sql_log_off)可变为`在`要么`离开`.（这假设通用查询日志本身已启用。）

写入一般查询日志的语句中的密码由服务器重写，不会以纯文本形式出现。可以通过使用[`--log-raw`](server-options.html#option_mysqld_log-raw)选项。此选项可能对诊断有用，可用于查看服务器接收到的语句的确切文本，但出于安全原因，不建议将其用于生产用途。也可以看看[第 6.1.2.3 节，“密码和日志记录”](password-logging.html).

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

仅当需要纯文本密码时才会重写密码。对于语法要求密码哈希值的语句，不会发生重写。如果错误地为此类语法提供了纯文本密码，则密码将被记录为给定，而无需重写。

这[`日志时间戳`](server-system-variables.html#sysvar_log_timestamps)系统变量控制写入通用查询日志文件（以及慢查询日志文件和错误日志）的消息中时间戳的时区。它不影响写入日志表的一般查询日志和慢查询日志消息的时区，但是从这些表中检索到的行可以从本地系统时区转换为任何所需的时区[`转换_TZ()`](date-and-time-functions.html#function_convert-tz)或通过设置会话[`时区`](server-system-variables.html#sysvar_time_zone)系统变量。
