Transporte de bases de datos de PostgreSQL entre instancias de base de datos - Amazon Relational Database Service

Transporte de bases de datos de PostgreSQL entre instancias de base de datos

Cuando utilice bases de datos transportables de PostgreSQL para Amazon RDS, puede trasladar una base de datos de PostgreSQL entre dos instancias de base de datos. Es una forma muy rápida de migrar bases de datos grandes entre distintas instancias de base de datos. Para utilizar este enfoque, ambas instancias de base de datos deben ejecutar la misma versión principal de PostgreSQL.

Esta capacidad requiere que instale la extensión pg_transport tanto en la instancia de base de datos de origen como en la de destino. La extensión pg_transport proporciona un mecanismo físico de transporte que traslada los archivos de base de datos con un procesamiento mínimo. Este mecanismo traslada los datos mucho más rápido que los procesos tradicionales de volcado y carga, con menos tiempo de inactividad.

nota

Las bases de datos transportables de PostgreSQL están disponibles para la versión 11.5 y las versiones posteriores de RDS for PostgreSQL, al igual que para la versión 10.10 y las versiones posteriores.

Para transportar una instancia de base de datos de PostgreSQL de una instancia de base de datos de RDS for PostgreSQL a otra, primero configure las instancias de origen y destino según se detalla en Configuración de una instancia de base de datos para transporte. A continuación, puede transportar la base de datos mediante la función descrita en Transporte de una base de datos de PostgreSQL.

Limitaciones del uso de bases de datos transportables de PostgreSQL

Las bases de datos transportables tienen las limitaciones siguientes:

  • Réplicas de lectura: no puede utilizar bases de datos transportables en réplicas de lectura o instancias principales de réplicas de lectura.

  • Tipos de columna no admitidos: no puede usar los tipos de datos reg en las tablas de base de datos que tenga previsto transportar con este método. Estos tipos depende de los ID de objeto (OID) de catálogo del sistema, que suelen cambiar durante el transporte.

  • Espacios de tablas: todos los objetos de base de datos de origen deben estar en el espacio de tablas pg_default predeterminado.

  • Compatibilidad: tanto las instancias de base de datos de origen como destino deben ejecutar la misma versión principal de PostgreSQL.

  • Extensiones: la instancia de base de datos de origen solo puede tener la extensión pg_transport instalada.

  • Roles y ACL: los privilegios de acceso y base de datos de origen y la información de propiedad no se traslada a la base de datos de destino. Todos los objetos de base de datos los crea y son propiedad del usuario de destino local del transporte.

  • Transportes simultáneos: una única instancia de base de datos puede admitir hasta 32 transportes simultáneos, incluidas tanto las importaciones como las exportaciones, si los procesos de trabajo se han configurado correctamente.

  • Únicamente para instancias de bases de datos de RDS for PostgreSQL: las bases de datos transportables de PostgreSQL solo son compatibles en instancias de bases de datos de RDS for PostgreSQL. No puede usarlo con bases de datos locales o bases de datos que se ejecutan en Amazon EC2.

Configuración de transporte de una base de datos de PostgreSQL

Antes de comenzar, asegúrese de que las instancias de base de datos de RDS for PostgreSQL cumplan los siguientes requisitos:

  • Las instancias de base de datos de RDS for PostgreSQL de origen y destino deben ejecutar la misma versión de PostgreSQL.

  • La base de datos de destino no puede tener una base de datos del mismo nombre que la base de datos de origen que desea transportar.

  • La cuenta que utiliza para gestionar el transporte necesita privilegios rds_superuser tanto en la base de datos de origen como en la base de datos de destino.

  • El grupo de seguridad de la instancia de base de datos de origen debe permitir el acceso entrante desde la instancia de base de datos de destino. Es posible que esto ya ocurra si las instancias de base de datos de origen y destino se encuentran en la VPC. Para obtener más información acerca de los grupos de seguridad, consulte Control de acceso con grupos de seguridad.

