Grabación de datos desde un clúster de base de datos Amazon Aurora MySQL en archivos de texto de un bucket de Amazon S3 - Amazon Aurora

Grabación de datos desde un clúster de base de datos Amazon Aurora MySQL en archivos de texto de un bucket de Amazon S3

Puede usar la instrucción SELECT INTO OUTFILE S3 para consultar datos de un clúster de base de datos de Amazon Aurora MySQL y guardarlos directamente en archivos de texto almacenados en un bucket de Amazon S3. En Aurora MySQL, los archivos se almacenan primero en el disco local y, a continuación, se exportan a S3. Una vez finalizadas las exportaciones, se eliminan los archivos locales.

Puede cifrar el bucket de Amazon S3 mediante una clave administrada de Amazon S3 (SSE-S3) o AWS KMS key (SSE-KMS: Clave administrada de AWS o clave administrada por el cliente).

La instrucción LOAD DATA FROM S3 puede usar archivos creados mediante la instrucción SELECT INTO OUTFILE S3 para cargar datos en un clúster de base de datos de Aurora. Para obtener más información, consulte Carga de datos en un clúster de base de datos Amazon Aurora MySQL desde archivos de texto en un bucket de Amazon S3.

nota

Esta característica no se admite para clústeres de base de datos de Aurora Serverless v1. Es compatible con clústeres de bases de datos de Aurora Serverless v2.

También puede guardar datos de clúster de base de datos y datos de instantáneas de clúster de base de datos en Amazon S3 mediante la AWS Management Console, la AWS CLI o la API de Amazon RDS. Para obtener más información, consulte Exportación de datos del clúster de base de datos a Amazon S3 y Exportación de datos de instantánea del clúster de bases de datos a Amazon S3.

Otorgar acceso a Aurora MySQL a Amazon S3

Para poder guardar datos en un bucket de Amazon S3, primero debe dar permiso al clúster de base de datos Aurora MySQL para que tenga acceso a Amazon S3.

Para conceder a Aurora MySQL acceso a Amazon S3
  1. Cree una política de AWS Identity and Access Management (IAM) que asigne los permisos de bucket y objeto que permiten que su clúster de base de datos de Aurora MySQL acceda a Amazon S3. Para obtener instrucciones, consulte Creación de una política de IAM para acceder a los recursos de Amazon S3.

    nota

    En Aurora MySQL versión 3.05 y versiones posteriores, puede cifrar objetos mediante claves administradas por el cliente AWS KMS. Para ello, incluya el permiso kms:GenerateDataKey en su política de IAM. Para obtener más información, consulte Creación de una política de IAM para acceder a los recursos de AWS KMS.

    No necesita este permiso para cifrar objetos mediante Claves administradas por AWS o claves administradas de Amazon S3 (SSE-S3).

  2. Cree un rol de IAM y asocie la política de IAM que creó en Creación de una política de IAM para acceder a los recursos de Amazon S3 al nuevo rol de IAM. Para obtener instrucciones, consulte Creación de un rol de IAM que permita a Amazon Aurora acceder a los servicios de AWS.

  3. Para la versión 2 de Aurora MySQL, establezca el parámetro de clúster de base de datos aurora_select_into_s3_role o aws_default_s3_role en el nombre de recurso de Amazon (ARN) del nuevo rol de IAM. Si no se ha especificado un rol de IAM para aurora_select_into_s3_role, Aurora utilizará el rol de IAM especificado en el parámetro aws_default_s3_role.

    Para Aurora MySQL versión 3, use aws_default_s3_role.

    Si el clúster es parte de una base de datos global de Aurora, configure este parámetro para cada clúster de Aurora en la base de datos global.

    Para obtener más información acerca de los parámetros de clúster de base de datos, consulte Parámetros del clúster de base de datos de Amazon Aurora y de instancia de base de datos.

  4. Para permitir el acceso a Aurora MySQL a los usuarios de base de datos un clúster de base de datos Amazon S3, asocie el rol que creó en Creación de un rol de IAM que permita a Amazon Aurora acceder a los servicios de AWS con el clúster.

    Para una base de datos global de Aurora, asocie el rol con cada clúster de Aurora en la base de datos global.

    Para obtener información acerca de cómo asociar un rol de IAM con un clúster de base de datos, consulte Asociación de un rol de IAM con un clúster de base de datos Amazon Aurora MySQL.

  5. Configure el clúster de base de datos Aurora MySQL para permitir conexiones salientes hacia Amazon S3. Para obtener instrucciones, consulte Habilitación de la comunicación de red de Amazon Aurora MySQL con otros servicios de AWS.

    Para una base de datos global de Aurora, habilite las conexiones de salida para cada clúster de Aurora en la base de datos global.

