Cómo diagnosticar problemas en las migraciones de PostgreSQL a AlloyDB

Soluciona problemas de errores de migración

El proceso del trabajo de migración puede generar errores durante el tiempo de ejecución.

  • Algunos errores, como una contraseña incorrecta en la base de datos de origen, se pueden recuperar, lo que significa que se pueden corregir y el trabajo de migración se reanuda automáticamente.
  • Algunos no se pueden recuperar, como los errores en la replicación de datos, lo que significa que el trabajo de migración debe reiniciarse desde el principio.

Cuando se produce un error, el estado del trabajo de migración cambia a Failed y el subestado refleja el último estado antes de la falla.

Para solucionar un error, navega al trabajo de migración con errores para ver el error y sigue los pasos que se indican en el mensaje de error.

Para ver más detalles sobre el error, navega a Cloud Monitoring con el vínculo del trabajo de migración. Los registros se filtran según el trabajo de migración específico.

En la siguiente tabla, puedes encontrar algunos ejemplos de problemas y cómo se pueden resolver:

Síntoma Causas posibles Solución
No se pudo conectar a la instancia de base de datos de origen. Hubo un problema de conectividad entre la instancia de base de datos de origen y la instancia de destino. Sigue los pasos que se indican en Depura la conectividad.
No se pudo ejecutar el trabajo de migración debido a versiones de base de datos de origen y destino incompatibles. Las versiones de base de datos de origen y destino no son una combinación compatible. En particular, la versión de base de datos de origen proporcionada no es compatible con la versión de base de datos de destino. Asegúrate de que la versión de base de datos de destino sea la misma o una versión principal superior a la versión de base de datos de origen. Luego, crea un trabajo de migración nuevo.
Los lenguajes de definición de datos (DDL) o los lenguajes de manipulación de datos (DML) están bloqueados en la fuente. Los DDL que requieren el ACCESS EXCLUSIVE bloqueo y que se ejecutan durante la fase de volcado completo están bloqueados.

Durante el proceso de sincronización inicial (volcado completo), se deben evitar los DDL o los programas que requieren ACCESS EXCLUSIVE bloqueos como ALTER TABLE o DROP TABLE en las tablas. De lo contrario, los DDL o los programas esperarán hasta que finalice la sincronización inicial.

Por ejemplo, si una tabla aún está en el proceso de sincronización inicial y se ejecuta un comando ALTER TABLE en la misma tabla, el comando no se ejecutará y los comandos DDL y DML posteriores se bloquearán hasta que finalice la sincronización inicial.

Mensaje de error: No pglogical extension installed on databases (X) Una o más bases de datos de origen no tienen instalado pglogical. Sigue estas instrucciones para instalar pglogical en las bases de datos de la instancia de origen.
Mensaje de error: Replication user 'x' doesn't have sufficient privileges. El usuario que usa Database Migration Service no tiene los privilegios necesarios para realizar la operación designada. Sigue estas instrucciones para asegurarte de que este usuario tenga los privilegios necesarios.
Mensaje de error: Unable to connect to source database server. Database Migration Service no puede establecer una conexión con el servidor de base de datos de origen. Asegúrate de que las instancias de base de datos de origen y destino puedan comunicarse entre sí y de que hayas completado todos los requisitos previos necesarios que aparecieron cuando definiste la configuración del trabajo de migración.
Mensaje de error: The source database 'wal_level' configuration must be equal to 'logical'. El wal_level de la base de datos de origen se establece en un valor que no es logical. Establece el wal_level en logical.
Mensaje de error: The source database 'max_replication_slots' configuration is not sufficient. El parámetro max_replication_slots no se configuró correctamente. Sigue estas instrucciones para configurar este parámetro correctamente.
Mensaje de error: The source database 'max_wal_senders' configuration is not sufficient. El parámetro max_wal_senders no se configuró correctamente. Sigue estas instrucciones para configurar este parámetro correctamente.
Mensaje de error: The source database 'max_worker_processes' configuration is not sufficient. El parámetro max_worker_processes no se configuró correctamente. Sigue estas instrucciones para configurar este parámetro correctamente.

Mensaje de error: Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

