

# 在数据库分片组中拆分一个分片
<a name="limitless-shard-split"></a>

您可以手动将数据库分片组中的分片拆分为两个较小的分片。这称为*用户发起的*分片拆分。

当分片的数据量非常大或使用率非常高时，Aurora PostgreSQL Limitless Database 也可以对其进行拆分。这称为*系统发起的*分片拆分。

**Topics**
+ [先决条件](#limitless-shard-split.prereqs)
+ [拆分分片](#limitless-shard-split.proc)
+ [跟踪分片拆分](#limitless-shard-split.track)
+ [结束分片拆分](#limitless-shard-split.finalize)
+ [取消分片拆分](#limitless-shard-split.cancel)

## 先决条件
<a name="limitless-shard-split.prereqs"></a>

用户发起的分片拆分有以下先决条件：
+ 您必须拥有一个数据库分片组。
+ 数据库分片组不能为空：它必须至少包含一个分片表。
+ 用户必须具有 `rds_aurora_limitless_cluster_admin` 权限。`rds_superuser` 拥有此权限；因此主用户也拥有该权限。`rds_superuser` 可以将该权限授予其他用户：

  ```
  /* Logged in as the master user or a user with rds_superuser privileges */
  CREATE USER username;
  GRANT rds_aurora_limitless_cluster_admin to username;
  ```
+ 您必须知道要拆分的分片的子集群（节点）ID。您可以通过以下查询获取 ID：

  ```
  SELECT * FROM rds_aurora.limitless_subclusters;
  
   subcluster_id | subcluster_type
  ---------------+-----------------
   1             | router
   2             | router
   3             | shard
   4             | shard
   5             | shard
   6             | shard
  ```

要启用系统发起的分片拆分，请在与数据库集群相关联的自定义数据库集群参数组中设置以下数据库集群参数：


| 参数 | 值 | 
| --- | --- | 
|  `rds_aurora.limitless_enable_auto_scale`  |  `on`  | 
|  `rds_aurora.limitless_auto_scale_options`  |  `split_shard` 或 `add_router,split_shard`  | 
|  `rds_aurora.limitless_finalize_split_shard_mode`  |  该参数决定*系统发起的*分片拆分如何结束。值可以是以下之一： [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/AmazonRDS/latest/AuroraUserGuide/limitless-shard-split.html) 有关更多信息，请参阅 [结束分片拆分](#limitless-shard-split.finalize)。  此参数仅适用于系统发起的分片拆分。   | 

有关更多信息，请参阅 [Amazon Aurora 数据库集群的数据库集群参数组](USER_WorkingWithDBClusterParamGroups.md)。

## 拆分分片
<a name="limitless-shard-split.proc"></a>

要拆分数据库分片组中的分片，请使用 `rds_aurora.limitless_split_shard` 函数。该函数启动异步运行的分片拆分任务。

```
SELECT rds_aurora.limitless_split_shard('subcluster_id');
```

在成功提交任务后，等待返回的任务 ID，例如：

```
SELECT rds_aurora.limitless_split_shard('3');

    job_id
---------------
 1691300000000
(1 row)
```

**注意**  
不支持并发分片拆分操作。按顺序执行每个操作并完成每个操作，然后再启动另一个添加操作。

## 跟踪分片拆分
<a name="limitless-shard-split.track"></a>

您可以使用任务 ID 跟踪分片拆分任务。要描述特定任务并获取有关它的更多详细信息，请运行以下查询：

```
SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs(job_id);
```

例如：

```
SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs(1691300000000);

    job_id     |    action   |      job_details      | status  |    submission_time     |                  message                  
---------------+-------------+-----------------------+---------+------------------------+-------------------------------------------
 1691300000000 | SPLIT_SHARD | Split Shard 3 by User | SUCCESS | 2023-08-06 05:33:20+00 | Scaling job succeeded.                 +
               |             |                       |         |                        | New shard instance with ID 7 was created.
(1 row)
```

当您将不存在的任务作为输入传递时，查询会返回错误。

```
SELECT * from rds_aurora.limitless_list_shard_scale_jobs(1691300000001);

ERROR:  no job found with the job ID provided
```

您可以使用不带任务 ID 的相同查询来跟踪所有分片拆分任务的状态，例如：

```
SELECT * FROM rds_aurora.limitless_list_shard_scale_jobs();

    job_id     |   action    |  job_details          |   status    |    submission_time     |                  message                 
---------------+-------------+-----------------------+-------------+------------------------+--------------------------------------------------------------
 1691200000000 | SPLIT_SHARD | Split Shard 3 by User | IN_PROGRESS | 2023-08-05 01:46:40+00 | 
 1691300000000 | SPLIT_SHARD | Split Shard 4 by User | SUCCESS     | 2023-08-06 05:33:20+00 | Scaling job succeeded. +
               |             |                       |             |                        | New shard instance with ID 7 was created.
 1691400000000 | SPLIT_SHARD | Split Shard 5 by User | FAILED      | 2023-08-07 09:20:00+00 | Error occurred for the add shard job 1691400000000.
               |             |                       |             |                        | Retry the command. If the issue persists, contact AWS Support.
 1691500000000 | SPLIT_SHARD | Split Shard 5 by User | CANCELED    | 2023-08-07 09:20:00+00 | Scaling job was cancelled.
(4 rows)
```

任务状态可以是下列项之一：
+ `IN_PROGRESS` – 分片拆分任务已提交且正在进行中。同一时间只能有一个任务在进行中。
+ `PENDING` – 分片拆分任务正等待您结束。有关更多信息，请参阅 [结束分片拆分](#limitless-shard-split.finalize)。
+ `CANCELLATION_IN_PROGRESS` – 用户正在取消分片拆分任务。
+ `CANCELED` – 用户或系统已成功取消分片拆分任务。
+ `SUCCESS` – 分片拆分任务已成功完成。该 `message` 字段包含新分片的实例 ID。
+ `FAILED` – 分片拆分任务失败。该 `message` 字段包含失败的详细信息以及可对失败任务采取的任何后续操作。

## 结束分片拆分
<a name="limitless-shard-split.finalize"></a>

结束是分片拆分流程的最后一步。它会产生一些停机时间。如果启动分片拆分任务，则会在任务成功完成后立即结束。

有时，当您使用 `rds_aurora.limitless_enable_auto_scale` 参数启用系统发起的分片拆分时，系统会根据工作负载拆分分片。

在这种情况下，您可以选择是立即结束还是按您选择的时间结束。您可以使用 `rds_aurora.limitless_finalize_split_shard_mode` 数据库集群参数来选择何时结束：
+ 如果将该值设置为 `immediate`，则会立即结束。
+ 如果将该值设置为 `user_initiated`，则必须手动结束分片拆分任务。

  系统会向您发送一个 RDS 事件，并将分片拆分任务的状态设置为 `PENDING`。

如果设置为 `user_initiated`，则使用 `rds_aurora.limitless_finalize_split_shard` 函数结束分片拆分任务：

```
SELECT * FROM rds_aurora.limitless_finalize_split_shard(job_id);
```

**注意**  
此功能仅适用于由系统发起的分片拆分，不适用于用户发起的分片拆分。

## 取消分片拆分
<a name="limitless-shard-split.cancel"></a>

您可以取消用户发起或系统发起的分片拆分，即 `IN_PROGRESS` 或 `PENDING`。您需要任务 ID 才能将其取消。

```
SELECT * from rds_aurora.limitless_cancel_shard_scale_jobs(job_id);
```

除非出现错误，否则不会返回任何输出。您可以使用任务跟踪查询来跟踪取消情况。