

# 使用错误注入查询测试 Amazon Aurora PostgreSQL
<a name="AuroraPostgreSQL.Managing.FaultInjectionQueries"></a>

可使用错误注入查询来测试 Aurora PostgreSQL 数据库集群的容错能力。错误注入查询作为 SQL 命令发布到 Amazon Aurora 实例。错误注入查询允许您使实例崩溃，以便您可以测试失效转移和恢复。您还可以模拟 Aurora 副本故障、磁盘故障和磁盘拥塞。所有可用的 Aurora PostgreSQL 版本都支持错误注入查询，如下所示。
+ Aurora PostgreSQL 版本 12、13、14 及更高版本
+ Aurora PostgreSQL 版本 11.7 及更高版本
+ Aurora PostgreSQL 版本 10.11 及更高版本

**Topics**
+ [测试实例崩溃](#AuroraPostgreSQL.Managing.FaultInjectionQueries.Crash)
+ [测试 Aurora 副本故障](#AuroraPostgreSQL.Managing.FaultInjectionQueries.ReplicaFailure)
+ [测试磁盘故障](#AuroraPostgreSQL.Managing.FaultInjectionQueries.DiskFailure)
+ [测试磁盘拥塞](#AuroraPostgreSQL.Managing.FaultInjectionQueries.DiskCongestion)

当故障注入查询指定崩溃时，它会强制 Aurora PostgreSQL 数据库实例崩溃。其他错误注入查询将导致模拟故障事件，但不会导致事件发生。提交错误注入查询时，还可指定故障事件模拟发生的时间长度。

可通过连接到 Aurora 副本的端点来将错误注入查询提交到 Aurora 副本实例之一。有关更多信息，请参阅“[Amazon Aurora 端点连接](Aurora.Overview.Endpoints.md)”。

## 测试实例崩溃
<a name="AuroraPostgreSQL.Managing.FaultInjectionQueries.Crash"></a>

您可使用错误注入查询函数 `aurora_inject_crash()` 强制使 Aurora PostgreSQL 实例发生崩溃。

对于该错误注入查询，不会进行故障转移。如果要测试失效转移，您可以在 RDS 控制台中为数据库集群选择**失效转移**实例操作，或者使用 [failover-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/failover-db-cluster.html) AWS CLI 命令或 [FailoverDBCluster](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_FailoverDBCluster.html) RDS API 操作。

**语法**

```
1. SELECT aurora_inject_crash ('instance' | 'dispatcher' | 'node');
```选项

该错误注入查询采用下列崩溃类型之一。崩溃类型不区分大小写：

*'instance'*  
模拟 Amazon Aurora 实例的 PostgreSQL 兼容数据库崩溃。

*'dispatcher'*  
模拟 Aurora 数据库集群的主实例上的调度程序崩溃。*调度程序* 将更新写入到 Amazon Aurora 数据库集群的集群卷中。

*'node'*  
模拟 Amazon Aurora 实例的 PostgreSQL 兼容数据库和调度程序崩溃。

## 测试 Aurora 副本故障
<a name="AuroraPostgreSQL.Managing.FaultInjectionQueries.ReplicaFailure"></a>

可使用错误注入查询函数 `aurora_inject_replica_failure()` 来模拟 Aurora 副本的故障。

Aurora 副本故障将在指定的时间间隔内按指定的百分比阻止复制到 Aurora 副本或数据库集群中的所有 Aurora 副本。在该时间间隔过后，受影响的 Aurora 副本将自动与主实例同步。

**语法**

```
1. SELECT aurora_inject_replica_failure(
2.    percentage_of_failure, 
3.    time_interval, 
4.    'replica_name'
5. );
```选项

该错误注入查询采用以下参数：

*percentage\$1of\$1failure*  
在故障事件期间阻止的复制百分比。该值可为 0 到 100 之间的双数。如果指定 0，则不会阻止任何复制。如果指定 100，则将阻止所有复制。

*time\$1interval*  
模拟 Aurora 副本故障的时间长度。间隔以秒为单位。例如，如果值为 20，则模拟会运行 20 秒。  
在指定 Aurora 副本故障事件的时间间隔时，请小心谨慎。如果指定的时间间隔太长，并且您的写入器实例在故障事件期间写入大量数据，则您的 Aurora 数据库集群可能假定您的 Aurora 副本已发生崩溃并将替换它。

*replica\$1name*  
要在其中注入故障模拟的 Aurora 副本。指定单个 Aurora 副本的名称可模拟单个 Aurora 副本故障的情况。指定空字符串可模拟数据库群集中所有 Aurora 副本故障的情况。  
要确定副本名称，请参阅 `server_id` 函数中的 `aurora_replica_status()` 列。例如：  

```
postgres=> SELECT server_id FROM aurora_replica_status();
```

## 测试磁盘故障
<a name="AuroraPostgreSQL.Managing.FaultInjectionQueries.DiskFailure"></a>

可使用错误注入查询函数 `aurora_inject_disk_failure()` 模拟 Aurora PostgreSQL 数据库集群的磁盘故障。

磁盘故障模拟期间，Aurora PostgreSQL 数据库集群会随机将磁盘区段标记为故障。在模拟期内，将阻止对这些区段的请求。

**语法**

```
1. SELECT aurora_inject_disk_failure(
2.    percentage_of_failure, 
3.    index, 
4.    is_disk, 
5.    time_interval
6. );
```选项

该错误注入查询采用以下参数：

*percentage\$1of\$1failure*  
在故障事件期间标记为故障的磁盘百分比。该值可为 0 到 100 之间的双数。如果指定 0，则不会将任何磁盘标记为故障。如果指定 100，则整个磁盘将标记为故障。

*index*  
模拟故障事件的特定逻辑数据块。如果超出了可用逻辑数据块或存储节点数据的范围，您会收到一条错误，告知您可指定的最大索引值。要避免此错误，请参阅 [显示 Aurora PostgreSQL 数据库集群的卷状态](AuroraPostgreSQL.Managing.VolumeStatus.md)。

*is\$1disk*  
指示注入失败是针对逻辑数据块还是存储节点。指定 true 意味着注入失败针对逻辑数据块。指定 false 意味着注入失败针对存储节点。

*time\$1interval*  
模拟磁盘故障的时间长度。间隔以秒为单位。例如，如果值为 20，则模拟会运行 20 秒。

## 测试磁盘拥塞
<a name="AuroraPostgreSQL.Managing.FaultInjectionQueries.DiskCongestion"></a>

可使用错误注入查询函数 `aurora_inject_disk_congestion()` 模拟 Aurora PostgreSQL 数据库集群的磁盘拥塞情况。

磁盘拥塞模拟期间，Aurora PostgreSQL 数据库集群会将磁盘区段标记为拥塞。在模拟持续时间内，对这些区段的请求将在指定的最小和最大延迟时间之间延迟。

**语法**

```
1. SELECT aurora_inject_disk_congestion(
2.    percentage_of_failure, 
3.    index, 
4.    is_disk, 
5.    time_interval, 
6.    minimum, 
7.    maximum
8. );
```选项

该错误注入查询采用以下参数：

*percentage\$1of\$1failure*  
在故障事件期间标记为拥塞的磁盘百分比。这是介于 0 到 100 之间的双精度值。如果指定 0，则不会将任何磁盘标记为拥塞。如果指定 100，则整个磁盘将标记为拥塞。

*index*  
用于模拟故障事件的特定逻辑数据块或存储节点。  
如果超出了数据的可用逻辑数据块或数据存储节点的范围，您将收到一条错误，告知您可指定的最大索引值。要避免此错误，请参阅 [显示 Aurora PostgreSQL 数据库集群的卷状态](AuroraPostgreSQL.Managing.VolumeStatus.md)。

*is\$1disk*  
指示注入失败是针对逻辑数据块还是存储节点。指定 true 意味着注入失败针对逻辑数据块。指定 false 意味着注入失败针对存储节点。

*time\$1interval*  
模拟磁盘拥塞情况的时间长度。间隔以秒为单位。例如，如果值为 20，则模拟会运行 20 秒。

*最小值，最大值*  
拥塞延迟的最小和最大时间长度（以毫秒为单位）。有效值范围为 0.0 至 100.0 毫秒。标记为拥塞的磁盘区段，在模拟持续时间内将随机延迟一段时间，该时间在最小和最大时间之间。最大值必须大于最小值。