O

Mensaje de error: Error promoting EM replica: finished drop replication with errors.

No se puede limpiar la configuración necesaria para la replicación durante la promoción de un trabajo de migración.

Para cada base de datos, ejecuta comandos como un usuario con el privilegio superuser.

Para obtener más información sobre qué comandos ejecutar, consulta Libera espacio en las ranuras de replicación.

Mensaje de error: x509 certificate signed by unknown authority.

Es posible que el certificado de la AC de origen proporcionado a Database Migration Service solo contenga el certificado raíz. Sin embargo, el certificado de origen requiere el certificado raíz y los certificados intermedios.

Por ejemplo, para Amazon Relational Database Service, usar el certificado rds-ca-2019-root.pem puede provocar este problema.

Crea un certificado de la AC de origen combinado que contenga el certificado raíz y todos los certificados intermedios necesarios.

Para el caso de uso de Amazon Relational Database Service, en lugar del certificado rds-ca-2019-root.pem, usa el certificado rds-combined-ca-bundle.pem.

Mensaje de error: ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

El valor establecido para el max_locks_per_transaction parámetro no es suficiente. Establece el valor de este parámetro para que sea al menos {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions).

Mensaje de error: ERROR: no data left in message.

El paquete pglogical no está instalado correctamente en la instancia de origen. Para obtener más información sobre cómo instalar este paquete correctamente, consulta Instala el paquete pglogical en la instancia de origen.

Mensaje de error: Cannot assign TransactionIds during recovery.

La fuente configurada está en modo de recuperación. Configura una fuente que no esté en modo de recuperación.
El volcado completo es lento. Es posible que el destino de AlloyDB sea lento para importar datos grandes de la base de datos de origen.
  • Elige un nivel superior para el destino de AlloyDB para obtener el máximo ancho de banda de red y de disco disponible.
  • Ajusta la marca max_wal_size del destino de AlloyDB. Por lo general, 32 GB o 64 GB es un buen valor para establecer esta marca. Para actualizar esta marca, no es necesario reiniciar el servidor.
Mensaje de error: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

El trabajo de migración falló durante la fase de volcado completo y no se puede recuperar. Se reinició la instancia de base de datos de origen o estaba en modo de recuperación, o bien las conexiones de replicación finalizaron debido a un valor insuficiente establecido para el wal_sender_timeout parámetro.

Para encontrar la causa raíz del problema, haz lo siguiente:

  1. Ve a la página del Explorador de registros en la Google Cloud consola.
  2. En la lista de recursos, selecciona tu instancia de AlloyDB. Aparecerá una lista de los registros más recientes de la instancia.
  3. En los nombres de los archivos de registro, selecciona postgres.log.
  4. Establece el nivel de gravedad del registro en todos los niveles superiores a Warning. Es posible que los primeros registros de errores sean la causa raíz de la falla.
  • Asegúrate de que Database Migration Service siempre pueda conectarse a la instancia de base de datos de origen durante la fase de volcado completo.
  • Verifica si el valor del parámetro wal_sender_timeout está establecido en un número mayor (por ejemplo, 0) en la instancia de base de datos de origen.
  • Reinicia el trabajo de migración y vuelve a intentarlo.
Mensaje de error: ERROR: unknown column name {column_name}

Se agregó una columna a una tabla replicada en el nodo principal, pero no en el nodo de réplica.

Solo los cambios en el lenguaje de manipulación de datos (DML) se actualizan automáticamente durante las migraciones continuas. La administración de los cambios en el lenguaje de definición de datos (DDL) para que las bases de datos de origen y destino sigan siendo compatibles es responsabilidad del usuario y se puede lograr de dos maneras:

  • Detén las operaciones de escritura en la base de datos de origen y ejecuta los comandos de DDL en el origen y el destino. Antes de ejecutar los comandos de DDL en el destino, otorga el rol cloudsqlexternalsync al usuario de Cloud SQL que aplica los cambios de DDL.
  • Usa el comando pglogical.replicate_ddl_command para permitir que los comandos de DDL se ejecuten en el origen y el destino en un punto coherente. El usuario que ejecuta los comandos debe tener el mismo nombre de usuario en el origen y el destino, y debe ser el superusuario o el propietario del artefacto que se migra (por ejemplo, la tabla, la secuencia, la vista o la base de datos).
  • Consulta Migración continua para encontrar los ejemplos de uso del pglogical.replicate_ddl_command.

