MySQL 8.0.24 中引入的新功能之一是能够将 MySQL Shell 中发出的所有 SQL 语句记录到系统日志中。这是一个有用的功能,可以极大地帮助跟踪谁在系统上做了什么。
用法
利用新的 Shell 日志记录功能的最简单方法是简单地启动 MySQL Shell 并启用syslog选项,如下所示:
Shell
$> mysqlsh --syslog --sql root@localhost
1
$> mysqlsh --syslog --sql root@localhost
从现在开始,所有在 MySQL Shell 中输入的 SQL 都将被记录到系统日志中。例如,在 Shell 中输入以下 SQL:
MySQL localhost:33060+ ssl SQL > show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
我们现在可以检查系统日志并验证上面的语句是否确实按预期记录,以及使用的系统用户和 MySQL 用户:
$> journalctl $(which mysqlsh)
Jun 28 10:01:11 localhost mysqlsh[9558]: SYSTEM_USER=brian MYSQL_USER=root CONNECTION_ID=16 DB_SERVER=localhost DB='--' QUERY='show databases;'
排除
根据 MySQL 用户手册,并非所有语句都会记录到系统日志中。基本上,出于安全原因通常会从 MySQL Shell 代码历史记录中排除的任何语句也将从系统日志中排除。我们可以通过检查 JS 模式下的 MySQL Shell 选项来验证将要排除的内容:
MySQL localhost:33060+ ssl JS > shell.options
这将列出 shell 的所有当前选项,这里的关键是history.sql.ignorePattern选项。在我们的例子中,它设置如下:
"history.sql.ignorePattern": "*IDENTIFIED*:*PASSWORD*"
因此,任何包含单词IDENTIFIED 或PASSWORD 的SQL 语句 都将被忽略,并且不会被记录到 MySQL Shell 历史记录中,即使启用了日志记录也不会记录到系统日志中。这减轻了在系统日志中以纯文本形式设置密码的任何安全问题。
默认记录
要从 MySQL Shell 自动启用系统日志记录而不必在每个运行时指定它,可以将选项设置为持久化。在 MySQL Shell 中,进入 JS 模式并设置以下选项:
MySQL localhost:33060+ ssl JS > shell.options.setPersist("history.sql.syslog",1)
从现在开始,在 MySQL shell 中输入的所有 SQL 将默认记录到系统日志中。
总结
知道谁在 MySQL Shell 中执行了什么是一个非常有用的管理工具,可以帮助跟踪问题或找出谁在给定时间发布了特定语句。虽然不是完全万无一失的审计方法(仍然可以在每个会话的基础上禁用日志记录),但它只是 DBA 工具箱的另一个项目,可以减轻当今大型数据库安装的管理负担。




