• 首页
  • css3教程
  • html5教程
  • jQuery手册
  • vue手册
  • php手册
  • MySQL手册
  • apache手册
  • redis手册
  • MySQL服务器错误日志

    MySQL Server有几个日志,可以帮助您了解正在发生的活动。

    日志类型写入日志的信息
    错误日志启动,运行或停止mysqld遇到的问题
    通用查询日志建立的客户连接和从客户那里收到的陈述
    二进制日志更改数据的语句(也用于复制)
    中继日志从复制主服务器收到的数据更改
    慢查询日志long_query_time执行耗时超过几秒钟的查询
    DDL日志(元数据日志)DDL语句执行的元数据操作

    默认情况下,除Windows上的错误日志外,没有启用任何日志。(DDL日志总是在需要时创建,并且没有用户可配置的选项;请参见“ DDL日志”。)以下特定于日志的部分提供有关启用日志记录的服务器选项的信息。

    默认情况下,服务器将所有已启用日志的文件写入数据目录中。您可以通过刷新日志来强制服务器关闭并重新打开日志文件(或在某些情况下切换到新的日志文件)。发出FLUSH LOGS语句时会发生日志刷新;使用或参数执行mysqladmin; 或使用或选项执行mysqldump。请参见“ FLUSH语句”,“mysqladmin-用于管理MySQL服务器的客户端”和“mysqldump-数据库备份程序”flush-logsrefresh--flush-logs--master-dat 。另外,当二进制日志的大小达到max_binlog_size系统变量的值时,将刷新该二进制日志。

    您可以在运行时控制常规查询日志和慢速查询日志。您可以启用或禁用日志记录,或更改日志文件名。您可以告诉服务器将常规查询条目和慢速查询条目写入日志表和/或日志文件。有关详细信息,请参见“选择常规查询日志和慢速查询日志输出目的地”,“常规查询日志”和“慢速查询日志”。

    中继日志仅在从属复制服务器上使用,以保留来自主服务器的数据更改,这些更改也必须在从属服务器上进行。有关中继日志内容和配置的讨论,请参见“从站中继日志”。

    有关日志维护操作(例如,旧日志文件到期)的信息,请参见“服务器日志维护”。

    有关确保日志安全的信息,

    选择常规查询日志和慢查询日志输出目标

    如果启用了MySQL日志,MySQL Server可以灵活控制写入普通查询日志和慢速查询日志的输出目标。日志条目的可能目标是日志文件或系统数据库中的general_logslow_logmysql。可以选择文件输出,表输出或两者。

    • 服务器启动时的日志控制
    • 运行时的日志控制
    • 日志表的优点和特征

    服务器启动时的日志控制

    所述log_output系统变量指定日志输出目的地。设置此变量本身并不会启用日志。必须分别启用它们。

    • 如果log_output在启动时未指定,则默认日志记录目标为FILE
    • 如果log_output在启动时指定,则其值为列表中一个或多个逗号分隔的单词的列表,这些单词选自TABLE(登录到表),FILE(登录到文件)或NONE(不登录到表或文件)。NONE(如果存在)优先于任何其他说明符。

    general_log系统变量控制记录到一般查询日志选定的日志目的地。如果在服务器启动时指定,general_log则使用可选参数1或0启用或禁用日志。要指定文件记录的默认名称以外的其他文件名,请设置general_log_file变量。同样,slow_query_log变量控制着将慢速查询日志记录到所选目标的日志中,并且该设置slow_query_log_file指定用于文件日志记录的文件名。如果启用了任何一个日志,则服务器将打开相应的日志文件并向其中写入启动消息。但是,除非进行以下操作,否则不会将查询进一步记录到文件中FILE已选择日志目标。

    例子:

    • 要将常规查询日志条目写入日志表和日志文件,请使用--log_output=TABLE,FILE来选择两个日志目标并--general_log启用常规查询日志。
    • 要编写通用和慢查询日志条目仅在日志表,使用--log_output=TABLE选择表作为日志目标,并且--general_log--slow_query_log同时启用日志。
    • 要将慢速查询日志条目仅写入日志文件,请使用--log_output=FILE选择文件作为日志目标并--slow_query_log启用慢速查询日志。在这种情况下,由于默认的日志目标是FILE,因此您可以省略该log_output设置。

    运行时的日志控制

    与日志表和文件相关联的系统变量可以对日志进行运行时控制:

    • log_output变量指示当前的日志记录目标。可以在运行时对其进行修改以更改目标。
    • general_logslow_query_log变量指示一般查询日志和慢查询日志是否已启用(ON)或禁用(OFF)。您可以在运行时设置这些变量,以控制是否启用日志。
    • general_log_fileslow_query_log_file变量指示一般查询日志和慢查询日志文件的名称。您可以在服务器启动时或在运行时设置这些变量,以更改日志文件的名称。
    • 要为当前会话禁用或启用常规查询日志记录,请将会话sql_log_off变量设置为ONOFF。(这假定常规查询日志本身已启用。)

    日志表的优点和特征

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

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

      SHOW CREATE TABLE mysql.general_log;
      SHOW CREATE TABLE mysql.slow_log;
      
    • 日志内容可通过SQL语句访问。这样可以使用仅选择满足特定条件的日志条目的查询。例如,要选择与特定客户端关联的日志内容(这对于从该客户端识别有问题的查询很有用),使用日志表比使用日志文件更容易做到这一点。
    • 可以通过任何可以连接到服务器并发出查询的客户端远程访问日志(如果客户端具有适当的日志表特权)。无需登录到服务器主机并直接访问文件系统。

    日志表实现具有以下特征:

    • 通常,日志表的主要目的是为用户提供一个界面,以观察服务器的运行时执行,而不干扰服务器的运行时执行。
    • CREATE TABLEALTER TABLEDROP TABLE是对日志表的有效操作。对于ALTER TABLEDROP TABLE,日志表无法使用,必须禁用,如下所述。
    • 默认情况下,日志表使用CSV以逗号分隔的值格式写入数据的存储引擎。对于有权访问.CSV包含日志表数据的文件的用户,这些文件很容易导入到其他程序中,例如可以处理CSV输入的电子表格。

      可以更改日志表以使用MyISAM存储引擎。您不能ALTER TABLE用来更改正在使用的日志表。必须先禁用日志。没有比其他引擎CSV或者MyISAM是合法的日志表。

      日志表和“打开的文件太多”错误。如果选择TABLE作为日志目标并且日志表使用CSV存储引擎,则可能会发现在运行时重复禁用和启用常规查询日志或慢速查询日志.CSV会导致该文件的许多打开文件描述符,可能会导致“打开的文件太多”错误。要变通解决此问题,执行FLUSH TABLES或确保的值open_files_limit大于的值table_open_cache_instances

    • 要禁用日志记录,以便您可以更改(或删除)日志表,可以使用以下策略。该示例使用常规查询日志。慢查询日志的过程类似,但是使用slow_log表和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是对日志表的有效操作。它可用于使日志条目过期。
    • RENAME TABLE是对日志表的有效操作。您可以使用以下策略自动重命名日志表(例如,执行日志轮换):

      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是对日志表的有效操作。
    • LOCK TABLES不能在日志表上使用。
    • INSERTDELETEUPDATE不能在日志表上使用。这些操作仅在服务器内部允许。
    • FLUSH TABLES WITH READ LOCKread_only系统变量的状态对日志表没有影响。服务器始终可以写入日志表。
    • 写入日志表的条目不会写入二进制日志,因此不会复制到从属服务器。
    • 要刷新日志表或日志文件,请分别使用FLUSH TABLESFLUSH LOGS
    • 不允许对日志表进行分区。
    • 一个mysqldump的转储包括报表中重新创建这些表,以便它们不会重新加载转储文件后失踪。日志表的内容不转储。

    错误日志

    本节讨论如何配置MySQL服务器以将诊断消息记录到错误日志中。有关选择错误消息字符集或语言的信息,请或“设置错误消息语言”。

    错误日志包含mysqld启动和关闭时间的记录。它还包含诊断消息,例如错误,警告和注释,它们在服务器启动和关闭期间以及服务器运行期间发生。例如,如果mysqld注意到需要自动检查或修复表,它将向错误日志中写入一条消息。

    在某些操作系统上,如果mysqld异常退出,则错误日志包含堆栈跟踪。该跟踪可用于确定mysqld退出的位置。请参见“调试和移植MySQL”。

    如果用于启动mysqld,则mysqld_safe可能会将消息写入错误日志。例如,当mysqld_safe注意到异常的mysqld退出时,它将重新启动mysqld并将mysqld restarted消息写入错误日志。

    以下各节讨论配置错误日志记录的各个方面。

    错误日志组件配置

    在MySQL 8.0中,错误记录使用“ MySQL服务器组件”中所述的MySQL组件体系结构。错误日志子系统由执行日志事件过滤和写入的组件以及配置要启用哪些组件以实现所需的日志记录结果的系统变量组成。

    本节讨论如何选择组件以进行错误记录。有关特定于日志过滤器的说明,有关特定于JSON和系统日志编写器的说明,请参见“JSON 数据类型”和“将错误记录到系统日志”。有关所有可用日志组件的更多详细信息,

    基于组件的错误日志记录提供以下功能:

    • 日志事件可以由过滤器组件过滤,以影响可用于写入的信息。
    • 日志事件由接收器(写入器)组件输出。可以启用多个接收器组件,以将错误日志输出写入多个目标。
    • 内置的过滤器和编写器组件结合起来可以实现默认的错误日志格式。
    • 可加载的编写器启用以JSON格式记录。
    • 可加载的编写器允许登录到系统日志。
    • 系统变量控制要启用的日志组件以及每个组件的运行方式。

    log_error_services哪个日志组件系统变量控制以启用错误日志记录。该变量可以包含具有0、1或许多元素的列表。在后一种情况下,元素可以用分号或(从MySQL 8.0.12开始)逗号分隔,并可选地后跟空格。给定的设置不能同时使用分号和逗号分隔符。组件顺序很重要,因为服务器按照列出的顺序执行组件。

    默认情况下,log_error_services具有以下值:

    mysql> SELECT @@GLOBAL.log_error_services;
    +----------------------------------------	+
    | @@GLOBAL.log_error_services             |
    +----------------------------------------	+
    | log_filter_internal; log_sink_internal  |
    +----------------------------------------	+
    

    该值指示日志事件首先通过内置过滤器组件log_filter_internal,然后再通过内置日志写入器组件log_sink_internal。过滤器修改日志事件,该事件由log_error_services值中稍后命名的组件看到。接收器是日志事件的目的地。通常,接收器将日志事件处理为具有特定格式的日志消息,并将这些消息写入其关联的输出,例如文件或系统日志。

    注意

    分配log_error_services不包含编写器组件的值将导致从该点开始不写入日志输出。

    log_error_services值的最后一个组成部分应该是作家。如果最终组件是过滤器,则该组件无效,因为过滤后的事件不会发送到任何编写器。

    组合log_filter_internal,并log_sink_internal实现默认的错误日志过滤和输出行为。这些组件的操作受其他服务器选项和系统变量影响:

    • 输出目标由--log-error选项确定(在Windows上,--pid-file--console)。它们确定是将错误消息写入控制台还是文件,如果写入文件,则确定错误日志文件名。
    • log_error_verbositylog_error_suppression_list系统变量影响哪些类型的日志事件log_filter_internal许可证或者抑制。

    要更改用于错误日志记录的日志组件集,请根据需要加载组件并修改log_error_services值。添加或删除日志组件受以下约束:

    • 要启用日志组件,请首先使用加载它INSTALL COMPONENT(除非它是内置的或已经加载的),然后在log_error_services值中列出该组件。

      对于允许log_error_services值包含的组件,必须知道它。组件是内置的,还是可加载的并且已使用加载的组件是已知的INSTALL COMPONENT。尝试在服务器启动时命名未知组件会导致log_error_services其设置为默认值。尝试在运行时命名未知组件会产生错误,并且该log_error_services值保持不变。

    • 要禁用日志组件,请将其从log_error_services值中删除。然后,如果该组件是可加载的,并且您还想卸载它,请使用UNINSTALL COMPONENT

      尝试用于UNINSTALL COMPONENT卸载仍在log_error_services值中命名的可加载组件会产生错误。

    例如,要使用系统日志编写器(log_sink_syseventlog)而不是默认编写器(log_sink_internal),请首先加载编写器组件,然后修改log_error_services值:

    INSTALL COMPONENT 'file://component_log_sink_syseventlog';
    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_syseventlog';
    
    注意

    用于加载日志组件的URN INSTALL COMPONENT是前缀为的组件名称file://component_。例如,对于该log_sink_syseventlog组件,对应的URN为file://component_log_sink_syseventlog

    可以配置多个日志记录器,从而可以将输出发送到多个目标。除了(而不是代替)默认写程序,要启用系统日志写程序,请按以下方式设置log_error_services值:

    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal; log_sink_syseventlog';
    

    要恢复为仅使用默认编写器并卸载系统日志编写器,请执行以下语句:

    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal;
    UNINSTALL COMPONENT 'file://component_log_sink_syseventlog';
    

    要配置在每次服务器启动时启用的日志组件,请使用以下过程:

    1. 如果组件是可加载的,请在运行时使用加载它INSTALL COMPONENT。加载组件会将其注册到mysql.component系统表中,以便服务器自动加载它以用于后续启动。
    2. log_error_services在启动时设置值以包括组件名称。在服务器my.cnf文件中设置值,或使用SET PERSIST,为正在运行的MySQL实例设置值,并保存该值以用于随后的服务器重启;请参见“变量分配的SET语法”。设置的值在my.cnf下次重启时生效。使用设置的值将SET PERSIST立即生效,并在随后的重启中生效。

    假设您想要配置,为每个服务器启动时,使用JSON日志作家(中log_sink_json除)内置日志过滤器和作家(log_filter_internallog_sink_internal)。如果未加载JSON书写器,请首先加载它:

    INSTALL COMPONENT 'file://component_log_sink_json';
    

    然后设置log_error_services为在服务器启动时生效。您可以在my.cnf以下位置进行设置:

    [mysqld]
    log_error_services='log_filter_internal; log_sink_internal; log_sink_json'
    

    或者您可以使用SET PERSIST以下命令进行设置:

    SET PERSIST log_error_services = 'log_filter_internal; log_sink_internal; log_sink_json';
    

    中命名的组件的顺序log_error_services很重要,尤其是相对于过滤器和编写器的相对顺序而言。考虑以下log_error_services值:

    log_filter_internal; log_sink_1; log_sink_2
    

    在这种情况下,日志事件将传递到内置过滤器,然后传递给第一个编写器,然后传递给第二个编写器。两位作者都接收到过滤后的日志事件。

    将其与此log_error_services值进行比较:

    log_sink_1; log_filter_internal; log_sink_2
    

    在这种情况下,日志事件将传递给第一个编写器,然后传递给内置过滤器,再传递给第二个编写器。第一作者收到未过滤的事件。第二个编写器接收已过滤的事件。如果希望一个日志包含所有日志事件的消息,而另一个日志仅包含部分日志事件的消息,则可以以这种方式配置错误日志记录。

    默认错误日志目标配置

    本节讨论哪些服务器选项配置默认错误日志目标,该目标可以是控制台或命名文件。它还指示哪些日志记录器组件将其自己的输出目标基于默认目标。

    在本讨论中,“控制台”是指stderr,标准错误输出。除非标准错误输出已重定向到其他目标,否则这是您的终端或控制台窗口。

    服务器解释用于确定默认错误日志目标的选项,对于Windows和Unix系统而言有所不同。确保使用适合您平台的信息来配置目标:

    • 对于Windows,请参阅Windows上的默认错误日志目标。
    • 对于Unix和类似Unix的系统,请参见Unix和类似Unix的系统上的默认错误日志目标。

    服务器解释了默认错误日志目标选项后,它将设置log_error系统变量以指示默认目标,这会影响多个日志编写器组件在何处写入错误消息。请参见默认错误日志目标如何影响日志编写器。

    • Windows上的默认错误日志目标
    • Unix和类似Unix的系统上的默认错误日志目标
    • 默认错误日志目标如何影响日志编写器

    Windows上的默认错误日志目标

    在Windows上,mysqld的使用--log-error--pid-file--console选项来确定默认的错误日志目的地是否是控制台或文件,并且,如果一个文件,文件名:

    • 如果--console给出,则默认目标是控制台。(如果同时提供--console--log-error两者,则优先于此,并且以下有关项目--log-error均不适用。)
    • 如果--log-error未指定,或者未指定文件名,则默认目标是host_name.err在数据目录中命名的文件,除非--pid-file指定了该选项。在这种情况下,文件名是PID文件的基本名称,.err在数据目录中带有后缀。
    • 如果--log-error为文件命名,则默认目标是.err位于数据目录下的文件(如果没有后缀,则添加后缀),除非给出绝对路径名以指定其他位置。

    如果默认错误日志目标是控制台,则服务器将log_error系统变量设置为stderr。否则,默认目标是文件,服务器将设置log_error为文件名。

    Unix和类似Unix的系统上的默认错误日志目标

    在Unix和类Unix系统上,mysqld使用该--log-error选项来确定默认错误日志目标是控制台还是文件,如果是文件,则使用文件名:

    • 如果--log-error未给出,则默认目标是控制台。
    • 如果--log-error给出时未命名文件,则默认目标是host_name.err在数据目录中命名的文件。
    • 如果--log-error为文件命名,则默认目标是.err位于数据目录下的文件(如果没有后缀,则添加后缀),除非给出绝对路径名以指定其他位置。
    • 如果--log-error在选项文件中给出的[mysqld][server][mysqld_safe]部分,mysqld_safe的查找并使用的选项,并将其传递到mysqld的
    注意

    在Yum或APT软件包安装中,通常/var/log使用诸如log-error=/var/log/mysqld.log服务器配置文件中的选项来配置错误日志文件位置。从选项中删除文件名将导致host_name.err使用数据目录中的文件。

    如果默认错误日志目标是控制台,则服务器将log_error系统变量设置为stderr。否则,默认目标是文件,服务器将设置log_error为文件名。

    默认错误日志目标如何影响日志编写器

    服务器解释错误日志目标配置选项后,将设置log_error系统变量以指示默认错误日志目标。日志编写器组件可以基于该log_error值自己的输出目标,也可以独立于其确定目标log_error

    如果log_errorstderr,则默认错误日志目标是控制台,并且将其输出目标基于默认目标的日志编写器也将写入控制台:

    • log_sink_internallog_sink_jsonlog_sink_test:这些作家写到控制台。即使对于log_sink_json可以多次启用的编写器也是如此。所有实例均写入控制台。
    • log_sink_syseventlog:无论log_error数值如何,写入器都会写入系统日志。

    如果log_error不是stderr,则默认错误日志目标是文件,并log_error指示文件名。日志编写器的输出目标基于默认的目标输出文件,该输出文件基于该文件名命名。(作者可以使用该名称,也可以使用其变体。)假设log_errorvalue为file_name。然后日志编写者使用如下名称:

    • log_sink_internallog_sink_test:这些作家写信给file_name
    • log_sink_json:在log_error_services值中命名的该writer的连续实例将写入文件file_name加上一个带数字后缀:,的文件,依此类推。.NN.jsonfile_name.00.jsonfile_name.01.json
    • log_sink_syseventlog:无论log_error数值如何,写入器都会写入系统日志。

    错误日志过滤的类型

    错误日志配置通常包括一个日志过滤器组件和一个或多个日志编写器组件。对于错误日志过滤,MySQL提供了以下组件选择:

    • log_filter_internal:此过滤器组件根据和事件log_error_verbositylog_error_suppression_list系统变量结合日志事件优先级和错误代码提供错误日志过滤。log_filter_internal内置并默认启用。
    • log_filter_dragnet:此过滤器组件可结合用户dragnet.log_error_filter_rules变量和系统变量,提供基于用户提供的规则的错误日志过滤。

    基于优先级的错误日志过滤(log_filter_internal)

    log_filter_internal日志过滤器组件实现日志的一个简单的形式滤波基于误差事件优先级和错误代码。要影响如何log_filter_internal允许或禁止用于错误日志的错误,警告和信息事件,请设置log_error_verbositylog_error_suppression_list系统变量。

    log_filter_internal内置并默认启用。如果此过滤器被禁用log_error_verbosity并且log_error_suppression_list无效,那么必须使用其他过滤器服务来对过滤进行建模,而不是在需要的地方(例如,使用时使用单独的过滤规则log_filter_dragnet)。有关过滤器配置的信息,

    • 详细度过滤
    • 抑制列表过滤
    • 详细度和抑制列表交互

    详细度过滤

    用于错误日志事件具有的优先级ERRORWARNINGINFORMATION。所述log_error_verbosity系统变量控制冗长基于其优先级以允许在写入日志消息,如图所示,在下表中。

    允许的邮件优先级log_error_verbosity值
    ERROR1个
    ERRORWARNING2
    ERRORWARNINGINFORMATION3

    如果log_error_verbosity为2或更大,则服务器记录有关对于基于语句的日志记录不安全的语句的消息。如果值为3,则服务器将记录中止的连接和访问被拒绝的错误,以进行新的连接尝试。请参见第B.4.2.10节“通信错误和中止的连接”。

    如果使用复制,log_error_verbosity建议使用2或更大的值,以获得有关正在发生的事情的更多信息,例如有关网络故障和重新连接的消息。

    如果log_error_verbosity在从属服务器上大于等于2,则从属服务器会将错误消息打印到错误日志中,以提供有关其状态的信息,例如二进制日志和中继日志坐标(从其开始工作时,切换到另一个中继日志时,断开连接后重新连接,依此类推。

    还有一个优先级SYSTEM。无论log_error_verbosity值如何,有关非错误情况的系统消息都会打印到错误日志中。这些消息包括启动和关闭消息,以及对设置的一些重大更改。

    在MySQL错误日志中,系统消息标记为“ System ”。其他日志编写者可能遵循或未遵循相同的约定,并且在生成的日志中,可能会为系统消息分配用于信息优先级的标签,例如“ Note ”或“ Information ”。如果您基于消息的标签对日志记录应用任何其他过滤或重定向,系统消息不会覆盖您的过滤器,但由过滤器以与其他消息相同的方式进行处理。

    抑制列表过滤

    log_error_suppression_list系统变量适用于用于错误日志,并指定其当它们的优先级发生的事件打压的事件WARNINGINFORMATION。例如,如果某种特定类型的警告由于频繁发生但不被关注而在错误日志中被认为是不希望的“噪音”,则可以将其抑制。

    log_error_suppression_list值可以是无抑制的空字符串,也可以是一个或多个逗号分隔值的列表,这些值指示要抑制的错误代码。错误代码可以以符号或数字形式指定。可以指定带或不带MY-前缀的数字代码。数字部分中的前导零并不重要。允许的代码格式示例:

    ER_SERVER_SHUTDOWN_COMPLETE
    MY-000031
    000031
    MY-31
    31
    

    从可读性和可移植性的角度来看,符号值优于数字值。

    尽管要抑制的代码可以用符号或数字形式表示,但是每个代码的数值必须在允许的范围内:

    • 1至999:服务器和客户端使用的全局错误代码。
    • 10000及更高版本:服务器错误代码,打算将其写入错误日志(不发送给客户端)。

    另外,指定的每个错误代码实际上必须由MySQL使用。尝试指定不在允许范围内或不在允许范围内但未被MySQL使用的代码会产生错误,并且该log_error_suppression_list值保持不变。

    有关错误代码范围以及每个范围内定义的错误符号和编号的信息,请参阅附录B,错误,错误代码和常见问题

    服务器可以以不同的优先级为给定的错误代码生成消息,因此是否禁止与其中列出的错误代码相关的消息log_error_suppression_list取决于其优先级。假设变量的值为'ER_PARSER_TRACE,MY-010001,10002'。然后log_error_suppression_list具有以下效果:

    • 如果生成优先级为WARNING或的消息,则这些代码的消息将被抑制INFORMATION
    • 优先级为ERRORSYSTEM不禁止显示的消息。
    详细度和抑制列表交互

    log_error_verbosity结合的效果log_error_suppression_list。考虑使用以下设置启动的服务器:

    [mysqld]
    log_error_verbosity=2     # error and warning messages only
    log_error_suppression_list='ER_PARSER_TRACE,MY-010001,10002'
    

    在这种情况下,log_error_verbosity允许具有ERRORWARNING优先级的消息,并丢弃具有INFORMATION优先级的消息。在未log_error_suppression_list丢弃的消息中,WARNING优先丢弃消息和任何命名的错误代码。

    注意

    log_error_verbosity示例中显示的值2也是其默认值,因此该变量对INFORMATION消息的影响如默认情况下所描述,而没有显式设置。log_error_verbosity如果要log_error_suppression_list影响INFORMATION优先级的消息,则必须设置为3 。

    考虑使用此设置启动的服务器:

    [mysqld]
    log_error_verbosity=1     # error messages only
    

    在这种情况下,log_error_verbosity允许具有ERROR优先级的消息,并丢弃具有WARNINGINFORMATION优先级的消息。设置log_error_suppression_list不会产生任何效果,因为设置可能会丢弃所有可能抑制的错误代码log_error_verbosity


    基于规则的错误日志过滤(log_filter_dragnet)

    log_filter_dragnet日志过滤器组件能够基于用户定义的规则日志过滤。要定义适用的规则,请设置dragnet.log_error_filter_rules系统变量。

    要启用log_filter_dragnet过滤器,请先加载过滤器组件,然后修改log_error_services值。以下示例log_filter_dragnet与内置日志编写器结合使用:

    INSTALL COMPONENT 'file://component_log_filter_dragnet';
    SET GLOBAL log_error_services = 'log_filter_dragnet; log_sink_internal';
    

    要设置log_error_services为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。

    随着log_filter_dragnet启动,通过设置定义它的过滤规则dragnet.log_error_filter_rules系统变量。规则集由零个或多个规则组成,其中每个规则都是IF以句点(.)字符结尾的语句。如果变量值为空(零规则),则不会进行过滤。

    示例1.此规则集删除信息事件,而对于其他事件,则删除该source_line字段:

    SET GLOBAL dragnet.log_error_filter_rules =
    'IF prio>=INFORMATION THEN drop. IF EXISTS source_line THEN unset source_line.';
    

    效果类似于设置为的过滤器执行的log_sink_internal过滤log_error_verbosity=2

    示例2:此规则将信息事件限制为每60秒不超过一个:

    SET GLOBAL dragnet.log_error_filter_rules =
    'IF prio>=INFORMATION THEN throttle 1/60.';
    

    设置完所需的过滤配置后,请考虑分配dragnet.log_error_filter_rules使用,SET PERSIST而不是SET GLOBAL使设置在服务器重新启动后持续存在。或者,将设置添加到服务器选项文件。

    要停止使用过滤语言,请首先从错误日志记录组件集中将其删除。通常,这意味着使用其他过滤器组件而不是不使用过滤器组件。例如:

    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_internal';
    

    同样,请考虑使用using SET PERSIST而不是SET GLOBAL使设置在服务器重新启动后保持不变。

    然后卸载过滤器log_filter_dragnet组件:

    UNINSTALL COMPONENT 'file://component_log_filter_dragnet';
    

    以下各节log_filter_dragnet更详细地描述了操作方面:

    • log_filter_dragnet规则语言
    • log_filter_dragnet规则操作
    • log_filter_dragnet规则字段
    log_filter_dragnet规则语言

    以下语法定义了log_filter_dragnet过滤规则的语言。每个规则都是一个IF以句点(.)字符结尾的语句。语言不区分大小写。

    rule:
    IF condition THEN ction
    [ELSEIF condition THEN ction] ...
    [ELSE ction]
    .
    
    condition: {
    field comparator value
    | [NOT] EXISTS field
    | condition {AND | OR} condition
    }
    
    ction: {
    drop
    | throttle {count | count / window_size}
    | set field [:= | =] value
    | unset [field]
    }
    
    field: {
    core_field
    | optional_field
    | user_defined_field
    }
    
    core_field: {
    time
    | msg
    | prio
    | label
    | err_code
    | err_symbol
    | SQL_state
    | subsystem
    }
    
    optional_field: {
    OS_errno
    | OS_errmsg
    | user
    | host
    | thread
    | query_id
    | source_file
    | source_line
    | function
    }
    
    user_defined_field:
    sequence of characters in [ -zA-Z0-9_] class
    
    comparator: {== | != | <
    > | >= | =
    > | <= | =< | < |
    >}
    
    value: {
    string_literal
    | integer_literal
    | float_literal
    | error_symbol
    | priority
    }
    
    count: integer_literal
    window_size: integer_literal
    
    string_literal:
    sequence of characters quoted as '...' or "..."
    
    integer_literal:
    sequence of characters in [0-9] class
    
    float_literal:
    integer_literal[.integer_literal]
    
    error_symbol:
    valid MySQL error symbol such as ER_ACCESS_DENIED_ERROR or ER_STARTUP
    
    priority: {
    ERROR
    | WARNING
    | INFORMATION
    }
    

    简单条件将字段与值或测试字段的存在进行比较。要构造更复杂的条件,请使用ANDOR运算符。两个运算符具有相同的优先级,并从左到右求值。

    要转义字符串中的字符,请在其前面加上反斜杠(\)。需要反斜杠以包含反斜杠本身或字符串引号字符,其他字符可选。

    为了方便起见,log_filter_dragnet支持使用符号名称与某些字段进行比较。在适用的情况下,出于可读性和可移植性的考虑,符号值优于数字值。

    • 事件优先级值1,2,和3可被指定为ERRORWARNING,和INFORMATION。仅在与该prio字段进行比较时才能识别优先级符号。这些比较是等效的:

      IF prio == INFORMATION THEN ...
      IF prio == 3 THEN ...
      
    • 错误代码可以以数字形式或作为相应的错误符号指定。例如,ER_STARTUP是error的符号名1408,因此这些比较是等效的:

      IF err_code == ER_STARTUP THEN ...
      IF err_code == 1408 THEN ...
      

      错误符号仅在与err_code字段和用户定义的字段进行比较时才被识别。

      要查找与给定错误代码编号相对应的错误符号,请使用以下方法之一:

      • 在第B.3.1节“服务器错误消息参考”中检查服务器错误列表。
      • 使用perror命令,当给定错误号参数时,该命令将显示有关错误的信息,包括其符号。

      假设带有错误编号的规则集如下所示:

      IF err_code == 10927 OR err_code == 10914 THEN drop.
      IF err_code == 1131 THEN drop.
      

      使用perror,确定错误符号:

      shell>perror 10927 10914 1131
      MySQL error code MY-010927 (ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED):
      Access denied for user '%-.48s'@'%-.64s'. Account is locked.
      MySQL error code MY-010914 (ER_ABORTING_USER_CONNECTION):
      Aborted connection %u to db: '%-.192s' user: '%-.48s' host:
      '%-.64s' (%-.64s).
      MySQL error code MY-001131 (ER_PASSWORD_ANONYMOUS_USER):
      You are using MySQL as an anonymous user and anonymous users
      are not allowed to change passwords
      

      用错误符号代替数字,规则集变为:

      IF err_code == ER_ACCESS_DENIED_FOR_USER_ACCOUNT_LOCKED
      OR err_code == ER_ABORTING_USER_CONNECTION THEN drop.
      IF err_code == ER_PASSWORD_ANONYMOUS_USER THEN drop.
      

    可以将符号名称指定为带引号的字符串,以便与字符串字段进行比较,但是在这种情况下,名称是没有特殊含义的字符串,并且log_filter_dragnet不会将其解析为相应的数值。同样,可能不会检测到错别字,而SET尝试使用服务器未知的未加引号的符号会立即引发错误。

    log_filter_dragnet规则操作

    log_filter_dragnet在过滤规则中支持以下操作:

    • drop:删除当前的日志事件(不记录)。
    • throttle:应用速率限制来减少符合特定条件的事件的日志详细程度。所述参数指示的速率,在形式countcount/window_size。该count值表示每个时间窗口允许记录的事件数。该window_size值是时间窗口,以秒为单位;如果省略,则默认窗口为60秒。两个值都必须是整数文字。

      该规则将插件关闭消息的速度限制为每60秒5条消息:

      IF err_code == ER_PLUGIN_SHUTTING_DOWN_PLUGIN THEN throttle 5.
      

      此规则将错误和警告限制为每小时1000条,并将信息消息限制为每小时100条:

      IF prio <= INFORMATION THEN throttle 1000/3600 ELSE throttle 100/3600.
      
    • set:为一个字段分配一个值(如果尚未存在,则使该字段存在)。在随后的规则中,EXISTS针对字段名称的测试为true,并且可以通过比较条件来测试新值。
    • unset:丢弃字段。在后续规则中,EXISTS针对字段名称的测试为false,而针对任何值的字段比较为false。

      在特殊情况下,该条件仅指一个字段名,后面的字段名unset是可选的,并unset丢弃命名字段。这些规则是等效的:

      IF myfield == 2 THEN unset myfield.
      IF myfield == 2 THEN unset.
      
    log_filter_dragnet规则字段

    log_filter_dragnet支持规则中的核心,可选和用户定义的字段:

    • 将为错误事件自动设置一个核心字段。但是,不能保证其在事件中的存在,因为核心字段(如任何类型的字段)可能未由过滤规则设置。如果是这样,则该字段将被规则集中的后续规则以及过滤器之后执行的组件(例如日志编写器)丢失。
    • 通常不存在可选字段,但对于某些事件类型可能存在该字段。如果存在,则可选字段会提供适当且可用的其他事件信息。
    • 用户定义的字段是名称尚未定义为核心或可选字段的任何字段。在使用set操作创建之前,用户定义的字段不存在。

    如前面的描述所隐含的,任何给定字段都可能不存在,因为它根本就不存在,或者被过滤规则所丢弃。对于日志编写者,缺少字段的影响是特定于编写者的。例如,编写者可能会从日志消息中忽略该字段,指示该字段丢失,或替换为默认值。如有疑问,请使用过滤器规则取消设置该字段,然后检查日志编写器对该字段的作用。

    这些字段是核心字段:

    • time

      事件时间戳记。

    • msg

      事件消息字符串。

    • prio

      事件优先级,用于指示错误,警告或注释/信息事件。该字段对应于中的严重性syslog

      在比较中,可以将每个优先级指定为符号优先级名称或整数文字。仅在与该prio字段进行比较时才能识别优先级符号。这些比较是等效的:

      IF prio == INFORMATION THEN ...
      IF prio == 3 THEN ...
      

      下表显示了允许的优先级。

      事件类型优先符号数值优先
      错误事件ERROR1个
      警告事件WARNING2
      笔记/信息事件INFORMATION3

      优先级也为SYSTEM,但是系统消息无法过滤,并且始终写入错误日志。

      通常,消息优先级确定如下:

      情况或事件是否可行?

      • 是:情况或事件可忽略吗?

        • 是:优先级为WARNING
        • 否:优先级为ERROR
      • 否:这种情况或事件是强制性的吗?

        • 是:优先级为SYSTEM
        • 否:优先级为INFORMATION

      优先级值遵循以下原则:较高优先级具有较低值,反之亦然。对于最严重的事件(错误),优先级值从1开始,对于优先级降低的事件,优先级值从1开始增加。例如,要丢弃优先级低于警告的事件,请测试高于的优先级值WARNING

      IF prio
      > WARNING THEN drop.
      

      以下示例显示了log_filter_dragnet实现类似于过滤器log_error_verbosity允许的每个值的效果的规则log_filter_internal

      • 仅错误(log_error_verbosity=1):

        IF prio
        > ERROR THEN drop.
        
      • 错误和警告(log_error_verbosity=2):

        IF prio
        > WARNING THEN drop.
        
      • 错误,警告和注意事项(log_error_verbosity=3):

        IF prio
        > INFORMATION THEN drop.
        

        实际上,可以忽略此规则,因为没有prio大于的值INFORMATION,因此有效地它不会丢失任何内容。

    • err_code

      数字事件错误代码。在比较中,可以将要测试的值指定为符号错误名称或整数文字。错误符号仅在与err_code字段和用户定义的字段进行比较时才被识别。这些比较是等效的:

      IF err_code == ER_ACCESS_DENIED_ERROR THEN ...
      IF err_code == 1045 THEN ...
      
    • err_symbol

      事件错误符号,以字符串形式(例如'ER_DUP_KEY')。err_symbol值比过滤器规则比较中更多地用于标识日志输出中的特定行,因为它们log_filter_dragnet不能将指定为字符串的比较值解析为等效的数字错误代码。

    • SQL_state

      事件SQLSTATE值,以字符串形式(例如'23000')。

    • subsystem

      发生事件的子系统。可能的值为InnoDBInnoDB存储引擎),Repl(复制子系统),Server(否则)。

    可选字段分为以下几类:

    有关错误的其他信息,例如操作系统发出的错误或错误标签:

    • OS_errno

      操作系统错误号。

    • OS_errmsg

      操作系统错误消息。

    • label

      prio值对应的标签,以字符串形式。筛选器规则可以更改支持自定义标签的日志编写器的标签。label值比过滤规则比较中更多地用于标识日志输出中的特定行,因为它们log_filter_dragnet不会将指定为字符串的比较值解析为等效的数字优先级。

    标识事件发生的客户端:

    • user

      客户端用户。

    • host

      客户端主机。

    • thread

      线程ID。

    • query_id

      查询ID。

    调试信息:

    • source_file

      发生事件的源文件。文件名应省略任何前导路径。例如,要测试sql/gis/distance.cc文件,请编写如下比较:

      IF source_file == "distance.cc" THEN ...
      
    • source_line

      源文件中发生事件的行。

    • function

      事件发生的功能。

    • component

      发生事件的组件或插件。

    JSON格式的错误记录

    本节介绍如何使用内置过滤器log_filter_internal和JSON编写器配置错误日志记录log_sink_json,以立即生效并在随后的服务器启动中生效。有关配置错误日志记录的一般信息,

    要启用JSON编写器,请首先加载编写器组件,然后修改log_error_services值:

    INSTALL COMPONENT 'file://component_log_sink_json';
    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_json';
    

    要设置log_error_services为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。

    允许log_sink_jsonlog_error_services值中多次命名。例如,要为一个实例编写未过滤的事件,为另一个实例编写过滤的事件,可以这样设置log_error_services

    SET GLOBAL log_error_services = 'log_sink_json; log_filter_internal; log_sink_json';
    

    JSON日志编写器根据默认错误日志目标(由log_error系统变量指定)确定其输出目标。如果log_error命名文件,则JSON 编写器将基于该文件名加上一个带编号的后缀(从00开始)来命名输出文件。例如,如果为is ,则值中连续的named 实例将写入,等等。.NN.jsonNNlog_errorfile_namelog_sink_jsonlog_error_servicesfile_name.00.jsonfile_name.01.json

    如果log_errorstderr,则JSON编写器将写入控制台。如果log_json_writerlog_error_services值中多次命名它们,它们都将写入控制台,这可能没有用。


    错误记录到系统日志

    可能mysqld将错误日志写入系统日志(Windows,syslogUnix和类似Unix的系统上的事件日志)。

    本节介绍如何使用内置过滤器log_filter_internal和系统日志编写器配置错误日志记录log_sink_syseventlog,以立即生效并随后启动服务器。有关配置错误日志记录的一般信息,

    要启用系统日志编写器,请首先加载编写器组件,然后修改log_error_services值:

    INSTALL COMPONENT 'file://component_log_sink_syseventlog';
    SET GLOBAL log_error_services = 'log_filter_internal; log_sink_syseventlog';
    

    要设置log_error_services为在服务器启动时生效,请使用“错误日志组件配置”中的说明。这些指令也适用于其他错误记录系统变量。

    注意

    对于MySQL 8.0配置,必须显式启用将错误日志记录到系统日志中。这与MySQL 5.7和更早版本不同,MySQL 5.7和更早版本的Windows默认情况下启用了将错误日志记录到系统日志的功能,并且在所有平台上都不需要加载组件。

    错误记录到系统日志中可能需要其他系统配置。请查阅所用平台的系统日志文档。

    在Windows上,写入应用程序日志中事件日志的错误消息具有以下特征:

    • 标记为ErrorWarning和的条目Note将写入事件日志,但不会写入消息(例如来自各个存储引擎的信息语句)。
    • 事件日志条目的来源MySQL(或如果定义为)。MySQL-tagsyseventlog.tagtag

    在Unix和类似Unix的系统上,使用登录到系统日志syslog。以下系统变量会影响syslog消息:

    • syseventlog.facilitysyslog消息的默认功能是daemon。设置此变量以指定其他功能。
    • syseventlog.include_pid:是否在每行syslog输出中包括服务器进程ID 。
    • syseventlog.tag:此变量定义了一个标签,该标签将添加到消息中的服务器标识符(mysqld)中syslog。如果已定义,则标签将以前导连字号附加到标识符。
    注意

    在此之前的MySQL 8.0.13,使用log_syslog_facilitylog_syslog_include_pidlog_syslog_tag系统变量,而不是变量。syseventlog.xxx

    MySQL将自定义标签“ System ”用于有关非错误情况的重要系统消息,例如启动,关闭以及对设置的一些重大更改。在不支持自定义标签的日志中,包括Windows syslog上的“事件日志”,以及在Unix和类似Unix的系统上,会为系统消息分配用于信息优先级的标签。但是,即使MySQL log_error_verbosity设置通常在信息级别排除消息,这些消息也会打印到日志中。

    当日志编写者必须以这种方式退回到“信息”而不是“系统”的标签,并且日志事件在MySQL服务器之外进一步处理(例如,由syslog配置过滤或转发)时,这些事件可能默认情况下,辅助应用程序将其作为“信息”优先级而不是“系统”优先级进行处理。

    错误日志消息格式

    每个错误日志接收器(写入器)组件都有一种特征输出格式,用于将消息写入其目的地,但是其他因素可能会影响消息的内容:

    • 日志编写器可用的信息。如果在执行写入程序组件之前执行的日志过滤器组件删除了日志事件属性,则该属性不可用于写入。有关日志过滤的信息,
    • 系统变量可能会影响日志编写器。请参阅影响错误日志格式的系统变量。

    对于所有日志编写器,错误日志消息中包含的ID是mysqld中负责编写消息的线程的ID 。这表明服务器的哪个部分产生了该消息,并且与常规查询日志和慢速查询日志消息(包括连接线程ID)一致。

    • log_sink_internal的输出格式
    • log_sink_json的输出格式
    • log_sink_syseventlog的输出格式
    • 早期启动日志记录的输出格式
    • 影响错误日志格式的系统变量

    log_sink_internal的输出格式

    该日志编写器生成传统的错误日志输出。它使用以下格式写消息:

    timestamp thread_id [priority] [err_code] [subsystem] message
    

    []方括号字符是在消息格式文本字符。它们并不表示字段是可选的。

    在和领域在MySQL 8.0中添加。它们将在旧服务器生成的日志中丢失。日志解析器可以将这些字段视为消息文本的一部分,仅在服务器最近写入的日志(包括它们)中才会出现。解析器必须将指标的一部分视为字符串值。[err_code][subsystem]err_code[err_code]

    例子:

    2018-03-22T12:35:47.538083Z 0 [Note] [MY-012487] [InnoDB] InnoDB: DDL log recovery : begin
    2018-03-22T12:35:47.550565Z 0 [Warning] [MY-010068] [Server] CA certificate /var/mysql/sslinfo/cacert.pem is self signed.
    2018-03-22T12:35:47.669397Z 4 [Note] [MY-010051] [Server] Event Scheduler: scheduler thread started with id 4
    2018-03-22T12:35:47.550939Z 0 [Note] [MY-010253] [Server] IPv6 is available.
    
    log_sink_json的输出格式

    JSON格式的日志编写器将消息生成为包含键值对的JSON对象。例如:

    { "prio": 3, "err_code": 10051, "subsystem": "Server",
    "source_file": "event_scheduler.cc", "function": "run",
    "msg": "Event Scheduler: scheduler thread started with id 4",
    "time": "2018-03-22T12:35:47.669397Z", "thread": 4,
    "err_symbol": "ER_SCHEDULER_STARTED", "SQL_state": "HY000",
    "label": "Note" }
    

    log_sink_syseventlog的输出格式

    系统日志编写器产生的输出符合本地平台上使用的系统日志格式。

    早期启动日志记录的输出格式

    服务器在处理启动选项之前以及因此知道错误日志设置(例如log_error_verbosity和和log_timestamps值)以及要使用的日志组件之前,会生成一些错误日志消息。服务器处理在启动过程早期生成的错误日志消息,如下所示:

    • 在MySQL 8.0.14之前,服务器生成具有默认时间戳,格式和详细级别的消息,并对其进行缓冲。处理启动选项并知道错误日志配置后,服务器将刷新缓冲的消息。由于这些早期消息使用默认的日志配置,因此它们可能与启动选项所指定的不同。此外,除了默认值以外,早期消息不会刷新到日志编写器。例如,登录到JSON编写器不包括这些早期消息,因为它们不是JSON格式。
    • 从MySQL 8.0.14开始,服务器缓冲日志事件而不是格式化日志消息。这样一来,它便可以在已知设置后将配置设置追溯应用到那些事件,结果刷新的消息将使用配置的设置,而不是默认设置。同样,消息将刷新到所有已配置的编写器,而不仅仅是默认的编写器。

      如果在知道日志配置之前发生了致命错误,并且服务器必须退出,则服务器不会丢失。如果没有发生致命错误,但是在处理启动选项之前启动速度过慢,则服务器会使用日志记录默认值定期格式化和刷新缓冲的消息,以免显得无响应。尽管这些行为与8.0.14之前的行为类似,但使用的是默认值,但在出现异常情况时,它们比丢失消息更好。

    影响错误日志格式的系统变量

    log_timestamps系统变量控制在写入错误日志消息时间戳的时区(以及一般查询日志和慢查询日志文件)。允许的值为UTC(默认值)和SYSTEM(本地系统时区)。

    错误日志文件刷新和重命名

    如果使用FLUSH ERROR LOGSFLUSH LOGSmysqladmin flush-logs刷新错误日志,则服务器将关闭并重新打开其正在写入的任何错误日志文件。要重命名错误日志文件,请在刷新前手动进行重命名。刷新日志,然后使用原始文件名打开一个新文件。例如,假设日志文件名为host_name.err,以重命名该文件并创建一个新文件,请使用以下命令:

    mv host_name.err host_name.err-old
    mysqladmin flush-logs
    mv host_name.err-old backup-directory
    

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

    如果错误日志文件的位置无法由服务器写入,则日志刷新操作将无法创建新的日志文件。例如,在Linux上,服务器可能将错误日志写入该/var/log/mysqld.log文件,该/var/log目录rootmysqld拥有并且不可写。有关处理这种情况的信息,请参见“服务器日志维护”。

    如果服务器未写入命名的错误日志文件,则刷新错误日志时不会发生任何错误日志文件重命名。

    通用查询日志

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

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

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

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

    但是,在使用基于行的二进制日志记录时,更新是作为行更改而不是SQL语句发送的,因此,当binlog_formatis 时,这些语句永远不会写入查询日志ROW。当此变量设置为时MIXED,给定的更新也可能不会写入查询日志,具体取决于所使用的语句。有关更多信息,请参见“复制格式”。

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

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

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

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

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

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