El transporte de bases de datos desde una instancia de base de datos de origen a una instancia de base de datos de destino requiere varios cambios en el grupo de parámetros de base de datos asociado a cada instancia. Esto significa que debe crear un grupo de parámetros de base de datos personalizado para la instancia de base de datos de origen y otro para la instancia de base de datos de destino.

nota

Si las instancias de base de datos ya están configuradas mediante grupos de parámetros de base de datos personalizados, puede comenzar con el paso 2 del siguiente procedimiento.

Para configurar los parámetros de grupo de bases de datos personalizados para transportar bases de datos

Para los siguientes pasos, utilice una cuenta que tenga privilegios rds_superuser.

  1. Si las instancias de base de datos de origen y destino utilizan un grupo de parámetros de base de datos predeterminado, debe crear un grupo de parámetros de base de datos personalizado con la versión adecuada para sus instancias. Haga esto para poder cambiar los valores de varios parámetros. Para obtener más información, consulte Working with parameter groups (Trabajar con grupos de parámetros).

  2. En el grupo de parámetros de base de datos personalizado, cambie los valores de los siguientes parámetros:

    • shared_preload_libraries – Agregue pg_transport a la lista de bibliotecas.

    • pg_transport.num_workers – El valor predeterminado es 3. Aumente o reduzca este valor según sea necesario para su base de datos. Para una base de datos de 200 GB, recomendamos que no sea superior a 8. Tenga en cuenta que si aumenta el valor predeterminado de este parámetro, también debe aumentar el valor de max_worker_processes.

    • pg_transport.work_mem – El valor predeterminado es 128 MB o 256 MB, según la versión de PostgreSQL. Por lo general, la configuración predeterminada se puede dejar sin cambios.

    • max_worker_processes: el valor de este parámetro debe establecerse utilizando el siguiente cálculo:

      (3 * pg_transport.num_workers) + 9

      Este valor es necesario en el destino para gestionar varios procesos de trabajo en segundo plano involucrados en el transporte. Para obtener más información sobre max_worker_processes, y otros parámetros, consulte Consumo de recursos en la documentación de PostgreSQL.

    Para obtener más información acerca de los parámetros pg_transport, consulte Referencia de parámetros de bases de datos transportables .

  3. Reinicie la instancia de base de datos de origen de RSD for PostgreSQL y la instancia de destino para que la configuración de los parámetros surta efecto.

  4. Conéctese a una instancia de base de datos de origen de RDS for PostgreSQL.

    psql --host=source-instance.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  5. Elimine extensiones extrañas del esquema público de la instancia de base de datos. Solo se permite la extensión pg_transport durante la operación de transporte real.

  6. Instale la extensión pg_transport de la siguiente manera:

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION
  7. Conéctese a una instancia de base de datos de destino de RDS for PostgreSQL. Elimine las extensiones extrañas y, a continuación, instale la extensión pg_transport.

    postgres=> CREATE EXTENSION pg_transport; CREATE EXTENSION

Transporte de una base de datos PostgreSQL al destino desde el origen

Después de completar el proceso descrito en Configuración de transporte de una base de datos de PostgreSQL, puede comenzar el transporte. Para ello, ejecute la función transport.import_from_server en la instancia de base de datos de destino. En la siguiente sintaxis, puede encontrar los parámetros de la función.

SELECT transport.import_from_server( 'source-db-instance-endpoint', source-db-instance-port, 'source-db-instance-user', 'source-user-password', 'source-database-name', 'destination-user-password', false);

El valor false que se muestra en el ejemplo indica a la función que no se trata de una prueba. Para probar la configuración de transporte, puede especificar true para la opción dry_run cuando ejecute la función, como se muestra a continuación:

postgres=> SELECT transport.import_from_server( 'docs-lab-source-db.666666666666aws-region.rds.amazonaws.com', 5432, 'postgres', '********', 'labdb', '******', true); INFO: Starting dry-run of import of database "labdb". INFO: Created connections to remote database (took 0.03 seconds). INFO: Checked remote cluster compatibility (took 0.05 seconds). INFO: Dry-run complete (took 0.08 seconds total). import_from_server -------------------- (1 row)

