

# Dividir um fragmento em um grupo de fragmentos de banco de dados
<a name="limitless-shard-split"></a>

Você pode dividir manualmente um fragmento em um grupo de fragmentos de banco de dados em dois fragmentos menores. Isso é chamado de divisão de fragmentos *iniciada pelo usuário*.

O Aurora PostgreSQL Limitless Database também pode dividir fragmentos quando eles têm grandes quantidades de dados ou um uso muito alto. Isso é chamado de divisão de fragmentos *iniciada pelo sistema*.

**Topics**
+ [Pré-requisitos](#limitless-shard-split.prereqs)
+ [Dividir um fragmento](#limitless-shard-split.proc)
+ [Rastrear divisões de fragmentos](#limitless-shard-split.track)
+ [Finalizar divisões de fragmentos](#limitless-shard-split.finalize)
+ [Cancelar uma divisão de fragmentos](#limitless-shard-split.cancel)

## Pré-requisitos
<a name="limitless-shard-split.prereqs"></a>

As divisões de fragmento iniciadas pelo usuário têm os seguintes pré-requisitos:
+ É necessário ter um grupo de fragmentos de banco de dados.
+ O grupo de fragmentos de banco de dados não pode estar vazio: ele deve conter pelo menos uma tabela fragmentada.
+ Um usuário deve ter o privilégio `rds_aurora_limitless_cluster_admin`. O `rds_superuser` tem esse privilégio; portanto, o usuário principal também o tem. O `rds_superuser` pode conceder o privilégio a outros usuários:

  ```
  /* Logged in as the master user or a user with rds_superuser privileges */
  CREATE USER username;
  GRANT rds_aurora_limitless_cluster_admin to username;
  ```
+ É necessário saber o ID do subcluster (nó) do fragmento que deseja dividir. É possível obter o ID usando a seguinte consulta:

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

Para habilitar divisões de fragmento iniciadas pelo sistema, defina os seguintes parâmetros de cluster de banco de dados em um grupo de parâmetros de cluster de banco de dados personalizado associado ao seu cluster de banco de dados:


| Parameter | Valor | 
| --- | --- | 
|  `rds_aurora.limitless_enable_auto_scale`  |  `on`  | 
|  `rds_aurora.limitless_auto_scale_options`  |  `split_shard` ou `add_router,split_shard`  | 
|  `rds_aurora.limitless_finalize_split_shard_mode`  |  Este parâmetro determina como as divisões de fragmento *iniciadas pelo sistema* são finalizadas. O valor pode ser um dos seguintes: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/AmazonRDS/latest/AuroraUserGuide/limitless-shard-split.html) Para obter mais informações, consulte [Finalizar divisões de fragmentos](#limitless-shard-split.finalize).  Este parâmetro se aplica apenas a divisões de fragmento iniciadas pelo sistema.   | 

Para obter mais informações, consulte [Grupos de parâmetros do cluster de banco de dados para clusters de banco de dados do Amazon Aurora](USER_WorkingWithDBClusterParamGroups.md).

## Dividir um fragmento
<a name="limitless-shard-split.proc"></a>

Para dividir um fragmento em um grupo de fragmentos de banco de dados, use a função `rds_aurora.limitless_split_shard`. Essa função inicia um trabalho de divisão de fragmentos que é executado de forma assíncrona.

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

Aguarde o retorno de um ID de trabalho após o envio bem-sucedido do trabalho, por exemplo:

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

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

**nota**  
Operações simultâneas de divisão de fragmentos não são aceitas. Execute todas as operações sequencialmente e conclua cada uma antes de iniciar outra operação de adição.

## Rastrear divisões de fragmentos
<a name="limitless-shard-split.track"></a>

É possível usar o ID do trabalho para rastrear um trabalho de divisão de fragmentos. Para descrever um trabalho específico e obter mais detalhes sobre ele, execute a seguinte consulta:

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

Por exemplo:

```
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)
```

A consulta retorna um erro quando você passa um trabalho inexistente como entrada.

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

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

É possível acompanhar o status de todos os trabalhos de divisão de fragmentos usando a mesma consulta sem um ID de trabalho, por exemplo:

```
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)
```

O status de trabalho pode ser um dos seguintes:
+ `IN_PROGRESS`: o trabalho de divisão de fragmentos foi enviado e está em andamento. É possível ter apenas um trabalho em andamento por vez.
+ `PENDING`: o trabalho de divisão de fragmentos está aguardando sua finalização. Para obter mais informações, consulte [Finalizar divisões de fragmentos](#limitless-shard-split.finalize).
+ `CANCELLATION_IN_PROGRESS`: o trabalho de divisão de fragmentos está sendo cancelado pelo usuário.
+ `CANCELED`: o trabalho de divisão de fragmentos foi cancelado com sucesso pelo usuário ou pelo sistema.
+ `SUCCESS`: o trabalho de divisão de fragmentos foi concluído com sucesso. O campo `message` contém o ID da instância do novo fragmento.
+ `FAILED`: o trabalho de divisão de fragmentos falhou. O campo `message` contém os detalhes da falha e todas as ações que podem ser tomadas como acompanhamento do trabalho que falhou.

## Finalizar divisões de fragmentos
<a name="limitless-shard-split.finalize"></a>

A finalização é a última etapa do processo de divisão de fragmentos. Isso causa algum tempo de inatividade. Se você iniciar um trabalho de divisão de fragmentos, a finalização ocorrerá imediatamente após a conclusão bem-sucedida do trabalho.

Às vezes, o sistema divide fragmentos com base na workload, quando você habilita as divisões de fragmentos iniciadas pelo sistema usando o parâmetro `rds_aurora.limitless_enable_auto_scale`.

Nesse caso, é possível escolher se a finalização acontece imediatamente ou em um horário que você escolher. Você usa o parâmetro de cluster de banco de dados `rds_aurora.limitless_finalize_split_shard_mode` para escolher quando isso acontece:
+ Se você definir o valor como `immediate`, isso acontecerá imediatamente.
+ Se você definir o valor como `user_initiated`, você precisará finalizar o trabalho de divisão de fragmentos manualmente.

  Um evento do RDS é enviado para você e o status do trabalho de divisão de fragmentos é definido como `PENDING`.

Quando definido como `user_initiated`, você usa a função `rds_aurora.limitless_finalize_split_shard` para finalizar o trabalho de divisão de fragmentos:

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

**nota**  
Essa função se aplica somente às divisões de fragmentos iniciadas pelo sistema, não por você.

## Cancelar uma divisão de fragmentos
<a name="limitless-shard-split.cancel"></a>

Você pode cancelar uma divisão de fragmentos iniciada pelo usuário ou pelo sistema que tenha o status `IN_PROGRESS` ou `PENDING`. Você precisa do ID do trabalho para cancelá-lo.

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

Nenhuma saída é retornada, a menos que haja um erro. É possível acompanhar o cancelamento usando uma consulta de rastreamento de trabalho.