Documentation Home

4.5.1.3 mysql 客户端日志记录

mysql客户端可以为交互式执行 的语句执行这些类型的日志记录:

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

  • 在所有平台上,如果--syslog给出该选项,mysql会将语句写入系统日志记录工具。在 Unix 上,这是 syslog; 在 Windows 上,它是 Windows 事件日志。记录消息出现的目的地取决于系统。在 Linux 上,目的地通常是 /var/log/messages文件。

以下讨论描述了适用于所有日志记录类型的特征,并提供了特定于每种日志记录类型的信息。

日志记录是如何发生的

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

  • 语句仅在交互执行时被记录。语句是非交互式的,例如,当从文件或管道中读取时。也可以使用--batch or--execute选项来禁止语句记录。

  • 如果语句与“忽略列表 中的任何模式匹配,它们将被忽略并且不会被记录。该列表稍后描述。

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

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

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

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

在这种情况下,mysql记录 SELECT'今天是',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和语句的日志记录,请像这样调用mysqlDELETE

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

.mysql_history文件应使用限制性访问模式进行保护,因为可能会向其中写入敏感信息,例如包含密码的 SQL 语句文本。请参阅第 6.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 功能 的LOG_INFO优先级 和Windows 事件日志的优先级。请查阅您的系统文档以配置您的日志记录功能。 syslogsyslogEVENTLOG_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;'