Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

6.5.1.3 MySQL 客户端日志记录

客户端 mysql 可以对交互式执行的语句进行以下类型的日志记录:

  • 在 Unix 上,mysql 将语句写入历史文件。默认情况下,该文件名为 .mysql_history,位于您的主目录中。要指定不同的文件,请设置 MYSQL_HISTFILE 环境变量的值。

  • 在所有平台上,如果给定 --syslog 选项,mysql 将语句写入系统日志设施。在 Unix 上,这是 syslog;在 Windows 上,这是 Windows 事件日志。日志消息的目标位置取决于系统。在 Linux 上,目标通常是 /var/log/messages 文件。

以下讨论描述了所有日志类型的共同特征,并提供了每种日志类型的信息。

日志记录如何发生

对于每个启用的日志目标,语句日志记录如下所示:

  • 仅当交互式执行语句时才记录语句。例如,从文件或管道读取的语句是非交互式的。还可以使用 --batch--execute 选项来抑制语句日志记录。

  • 如果语句与“忽略”列表中的任何模式匹配,则忽略该语句并且不记录。

  • mysql 将每个非忽略、非空语句行单独记录。

  • 如果一个非忽略语句跨越多行(不包括终止符),mysql 将连接这些行以形成完整的语句,将换行符映射到空格,并记录结果,包括一个分隔符。

因此,跨越多行的输入语句可能会被记录两次。考虑以下输入:

mysql> SELECT
    -> 'Today is'
    -> ,
    -> CURDATE()
    -> ;

在这种情况下,mysql 将记录 SELECT'Today is',CURDATE(); 行,因为它读取它们。它还记录完整的语句,包括将 SELECT\n'Today is'\n,\nCURDATE() 映射到 SELECT 'Today is' , CURDATE(),加上一个分隔符。因此,这些行将出现在日志输出中:

SELECT
'Today is'
,
CURDATE()
;
SELECT 'Today is' , CURDATE();

mysql 忽视日志目的语句,如果它们与“忽略”列表中的任何模式匹配。默认情况下,该列表是 "*IDENTIFIED*:*PASSWORD*",以忽略与密码相关的语句。模式匹配不区分大小写。在模式中,两个字符是特殊的:

  • ? 匹配任何单个字符。

  • * 匹配任何序列的零个或多个字符。

要指定其他模式,请使用 --histignore 选项或设置 MYSQL_HISTIGNORE 环境变量。(如果两者都指定,则选项值优先。)该值应是一个或多个以冒号分隔的模式列表,这些模式将追加到默认模式列表中。

命令行上的模式可能需要被引号或转义,以防止命令解释器对其进行特殊处理。例如,要抑制 UPDATE 和 DELETE 语句的日志记录,以及与密码相关的语句,可以像这样调用 mysql

mysql --histignore="*UPDATE*:*DELETE*"
历史文件控制

文件 .mysql_history 应该使用限制性访问模式保护,因为可能写入敏感信息,例如包含密码的 SQL 语句。请参阅 第 8.1.2.1 节,“用户密码安全指南”。文件中的语句可以从 mysql 客户端中通过使用 上箭头 键回忆历史记录。请参阅 禁用交互式历史记录

如果您不想维护历史文件,首先删除 .mysql_history 文件(如果存在)。然后使用以下技术之一来防止其再次创建:

  • 将环境变量 MYSQL_HISTFILE 设置为 /dev/null。要使此设置生效,每次登录时,请将其放入 shell 的启动文件中。

  • 创建 .mysql_history 作为指向 /dev/null 的符号链接;这只需要执行一次:

    ln -s /dev/null $HOME/.mysql_history
syslog 日志记录特征

如果给定 --syslog 选项,mysql 将交互式语句写入系统日志记录设施。日志记录具有以下特征。

日志记录在 信息 级别上进行。这对应于 Unix/Linux syslog 能力中的 LOG_INFO 优先级和 Windows 事件日志中的 EVENTLOG_INFORMATION_TYPE。请参阅系统文档,以配置您的日志记录能力。

消息大小限制为 1024 字节。

消息由以下值组成:

  • SYSTEM_USER

    操作系统用户名(登录名)或 -- 如果用户未知。

  • MYSQL_USER

    MySQL 用户名(使用 --user 选项指定)或 -- 如果用户未知。

  • CONNECTION_ID:

    客户端连接标识符。这与会话中的 CONNECTION_ID() 函数值相同。

  • DB_SERVER

    服务器主机或 -- 如果主机未知。

  • DB

    默认数据库或 -- 如果未选择数据库。

  • QUERY

    记录语句的文本。

以下是 Linux 上使用 --syslog 生成的示例输出。该输出格式化以提高可读性;每个记录消息实际上占一行。

Mar  7 12:39:25 myhost MysqlClient[20824]:
  SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23,
  DB_SERVER:'127.0.0.1', DB:'--', QUERY:'USE test;'
Mar  7 12:39:28 myhost MysqlClient[20824]:
  SYSTEM_USER:'oscar', MYSQL_USER:'my_oscar', CONNECTION_ID:23,
  DB_SERVER:'127.0.0.1', DB:'test', QUERY:'SHOW TABLES;'