Mensaje de error: ERROR: cannot truncate a table referenced in a foreign key constraint

El usuario intentó truncar una tabla que tiene una restricción de clave externa.

Primero, quita la restricción de clave externa y, luego, trunca la tabla.

Mensaje de error: ERROR: connection to other side has died

La conexión de replicación finalizó debido a un valor insuficiente establecido para el wal_sender_timeout parameter. Por lo general, el error se produce durante la fase de replicación después del éxito del volcado inicial.

Considera aumentar el valor del parámetro wal_sender_timeout o inhabilitar el mecanismo de tiempo de espera estableciendo su valor en 0 en la instancia de base de datos de origen.

Cuando migras bases de datos seleccionadas y el trabajo de migración no puede replicar datos en una o más bases de datos, se muestra el estado Failed en la lista de bases de datos. Varios errores del trabajo de migración.

En la columna Errors, haz clic en View errors y corrígelos. También puedes quitar las bases de datos con errores del trabajo de migración.

Para obtener más información sobre cómo quitar una base de datos con errores de un trabajo de migración, consulta Administra trabajos de migración.

Limpia las ranuras de replicación

Verás uno de los siguientes mensajes:

  • Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.
  • Error promoting EM replica: finished drop replication with errors.

Causas posibles

Cuando se promueve una instancia de AlloyDB, si no se puede acceder a la instancia de origen desde la instancia de AlloyDB (por ejemplo, la instancia de origen no se está ejecutando o quitaste la instancia de AlloyDB de la lista de entidades permitidas de instancias de origen), no se puede limpiar la configuración necesaria para la replicación durante la promoción de un trabajo de migración. Debes limpiar las ranuras de replicación de forma manual.

Solución

Para cada base de datos, ejecuta los siguientes comandos como un usuario con el privilegio superuser:

  1. Obtén los nombres de las ranuras de replicación del mensaje de error y, luego, ejecuta el siguiente comando para quitar las ranuras, una por una:

    select pg_drop_replication_slot({slot_name});
  2. Si los nombres de las ranuras de replicación no están disponibles en el mensaje de error, ejecuta el siguiente comando para consultar las ranuras de replicación existentes:

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%alloydb%' and active = 'f';
  3. Si no hay réplicas de AlloyDB que usen la instancia de origen, ejecuta el siguiente comando para limpiar la configuración de pglogical:

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'alloydb';
  4. Si ya no se necesita la extensión pglogical, ejecuta el siguiente comando para desinstalarla:

    DROP EXTENSION IF EXISTS pglogical;

Borra los clústeres de AlloyDB huérfanos en modo de bootstrapping

En casos extremos poco frecuentes, es posible que descubras que se borró tu trabajo de migración, pero no el clúster de AlloyDB asociado, y que aún está en modo de bootstrapping. Es posible borrar el clúster con el comando gcloud de AlloyDB para borrar un clúster, combinado con la opción --force.

Ten en cuenta que borrar un clúster de bootstrapping mientras lo usa un trabajo de migración genera un comportamiento indefinido.

Administra usuarios y roles

Migra usuarios existentes

Actualmente, Database Migration Service no admite la migración de usuarios existentes de una instancia de origen a una instancia de AlloyDB de destino. Puedes administrar esta migración creando los usuarios en AlloyDB de forma manual.

Acerca del usuario alloydbexternalsync

Durante la migración, todos los objetos de la instancia principal de AlloyDB son propiedad del usuario alloydbexternalsync. Después de migrar los datos, puedes modificar la propiedad de los objetos a otros usuarios completando los siguientes pasos:

  • Ejecuta el comando GRANT alloydbexternalsync to {USER}.
  • En cada base de datos, ejecuta el comando reassign owned by alloydbexternalsync to {USER};.
  • Para quitar el usuario alloydbexternalsync, ejecuta el comando drop role alloydbexternalsync.