pg_createsubscriber — convierte una réplica física en una nueva réplica lógica
pg_createsubscriber [option...] { -d | --database }dbname { -D | --pgdata }datadir { -P | --publisher-server }connstr
pg_createsubscriber crea una nueva réplica lógica a partir de un servidor en espera físico (physical standby). Todas las tablas de la base de datos especificada se incluyen en la configuración de la replicación lógica. Se crea un par de objetos de publicación y suscripción para cada base de datos. Debe ejecutarse en el servidor de destino.
Tras una ejecución exitosa, el estado del servidor de destino es análogo a una nueva configuración de replicación lógica. La principal diferencia entre la configuración de replicación lógica y pg_createsubscriber es cómo se realiza la sincronización de datos. pg_createsubscriber no copia los datos iniciales de las tablas. Solo realiza la fase de sincronización, lo que garantiza que cada tabla se lleve a un estado sincronizado.
pg_createsubscriber está diseñado para sistemas de bases
de datos grandes porque, en una configuración de replicación lógica, la mayor parte
del tiempo se dedica a realizar la copia inicial de datos. Además, un efecto secundario
de este largo tiempo dedicado a sincronizar datos suele ser una gran cantidad de
cambios a aplicar (que se produjeron durante la copia inicial de datos), lo que aumenta
aún más el tiempo en que la réplica lógica estará disponible. Para bases de datos
más pequeñas, se recomienda configurar la replicación lógica con sincronización de datos
inicial. Para más detalles, consulta la opción
copy_data de CREATE SUBSCRIPTION.
pg_createsubscriber acepta los siguientes argumentos de línea de comandos:
-a--all
Crea una suscripción por base de datos en el servidor de destino. Las excepciones
son las bases de datos de plantilla (template) y las bases de datos que no permiten conexiones.
Para descubrir la lista de todas las bases de datos, se conecta al servidor de origen
utilizando el nombre de la base de datos especificado en la cadena de conexión de
--publisher-server, o si no se especifica, se utilizará la base de datos
postgres, o si esta no existe, se utilizará template1.
Se utilizan nombres generados automáticamente para las suscripciones, publicaciones y
slots de replicación cuando se especifica esta opción.
Esta opción no se puede utilizar junto con --database,
--publication, --replication-slot o
--subscription.
-d dbname--database=dbname
El nombre de la base de datos en la que crear una suscripción. Se pueden
seleccionar múltiples bases de datos escribiendo múltiples opciones -d.
Esta opción no se puede utilizar junto con -a.
Si no se proporciona la opción -d, el nombre de la base de datos se
obtendrá de la opción -P. Si el nombre de la base de datos no se
especifica en la opción -d ni en la opción -P, y no
se especifica la opción -a, se informará de un error.
-D directory--pgdata=directoryEl directorio de destino que contiene un directorio de clúster de una réplica física.
-n--dry-runRealiza todo el proceso excepto modificar realmente el directorio de destino.
-p port--subscriber-port=portEl número de puerto en el que el servidor de destino está escuchando conexiones. Por defecto, ejecuta el servidor de destino en el puerto 50432 para evitar conexiones de clientes no deseadas.
-P connstr--publisher-server=connstrLa cadena de conexión al publicador (publisher). Para más detalles, consulta Section 32.1.1.
-s dir--socketdir=dirEl directorio que se utilizará para los sockets del postmaster en el servidor de destino. El valor predeterminado es el directorio actual.
-t seconds--recovery-timeout=secondsEl número máximo de segundos a esperar a que finalice la recuperación. Establecer en 0 lo desactiva. El valor predeterminado es 0.
-T--enable-two-phase
Habilita la confirmación en dos fases (two_phase)
para la suscripción. Cuando se especifican múltiples bases de datos, esta
opción se aplica de manera uniforme a todas las suscripciones creadas en esas bases de datos.
El valor predeterminado es false.
-U username--subscriber-username=usernameEl nombre de usuario con el que conectarse en el servidor de destino. Por defecto, el nombre de usuario del sistema operativo actual.
-v--verboseHabilita el modo detallado (verbose). Esto hará que pg_createsubscriber envíe mensajes de progreso e información detallada sobre cada paso a la salida de error estándar. Repetir la opción hace que aparezcan mensajes de depuración adicionales en la salida de error estándar.
--clean=objtypeElimina todos los objetos del tipo especificado de las bases de datos especificadas en el servidor de destino.
publications:
Las publicaciones FOR ALL TABLES establecidas para este
suscriptor siempre se eliminan; especificar este tipo de objeto hace que también
se eliminen todas las demás publicaciones replicadas desde el servidor de origen.
Los objetos seleccionados para ser eliminados se registran individualmente, incluso durante
un --dry-run. No hay oportunidad de influir o detener la
eliminación de los objetos seleccionados, así que considera realizar una copia de seguridad de ellos
mediante pg_dump.
--config-file=filename
Utiliza el archivo de configuración principal del servidor especificado para el directorio de datos
de destino. pg_createsubscriber utiliza internamente
el comando pg_ctl para iniciar y
detener el servidor de destino. Te permite especificar el archivo de configuración
postgresql.conf real si está almacenado fuera del
directorio de datos.
--publication=name
El nombre de la publicación para configurar la replicación lógica. Se pueden
especificar múltiples publicaciones escribiendo múltiples opciones
--publication. El número de nombres de publicaciones
debe coincidir con el número de bases de datos especificadas; de lo contrario, se informa
de un error. El orden de las múltiples opciones de nombre de publicación debe
coincidir con el orden de las opciones de base de datos. Si no se especifica esta opción,
se asigna un nombre generado al nombre de la publicación. Esta opción no puede
ser utilizada junto con --all.
--replication-slot=name
El nombre del slot de replicación para configurar la replicación lógica. Se pueden
especificar múltiples slots de replicación escribiendo múltiples opciones
--replication-slot. El número de nombres de slots de
replicación debe coincidir con el número de bases de datos especificadas;
de lo contrario, se informa de un error. El orden de las múltiples opciones de nombre de
slot de replicación debe coincidir con el orden de las opciones de base de datos. Si esta
opción no se especifica, se asigna el nombre de la suscripción al nombre del
slot de replicación. Esta opción no se puede utilizar junto con
--all.
--subscription=name
El nombre de la suscripción para configurar la replicación lógica. Se pueden
especificar múltiples suscripciones escribiendo múltiples opciones
--subscription. El número de nombres de suscripciones
debe coincidir con el número de bases de datos especificadas; de lo contrario, se informa
de un error. El orden de las múltiples opciones de nombre de suscripción debe
coincidir con el orden de las opciones de base de datos. Si no se especifica esta opción,
se asigna un nombre generado al nombre de la suscripción. Esta opción no puede
ser utilizada junto con --all.
-V--versionMuestra la versión de pg_createsubscriber y termina.
-?--helpMuestra ayuda sobre los argumentos de línea de comandos de pg_createsubscriber y termina.
Existen algunos prerrequisitos para que
pg_createsubscriber convierta el servidor de destino
en una réplica lógica. Si estos no se cumplen, se informará de un error.
Los servidores de origen y destino deben tener la misma versión principal que el
pg_createsubscriber. El directorio de datos de destino
dado debe tener el mismo identificador de sistema que el directorio de datos de
origen. El usuario de la base de datos proporcionado para el directorio de datos de destino debe tener
privilegios para crear suscripciones y utilizar pg_replication_origin_advance().
El servidor de destino debe utilizarse como un standby físico. El servidor de destino
debe tener max_active_replication_origins y max_logical_replication_workers configurados a un valor
mayor o igual al número de bases de datos especificadas. El servidor de destino
debe tener max_worker_processes configurado a un
valor mayor que el número de bases de datos especificadas. El servidor de destino
debe aceptar conexiones locales. Si estás planeando utilizar la opción
--enable-two-phase, también necesitarás configurar
el max_prepared_transactions de manera adecuada.
El servidor de origen debe aceptar conexiones desde el servidor de destino. El
servidor de origen no debe estar en recuperación. El servidor de origen debe tener wal_level establecido en logical. El servidor de origen
debe tener max_replication_slots configurado a un valor
mayor o igual al número de bases de datos especificadas más los slots de
replicación existentes. El servidor de origen debe tener max_wal_senders configurado a un valor mayor o igual
al número de bases de datos especificadas y los procesos de envío de WAL (WAL sender) existentes.
Si pg_createsubscriber falla después de que se haya promovido el servidor de destino, es probable que el directorio de datos no se encuentre en un estado recuperable. En tal caso, se recomienda crear un nuevo servidor en espera (standby).
pg_createsubscriber generalmente inicia el servidor de destino con diferentes parámetros de conexión durante la transformación. Por lo tanto, las conexiones al servidor de destino deberían fallar.
Dado que los comandos DDL no son replicados por la replicación lógica, evita ejecutar comandos DDL que cambien el esquema de la base de datos mientras ejecutas pg_createsubscriber. Si el servidor de destino ya se ha convertido en una réplica lógica, es posible que los comandos DDL no se repliquen, lo que podría causar un error.
Si pg_createsubscriber falla durante el procesamiento, los objetos (publicaciones, slots de replicación) creados en el servidor de origen son eliminados. La eliminación podría fallar si el servidor de destino no se puede conectar al servidor de origen. En tal caso, un mensaje de advertencia informará sobre los objetos que quedaron. Si el servidor de destino se está ejecutando, se detendrá.
Si la replicación está utilizando primary_slot_name, se eliminará del servidor de origen después de la configuración de la replicación lógica.
Si el servidor de destino es una réplica síncrona, las confirmaciones de transacciones en el primario podrían esperar a la replicación mientras se ejecuta pg_createsubscriber.
A menos que se especifique la opción --enable-two-phase,
pg_createsubscriber configura la replicación
lógica con la confirmación en dos fases deshabilitada. Esto significa que cualquier
transacción preparada se replicará en el momento del
COMMIT PREPARED, sin preparación previa.
Una vez completada la configuración, puedes eliminar y volver a crear manualmente las
suscripciones con la opción
two_phase
habilitada.
pg_createsubscriber cambia el identificador del sistema utilizando pg_resetwal. Esto evitaría situaciones en las que el servidor de destino pudiera utilizar archivos WAL del servidor de origen. Si el servidor de destino tiene un standby, la replicación se romperá y se deberá crear un nuevo standby.
Pueden ocurrir fallos de replicación si faltan archivos WAL necesarios. Para evitar
esto, el servidor de origen debe establecer
max_slot_wal_keep_size en -1 para
garantizar que los archivos WAL requeridos no se eliminen prematuramente.
La idea básica es tener un punto de inicio de replicación desde el servidor de origen y configurar una replicación lógica para comenzar desde este punto:
Inicia el servidor de destino con las opciones de línea de comandos especificadas. Si el servidor de destino ya se está ejecutando, pg_createsubscriber terminará con un error.
Comprueba si el servidor de destino se puede convertir. También se realizan algunas comprobaciones en el servidor de origen. Si no se cumple alguno de los prerrequisitos, pg_createsubscriber terminará con un error.
Crea una publicación y un slot de replicación para cada base de datos especificada en
el servidor de origen. Cada publicación se crea utilizando FOR ALL
TABLES. Si no se especifica la opción --publication,
la publicación tiene el siguiente patrón de nombre:
“pg_createsubscriber_%u_%x” (parámetro:
oid de la base de datos, int aleatorio).
Si no se especifica la opción --replication-slot, el
slot de replicación tiene el siguiente patrón de nombre:
“pg_createsubscriber_%u_%x” (parámetros:
oid de la base de datos, int aleatorio).
Estos slots de replicación serán utilizados por las suscripciones en un paso
posterior. El LSN del último slot de replicación se utiliza como punto de
detención en el parámetro recovery_target_lsn y por las
suscripciones como un punto de inicio de replicación. Esto garantiza que no
se perderá ninguna transacción.
Escribe los parámetros de recuperación en el directorio de datos de destino y reinicia el
servidor de destino. Especifica un LSN (recovery_target_lsn) de la ubicación del registro de transacciones
hasta el cual procederá la recuperación. También especifica
promote como la acción que debe tomar el servidor
una vez alcanzado el objetivo de recuperación. Se agregan parámetros de recuperación
adicionales para evitar comportamientos inesperados durante el proceso de recuperación,
como el fin de la recuperación tan pronto como se alcance un estado consistente (el
WAL se debe aplicar hasta la ubicación de inicio de la replicación) y múltiples
objetivos de recuperación que pueden causar un fallo. Este paso finaliza una vez que el
servidor termina el modo de espera (standby) y acepta transacciones de lectura y escritura.
Si se establece la opción --recovery-timeout,
pg_createsubscriber termina si la recuperación
no finaliza dentro del número de segundos especificado.
Crea una suscripción para cada base de datos especificada en el servidor de destino.
Si no se especifica la opción --subscription, la
suscripción tiene el siguiente patrón de nombre:
“pg_createsubscriber_%u_%x” (parámetros:
oid de la base de datos, int aleatorio).
No copia los datos existentes desde el servidor de origen. No
crea un slot de replicación. En su lugar, utiliza el slot de replicación que
se creó en un paso anterior. La suscripción se crea pero aún no está
habilitada. La razón es que el progreso de la replicación debe establecerse en
el punto de inicio de la replicación antes de comenzar la replicación.
Elimina las publicaciones en el servidor de destino que fueron replicadas porque se crearon antes de la ubicación de inicio de la replicación. No tiene utilidad en el suscriptor.
Establece el progreso de la replicación en el punto de inicio de la replicación para cada
suscripción. Cuando el servidor de destino inicia el proceso de recuperación, se
pone al día hasta el punto de inicio de la replicación. Este es el LSN exacto a
utilizarse como ubicación inicial de replicación para cada suscripción. El
nombre del origen de replicación se obtiene desde que se creó la suscripción.
El nombre del origen de replicación y el punto de inicio de la replicación se utilizan en
pg_replication_origin_advance()
para configurar la ubicación inicial de la replicación.
Habilita la suscripción para cada base de datos especificada en el servidor de destino. La suscripción comienza a aplicar transacciones desde el punto de inicio de la replicación.
Si el servidor en espera estaba utilizando primary_slot_name, ya no tiene utilidad, por lo que se elimina.
Si el servidor en espera contiene slots de replicación de failover, ya no se pueden sincronizar, por lo que se eliminan.
Actualiza el identificador del sistema en el servidor de destino. Se ejecuta
pg_resetwal para modificar el identificador del sistema.
El servidor de destino se detiene como requisito de pg_resetwal.
Para crear una réplica lógica para las bases de datos hr y
finance a partir de una réplica física en
foo:
$pg_createsubscriber -D /usr/local/pgsql/data -P "host=foo" -d hr -d finance