文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  mysql 客户端日志记录

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 环境变量。(如果两者都指定,则选项值优先。)该值应是一个或多个以冒号分隔的模式的列表,这些模式将附加到默认模式列表。

命令行上指定的模式可能需要加引号或转义,以防止命令解释器对它们进行特殊处理。例如,要禁止记录 UPDATEDELETE 语句以及引用密码的语句,请像这样调用 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 字节。

消息由标识符 MysqlClient 以及以下值组成:

  • 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;'