Las líneas de INFO se generan porque el parámetro pg_transport.timing se establece en su valor predeterminado true. Configure dry_run en false cuando ejecute el comando y la base de datos de origen se importe al destino, como se muestra a continuación:

INFO: Starting import of database "labdb". INFO: Created connections to remote database (took 0.02 seconds). INFO: Marked remote database as read only (took 0.13 seconds). INFO: Checked remote cluster compatibility (took 0.03 seconds). INFO: Signaled creation of PITR blackout window (took 2.01 seconds). INFO: Applied remote database schema pre-data (took 0.50 seconds). INFO: Created connections to local cluster (took 0.01 seconds). INFO: Locked down destination database (took 0.00 seconds). INFO: Completed transfer of database files (took 0.24 seconds). INFO: Completed clean up (took 1.02 seconds). INFO: Physical transport complete (took 3.97 seconds total). import_from_server -------------------- (1 row)

Esta función requiere que proporcione contraseñas de usuario de base de datos. De esta manera, le recomendamos que cambie las contraseñas de los roles de usuario que ha utilizado después de completar el transporte. O, puede utilizar variables de enlace SQL para crear roles de usuario temporales. Utilice estos roles temporales para el transporte y, a continuación, descarte los roles con posterioridad.

Si el transporte no se realiza correctamente, es posible que vea un mensaje de error similar al siguiente:

pg_transport.num_workers=8 25% of files transported failed to download file data

El mensaje de error “Failed to download file data” (No se pudo descargar los datos de archivo) indica que el número de procesos de trabajo no está configurado correctamente para el tamaño de la base de datos. Es posible que tenga que aumentar o disminuir el valor establecido para pg_transport.num_workers. Cada error informa el porcentaje de finalización, de modo que pueda ver el impacto de los cambios. Por ejemplo, cambiar la configuración de 8 a 4 en un caso dio lugar a lo siguiente:

pg_transport.num_workers=4 75% of files transported failed to download file data

Tenga en cuenta que el parámetro max_worker_processes también se tiene en cuenta durante el proceso de transporte. En otras palabras, es posible que tenga que modificar tanto pg_transport.num_workers como max_worker_processes para transportar correctamente la base de datos. El ejemplo que se muestra finalmente funcionó cuando pg_transport.num_workers se estableció en 2:

pg_transport.num_workers=2 100% of files transported

Para obtener más información sobre la funcionalidad transport.import_from_server y sus parámetros, consulte Referencia de función de bases de datos transportables.

Lo que ocurre durante el transporte de base de datos

La característica de bases de datos transportables de PostgreSQL utiliza un modelo de extracción para importar la base de datos de la instancia de base de datos de origen a la de destino. La función transport.import_from_server crea la base de datos en tránsito en la instancia de base de datos de destino. No se puede acceder a la base de datos en tránsito en la instancia de base de datos de destino mientras dura el transporte.

Cuando el transporte comienza, finalizan todas las sesiones actuales en la base de datos de origen. Cualquier base de datos distinta a la base de datos de origen en la instancia de base de datos de origen no se ve afectada por el transporte.

La base de datos de origen se pone en un modo de solo lectura especial. Mientras está en este modo, puede conectar a la base de datos de origen y ejecutar consultas de solo lectura. Sin embargo, las consultas habilitadas para escritura y algunos otros tipos de comandos están bloqueados. Solo la base de datos de origen específica que se transporta se ve afectada por estas restricciones.

Durante el transporte, no puede restaurar la instancia de base de datos de destino a un momento en el tiempo. Esto se debe a que el transporte no es transaccional y no utiliza el registro antes de la escritura de PostgreSQL para registrar cambios. Si la instancia de base de datos de destino tiene habilitadas las copias de seguridad automáticas, se realiza automáticamente una copia de seguridad una vez que se completa el transporte. Las restauraciones a un momento dado están disponibles para momentos después de que finalice la copia de seguridad.