Concesión de privilegios para guardar datos en Aurora MySQL

El usuario de la base de datos que utilice la instrucción SELECT INTO OUTFILE S3 debe tener un rol o privilegio específicos. En Aurora MySQL versión 3, usted otorga el rol de AWS_SELECT_S3_ACCESS. En la versión 2 de Aurora MySQL, usted otorga el privilegio SELECT INTO S3. El usuario administrativo de un clúster de base de datos tiene el rol o privilegio adecuados de forma predeterminada. Para conceder el privilegio a otro usuario, puede usar una de las instrucciones siguientes.

Utilice la siguiente instrucción para Aurora MySQL versión 3:

GRANT AWS_SELECT_S3_ACCESS TO 'user'@'domain-or-ip-address'
sugerencia

Cuando utiliza la técnica de rol en Aurora MySQL versión 3, también puede activar el rol mediante la instrucción SET ROLE role_name o SET ROLE ALL. Si no está familiarizado con el sistema de roles MySQL 8.0, puede obtener más información en Modelo de privilegios basado en roles. Para obtener más información, consulte Using roles en el Manual de referencia de MySQL.

Esto solo se aplica a la sesión activa actual. Cuando se vuelva a conectar, debe ejecutar la instrucción SET ROLE de nuevo para conceder privilegios. Para obtener más información, consulte la instrucción SET ROLE en el Manual de referencia de MySQL.

Puede utilizar el parámetro de clúster de base de datos activate_all_roles_on_login para activar automáticamente todos los roles cuando un usuario se conecta a una instancia de base de datos. Cuando se establece este parámetro, por lo general no tiene que llamar a la instrucción SET ROLE para activar un rol. Para obtener más información, consulte activate_all_roles_on_login en el Manual de referencia de MySQL.

Sin embargo, debe llamar a SET ROLE ALL de forma explícita al principio de un procedimiento almacenado para activar el rol cuando un usuario diferente llame al procedimiento almacenado.

Utilice la siguiente instrucción para la versión 2 de Aurora MySQL:

GRANT SELECT INTO S3 ON *.* TO 'user'@'domain-or-ip-address'

El rol AWS_SELECT_S3_ACCESS y el privilegio SELECT INTO S3 son específicos de Amazon Aurora MySQL y no están disponibles en las bases de datos de MySQL ni en las instancias de base de datos de RDS for MySQL. Si ha configurado replicación entre un clúster de base de datos Aurora MySQL como maestro y una base de datos MySQL como cliente, la instrucción GRANT para el rol o privilegio hace que la replicación se detenga con un error. Puede pasar por alto el error para continuar la replicación. Para pasar por alto el error en una instancia de base de datos de RDS for MySQL, utilice el procedimiento mysql_rds_skip_repl_error. Para omitir el error en una base de datos MySQL externa, utilice la variable de sistema slave_skip_errors (Aurora MySQL versión 2) o la variable de sistema replica_skip_errors (Aurora MySQL versión 3).

Especificación de una ruta a un bucket de Amazon S3

La sintaxis para especificar una ruta donde almacenar los datos y los archivos de manifiesto en un bucket de Amazon S3 es similar a la empleada en la instrucción LOAD DATA FROM S3 PREFIX, como se indica a continuación:

