Diagnostica problemas de migraciones homogéneas a Cloud SQL para PostgreSQL

Es posible que el proceso de trabajo de migración genere 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 que el trabajo de migración se reanuda automáticamente.
  • Algunos son irrecuperables, 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 estado secundario refleja el último estado antes de la falla.

Para solucionar un error, navega al trabajo de migración que falló para verlo 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 la tarea de migración específica.

En la siguiente tabla, encontrarás algunos ejemplos de problemas y cómo resolverlos:

Situación Posible problema Solución
Cuando migras a una instancia de destino existente, recibes el siguiente mensaje de error: The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job. Tu instancia de Cloud SQL de destino contiene datos adicionales. Solo puedes migrar a instancias existentes que estén vacías. Consulta las limitaciones conocidas. Asciende tu instancia de destino para que sea una instancia de lectura y escritura, quita los datos adicionales y vuelve a intentar el trabajo de migración. Consulta Cómo borrar datos adicionales de tu instancia de destino existente.
No se pudo establecer una conexión con la instancia de la base de datos de origen. Se produjo un problema de conectividad entre la instancia de base de datos de origen y la de destino. Sigue los pasos que se indican en Cómo depurar la conectividad.
Falla en la ejecución del trabajo de migración debido a versiones incompatibles de las bases de datos de origen y destino. Las versiones de la base de datos de origen y destino no son una combinación compatible. Específicamente, la versión de la base de datos de origen proporcionada no es compatible con la versión de la base de datos de destino. Asegúrate de que la versión de la base de datos de destino sea la misma o una versión principal superior a la versión de la base de datos de origen. Luego, crea un nuevo trabajo de migración.
Los lenguajes de definición de datos (DDL) o de manipulación de datos (DML) están bloqueados en la fuente. Se bloquean los DDL que requieren el bloqueo ACCESS EXCLUSIVE y se ejecutan durante la fase de volcado completo.

Durante el proceso de sincronización inicial (volcado completo), se deben evitar los DDL o los programas que requieran bloqueos ACCESS EXCLUSIVE, 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, no se ejecutará el comando y se bloquearán los comandos DDL y DML posteriores 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 estos lineamientos para instalar pglogical en las bases de datos de la instancia de origen.
Cuando se migra a la versión 15 de PostgreSQL, después de varios intentos de reintento de conexión posteriores, se produce uno de los siguientes síntomas: A menudo, este problema se atribuye al problema de interbloqueo en la extensión pglogical. Para obtener más información, consulta el seguimiento de errores de pglogical en GitHub. Vuelve a intentar el trabajo de migración o migra primero a una versión intermedia de PostgreSQL. Para obtener más información, consulta Mensaje de error: Cannot connect to invalid database.
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 estos lineamientos 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 la 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 distinto de logical. Establece 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 estos lineamientos 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 estos lineamientos 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 estos lineamientos 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 los comandos como un usuario con el privilegio superuser.

Para obtener más información sobre qué comandos ejecutar, consulta Cómo limpiar los espacios 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 cualquier certificado intermedio.

Por ejemplo, en el caso de Amazon Relational Database Service, usar el certificado rds-ca-2019-root.pem puede generar este problema.

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

Para el caso de uso del Servicio de Base de datos Relacionales de Amazon, 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 parámetro max_locks_per_transaction no es suficiente. Establece el valor de este parámetro en, 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 que se configuró 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 Cloud SQL sea lento para importar datos grandes de la base de datos de origen.
  • Cuando crees el destino, establece el tamaño del disco de datos para que sea cercano al tamaño final. La fase de volcado completo usa una carga de trabajo intensiva en operaciones de escritura de E/S, y un tamaño de disco más grande tiene un mejor rendimiento de E/S. Para obtener más información, consulta Rendimiento del almacenamiento en bloque.
  • Elige un nivel superior para el destino de Cloud SQL para obtener el ancho de banda máximo de red y disco disponible.
  • Ajusta la marca max_wal_size del destino de Cloud SQL. Por lo general, 32 GB o 64 GB es un buen valor para establecer esta marca. No es necesario reiniciar el servidor para actualizar esta marca.
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. La instancia de la base de datos de origen se reinició o está en modo de recuperación, o bien las conexiones de replicación finalizaron debido a que se estableció un valor insuficiente para el parámetro wal_sender_timeout.

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

  1. Ve a la página Explorador de registros en la consola de Google Cloud .
  2. En la lista de recursos, selecciona tu réplica de Cloud SQL. Aparecerá una lista de los registros más recientes de la réplica.
  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. Los primeros registros de errores pueden ser la causa raíz de la falla.
  • Asegúrate de que Database Migration Service siempre pueda conectarse a la instancia de la base de datos de origen durante la fase de volcado completo.
  • Verifica si el valor del parámetro wal_sender_timeout está configurado en un número mayor (por ejemplo, 0) en la instancia de la 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 de 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 DDL en el destino, otorga el rol cloudsqlexternalsync al usuario de Cloud SQL que aplicará los cambios de DDL.
  • Usa 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 la fuente y en 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 ver los ejemplos de uso de 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 que se estableció un valor insuficiente para wal_sender_timeout parameter. Por lo general, el error ocurre durante la fase de replicación después de que se realiza correctamente el volcado inicial.

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

Mensaje de advertencia: migration job test configuration has returned the following warnings: Some table(s) have limited support.

