4.5.1.3 mysqlClient 端记录

mysqlClient 端可以为交互式执行的语句执行以下类型的日志记录:

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

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

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

记录如何发生

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

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

  • 如果语句与“忽略”列 table 中的任何模式匹配,则忽略该语句并将其记录下来。稍后将描述此列 table。

  • mysql分别记录每个不可忽略的非空语句行。

  • 如果不可忽略的语句跨越多行(不包括终止定界符),则mysql将这些行连接起来以形成完整的语句,将换行符 Map 到空格,并记录结果以及定界符。

因此,跨多行的 Importing 语句可以记录两次。考虑以下 Importing:

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

在这种情况下,mysql记录“ SELECT”,“'Today is'”,“,”,“ CURDATE()”和“;”。行,因为它们读取它们。在将SELECT\n'Today is'\n,\nCURDATE()Map 到SELECT 'Today is' , CURDATE()以及定界符之后,它还会记录 complete 语句。因此,这些行出现在记录的输出中:

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

mysql出于忽略目的而忽略与“忽略”列 table 中的任何模式匹配的语句。默认情况下,模式列 table 为"*IDENTIFIED*:*PASSWORD*",以忽略引用密码的语句。模式匹配不区分大小写。在模式中,两个字符是特殊的:

  • ?匹配任何单个字符。

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

要指定其他模式,请使用--histignore选项或设置MYSQL_HISTIGNORE环境变量。 (如果同时指定了两个选项,则选项值优先.)该值应该是一个或多个冒号分隔的模式的列 table,并附加到默认模式列 table 中。

命令行上指定的模式可能需要加引号或转义以防止命令解释器对其进行特殊对待。例如,除了显示引用密码的语句之外,要禁止记录UPDATEDELETE语句,请像下面这样调用mysql

shell> mysql --histignore="*UPDATE*:*DELETE*"
控制历史记录文件

.mysql_history文件应使用限制性访问模式进行保护,因为可能会向其中写入敏感信息,例如包含密码的 SQL 语句的文本。参见第 6.1.2.1 节,“最终用户密码安全准则”。当使用 向上箭头 键调用历史记录时,可从mysqlClient 端访问文件中的语句。参见禁用互动历史记录

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

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

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

shell> ln -s /dev/null $HOME/.mysql_history
syslog 日志记录 Feature

如果提供了--syslog选项,则mysql将交互式语句写入系统日志记录工具。消息日志记录具有以下 Feature。

记录发生在“信息”级别。这对应于 Unix/Linux syslog功能上syslogLOG_INFO优先级,以及 Windows 事件日志中的EVENTLOG_INFORMATION_TYPE。请查阅系统文档以配置日志记录功能。

邮件大小限制为 1024 个字节。

消息包含标识符MysqlClient,后跟以下值:

  • SYSTEM_USER

os 用户名(登录名)或--(如果用户未知)。

  • MYSQL_USER

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

  • CONNECTION_ID :

Client 端连接标识符。这与会话中的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;'