s3-region://bucket-name/file-prefix

La ruta incluye los siguientes valores:

  • region (opcional): la región de AWS que contiene el bucket de Amazon S3 para guardar los datos. Este valor es opcional. Si no especifica el valor region, Aurora guarda los archivos en Amazon S3 en la misma región en la que se encuentra el clúster de base de datos.

  • bucket-name: nombre del bucket de Amazon S3 donde se guardan los datos. Pueden usarse prefijos de objeto que identifiquen una ruta de carpeta virtual.

  • file-prefix: prefijo de objeto de Amazon S3 que identifica los archivos que se guardan en Amazon S3.

Los archivos de datos creados con la instrucción SELECT INTO OUTFILE S3 usan la ruta siguiente, donde 00000 representa un número entero de cinco dígitos basado en cero.

s3-region://bucket-name/file-prefix.part_00000

Por ejemplo, supongamos que la instrucción SELECT INTO OUTFILE S3 especifica s3-us-west-2://bucket/prefix como la ruta donde almacenar los archivos de datos y que crea tres archivos. El bucket de Amazon S3 especificado contendrá los archivos de datos siguientes:

  • s3-us-west-2://bucket/prefix.part_00000

  • s3-us-west-2://bucket/prefix.part_00001

  • s3-us-west-2://bucket/prefix.part_00002

Creación de un manifiesto con una lista de los archivos de datos

Puede utilizar la instrucción SELECT INTO OUTFILE S3 con la opción MANIFEST ON para crear un archivo de manifiesto con formato JSON que enumera los archivos de texto creados por la instrucción. La instrucción LOAD DATA FROM S3 puede usar el archivo de manifiesto para volver a cargar los archivos de datos en un clúster de base de datos Aurora MySQL. Para obtener más información acerca de cómo utilizar un archivo de manifiesto para cargar archivos de texto desde Amazon S3 en un clúster de base de datos Aurora MySQL, consulte Uso de un manifiesto para especificar los archivos de datos que se deben cargar.

Los archivos de datos incluidos en el manifiesto creado con la instrucción SELECT INTO OUTFILE S3 se enumeran en el orden en que la instrucción los ha creado. Por ejemplo, supongamos que la instrucción SELECT INTO OUTFILE S3 especificó s3-us-west-2://bucket/prefix como la ruta donde almacenar los archivos de datos y que ha creado tres archivos de datos y un archivo de manifiesto. El bucket de Amazon S3 especificado contendrá un archivo de manifiesto llamado s3-us-west-2://bucket/prefix.manifest que contiene la información siguiente:

{ "entries": [ { "url":"s3-us-west-2://bucket/prefix.part_00000" }, { "url":"s3-us-west-2://bucket/prefix.part_00001" }, { "url":"s3-us-west-2://bucket/prefix.part_00002" } ] }

SELECT INTO OUTFILE S3

Con la instrucción SELECT INTO OUTFILE S3 puede consultar datos de un clúster de base de datos y guardarlos directamente en archivos de texto delimitado almacenados en un bucket de Amazon S3.

No se admiten archivos comprimidos. Los archivos cifrados son compatibles a partir de Aurora MySQL versión 2.09.0.

Sintaxis

SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT] [SQL_CACHE | SQL_NO_CACHE] [SQL_CALC_FOUND_ROWS] select_expr [, select_expr ...] [FROM table_references [PARTITION partition_list] [WHERE where_condition] [GROUP BY {col_name | expr | position} [ASC | DESC], ... [WITH ROLLUP]] [HAVING where_condition] [ORDER BY {col_name | expr | position} [ASC | DESC], ...] [LIMIT {[offset,] row_count | row_count OFFSET offset}] INTO OUTFILE S3 's3_uri' [CHARACTER SET charset_name] [export_options] [MANIFEST {ON | OFF}] [OVERWRITE {ON | OFF}] [ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id']}] export_options: [FORMAT {CSV|TEXT} [HEADER]] [{FIELDS | COLUMNS} [TERMINATED BY 'string'] [[OPTIONALLY] ENCLOSED BY 'char'] [ESCAPED BY 'char'] ] [LINES [STARTING BY 'string'] [TERMINATED BY 'string'] ]

Parámetros

La instrucción SELECT INTO OUTFILE S3 utiliza los siguientes parámetros obligatorios y opcionales que son específicos de Aurora.

s3-uri

Especifica el URI del prefijo de Amazon S3 utilizado. Utilice la sintaxis descrita en Especificación de una ruta a un bucket de Amazon S3.

FORMAT {CSV|TEXT} [HEADER]

Si lo desea, guarda los datos en formato CSV.

La opción TEXT es la predeterminada y produce el formato de exportación MySQL existente.

La opción CSV produce valores de datos separados por comas. El formato CSV sigue la especificación de RFC-4180. Si especifique la palabra clave opcional HEADER, el archivo de salida contiene una línea de encabezado. Las etiquetas de la línea de encabezado se corresponden con los nombres de las columnas de la instrucción SELECT. Puede usar los archivos CSV para el entrenamiento de modelos de datos a fin de utilizarlos con los servicios de ML de AWS. Para obtener más información acerca del uso de datos exportados de Aurora con servicios de ML de AWS, consulte Exportación de datos a Amazon S3 para el entrenamiento de modelos de SageMaker (avanzado).

MANIFEST {ON | OFF}

Indica si se crea o no un archivo de manifiesto en Amazon S3. El archivo de manifiesto es un archivo en notación de objetos JavaScript (JSON) que puede usarse para cargar datos en un clúster de base de datos Aurora con la instrucción LOAD DATA FROM S3 MANIFEST. Para obtener más información acerca de LOAD DATA FROM S3 MANIFEST, consulte Carga de datos en un clúster de base de datos Amazon Aurora MySQL desde archivos de texto en un bucket de Amazon S3.

Si se especifica MANIFEST ON en la consulta, se creará el archivo de manifiesto en Amazon S3 después de haber creado y cargado todos los archivos de datos. El archivo de manifiesto se crea en la ruta siguiente:

s3-region://bucket-name/file-prefix.manifest

Para obtener más información acerca del formato del contenido del archivo de manifiesto, consulte Creación de un manifiesto con una lista de los archivos de datos.

OVERWRITE {ON | OFF}

Indica si los archivos existentes en el bucket de Amazon S3 especificado se sobrescriben. Si se especifica OVERWRITE ON, se sobrescribirán los archivos existentes con el prefijo indicado en el URI especificado en s3-uri. En caso contrario, se produce un error.

ENCRYPTION {ON | OFF | SSE_S3 | SSE_KMS ['cmk_id']}

Indica si se usa el cifrado del servidor con claves administradas de Amazon S3 (SSE-S3) o AWS KMS keys (SSE-KMS, incluidas Claves administradas por AWS y claves administradas por el cliente). La configuración de SSE_S3 y SSE_KMS está disponible en la versión 3.05 de Aurora MySQL y versiones posteriores.

También puede utilizar la variable de sesión aurora_select_into_s3_encryption_default en lugar de la cláusula ENCRYPTION, como se muestra en el siguiente ejemplo. Utilice la cláusula SQL o la variable de sesión, pero no ambas.

set session set session aurora_select_into_s3_encryption_default={ON | OFF | SSE_S3 | SSE_KMS};

La configuración de SSE_S3 y SSE_KMS está disponible en la versión 3.05 de Aurora MySQL y versiones posteriores.

Cuando se establece aurora_select_into_s3_encryption_default en el siguiente valor:

  • OFF: se sigue la política de cifrado predeterminada del bucket de S3. El valor predeterminado de aurora_select_into_s3_encryption_default es OFF.

  • ON o SSE_S3: el objeto S3 se cifra mediante claves administradas de Amazon S3 (SSE-S3).

  • SSE_KMS: el objeto S3 se cifra mediante una AWS KMS key.

    En este caso, también se incluye la variable de sesión aurora_s3_default_cmk_id, por ejemplo:

    set session aurora_select_into_s3_encryption_default={SSE_KMS}; set session aurora_s3_default_cmk_id={NULL | 'cmk_id'};
    • Cuando aurora_s3_default_cmk_id es NULL, el objeto S3 se cifra mediante una Clave administrada de AWS.

    • Cuando aurora_s3_default_cmk_id es cmk_id de una cadena que no está vacía, el objeto S3 se cifra mediante una clave gestionada por el cliente.

      El valor de cmk_id no puede ser una cadena vacía.

Si se utiliza el comando SELECT INTO OUTFILE S3, Aurora determina el cifrado de la siguiente manera:

  • Si la cláusula ENCRYPTION está presente en el comando SQL, Aurora se basa únicamente en el valor de ENCRYPTION y no usa una variable de sesión.

  • Si la cláusula ENCRYPTION no está presente, Aurora se basa en el valor de la variable de sesión.

Para obtener más información, consulte Uso del cifrado del servidor con claves administradas por Amazon S3 (SSE-S3) y Uso del cifrado del lado del servidor con claves AWS KMS (SSE-KMS) en la Guía del usuario de Amazon Simple Storage Service.

Encontrará más información sobre otros parámetros en SELECT statement (Instrucción SELECT) y LOAD DATA statement (Instrucción LOAD DATA) en la documentación de MySQL.

Consideraciones

El número de archivos escritos en el bucket de Amazon S3 depende de la cantidad de datos que seleccione la instrucción SELECT INTO OUTFILE S3 y del umbral de tamaño de archivo de Aurora MySQL. Por defecto, el umbral de tamaño de archivo es 6 gigabytes (GB). Si el volumen de los datos seleccionados por la instrucción es inferior al umbral de tamaño de archivo, se creará un solo archivo. En caso contrario, se crearán varios. Las siguientes son otras consideraciones sobre los archivos que crea esta instrucción:

  • Aurora MySQL garantiza que las filas de los archivos de datos no se dividan entre archivos. Si hay varios archivos, normalmente el tamaño de cada uno, salvo el último, será cercano al umbral de tamaño de archivo. Sin embargo, en ocasiones, mantenerse por debajo del umbral de tamaño de archivo implicaría dividir una fila entre dos archivos. En tal caso, Aurora MySQL crea un archivo de datos que mantiene la fila completa, pero que puede tener un tamaño superior al umbral.

  • Dado que cada instrucción SELECT en Aurora MySQL ejecuta como transacción atómica, una instrucción SELECT INTO OUTFILE S3 que selecciona un conjunto de datos grande puede ejecutarse durante un tiempo considerable. Si la instrucción devuelve un error por cualquier motivo, puede ser necesario comenzar desde el principio y ejecutarla de nuevo. Sin embargo, si la instrucción falla, los archivos ya cargados en Amazon S3 permanecerán en el bucket de Amazon S3 especificado. Entonces puede utilizar otra instrucción para cargar los datos faltantes en lugar de comenzar de nuevo desde el principio.

  • Si el volumen de datos que se seleccionan es grande (más de 25 GB), es recomendable usar varias instrucciones SELECT INTO OUTFILE S3 para guardar los datos en Amazon S3. Cada instrucción debe seleccionar una parte distinta de los datos que se deben guardar y también debe especificar un valor file_prefix distinto en el parámetro s3-uri al guardar los archivos de datos. La partición de los datos que se van a seleccionar con varias instrucciones facilita la recuperación de un error en una instrucción. Si se produce un error para una instrucción, solo se debe volver a seleccionar una parte de los datos y cargarlos en Amazon S3. El uso de múltiples instrucciones también ayuda a evitar una transacción única prolongada, lo que puede mejorar el desempeño.

  • Si se ejecutan varias instrucciones SELECT INTO OUTFILE S3 en paralelo con el mismo valor de file_prefix en el parámetro s3-uri para seleccionar datos y cargarlos en Amazon S3, el comportamiento resultante no está definido.

  • Aurora MySQL no carga en Amazon S3 los metadatos, como el esquema de tablas y los metadatos de archivos.

  • En algunos casos puede ser necesario volver a ejecutar una consulta SELECT INTO OUTFILE S3, por ejemplo para recuperarse de un error. En estos casos, deberá eliminar los archivos de datos que haya en el bucket de Amazon S3 con el prefijo especificado en s3-uri o bien deberá especificar OVERWRITE ON en la consulta SELECT INTO OUTFILE S3.

La instrucción SELECT INTO OUTFILE S3 devuelve el número de error y la respuesta habituales de MySQL en caso de éxito o error de la operación. Si no tiene acceso al número de error y la respuesta de MySQL, la forma más sencilla de determinar cuándo ha terminado la operación es especificar MANIFEST ON en la instrucción. El archivo de manifiesto es el último archivo que escribe la instrucción. En otras palabras, si existe un archivo de manifiesto, la instrucción se ha completado.

Actualmente no existe un modo de monitorear el progreso de la instrucción SELECT INTO OUTFILE S3 mientras se ejecuta. Sin embargo, supongamos que va a cargar una gran cantidad de datos de Aurora MySQL en Amazon S3 con esta instrucción y que conoce el volumen de los datos seleccionados. En tal caso puede estimar el progreso observando la creación de los archivos de datos en Amazon S3.

Para ello partimos del hecho de que se crea un archivo de datos en el bucket de Amazon S3 aproximadamente por cada 6 GB de datos seleccionados por la instrucción. Dividiendo el volumen de los datos seleccionados entre 6 GB se obtiene el número estimado de archivos de datos que se crean. Puede estimar el progreso de la instrucción monitoreando el número de archivos cargados en Amazon S3 mientras se ejecuta la instrucción.

Ejemplos

La instrucción siguiente selecciona todos los datos de la tabla employees y los guarda en un bucket de Amazon S3 situado en una región distinta de la del clúster de base de datos Aurora MySQL. La instrucción crea archivos de datos en los que cada campo termina con un carácter coma (,) y cada fila termina con un carácter de nueva línea (\n). La instrucción devuelve un error si en el bucket de Amazon S3 especificado ya existen archivos con el prefijo especificado en sample_employee_data.

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';

La instrucción siguiente selecciona todos los datos de la tabla employees y los guarda en un bucket de Amazon S3 situado en la misma región que el clúster de base de datos Aurora MySQL. La instrucción crea archivos de datos en los que cada campo termina con un carácter coma (,) y cada fila termina con un carácter de nueva línea (\n), y también crea un archivo de manifiesto. La instrucción devuelve un error si en el bucket de Amazon S3 especificado ya existen archivos con el prefijo especificado en sample_employee_data.

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON;

La instrucción siguiente selecciona todos los datos de la tabla employees y los guarda en un bucket de Amazon S3 situado en una región distinta de la del clúster de base de datos Aurora. La instrucción crea archivos de datos en los que cada campo termina con un carácter coma (,) y cada fila termina con un carácter de nueva línea (\n). La instrucción sobrescribe los archivos que puedan existir en el bucket de sample_employee_data con el prefijo especificado en Amazon S3.

SELECT * FROM employees INTO OUTFILE S3 's3-us-west-2://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' OVERWRITE ON;

La instrucción siguiente selecciona todos los datos de la tabla employees y los guarda en un bucket de Amazon S3 situado en la misma región que el clúster de base de datos Aurora MySQL. La instrucción crea archivos de datos en los que cada campo termina con un carácter coma (,) y cada fila termina con un carácter de nueva línea (\n), y también crea un archivo de manifiesto. La instrucción sobrescribe los archivos que puedan existir en el bucket de sample_employee_data con el prefijo especificado en Amazon S3.

SELECT * FROM employees INTO OUTFILE S3 's3://aurora-select-into-s3-pdx/sample_employee_data' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' MANIFEST ON OVERWRITE ON;