

# Transporte de bases de datos de PostgreSQL entre instancias de base de datos
<a name="PostgreSQL.TransportableDB"></a>

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](PostgreSQL.TransportableDB.Setup.md). A continuación, puede transportar la base de datos mediante la función descrita en [ Transporte de una base de datos de PostgreSQL](PostgreSQL.TransportableDB.Transporting.md). 

**Topics**
+ [Lo que ocurre durante el transporte de base de datos](#PostgreSQL.TransportableDB.DuringTransport)
+ [Limitaciones del uso de bases de datos transportables de PostgreSQL](#PostgreSQL.TransportableDB.Limits)
+ [Configuración de transporte de una base de datos de PostgreSQL](PostgreSQL.TransportableDB.Setup.md)
+ [Transporte de una base de datos PostgreSQL al destino desde el origen](PostgreSQL.TransportableDB.Transporting.md)
+ [Referencia de función de bases de datos transportables](PostgreSQL.TransportableDB.transport.import_from_server.md)
+ [Referencia de parámetros de bases de datos transportables](PostgreSQL.TransportableDB.Parameters.md)

## Lo que ocurre durante el transporte de base de datos
<a name="PostgreSQL.TransportableDB.DuringTransport"></a>

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;
```

## Limitaciones del uso de bases de datos transportables de PostgreSQL
<a name="PostgreSQL.TransportableDB.Limits"></a>

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
<a name="PostgreSQL.TransportableDB.Setup"></a>

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](Overview.RDSSecurityGroups.md).

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 [Grupos de parámetros para Amazon RDS](USER_WorkingWithParamGroups.md). 

1. 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](https://www.postgresql.org/docs/current/runtime-config-resource.html) 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](PostgreSQL.TransportableDB.Parameters.md).

1. 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.

1. 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
   ```

1. 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.

1. Instale la extensión `pg_transport` de la siguiente manera:

   ```
   postgres=> CREATE EXTENSION pg_transport;
   CREATE EXTENSION
   ```

1. 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
<a name="PostgreSQL.TransportableDB.Transporting"></a>

Después de completar el proceso descrito en [Configuración de transporte de una base de datos de PostgreSQL](PostgreSQL.TransportableDB.Setup.md), 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](PostgreSQL.TransportableDB.transport.import_from_server.md). 

# Referencia de función de bases de datos transportables
<a name="PostgreSQL.TransportableDB.transport.import_from_server"></a>

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\$1password |  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\$1run | 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\$1run en true. | 

**Ejemplo**

Para ver un ejemplo, consulte [Transporte de una base de datos PostgreSQL al destino desde el origen](PostgreSQL.TransportableDB.Transporting.md).

# Referencia de parámetros de bases de datos transportables
<a name="PostgreSQL.TransportableDB.Parameters"></a>

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](PostgreSQL.TransportableDB.Transporting.md).

**`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.