Si el transporte devuelve un error, la extensión pg_transport intenta deshacer todos los cambios en las instancias de base de datos de origen y de destino. Esto incluye eliminar la base de datos transportada parcialmente del destino. En función del tipo de error, la base de datos de origen podría seguir rechazando consultas habilitadas para escritura. Si esto ocurre, utilice el comando siguiente para permitir consultas habilitadas para escritura.

ALTER DATABASE db-name SET default_transaction_read_only = false;

Referencia de función de bases de datos transportables

La función transport.import_from_server transporta una base de datos de PostgreSQL importándola desde una instancia de base de datos de origen en una instancia de base de datos de destino. Lo hace utilizando un mecanismo de transporte de conexión de base de datos física.

Antes de iniciar el transporte, esta función verifica que las instancias de base de datos de origen y de destino sean la misma versión y sean compatibles para la migración. También confirma que la instancia de base de datos de destino tenga suficiente espacio para la de origen.

Sintaxis

transport.import_from_server( host text, port int, username text, password text, database text, local_password text, dry_run bool )

Valor de retorno

Ninguno.

Parámetros

Puede buscar las descripciones de los parámetros de función transport.import_from_server en la tabla siguiente.

Parámetro Descripción
host

El punto de enlace de una instancia de base de datos de origen.

port Un entero que representa el puerto de la instancia de base de datos de origen.

Las instancias de base de datos de PostgreSQL suelen utilizar el puerto 5432.

username

El usuario de la instancia de base de datos de origen. Este usuario debe ser un miembro del rol rds_superuser.

password

La contraseña de usuario de la instancia de base de datos de origen.

database

El nombre de la base de datos en la instancia de base de datos de origen que transportar.

local_password

La contraseña local del usuario actual para la instancia de base de datos de destino. Este usuario debe ser un miembro del rol rds_superuser.

dry_run

Un valor booleano opcional que especifique si realizar un simulacro. El valor predeterminado es false, lo que significa que el transporte continúa.

Para confirmar la compatibilidad entre las instancias de base de datos de origen y destino sin llevar a cabo el transporte real, defina dry_run en true.

Ejemplo

Para ver un ejemplo, consulte Transporte de una base de datos PostgreSQL al destino desde el origen.

Referencia de parámetros de bases de datos transportables

Varios parámetros controlan el comportamiento de la extensión pg_transport. A continuación, puede encontrar las descripciones de estos parámetros.

pg_transport.num_workers

El número de empleados que se necesitarán para el proceso de transporte. El valor predeterminado es 3. Los valores válidos están comprendidos entre 1 y 32. Incluso los transportes de base de datos más grandes normalmente requieren menos de 8 empleados. El valor de esta configuración en la instancia de base de datos de destino se utiliza tanto en las instancias de base de datos de destino y de origen durante el transporte.

pg_transport.timing

Especifica si se debe notificar la información de tiempo durante el transporte. El valor predeterminado es true, lo que significa que se informa la información de los plazos. Le recomendamos que deje este parámetro configurado en true para que pueda supervisar el progreso. Para ejemplo de salida, consulte Transporte de una base de datos PostgreSQL al destino desde el origen.

pg_transport.work_mem

La cantidad de memoria máxima que asignar para cada proceso de trabajo. El valor predeterminado es 131 072 kilobytes (KB) o 262 144 KB (256 MB), según la versión de PostgreSQL. El valor mínimo es 64 megabytes (65 536 KB). Los valores válidos están en kilobytes (KB) como unidades binarias de base 2, donde 1 KB = 1024 bytes.

El transporte podría utilizar menos memoria que la que se especifica en este parámetro. Incluso los transportes de base de datos grandes normalmente requieren menos de 256 MB (262 144 KB) de memoria por proceso de trabajo.