

# Considerações sobre exportações de snapshot de cluster de banco de dados
<a name="aurora-export-snapshot.Considerations"></a>

## Limitações
<a name="aurora-export-snapshot.Limits"></a>

A exportação de dados de snapshots de banco de dados para o Amazon S3 apresenta as seguintes limitações:
+ Você não pode executar várias tarefas de exportação para o mesmo snapshot de cluster de banco de dados simultaneamente. Isso se aplica a exportações totais e parciais.
+ Você pode ter até cinco tarefas de exportação de snapshot de banco de dados simultâneas em andamento por Conta da AWS.
+ As exportações para o S3 não são compatíveis com prefixos do S3 contendo dois pontos (:).
+ Os seguintes caracteres no caminho do arquivo do S3 são convertidos em sublinhados (\_) durante a exportação:

  ```
  \ ` " (space)
  ```
+ Se um banco de dados, esquema ou tabela tiver caracteres em seu nome diferentes dos a seguir, a exportação parcial não será aceita. No entanto, você pode exportar o snapshot de banco de dados inteiro.
  + Letras latinas (A–Z)
  + Dígitos (0–9)
  + Símbolo do dólar ($)
  + Sublinhado (\_)
+ Espaços ( ) e alguns caracteres não são compatíveis em nomes de colunas de tabelas de banco de dados. As tabelas com os seguintes caracteres em nomes de colunas são ignoradas durante a exportação:

  ```
  , ; { } ( ) \n \t = (space)
  ```
+ As tabelas com barras (/) em seus nomes são ignoradas durante a exportação.
+ As tabelas temporárias e não registradas do Aurora PostgreSQL são ignoradas durante a exportação.
+ Se os dados contiverem um objeto grande, como um BLOB ou um CLOB, com tamanho próximo ou superior a 500 MB, ocorrerá uma falha na exportação.
+ Se uma tabela contiver uma linha grande próxima ou maior que 2 GB, a tabela será ignorada durante a exportação.
+ Em relação a exportações parciais, a lista `ExportOnly` tem um tamanho máximo de 200 KB.
+ É altamente recomendável que você use um nome exclusivo para cada tarefa de exportação. Se você não usar um nome de tarefa exclusivo, poderá receber a seguinte mensagem de erro:

  ExportTaskAlreadyExistsFault: An error occurred (ExportTaskAlreadyExists) when calling the StartExportTask operation: The export task with the ID {{xxxxx}} already exists [ExportTaskAlreadyExistsFault: ocorreu um erro (ExportTaskAlreadyExists) ao chamar a operação StartExportTask: a tarefa de exportação com o ID xxxxx já existe].
+ Você pode excluir um snapshot enquanto exporta seus dados para o S3, mas ainda é cobrado pelo armazenamento desse snapshot até que a tarefa de exportação seja concluída.
+ Não é possível restaurar dados de snapshots exportados do S3 para um novo cluster de banco de dados.

## Convenção de nomenclatura de arquivos
<a name="aurora-export-snapshot.FileNames"></a>

Os dados exportados para tabelas específicas são armazenados no formato `{{base_prefix}}/{{files}}`, onde o prefixo base é o seguinte:

```
{{export_identifier}}/{{database_name}}/{{schema_name}}.{{table_name}}/
```

Por exemplo:

```
export-1234567890123-459/rdststdb/rdststdb.DataInsert_7ADB5D19965123A2/
```

Existem duas convenções de nomenclatura para arquivos.
+ Convenção atual:

  ```
  {{batch_index}}/part-{{partition_index}}-{{random_uuid}}.{{format-based_extension}}
  ```

  O índice do lote é um número de sequência que representa um lote de dados lidos da tabela. Se não conseguirmos particionar a tabela em pequenos blocos para serem exportados paralelamente, haverá vários índices de lote. O mesmo acontecerá se a tabela for particionada em várias tabelas. Haverá vários índices de lote, um para cada partição da tabela principal.

  Se conseguirmos particionar a tabela em pequenos blocos para serem lidos paralelamente, haverá apenas a pasta `1` de índices de lote.

  Na pasta de índices de lote, há um ou mais arquivos Parquet que contêm os dados da sua tabela. O prefixo do nome do arquivo Parquet é `part-{{partition_index}}`. Se a tabela estiver particionada, haverá vários arquivos que começam com o índice de partição `00000`.

  Pode haver lacunas na sequência do índice de partição. Isso acontece porque cada partição é obtida de uma consulta por intervalos na tabela. Se não houver dados no intervalo dessa partição, esse número de sequência será ignorado.

  Por exemplo, suponha que a coluna `id` seja a chave primária da tabela e os valores mínimo e máximo sejam `100` e `1000`. Quando tentamos exportar essa tabela com nove partições, a lemos com consultas paralelas, como as seguintes:

  ```
  SELECT * FROM table WHERE id <= 100 AND id < 200
  	SELECT * FROM table WHERE id <= 200 AND id < 300
  ```

  Isso deve gerar nove arquivos, de `part-00000-{{random_uuid}}.gz.parquet` a `part-00008-{{random_uuid}}.gz.parquet`. No entanto, se não houver linhas com IDs entre `200` e `350`, uma das partições concluídas estará vazia e nenhum arquivo será criado para ela. No exemplo anterior, `part-00001-{{random_uuid}}.gz.parquet` não foi criado.
+ Convenção mais antiga:

  ```
  part-{{partition_index}}-{{random_uuid}}.{{format-based_extension}}
  ```

  É igual à convenção atual, mas sem o prefixo `{{batch_index}}`, por exemplo:

  ```
  part-00000-c5a881bb-58ff-4ee6-1111-b41ecff340a3-c000.gz.parquet
  	part-00001-d7a881cc-88cc-5ab7-2222-c41ecab340a4-c000.gz.parquet
  	part-00002-f5a991ab-59aa-7fa6-3333-d41eccd340a7-c000.gz.parquet
  ```

A convenção de nomenclatura de arquivos está sujeita a alterações. Portanto, ao ler as tabelas de destino, recomendamos que você leia tudo dentro do prefixo base para a tabela.

## Conversão de dados ao exportar para um bucket do Amazon S3
<a name="aurora-export-snapshot.data-types"></a>

Ao exportar um snapshot de banco de dados para um bucket do Amazon S3, o Amazon Aurora converte os dados para o formato Parquet e exporta e armazena os dados nesse formato. Para ter mais informações sobre o Parquet, consulte o site [Apache Parquet](https://parquet.apache.org/docs/).

O Parquet armazena todos os dados como um dos seguintes tipos primitivos:
+ BOOLEAN
+ INT32
+ INT64
+ INT96
+ FLOAT
+ DOUBLE
+ BYTE\_ARRAY: uma matriz de bytes de comprimento variável, também conhecida como binário
+ FIXED\_LEN\_BYTE\_ARRAY: uma matriz de bytes de comprimento fixo usada quando os valores têm um tamanho constante

Os tipos de dados Parquet são poucos para reduzir a complexidade de leitura e gravação do formato. O Parquet fornece tipos lógicos para estender os tipos primitivos. Um *tipo lógico* é implementado como uma anotação com os dados em um campo de metadados `LogicalType`. A anotação de tipo lógico explica como interpretar o tipo primitivo. 

Quando o tipo lógico `STRING` anota um tipo `BYTE_ARRAY`, ele indica que a matriz de bytes deve ser interpretada como uma string de caracteres codificada em UTF-8. Depois que uma tarefa de exportação é concluída, o Amazon Aurora notificará você se uma conversão de string tiver ocorrido. Os dados subjacentes exportados são sempre os mesmos que os dados da origem. No entanto, devido à diferença de codificação em UTF-8, alguns caracteres podem aparecer diferentes da fonte quando lidos em ferramentas como a Athena.

Para ter mais informações, consulte [Definições de tipos lógicos do Parquet](https://github.com/apache/parquet-format/blob/master/LogicalTypes.md) na documentação do Parquet.

**Topics**
+ [Mapeamento de tipos de dados MySQL para o Parquet](#aurora-export-snapshot.data-types.MySQL)
+ [Mapeamento de tipo de dados PostgreSQL para Parquet](#aurora-export-snapshot.data-types.PostgreSQL)

### Mapeamento de tipos de dados MySQL para o Parquet
<a name="aurora-export-snapshot.data-types.MySQL"></a>

A tabela a seguir mostra o mapeamento dos tipos de dados MySQL para tipos de dados Parquet quando os dados são convertidos e exportados para o Amazon S3.


<table>
<thead>
  <tr><th>Tipo de dados de origem</th><th>Tipo primitivo do Parquet</th><th>Anotação de tipo lógico</th><th>Notas de conversão</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">Tipos de dados numéricos</td></tr>
  <tr><td>BIGINT</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>BIGINT UNSIGNED</td><td>FIXED\_LEN\_BYTE\_ARRAY(9) </td><td>DECIMAL(20,0)</td><td>O Parquet é compatível apenas com tipos assinados, portanto, o mapeamento requer um byte adicional (8 mais 1) para armazenar o tipo BIGINT\_UNSIGNED.</td></tr>
  <tr><td>BIT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td rowspan="4">DECIMAL</td><td>INT32</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for menor que 231, ele será armazenado como INT32. </td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.</td></tr>
  <tr><td>FIXED\_LEN\_BYTE\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 263 ou superior, ele será armazenado como FIXED\_LEN\_BYTE\_ARRAY(N).</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>O Parquet não é compatível com precisão decimal maior que 38. O valor decimal é convertido em uma string em um tipo BYTE\_ARRAY e codificado como UTF8.</td></tr>
  <tr><td>DOUBLE</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>FLOAT</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>INT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>INT UNSIGNED</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>MEDIUMINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>MEDIUMINT UNSIGNED</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td rowspan="4"> NUMERIC</td><td>INT32</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for menor que 231, ele será armazenado como INT32.</td></tr>
  <tr><td>INT64</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.</td></tr>
  <tr><td>FIXED\_LEN\_ARRAY(N)</td><td>DECIMAL (p,s)</td><td>Se o valor de origem for 263 ou superior, ele será armazenado como FIXED\_LEN\_BYTE\_ARRAY(N).</td></tr>
  <tr><td>BYTE\_ARRAY</td><td>STRING</td><td>O Parquet não é compatível com precisão numérica maior que 38. Esse valor numérico é convertido em uma string em um tipo BYTE\_ARRAY e codificado como UTF8.</td></tr>
  <tr><td>SMALLINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>SMALLINT UNSIGNED</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>TINYINT</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>TINYINT UNSIGNED</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td colspan="4">Tipos de dados de string</td></tr>
  <tr><td>BINARY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>BLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>CHAR</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>ENUM</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINESTRING</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>LONGBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>LONGTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>MEDIUMBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MEDIUMTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>MULTILINESTRING</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>SET</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TINYBLOB</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>TINYTEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>VARBINARY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>VARCHAR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">Tipos de dados de data e hora</td></tr>
  <tr><td>DATE</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Uma data é convertida em uma string em um tipo BYTE\_ARRAY e codificada como UTF8.</td></tr>
  <tr><td>DATETIME</td><td>INT64 </td><td>TIMESTAMP\_MICROS</td><td> </td></tr>
  <tr><td>TIME</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Um tipo TIME é convertido em uma string em um BYTE\_ARRAY e codificado como UTF8.</td></tr>
  <tr><td>TIMESTAMP</td><td>INT64 </td><td>TIMESTAMP\_MICROS</td><td> </td></tr>
  <tr><td>YEAR</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td colspan="4">Tipos de dados geométricos</td></tr>
  <tr><td>GEOMETRY</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>GEOMETRYCOLLECTION</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MULTIPOINT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>MULTIPOLYGON</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>POINT</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td>POLYGON</td><td>BYTE\_ARRAY</td><td></td><td> </td></tr>
  <tr><td colspan="4">Tipo de dados do JSON</td></tr>
  <tr><td>JSON </td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
</tbody>
</table>


### Mapeamento de tipo de dados PostgreSQL para Parquet
<a name="aurora-export-snapshot.data-types.PostgreSQL"></a>

A tabela a seguir mostra o mapeamento de tipos de dados PostgreSQL para tipos de dados Parquet quando os dados são convertidos e exportados para o Amazon S3.


<table>
<thead>
  <tr><th>Tipo de dados do PostgreSQL</th><th>Tipo primitivo do Parquet</th><th>Anotação de tipo lógico</th><th>Notas de mapeamento</th></tr>
</thead>
<tbody>
  <tr><td colspan="4">Tipos de dados numéricos</td></tr>
  <tr><td>BIGINT</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>BIGSERIAL</td><td>INT64</td><td></td><td> </td></tr>
  <tr><td>DECIMAL</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Um tipo DECIMAL é convertido em uma string em um tipo BYTE\_ARRAY e codificado como UTF8.Essa conversão é para evitar complicações devido à precisão dos dados e valores de dados que não são um número (NaN).</td></tr>
  <tr><td>DOUBLE PRECISION</td><td>DOUBLE</td><td></td><td> </td></tr>
  <tr><td>INTEGER</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>MONEY</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>REAL</td><td>FLOAT</td><td></td><td> </td></tr>
  <tr><td>SERIAL</td><td>INT32</td><td></td><td> </td></tr>
  <tr><td>SMALLINT</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td>SMALLSERIAL</td><td>INT32</td><td>INT(16, true)</td><td> </td></tr>
  <tr><td colspan="3">String e tipos de dados relacionados</td><td></td></tr>
  <tr><td>ARRAY</td><td>BYTE\_ARRAY</td><td>STRING</td><td>Uma matriz é convertida em uma string e codificada como BINARY (UTF8).<br />Essa conversão é para evitar complicações devido à precisão dos dados, os valores dos dados que não são um número (NaN) e os valores de dados de tempo.</td></tr>
  <tr><td>BIT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>BIT VARYING</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>BYTEA</td><td>BINARY</td><td></td><td> </td></tr>
  <tr><td>CHAR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>CHAR(N)</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>ENUM</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>NAME</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TEXT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TEXT SEARCH</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>VARCHAR(N)</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>XML</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">Tipos de dados de data e hora</td></tr>
  <tr><td>DATE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>INTERVAL</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>TIME</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>TIME WITH TIME ZONE</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>TIMESTAMP</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td>TIMESTAMP WITH TIME ZONE</td><td>BYTE\_ARRAY</td><td>STRING</td><td></td></tr>
  <tr><td colspan="4">Tipos de dados geométricos</td></tr>
  <tr><td>BOX</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>CIRCLE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>LINESEGMENT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>PATH</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>POINT</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>POLYGON</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">Tipos de dados JSON</td></tr>
  <tr><td>JSON</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>JSONB</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td colspan="4">Outros tipos de dados</td></tr>
  <tr><td>BOOLEAN</td><td>BOOLEAN</td><td></td><td> </td></tr>
  <tr><td>CIDR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> Tipo de dados de rede</td></tr>
  <tr><td>COMPOSITE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>DOMAIN</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>INET</td><td>BYTE\_ARRAY</td><td>STRING</td><td> Tipo de dados de rede</td></tr>
  <tr><td>MACADDR</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>OBJECT IDENTIFIER</td><td>N/D</td><td></td><td></td></tr>
  <tr><td>PG\_LSN</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>RANGE</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
  <tr><td>UUID</td><td>BYTE\_ARRAY</td><td>STRING</td><td> </td></tr>
</tbody>
</table>
