Considerações sobre exportações de snapshot de cluster de banco de dados - Amazon Aurora

Considerações sobre exportações de snapshot de cluster de banco de dados

Limitações

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.

  • Não é possível restaurar dados de snapshots exportados de clusters de banco de dados do Aurora Serverless v1 para o S3.

  • 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

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

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.

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 na documentação do Parquet.

Mapeamento de tipos de dados MySQL para o Parquet

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.

Tipo de dados de origem Tipo primitivo do Parquet Anotação de tipo lógico Notas de conversão
Tipos de dados numéricos
BIGINT INT64
BIGINT UNSIGNED FIXED_LEN_BYTE_ARRAY(9) DECIMAL(20,0) O Parquet é compatível apenas com tipos assinados, portanto, o mapeamento requer um byte adicional (8 mais 1) para armazenar o tipo BIGINT_UNSIGNED.
BIT BYTE_ARRAY
DECIMAL INT32 DECIMAL (p,s) Se o valor de origem for menor que 231, ele será armazenado como INT32.
INT64 DECIMAL (p,s) Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.
FIXED_LEN_BYTE_ARRAY(N) DECIMAL (p,s) Se o valor de origem for 263 ou superior, ele será armazenado como FIXED_LEN_BYTE_ARRAY(N).
BYTE_ARRAY STRING 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.
DOUBLE DOUBLE
FLOAT DOUBLE
INT INT32
INT UNSIGNED INT64
MEDIUMINT INT32
MEDIUMINT UNSIGNED INT64
NUMERIC INT32 DECIMAL (p,s)

Se o valor de origem for menor que 231, ele será armazenado como INT32.

INT64 DECIMAL (p,s) Se o valor de origem for 231 ou maior, mas inferior a 263, ele será armazenado como INT64.
FIXED_LEN_ARRAY(N) DECIMAL (p,s) Se o valor de origem for 263 ou superior, ele será armazenado como FIXED_LEN_BYTE_ARRAY(N).
BYTE_ARRAY STRING 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.
SMALLINT INT32
SMALLINT UNSIGNED INT32
TINYINT INT32
TINYINT UNSIGNED INT32
Tipos de dados de string
BINARY BYTE_ARRAY
BLOB BYTE_ARRAY
CHAR BYTE_ARRAY
ENUM BYTE_ARRAY STRING
LINESTRING BYTE_ARRAY
LONGBLOB BYTE_ARRAY
LONGTEXT BYTE_ARRAY STRING
MEDIUMBLOB BYTE_ARRAY
MEDIUMTEXT BYTE_ARRAY STRING
MULTILINESTRING BYTE_ARRAY
SET BYTE_ARRAY STRING
TEXT BYTE_ARRAY STRING
TINYBLOB BYTE_ARRAY
TINYTEXT BYTE_ARRAY STRING
VARBINARY BYTE_ARRAY
VARCHAR BYTE_ARRAY STRING
Tipos de dados de data e hora
DATE BYTE_ARRAY STRING Uma data é convertida em uma string em um tipo BYTE_ARRAY e codificada como UTF8.
DATETIME INT64 TIMESTAMP_MICROS
TIME BYTE_ARRAY STRING Um tipo TIME é convertido em uma string em um BYTE_ARRAY e codificado como UTF8.
TIMESTAMP INT64 TIMESTAMP_MICROS
YEAR INT32
Tipos de dados geométricos
GEOMETRY BYTE_ARRAY
GEOMETRYCOLLECTION BYTE_ARRAY
MULTIPOINT BYTE_ARRAY
MULTIPOLYGON BYTE_ARRAY
POINT BYTE_ARRAY
POLYGON BYTE_ARRAY
Tipo de dados do JSON
JSON BYTE_ARRAY STRING

Mapeamento de tipo de dados PostgreSQL para Parquet

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.

Tipo de dados do PostgreSQL Tipo primitivo do Parquet Anotação de tipo lógico Notas de mapeamento
Tipos de dados numéricos
BIGINT INT64
BIGSERIAL INT64
DECIMAL BYTE_ARRAY STRING 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).

DOUBLE PRECISION DOUBLE
INTEGER INT32
MONEY BYTE_ARRAY STRING
REAL FLOAT
SERIAL INT32
SMALLINT INT32 INT_16
SMALLSERIAL INT32 INT_16
String e tipos de dados relacionados
ARRAY BYTE_ARRAY STRING

Uma matriz é convertida em uma string e codificada como BINARY (UTF8).

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.

BIT BYTE_ARRAY STRING
BIT VARYING BYTE_ARRAY STRING
BYTEA BINARY
CHAR BYTE_ARRAY STRING
CHAR(N) BYTE_ARRAY STRING
ENUM BYTE_ARRAY STRING
NAME BYTE_ARRAY STRING
TEXT BYTE_ARRAY STRING
TEXT SEARCH BYTE_ARRAY STRING
VARCHAR(N) BYTE_ARRAY STRING
XML BYTE_ARRAY STRING
Tipos de dados de data e hora
DATE BYTE_ARRAY STRING
INTERVAL BYTE_ARRAY STRING
TIME BYTE_ARRAY STRING
TIME WITH TIME ZONE BYTE_ARRAY STRING
TIMESTAMP BYTE_ARRAY STRING
TIMESTAMP WITH TIME ZONE BYTE_ARRAY STRING
Tipos de dados geométricos
BOX BYTE_ARRAY STRING
CIRCLE BYTE_ARRAY STRING
LINE BYTE_ARRAY STRING
LINESEGMENT BYTE_ARRAY STRING
PATH BYTE_ARRAY STRING
POINT BYTE_ARRAY STRING
POLYGON BYTE_ARRAY STRING
Tipos de dados JSON
JSON BYTE_ARRAY STRING
JSONB BYTE_ARRAY STRING
Outros tipos de dados
BOOLEAN BOOLEAN
CIDR BYTE_ARRAY STRING Tipo de dados de rede
COMPOSITE BYTE_ARRAY STRING
DOMAIN BYTE_ARRAY STRING
INET BYTE_ARRAY STRING Tipo de dados de rede
MACADDR BYTE_ARRAY STRING
OBJECT IDENTIFIER N/D
PG_LSN BYTE_ARRAY STRING
RANGE BYTE_ARRAY STRING
UUID BYTE_ARRAY STRING