#### 6.1.2.3 密码和日志记录

[](<>)[](<>)

密码可以写成 SQL 语句中的纯文本，例如[`创建用户`](create-user.html),[`授予`](grant.html)和[`设置密码`](set-password.html).如果 MySQL 服务器以书面形式记录此类语句，则任何有权访问日志的人都可以看到其中的密码。

语句日志记录避免将密码写为以下语句的明文：

```
CREATE USER ... IDENTIFIED BY ...
ALTER USER ... IDENTIFIED BY ...
SET PASSWORD ...
START SLAVE ... PASSWORD = ...
START REPLICA ... PASSWORD = ...
CREATE SERVER ... OPTIONS(... PASSWORD ...)
ALTER SERVER ... OPTIONS(... PASSWORD ...)
```

这些语句中的密码被重写，不会出现在写入一般查询日志、慢查询日志和二进制日志的语句文本中。重写不适用于其他语句。特别是，[`插入`](insert.html)要么[`更新`](update.html)的声明`mysql.user`引用文字密码的系统表按原样记录，因此您应该避免此类语句。（无论如何，不​​鼓励直接修改授权表。）

对于一般查询日志，可以通过启动服务器来抑制密码重写[`--log-raw`](server-options.html#option_mysqld_log-raw)选项。出于安全原因，不建议将此选项用于生产用途。出于诊断目的，查看服务器接收到的语句的确切文本可能很有用。

默认情况下，审计日志插件生成的审计日志文件的内容是不加密的，并且可能包含敏感信息，例如 SQL 语句的文本。出于安全原因，审计日志文件应写入仅 MySQL 服务器和有正当理由查看日志的用户可访问的目录。看[第 6.4.5.3 节，“MySQL 企业审计安全注意事项”](audit-log-security.html).

如果安装了查询重写插件，服务器接收到的语句可能会被重写（参见[查询重写插件](https://dev.mysql.com/doc/extending-mysql/8.0/en/plugin-types.html#query-rewrite-plugin-type)）。在这种情况下，[`--log-raw`](server-options.html#option_mysqld_log-raw)选项影响语句记录如下：

-   没有[`--log-raw`](server-options.html#option_mysqld_log-raw)，服务器记录查询重写插件返回的语句。这可能与收到的声明不同。

-   和[`--log-raw`](server-options.html#option_mysqld_log-raw)，服务器将原始语句记录为收到。

    密码重写的一个含义是无法解析的语句（例如，由于语法错误）不会写入一般查询日志，因为它们不知道是无密码的。需要记录所有语句（包括有错误的语句）的用例应使用[`--log-raw`](server-options.html#option_mysqld_log-raw)选项，请记住，这也绕过了密码重写。

    仅当需要纯文本密码时才会重写密码。对于语法要求密码哈希值的语句，不会发生重写。如果错误地为此类语法提供了纯文本密码，则密码将被记录为给定，而无需重写。

    为防止日志文件无故暴露，请将它们放在限制对服务器和数据库管理员访问的目录中。如果服务器登录到`mysql`数据库，仅向数据库管理员授予对这些表的访问权限。

    副本将复制源服务器的密码存储在其连接元数据存储库中，默认情况下是`mysql`数据库命名`slave_master_info`.现在不推荐使用数据目录中的文件作为连接元数据存储库，但仍然可以使用（请参阅[第 17.2.4 节，“中继日志和复制元数据存储库”](replica-logs.html)）。确保连接元数据存储库只能由数据库管理员访问。将密码存储在连接元数据存储库中的另一种方法是使用[`开始复制`](start-replica.html)（或在 MySQL 8.0.22 之前，[`启动奴隶`](start-slave.html)） 要么[`开始 GROUP_REPLICATION`](start-group-replication.html)语句来指定连接到源的凭据。

    使用受限访问模式来保护包含日志表或包含密码的日志文件的数据库备份。
