

# 比较 Aurora MySQL 版本 3 和 MySQL 8.0 社群版
<a name="AuroraMySQL.Compare-80-v3"></a>

您可以使用以下信息了解从不同的 MySQL 8.0 兼容系统转换为 Aurora MySQL 版本 3 时需要注意的更改。

 一般来说，Aurora MySQL 版本 3 支持社区 MySQL 8.0.23 的功能集。MySQL 8.0 社群版的一些新功能不适用于 Aurora MySQL。其中一些功能与 Aurora 的某些方面不兼容，例如 Aurora 存储架构。不需要其他功能，因为 Amazon RDS 管理服务提供了同等的功能。社区 MySQL 8.0 中的以下功能不受支持或者在 Aurora MySQL 版本 3 中的工作方式有所不同。

 有关所有 Aurora MySQL 版本 3 发布的发布说明，请参阅《Aurora MySQL 发布说明》中的 [Amazon Aurora MySQL 版本 3 的数据库引擎更新](https://docs.amazonaws.cn/AmazonRDS/latest/AuroraMySQLReleaseNotes/AuroraMySQL.Updates.30Updates.html)**。

**Topics**
+ [MySQL 8.0 功能在 Aurora MySQL 版本 3 中不可用](#AuroraMySQL.Compare-80-v3-features)
+ [基于角色的权限模型](#AuroraMySQL.privilege-model)
+ [查找数据库服务器 ID](#AuroraMySQL.server-id)
+ [身份验证](#AuroraMySQL.mysql80-authentication)

## MySQL 8.0 功能在 Aurora MySQL 版本 3 中不可用
<a name="AuroraMySQL.Compare-80-v3-features"></a>

社区 MySQL 8.0 中的以下功能未提供或者在 Aurora MySQL 版本 3 中的工作方式有所不同。
+ Aurora MySQL 不支持资源组和相关的 SQL 语句。
+ Aurora MySQL 不支持用户定义的撤消表空间和关联的 SQL 语句，例如 `CREATE UNDO TABLESPACE`、`ALTER UNDO TABLESPACE ... SET INACTIVE` 和 `DROP UNDO TABLESPACE`。
+ 对于低于 3.06 的 Aurora MySQL 版本，Aurora MySQL 不支持撤消表空间截断。在 Aurora MySQL 3.06 及更高版本中，支持[自动撤消表空间截断](https://dev.mysql.com/doc/refman/8.0/en/innodb-undo-tablespaces.html#truncate-undo-tablespace)。
+ 支持密码验证插件。
+ 您无法修改任何 MySQL 插件的设置，包括密码验证插件。
+ 不支持 X 插件。
+ 不支持多源复制。

## 基于角色的权限模型
<a name="AuroraMySQL.privilege-model"></a>

使用 Aurora MySQL 版本 3，您无法直接修改 `mysql` 数据库中的表。特别是，您无法通过插入到 `mysql.user` 表来设置用户。相反，您可以使用 SQL 语句授予基于角色的权限。您也无法创建其他类型的对象，例如 `mysql` 数据库中的存储过程。您仍然可以查询 `mysql` 表。如果您使用二进制日志复制，则直接对源集群上的 `mysql` 表进行的更改不会复制到目标集群中。

 在某些情况下，您的应用程序可能会使用快捷方式通过插入到 `mysql` 表来创建用户或其他对象。如果是这样，请更改应用程序代码以使用相应的语句，例如 `CREATE USER`。如果您的应用程序在 `mysql` 数据库中创建存储过程或其他对象，请改用其他数据库。

要在从外部 MySQL 数据库迁移期间导出数据库用户的元数据，您可以使用 MySQL Shell 命令而非 `mysqldump`。有关更多信息，请参阅 [Instance Dump Utility, Schema Dump Utility, and Table Dump Utility](https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-utilities-dump-instance-schema.html#mysql-shell-utilities-dump-about)。

为了简化对许多用户或应用程序的权限管理，您可以使用 `CREATE ROLE` 语句来创建具有一组权限的角色。然后，您可以使用 `GRANT` 和 `SET ROLE` 语句以及 `current_role` 函数将角色分配给用户或应用程序、切换当前角色以及检查哪些角色有效。有关 MySQL 8.0 中基于角色的权限系统的更多信息，请参阅 MySQL 参考手册中的[使用角色](https://dev.mysql.com/doc/refman/8.0/en/roles.html)。

**重要**  
我们强烈建议不要直接在应用程序中使用主用户。请遵守使用数据库用户的最佳实践，按照您的应用程序所需的最少权限创建用户。

**Topics**
+ [rds\$1superuser\$1role](#AuroraMySQL.privilege-model.rds_superuser_role)
+ [二进制日志复制的权限检查用户](#AuroraMySQL.privilege-model.binlog)
+ [用于访问其它 Amazon 服务的角色](#AuroraMySQL.privilege-model.other)

### rds\$1superuser\$1role
<a name="AuroraMySQL.privilege-model.rds_superuser_role"></a>

Aurora MySQL 版本 3 包括一个具有以下所有权限的特殊角色。该角色命名为 `rds_superuser_role`。每个集群的主管理用户已经授予了此角色。`rds_superuser_role` 角色包括所有数据库对象的以下权限：
+ `ALTER`
+ `APPLICATION_PASSWORD_ADMIN`
+ `ALTER ROUTINE`
+ `CONNECTION_ADMIN`
+ `CREATE`
+ `CREATE ROLE`
+ `CREATE ROUTINE`
+ `CREATE TEMPORARY TABLES`
+ `CREATE USER`
+ `CREATE VIEW`
+ `DELETE`
+ `DROP`
+ `DROP ROLE`
+ `EVENT`
+ `EXECUTE`
+ `FLUSH_OPTIMIZER_COSTS`（Aurora MySQL 版本 3.09 及更高版本）
+ `FLUSH_STATUS`（Aurora MySQL 版本 3.09 及更高版本）
+ `FLUSH_TABLES`（Aurora MySQL 版本 3.09 及更高版本）
+ `FLUSH_USER_RESOURCES`（Aurora MySQL 版本 3.09 及更高版本）
+ `INDEX`
+ `INSERT`
+ `LOCK TABLES`
+ `PROCESS`
+ `REFERENCES`
+ `RELOAD`
+ `REPLICATION CLIENT`
+ `REPLICATION SLAVE`
+ `ROLE_ADMIN`
+ `SET_USER_ID`
+ `SELECT`
+ `SHOW DATABASES`
+ `SHOW_ROUTINE`（Aurora MySQL 版本 3.04 及更高版本）
+ `SHOW VIEW`
+ `TRIGGER`
+ `UPDATE`
+ `XA_RECOVER_ADMIN`

角色定义还包括 `WITH GRANT OPTION`，以便管理用户可以将该角色授予其他用户。特别是，管理员必须授予以 Aurora MySQL 集群作为目标执行二进制日志复制所需的任何权限。

**提示**  
要查看权限的完整详细信息，请输入以下语句。  

```
SHOW GRANTS FOR rds_superuser_role@'%';
SHOW GRANTS FOR name_of_administrative_user_for_your_cluster@'%';
```

### 二进制日志复制的权限检查用户
<a name="AuroraMySQL.privilege-model.binlog"></a>

Aurora MySQL 版本 3 包括二进制日志（binlog）复制的权限检查用户，即 `rdsrepladmin_priv_checks_user`。除 `rds_superuser_role` 的权限之外，此用户还拥有 `replication_applier` 权限。

当您通过调用 `mysql.rds_start_replication` 存储过程来开启二进制日志复制时，即会创建 `rdsrepladmin_priv_checks_user`。

`rdsrepladmin_priv_checks_user@localhost` 用户是保留用户。请勿修改此用户。

### 用于访问其它 Amazon 服务的角色
<a name="AuroraMySQL.privilege-model.other"></a>

Aurora MySQL 版本 3 包括可用于访问其它 Amazon 服务的角色。可以将其中许多角色设置为授予权限的替代。例如，您可以指定 `GRANT AWS_LAMBDA_ACCESS TO user` 而不是 `GRANT INVOKE LAMBDA ON *.* TO user`。对于访问其他 Amazon 服务的程序，请参阅 [将 Amazon Aurora MySQL 与其他Amazon服务集成](AuroraMySQL.Integrating.md)。Aurora MySQL 版本 3 包括以下与访问其他 Amazon 服务相关的角色：
+ `AWS_LAMBDA_ACCESS` – `INVOKE LAMBDA` 权限的替代。有关使用信息，请参阅[从 Amazon Aurora MySQL 数据库集群中调用 Lambda 函数](AuroraMySQL.Integrating.Lambda.md)。
+ `AWS_LOAD_S3_ACCESS` – `LOAD FROM S3` 权限的替代。有关使用信息，请参阅[将数据从 Amazon S3 存储桶中的文本文件加载到 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Integrating.LoadFromS3.md)。
+ `AWS_SELECT_S3_ACCESS` – `SELECT INTO S3` 权限的替代。有关使用信息，请参阅[将数据从 Amazon Aurora MySQL 数据库集群保存到 Amazon S3 存储桶中的文本文件](AuroraMySQL.Integrating.SaveIntoS3.md)。
+ `AWS_COMPREHEND_ACCESS` – `INVOKE COMPREHEND` 权限的替代。有关使用信息，请参阅[授予数据库用户访问 Aurora 机器学习的权限](mysql-ml.md#aurora-ml-sql-privileges)。
+ `AWS_SAGEMAKER_ACCESS` – `INVOKE SAGEMAKER` 权限的替代。有关使用信息，请参阅[授予数据库用户访问 Aurora 机器学习的权限](mysql-ml.md#aurora-ml-sql-privileges)。
+ `AWS_BEDROCK_ACCESS` – Amazon Bedrock 没有类似的 `INVOKE` 权限。有关使用信息，请参阅[授予数据库用户访问 Aurora 机器学习的权限](mysql-ml.md#aurora-ml-sql-privileges)。

当您使用 Aurora MySQL 版本 3 中的角色授予访问权限时，还可以通过使用 `SET ROLE role_name` 或 `SET ROLE ALL` 语句来激活角色。下面的示例演示如何操作。将适当的角色名称替换为 `AWS_SELECT_S3_ACCESS`。

```
# Grant role to user.

mysql> GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'

# Check the current roles for your user. In this case, the AWS_SELECT_S3_ACCESS role has not been activated.
# Only the rds_superuser_role is currently in effect.
mysql> SELECT CURRENT_ROLE();
+--------------------------+
| CURRENT_ROLE()           |
+--------------------------+
| `rds_superuser_role`@`%` |
+--------------------------+
1 row in set (0.00 sec)

# Activate all roles associated with this user using SET ROLE.
# You can activate specific roles or all roles.
# In this case, the user only has 2 roles, so we specify ALL.
mysql> SET ROLE ALL;
Query OK, 0 rows affected (0.00 sec)

# Verify role is now active
mysql> SELECT CURRENT_ROLE();
+-----------------------------------------------------+
| CURRENT_ROLE()                                      |
+-----------------------------------------------------+
| `AWS_SELECT_S3_ACCESS`@`%`,`rds_superuser_role`@`%` |
+-----------------------------------------------------+
```

## 查找数据库服务器 ID
<a name="AuroraMySQL.server-id"></a>

数据库服务器 ID（`server_id`）是二进制日志（binlog）复制所必需的。在 Aurora MySQL 中查找服务器 ID 的方式与在 Community MySQL 中查找不同。

在 Community MySQL 中，服务器 ID 是一个数字，您可以在登录服务器时使用以下语法获得：

```
mysql> select @@server_id;

+-------------+
| @@server_id |
+-------------+
| 2           |
+-------------+
1 row in set (0.00 sec)
```

在 Aurora MySQL 中，服务器 ID 是数据库实例 ID，您可以在登录数据库实例时使用以下语法获得：

```
mysql> select @@aurora_server_id;

+------------------------+
| @@aurora_server_id     |
+------------------------+
| mydbcluster-instance-2 |
+------------------------+
1 row in set (0.00 sec)
```

有关二进制日志复制的更多信息，请参阅 [Aurora 与 MySQL 之间或 Aurora 与其他 Aurora 数据库集群之间的复制（二进制日志复制）](AuroraMySQL.Replication.MySQL.md)。

## 身份验证
<a name="AuroraMySQL.mysql80-authentication"></a>

在社区 MySQL 8.0 中，默认的身份验证插件是 `caching_sha2_password`。Aurora MySQL 版本 3 仍然使用 `mysql_native_password` 插件。您将无法更改 `default_authentication_plugin` 设置。但是，您可以创建新用户和更改当前用户，并且这些用户各自的密码使用新的身份验证插件。以下为示例。

```
mysql> CREATE USER 'testnewsha'@'%' IDENTIFIED WITH caching_sha2_password BY 'aNewShaPassword';
Query OK, 0 rows affected (0.74 sec)
```