

# 使用 GTID 复制事务
<a name="mysql-stored-proc-gtid"></a>

以下存储过程控制如何使用 Aurora MySQL 中的全局事务标识符（GTID）复制事务。要了解如何根据 Aurora MySQL 中的 GTID 使用复制，请参阅[使用基于 GTID 的复制](mysql-replication-gtid.md)。

**Topics**
+ [mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions（Aurora MySQL 版本 3）](#mysql_assign_gtids_to_anonymous_transactions)
+ [mysql.rds\$1gtid\$1purged（Aurora MySQL 版本 3）](#mysql_rds_gtid_purged)
+ [mysql.rds\$1skip\$1transaction\$1with\$1gtid（Aurora MySQL 版本 2 和 3）](#mysql_rds_skip_transaction_with_gtid)
+ [mysql.rds\$1start\$1replication\$1until\$1gtid（Aurora MySQL 版本 3）](#mysql_rds_start_replication_until_gtid)

## mysql.rds\$1assign\$1gtids\$1to\$1anonymous\$1transactions（Aurora MySQL 版本 3）
<a name="mysql_assign_gtids_to_anonymous_transactions"></a>

配置 `CHANGE REPLICATION SOURCE TO` 语句的 `ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS` 选项。它使得复制通道将 GTID 分配给没有 GTID 的复制事务。这样，您就可以将二进制日志从不使用基于 GTID 的复制的源复制到使用该复制的副本。有关更多信息，请参阅 *MySQL 参考手册*中的 [CHANGE REPLICATION SOURCE TO 语句](https://dev.mysql.com/doc/refman/8.0/en/change-replication-source-to.html)和[从没有 GTID 的源复制到有 GTID 的副本](https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-assign-anon.html)。

### 语法
<a name="mysql_assign_gtids_to_anonymous_transactions-syntax"></a>

```
CALL mysql.rds_assign_gtids_to_anonymous_transactions(gtid_option);
```

### 参数
<a name="mysql_assign_gtids_to_anonymous_transactions-parameters"></a>

 *gtid\$1option*  
字符串值。允许的值为 `OFF`、`LOCAL` 或者指定的 UUID。

### 使用说明
<a name="mysql_assign_gtids_to_anonymous_transactions-usage-notes"></a>

此过程与在社群 MySQL 中发布语句 `CHANGE REPLICATION SOURCE TO ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS = gtid_option` 的效果相同。

 GTID 必须转向 `ON` 才能使 *gtid\$1option* 设置为 `LOCAL` 或指定的 UUID。

默认值为 `OFF`，这意味着不使用该功能。

`LOCAL` 会分配一个 GTID，其中包括副本自己的 UUID（`server_uuid` 设置)。

传递一个作为 UUID 的参数会分配一个包含指定 UUID 的 GTID，例如复制源服务器的 `server_uuid` 设置。

### 示例
<a name="mysql_assign_gtids_to_anonymous_transactions-examples"></a>

要关闭此功能：

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('OFF');
+-------------------------------------------------------------+
| Message  |
+-------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: OFF |
+-------------------------------------------------------------+
1 row in set (0.07 sec)
```

要使用副本自己的 UUID：

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('LOCAL');
+---------------------------------------------------------------+
| Message  |
+---------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: LOCAL |
+---------------------------------------------------------------+
1 row in set (0.07 sec)
```

要使用指定的 UUID：

```
mysql> call mysql.rds_assign_gtids_to_anonymous_transactions('317a4760-f3dd-3b74-8e45-0615ed29de0e');
+----------------------------------------------------------------------------------------------+
| Message |
+----------------------------------------------------------------------------------------------+
| ASSIGN_GTIDS_TO_ANONYMOUS_TRANSACTIONS has been set to: 317a4760-f3dd-3b74-8e45-0615ed29de0e |
+----------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)
```

## mysql.rds\$1gtid\$1purged（Aurora MySQL 版本 3）
<a name="mysql_rds_gtid_purged"></a>



将系统变量 `gtid_purged` 的全局值设置为给定的全局事务标识符（GTID）集。`gtid_purged` 系统变量是一个 GTID 集，由服务器上已提交但不存在于服务器上任何二进制日志文件中的所有事务的 GTID 组成。

为了与 MySQL 8.0 兼容，有两种方法可以设置 `gtid_purged` 的值：
+ 将 `gtid_purged` 的值替换为指定的 GTID 集。
+ 将您指定的 GTID 集附加到 `gtid_purged` 已经包含的 GTID 集。

### 语法
<a name="mysql_rds_gtid_purged-syntax"></a>

要将 `gtid_purged` 的值替换为您指定的 GTID 集，请执行以下操作：

```
CALL mysql.rds_gtid_purged (gtid_set);
```

要将 `gtid_purged` 的值附加到您指定的 GTID 集，请执行以下操作：

```
CALL mysql.rds_gtid_purged (+gtid_set);
```

### 参数
<a name="mysql_rds_gtid_purged-parameters"></a>

*gtid\$1set*  
*gtid\$1set* 的值必须是 `gtid_purged` 的当前值的超集，并且不能与 `gtid_subtract(gtid_executed,gtid_purged)` 相交。也就是说，新的 GTID 集必须包括 `gtid_purged` 中已经存在的任何 GTID，并且不能包括 `gtid_executed` 中尚未清除的任何 GTID。*gtid\$1set* 参数也不能包括全局 `gtid_owned` 集中的任何 GTID，即当前服务器上正在处理的事务的 GTID。

### 使用说明
<a name="mysql_rds_gtid_purged-usage-notes"></a>

主用户必须运行 `mysql.rds_gtid_purged` 过程。

Aurora MySQL 版本 3.04 及更高版本支持此过程。

### 示例
<a name="mysql_rds_gtid_purged-examples"></a>

以下示例将 GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23` 分配给 `gtid_purged` 全局变量。

```
CALL mysql.rds_gtid_purged('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```

## mysql.rds\$1skip\$1transaction\$1with\$1gtid（Aurora MySQL 版本 2 和 3）
<a name="mysql_rds_skip_transaction_with_gtid"></a>

在 Aurora 主实例上跳过复制具有指定全局事务标识符 (GTID) 的事务。

在已知特定 GTID 事务导致问题时，您可以使用该过程进行灾难恢复。请使用该存储过程跳过有问题的事务。有问题的事务示例包括禁用复制、删除重要数据或导致数据库实例变得不可用的事务。

### 语法
<a name="mysql_rds_skip_transaction_with_gtid-syntax"></a>

 

```
CALL mysql.rds_skip_transaction_with_gtid (
gtid_to_skip
);
```

### 参数
<a name="mysql_rds_skip_transaction_with_gtid-parameters"></a>

 *gtid\$1to\$1skip*   
要跳过的复制事务的 GTID。

### 使用说明
<a name="mysql_rds_skip_transaction_with_gtid-usage-notes"></a>

主用户必须运行 `mysql.rds_skip_transaction_with_gtid` 过程。

Aurora MySQL 版本 2 和 3 支持此过程。

### 示例
<a name="mysql_rds_skip_transaction_with_gtid-examples"></a>

以下示例将跳过复制具有 GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23` 的事务。

```
CALL mysql.rds_skip_transaction_with_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```

## mysql.rds\$1start\$1replication\$1until\$1gtid（Aurora MySQL 版本 3）
<a name="mysql_rds_start_replication_until_gtid"></a>

从 Aurora MySQL 数据库集群中启动复制，并在指定的全局事务标识符（GTID）后面立即停止复制。

### 语法
<a name="mysql_rds_start_replication_until_gtid-syntax"></a>

 

```
CALL mysql.rds_start_replication_until_gtid(gtid);
```

### 参数
<a name="mysql_rds_start_replication_until_gtid-parameters"></a>

 *gtid*   
停止复制前的 GTID。

### 使用说明
<a name="mysql_rds_start_replication_until_gtid-usage-notes"></a>

主用户必须运行 `mysql.rds_start_replication_until_gtid` 过程。

Aurora MySQL 版本 3.04 及更高版本支持该过程。

托管式复制不支持 `mysql.rds_start_replication_until_gtid` 存储过程，其中包括以下内容：
+ [跨 AWS 区域复制 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Replication.CrossRegion.md)
+ [使用 Aurora 只读副本将数据从 RDS for MySQL 数据库实例迁移到 Amazon Aurora MySQL 数据库集群](AuroraMySQL.Migrating.RDSMySQL.Replica.md)

在 `gtid` 参数指定副本已运行的事务时，将会立即停止复制。

### 示例
<a name="mysql_rds_start_replication_until_gtid-examples"></a>

以下示例启动复制并复制更改，直至到达 GTID `3E11FA47-71CA-11E1-9E33-C80AA9429562:23`。

```
call mysql.rds_start_replication_until_gtid('3E11FA47-71CA-11E1-9E33-C80AA9429562:23');
```