Comentarios sobre la exportación de instantáneas de clústeres de base de datos - Amazon Aurora

Comentarios sobre la exportación de instantáneas de clústeres de base de datos

Limitaciones

Exportar datos de instantáneas de base de datos a Amazon S3 tiene las siguientes limitaciones:

  • No puede ejecutar varias tareas de exportación para la misma instantánea del clúster de base de datos simultáneamente. Esto es cierto para las exportaciones completas y parciales.

  • Puede tener hasta cinco tareas de exportación de instantáneas de base de datos en curso por Cuenta de AWS.

  • No puede exportar los datos de instantáneos desde clústeres de bases de datos de Aurora Serverless v1 a S3.

  • Las exportaciones a S3 no admiten prefijos S3 que contengan dos puntos (:).

  • Los siguientes caracteres en la ruta del archivo S3 se convierten en guiones bajos (_) durante la exportación:

    \ ` " (space)
  • Si una base de datos, esquema o tabla tiene caracteres en su nombre distintos del siguiente, no se admite la exportación parcial. Sin embargo, puede exportar toda la instantánea de base de datos.

    • Letras latinas (A–Z)

    • Dígitos (0–9)

    • Símbolo de dólar ($)

    • Guion bajo (_)

  • No se admiten espacios ( ) ni determinados caracteres en los nombres de columna de las tablas de bases de datos. Las tablas con los siguientes caracteres en los nombres de columna se omiten durante la exportación:

    , ; { } ( ) \n \t = (space)
  • Las tablas con barras diagonales (/) en el nombre se omiten durante la exportación.

  • Las tablas temporales y no registradas de Aurora PostgreSQL se omiten durante la exportación.

  • Si los datos contienen un objeto grande, como un BLOB o CLOB, cercano o superior a 500 MB, se producirá un error en la exportación.

  • Si una tabla contiene una fila grande cercana o superior a 2 GB, la tabla se omite durante la exportación.

  • Para exportaciones parciales, la lista ExportOnly tiene un tamaño máximo de 200 KB.

  • Es muy recomendable que utilice un nombre exclusivo para cada tarea de exportación. Si no utiliza un nombre de tarea exclusivo, es posible que aparezca el siguiente mensaje de error como el que sigue:

    exportTaskAlreadyExistsFault: Se ha producido un error (exportTaskAlReadyExists) al llamar a la operación StartExportTask: la tarea de exportación con ID xxxxx ya existe.

  • Puede eliminar una instantánea mientras exporta los datos a S3, pero se le seguirán cobrando los costos de almacenamiento de esa instantánea hasta que se complete la tarea de exportación.

  • No puede restaurar los datos de instantáneas exportados de S3 a un nuevo clúster de base de datos.

Convención de nomenclatura de archivos

Los datos exportados para tablas específicas se almacenan en el formato base_prefix/files, donde el prefijo base es el siguiente:

export_identifier/database_name/schema_name.table_name/

Por ejemplo:

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

Hay dos convenciones para la forma en que se denominan los archivos.

  • Convención actual:

    batch_index/part-partition_index-random_uuid.format-based_extension

    El índice de lote es un número secuencial que representa un lote de datos leídos desde la tabla. Si no podemos dividir su tabla en pequeños fragmentos para exportarlos en paralelo, habrá varios índices de lote. Lo mismo ocurre si la tabla está dividida en varias tablas. Habrá varios índices de lote, uno para cada una de las particiones de la tabla principal.

    Si podemos dividir su tabla en pequeños fragmentos para que se lean en paralelo, solo estará la carpeta de índices de lote 1.

    Dentro de la carpeta de índices de lote, habrá uno o varios archivos Parquet que contienen los datos de la tabla. El prefijo del nombre de archivo Parquet es part-partition_index. Si la tabla está particionada, habrá varios archivos que comiencen por el índice de partición 00000.

    Puede haber huecos en la secuencia del índice de partición. Esto sucede porque cada partición se obtiene de una consulta por rangos de la tabla. Si no hay datos en el rango de esa partición, se omite ese número secuencial.

    Por ejemplo, supongamos que la columna id es la clave principal de la tabla y que sus valores mínimo y máximo son 100 y 1000. Al intentar exportar esta tabla con nueve particiones, la leemos con consultas paralelas como las siguientes:

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

    Esto debería generar nueve archivos, del part-00000-random_uuid.gz.parquet al part-00008-random_uuid.gz.parquet. Sin embargo, si no hay filas con ID entre 200 y 350, una de las particiones completadas estará vacía y no se creará ningún archivo para ella. En el ejemplo anterior, no se crea part-00001-random_uuid.gz.parquet.

  • Convención anterior:

    part-partition_index-random_uuid.format-based_extension

    Es igual a la convención actual, pero sin el prefijo batch_index, por ejemplo:

    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

La convención de nomenclatura de archivos está sujeta a cambios. Por lo tanto, cuando lea tablas de destino, recomendamos que lea todo lo que hay dentro del prefijo base de la tabla.

Conversión de datos al exportar a un bucket de Amazon S3

Cuando exporta una instantánea de base de datos a un bucket de Amazon S3, Amazon Aurora convierte los datos al formato Parquet, y exporta y almacena los datos en dicho formato. Para obtener más información sobre Parquet, consulte el sitio web de Apache Parquet.

Parquet almacena todos los datos como uno de los siguientes tipos primitivos:

  • BOOLEANO

  • INT32

  • INT64

  • INT96

  • FLOAT

  • DOUBLE

  • BYTE_ARRAY: matriz de bytes de longitud variable, también conocida como binario.

  • FIXED_LEN_BYTE_ARRAY. matriz de bytes de longitud fija utilizada cuando los valores tienen un tamaño constante.

Los tipos de datos Parquet son pocos para reducir la complejidad de leer y escribir el formato. Parquet proporciona tipos lógicos para ampliar los tipos primitivos. Un tipo lógico se implementa como una anotación con los datos en un campo de metadatos LogicalType. La anotación de tipo lógico explica cómo interpretar el tipo primitivo.

Cuando el tipo lógico STRING anota un tipo BYTE_ARRAY, indica que la matriz de bytes debe interpretarse como una cadena de caracteres codificada UTF-8. Cuando se complete la tarea de exportación, Amazon Aurora le notificará si se ha producido alguna conversión de cadena. Los datos subyacentes exportados siempre son los mismos que los datos del origen. Sin embargo, debido a la diferencia de codificación en UTF-8, algunos caracteres pueden parecer diferentes a los del origen cuando se leen en herramientas como Athena.

Para obtener más información, consulte Definiciones de tipos lógicos de Parquet en la documentación de Parquet.

Mapeo del tipo de datos MySQL con Parquet

En la siguiente tabla se muestra el mapeo de los tipos de datos MySQL con los tipos de datos Parquet cuando los datos se convierten y se exportan a Amazon S3.

Tipo de datos de origen Tipo primitivo de Parquet Anotación de tipo lógico Notas de conversión
Tipos de datos numéricos
BIGINT INT64
BIGINT UNSIGNED FIXED_LEN_BYTE_ARRAY(9) DECIMAL(20,0) Parquet solo admite tipos firmados, por lo que el mapeo requiere un byte adicional (8 más 1) para almacenar el tipo BIGINT_UNSIGNED.
BIT BYTE_ARRAY
DECIMAL INT32 DECIMAL (p,s) Si el valor de origen es inferior a 231, se almacena como INT32.
INT64 DECIMAL (p,s) Si el valor de origen es 231 o superior, pero inferior a 263, se almacena como INT64.
FIXED_LEN_BYTE_ARRAY(N) DECIMAL (p,s) Si el valor de origen es 263 o superior, se almacena como FIXED_LEN_BYTE_ARRAY(N).
BYTE_ARRAY STRING Parquet no admite una precisión decimal superior a 38. El valor decimal se convierte en una cadena en un tipo BYTE_ARRAY y se codifica como UTF8.
DOUBLE DOUBLE
FLOAT DOUBLE
INT INT32
INT UNSIGNED INT64
MEDIUMINT INT32
MEDIUMINT UNSIGNED INT64
NUMERIC INT32 DECIMAL (p,s)

Si el valor de origen es inferior a 231, se almacena como INT32.

INT64 DECIMAL (p,s) Si el valor de origen es 231 o superior, pero inferior a 263, se almacena como INT64.
FIXED_LEN_ARRAY(N) DECIMAL (p,s) Si el valor de origen es 263 o superior, se almacena como FIXED_LEN_BYTE_ARRAY(N).
BYTE_ARRAY STRING Parquet no admite una precisión numérica superior a 38. Este valor numérico se convierte en una cadena en un tipo BYTE_ARRAY y se codifica como UTF8.
SMALLINT INT32
SMALLINT UNSIGNED INT32
TINYINT INT32
TINYINT UNSIGNED INT32
Tipos de datos de cadena
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 datos de fecha y hora
FECHA BYTE_ARRAY STRING Una fecha se convierte en una cadena en un tipo BYTE_ARRAY y se codifica como UTF8.
DATETIME INT64 TIMESTAMP_MICROS
TIME BYTE_ARRAY STRING Un tipo TIME se convierte en una cadena en un BYTE_ARRAY y se codifica como UTF8.
TIMESTAMP INT64 TIMESTAMP_MICROS
YEAR INT32
Tipos de datos geométricos
GEOMETRY BYTE_ARRAY
GEOMETRYCOLLECTION BYTE_ARRAY
MULTIPOINT BYTE_ARRAY
MULTIPOLYGON BYTE_ARRAY
POINT BYTE_ARRAY
POLYGON BYTE_ARRAY
Tipos de datos de JSON
JSON BYTE_ARRAY STRING

Mapeo de tipos de datos PostgreSQL con Parquet

En la tabla siguiente se muestra el mapeo de los tipos de datos PostgreSQL con los tipos de datos Parquet cuando los datos se convierten y se exportan a Amazon S3.

Tipos de datos de PostgreSQL Tipo primitivo de Parquet Anotación de tipo lógico Notas de mapeo
Tipos de datos numéricos
BIGINT INT64
BIGSERIAL INT64
DECIMAL BYTE_ARRAY STRING Un tipo DECIMAL se convierte en una cadena en un tipo BYTE_ARRAY y se codifica como UTF8.

Esta conversión se realiza para evitar complicaciones debidas a la precisión de los datos y los valores de datos que no son un número (NaN).

DOUBLE PRECISION DOUBLE
INTEGER INT32
MONEY BYTE_ARRAY STRING
REAL FLOAT
SERIAL INT32
SMALLINT INT32 INT_16
SMALLSERIAL INT32 INT_16
Tipos de datos de cadena y relacionados
ARRAY BYTE_ARRAY STRING

Una matriz se convierte en una cadena y se codifica como BINARY (UTF8).

Esta conversión se realiza para evitar complicaciones debido a la precisión de los datos, valores de datos que no son un número (NaN) y valores de datos de tiempo.

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 datos de fecha y hora
FECHA 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 datos 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 datos JSON
JSON BYTE_ARRAY STRING
JSONB BYTE_ARRAY STRING
Otros tipos de datos
BOOLEANO BOOLEANO
CIDR BYTE_ARRAY STRING Tipo de datos de red
COMPOSITE BYTE_ARRAY STRING
DOMAIN BYTE_ARRAY STRING
INET BYTE_ARRAY STRING Tipo de datos de red
MACADDR BYTE_ARRAY STRING
OBJECT IDENTIFIER N/A
PG_LSN BYTE_ARRAY STRING
RANGE BYTE_ARRAY STRING
UUID BYTE_ARRAY STRING