La fuente tiene tablas con compatibilidad limitada, por ejemplo, tablas sin claves primarias.

Este es un mensaje de advertencia. Puedes continuar con la migración, pero ten en cuenta que las entidades no admitidas (por ejemplo, tablas sin claves primarias) no se migran. Para obtener más información, consulta Configura tus bases de datos de origen.

Borra los datos adicionales de tu instancia de destino existente

Cuando migras a una instancia de destino existente, recibes el siguiente mensaje de error: The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job.

Este problema puede ocurrir si tu instancia de destino contiene datos adicionales. Solo puedes migrar a instancias existentes que estén vacías. Consulta Limitaciones conocidas.

Solución

Para borrar los datos adicionales de tu instancia de destino y reiniciar el trabajo de migración, sigue estos pasos:

  1. Detén el trabajo de migración.
  2. En este punto, tu instancia de Cloud SQL de destino está en modo de solo lectura. Promociona la instancia de destino para obtener acceso de escritura.
  3. Conéctate a tu instancia de Cloud SQL de destino.
  4. Quita los datos adicionales de las bases de datos de tu instancia de destino. Tu destino solo puede contener datos de configuración del sistema. Las bases de datos de destino no pueden contener datos del usuario (como tablas). Existen diferentes instrucciones SQL que puedes ejecutar en tus bases de datos para encontrar datos que no sean del sistema, por ejemplo:

    Ejemplo de instrucción de SQL para recuperar bases de datos que no son del sistema (haz clic para expandir)

    SELECT datname FROM pg_catalog.pg_database
    WHERE datname NOT IN ('cloudsqladmin', 'template1', 'template0', 'postgres');

    Ejemplo de instrucción de SQL para recuperar datos que no son del sistema en la base de datos postgres (haz clic para expandir)

    La base de datos postgres es una base de datos del sistema, pero puede contener datos que no son del sistema. Asegúrate de ejecutar estas instrucciones en la base de datos postgres. Si usas el cliente psql para conectarte a la instancia de destino, puedes cambiar a otra base de datos sin restablecer la conexión con el comando \connect {database_name_here}.

    SELECT table_schema, table_name FROM information_schema.tables
    WHERE table_schema != 'information_schema' AND table_schema not like 'pg\_%';
    
    SELECT routine_schema, routine_name FROM information_schema.routines
    WHERE routine_schema != 'information_schema' AND routine_schema not like 'pg\_%';
    
    SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
        
  5. Inicia el trabajo 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.

Posible problema

Cuando se promociona una instancia de Cloud SQL, si no se puede acceder a la instancia de origen desde la instancia de Cloud SQL (por ejemplo, la instancia de origen no se está ejecutando o se quitó la instancia de Cloud SQL 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 los espacios 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 descartar las ranuras, una por una:

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

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%cloudsql%' and active = 'f';
  3. Si no hay réplicas de Cloud SQL 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 'cloudsql';
  4. Si ya no necesitas la extensión pglogical, ejecuta el siguiente comando para desinstalarla:

    DROP EXTENSION IF EXISTS pglogical;


Mensaje de error: Cannot connect to invalid database

Cuando se migra a la versión 15 de PostgreSQL, después de varios intentos de reconexión posteriores, se produce uno de los siguientes síntomas:

Posible problema

A menudo, este problema se atribuye al problema de interbloqueo en la extensión pglogical. Para obtener más información, consulta el seguimiento de errores de pglogical en GitHub.

Solución

Vuelve a realizar el trabajo de migración con una instancia de destino nueva

Intenta borrar la base de datos de destino en la que se produjo el problema y vuelve a crear el trabajo de migración. Lleva a cabo los pasos siguientes:

  1. Borra la instancia de destino en la que experimentaste los problemas. Consulta Cómo borrar instancias en la documentación de Cloud SQL para PostgreSQL.
  2. Borra el trabajo de migración que falló. Consulta Revisa un trabajo de migración.
  3. Vuelve a crear el trabajo de migración. Consulta Crea un trabajo de migración.

Cómo migrar a una versión intermedia

Considera migrar a una versión anterior de PostgreSQL, como PostgreSQL 14. Después de una migración exitosa, puedes intentar actualizar a la instancia de PostgreSQL 15 que desees. Consulta Cómo actualizar la versión principal de la base de datos migrando datos en la documentación de Cloud SQL para PostgreSQL.

Administrar usuarios y roles

Cómo migrar usuarios existentes

Actualmente, Database Migration Service no admite la migración de usuarios existentes de una instancia de origen a una instancia de Cloud SQL de destino. Para administrar esta migración, crea los usuarios en Cloud SQL de forma manual.

Acerca del usuario cloudsqlexternalsync

Durante la migración, el usuario cloudsqlexternalsync es el propietario de todos los objetos de la réplica de Cloud SQL. Después de migrar los datos, puedes modificar la propiedad de los objetos para otros usuarios. Para ello, completa los siguientes pasos:

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

Importa datos a una instancia nueva de Cloud SQL

Si primero exportas datos de una instancia de Cloud SQL que Database Migration Service migró a Cloud Storage y, luego, importas los datos de Cloud Storage a una instancia independiente de Cloud SQL, es posible que la importación falle porque el usuario cloudsqlexternalsync no existe en la instancia de destino.

Para mitigar el problema, crea el usuario cloudsqlexternalsync en la instancia de destino o quítalo de la instancia migrada.