### 5.4.1 选择通用查询日志和慢查询日志输出目的地

MySQL 服务器提供对写入一般查询日志和慢查询日志的输出目的地的灵活控制（如果启用了这些日志）。日志条目的可能目的地是日志文件或`通用日志`和`慢日志`中的表`mysql`系统数据库。可以选择文件输出、表格输出或两者都选择。

-   [服务器启动时的日志控制](log-destinations.html#log-destinations-startup)

-   [运行时的日志控制](log-destinations.html#log-destinations-runtime)

-   [日志表的好处和特点](log-destinations.html#log-destinations-tables)

#### 服务器启动时的日志控制

这[`日志输出`](server-system-variables.html#sysvar_log_output)系统变量指定日志输出的目的地。设置此变量本身不会启用日志；它们必须单独启用。

-   如果[`日志输出`](server-system-variables.html#sysvar_log_output)在启动时未指定，默认的日志记录目标是`文件`.

-   如果[`日志输出`](server-system-variables.html#sysvar_log_output)在启动时指定，它的值是从列表中选择一个或多个逗号分隔的单词`桌子`（登录到表格），`文件`（记录到文件），或`没有`（不要登录到表或文件）。`没有`，如果存在，优先于任何其他说明符。

    这[`通用日志`](server-system-variables.html#sysvar_general_log)系统变量控制对选定日志目标的一般查询日志的日志记录。如果在服务器启动时指定，[`通用日志`](server-system-variables.html#sysvar_general_log)采用可选参数 1 或 0 来启用或禁用日志。要指定文件记录的默认文件名以外的文件名，请设置[`general_log_file`](server-system-variables.html#sysvar_general_log_file)多变的。同样，[`慢查询日志`](server-system-variables.html#sysvar_slow_query_log)变量控制记录到所选目的地的慢查询日志和设置[`慢查询日志文件`](server-system-variables.html#sysvar_slow_query_log_file)指定文件记录的文件名。如果启用了任一日志，服务器将打开相应的日志文件并将启动消息写入其中。但是，不会进一步记录对文件的查询，除非`文件`选择日志目的地。

    例子：

-   要将一般查询日志条目写入日志表和日志文件，请使用[`--log_output=表，文件`](server-system-variables.html#sysvar_log_output)选择两个日志目的地和[`--general_log`](server-system-variables.html#sysvar_general_log)启用通用查询日志。

-   要将一般查询和慢查询日志条目仅写入日志表，请使用[`--log_output=表`](server-system-variables.html#sysvar_log_output)选择表作为日志目标和[`--general_log`](server-system-variables.html#sysvar_general_log)和[`--slow_query_log`](server-system-variables.html#sysvar_slow_query_log)启用两个日志。

-   要将慢查询日志条目仅写入日志文件，请使用[`--log_output=文件`](server-system-variables.html#sysvar_log_output)选择文件作为日志目的地和[`--slow_query_log`](server-system-variables.html#sysvar_slow_query_log)启用慢查询日志。在这种情况下，因为默认的日志目的地是`文件`, 你可以省略[`日志输出`](server-system-variables.html#sysvar_log_output)环境。

#### 运行时的日志控制

与日志表和文件关联的系统变量启用对日志记录的运行时控制：

-   这[`日志输出`](server-system-variables.html#sysvar_log_output)变量指示当前的日志记录目标。它可以在运行时修改以更改目的地。

-   这[`通用日志`](server-system-variables.html#sysvar_general_log)和[`慢查询日志`](server-system-variables.html#sysvar_slow_query_log)变量表示是否启用通用查询日志和慢查询日志（`在`) 或禁用 (`离开`）。您可以在运行时设置这些变量来控制是否启用日志。

-   这[`general_log_file`](server-system-variables.html#sysvar_general_log_file)和[`慢查询日志文件`](server-system-variables.html#sysvar_slow_query_log_file)变量表示通用查询日志和慢查询日志文件的名称。您可以在服务器启动或运行时设置这些变量以更改日志文件的名称。

-   要为当前会话禁用或启用常规查询日志记录，请设置会话[`sql_log_off`](server-system-variables.html#sysvar_sql_log_off)可变为`在`要么`离开`.（这假设通用查询日志本身已启用。）

#### 日志表的好处和特点

使用表进行日志输出具有以下好处：

-   日志条目具有标准格式。要显示日志表的当前结构，请使用以下语句：

    ```
    SHOW CREATE TABLE mysql.general_log;
    SHOW CREATE TABLE mysql.slow_log;
    ```

-   日志内容可通过 SQL 语句访问。这允许使用仅选择那些满足特定条件的日志条目的查询。例如，要选择与特定客户端关联的日志内容（这对于识别来自该客户端的有问题的查询很有用），使用日志表比使用日志文件更容易做到这一点。

-   可以通过任何可以连接到服务器并发出查询的客户端远程访问日志（如果客户端具有适当的日志表权限）。无需登录服务器主机直接访问文件系统。

    日志表实现具有以下特点：

-   一般来说，日志表的主要目的是为用户提供一个接口来观察服务器的运行时执行，而不是干扰它的运行时执行。

-   [`创建表`](create-table.html),[`更改表`](alter-table.html)， 和[`删除表`](drop-table.html)是对日志表的有效操作。为了[`更改表`](alter-table.html)和[`删除表`](drop-table.html)，日志表不能在使用中，必须禁用，如下所述。

-   默认情况下，日志表使用`CSV`以逗号分隔值格式写入数据的存储引擎。对于有权访问`.CSV`包含日志表数据的文件，这些文件很容易导入其他程序，例如可以处理 CSV 输入的电子表格。

    可以更改日志表以使用`MyISAM`存储引擎。你不能使用[`更改表`](alter-table.html)更改正在使用的日志表。必须先禁用日志。没有其他引擎`CSV`要么`MyISAM`对于日志表是合法的。

    [](<>)**日志表和“打开的文件太多”错误。**  [](<>)如果您选择`桌子`作为日志目标，日志表使用`CSV`存储引擎，您可能会发现在运行时重复禁用和启用通用查询日志或慢查询日志会导致许多打开的文件描述符用于`.CSV`文件，可能会导致“打开的文件太多”错误。要解决此问题，请执行[`同花顺表`](flush.html)或确保[`open_files_limit`](server-system-variables.html#sysvar_open_files_limit)大于的值[`table_open_cache_instances`](server-system-variables.html#sysvar_table_open_cache_instances).

-   要禁用日志记录以便您可以更改（或删除）日志表，您可以使用以下策略。示例使用通用查询日志；慢查询日志的过程类似，但使用`慢日志`表和[`慢查询日志`](server-system-variables.html#sysvar_slow_query_log)系统变量。

    ```
    SET @old_log_state = @@GLOBAL.general_log;
    SET GLOBAL general_log = 'OFF';
    ALTER TABLE mysql.general_log ENGINE = MyISAM;
    SET GLOBAL general_log = @old_log_state;
    ```

-   [`截断表`](truncate-table.html)是对日志表的有效操作。它可用于使日志条目过期。

-   [`重命名表`](rename-table.html)是对日志表的有效操作。您可以使用以下策略自动重命名日志表（例如，执行日志轮换）：

    ```
    USE mysql;
    DROP TABLE IF EXISTS general_log2;
    CREATE TABLE general_log2 LIKE general_log;
    RENAME TABLE general_log TO general_log_backup, general_log2 TO general_log;
    ```

-   [`检查表`](check-table.html)是对日志表的有效操作。

-   [`锁定表`](lock-tables.html)不能用于日志表。

-   [`插入`](insert.html),[`删除`](delete.html)， 和[`更新`](update.html)不能用于日志表。这些操作只允许在服务器内部进行。

-   [`带读锁的刷新表`](flush.html#flush-tables-with-read-lock)和状态[`只读`](server-system-variables.html#sysvar_read_only)系统变量对日志表没有影响。服务器始终可以写入日志表。

-   写入日志表的条目不会写入二进制日志，因此不会复制到副本。

-   要刷新日志表或日志文件，请使用[`同花顺表`](flush.html#flush-tables)要么[`刷新日志`](flush.html#flush-logs)， 分别。

-   不允许对日志表进行分区。

-   一种[**mysql转储**](mysqldump.html)转储包括用于重新创建这些表的语句，以便在重新加载转储文件后不会丢失它们。不会转储日志表内容。
