Diagnostica i problemi relativi alle migrazioni omogenee a Cloud SQL per PostgreSQL

Il processo del job di migrazione potrebbe generare errori durante il runtime.

  • Alcuni errori, come una password errata nel database di origine, sono recuperabili, il che significa che possono essere corretti e il job di migrazione riprende automaticamente.
  • Alcuni non sono recuperabili, ad esempio gli errori nella replica dei dati, il che significa che il job di migrazione deve essere riavviato dall'inizio.

Quando si verifica un errore, lo stato del job di migrazione cambia in Failed e lo stato secondario riflette l'ultimo stato prima dell'errore.

Per risolvere un errore, vai al job di migrazione non riuscito per visualizzare l'errore e segui i passaggi descritti nel messaggio di errore.

Per visualizzare ulteriori dettagli sull'errore, vai a Cloud Monitoring utilizzando il link nel job di migrazione. I log vengono filtrati in base al job di migrazione specifico.

Nella tabella seguente sono riportati alcuni esempi di problemi e di come possono essere risolti:

Per questo problema… Il problema potrebbe essere… Prova…
Quando esegui la migrazione a un'istanza di destinazione esistente, ricevi il seguente messaggio di errore: 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. L'istanza Cloud SQL di destinazione contiene dati aggiuntivi. Puoi eseguire la migrazione solo a istanze esistenti vuote. Consulta le limitazioni note. Promuovi l'istanza di destinazione in modo che diventi un'istanza di lettura/scrittura, rimuovi i dati aggiuntivi e riprova il job di migrazione. Consulta Cancella i dati aggiuntivi dall'istanza di destinazione esistente.
Impossibile connettersi all'istanza del database di origine. Si è verificato un problema di connettività tra l'istanza del database di origine e l'istanza di destinazione. Segui i passaggi descritti in Debug della connettività.
Errore durante l'esecuzione del job di migrazione a causa di versioni dei database di origine e di destinazione incompatibili. Le versioni dei database di origine e di destinazione non sono una combinazione supportata. In particolare, la versione del database di origine fornita non è compatibile con la versione del database di destinazione. Assicurati che la versione del database di destinazione sia la stessa o una versione principale successiva rispetto alla versione del database di origine. Poi, crea un nuovo job di migrazione.
I linguaggi DDL (Data Definition Language) o DML (Data Manipulation Language) sono bloccati nell'origine. I DDL che richiedono il blocco ACCESS EXCLUSIVE e sono in esecuzione durante la fase di dump completo vengono bloccati.

Durante il processo di sincronizzazione iniziale (dump completo), è necessario evitare DDL o programmi che richiedono blocchi ACCESS EXCLUSIVE come ALTER TABLE o DROP TABLE sulle tabelle. In caso contrario, i DDL o i programmi attenderanno il completamento della sincronizzazione iniziale.

Ad esempio, se una tabella è ancora in fase di sincronizzazione iniziale e viene eseguito un comando ALTER TABLE sulla stessa tabella, il comando non verrà eseguito e i comandi DDL e DML successivi verranno bloccati fino al termine della sincronizzazione iniziale.

Messaggio di errore: No pglogical extension installed on databases (X) Uno o più database di origine non hanno pglogical installato. Segui queste linee guida per installare pglogical sui database nell'istanza di origine.
Durante la migrazione a PostgreSQL versione 15, dopo diversi tentativi di connessione successivi, si verifica uno dei seguenti sintomi: Questo problema è spesso attribuito al problema di deadlock nell'estensione pglogical. Per maggiori informazioni, consulta il Issue Tracker di pglogical su GitHub. Riprova il job di migrazione o esegui prima la migrazione a una versione PostgreSQL intermedia. Per maggiori dettagli, vedi Messaggio di errore: Cannot connect to invalid database.
Messaggio di errore: Replication user 'x' doesn't have sufficient privileges. L'utente che utilizza Database Migration Service non dispone dei privilegi richiesti per eseguire l'operazione designata. Segui queste linee guida per assicurarti che questo utente disponga dei privilegi richiesti.
Messaggio di errore: Unable to connect to source database server. Database Migration Service non riesce a stabilire una connessione al server del database di origine. Assicurati che le istanze di database di origine e di destinazione possano comunicare tra loro e di aver completato tutti i prerequisiti richiesti visualizzati quando hai definito le impostazioni per il job di migrazione.
Messaggio di errore: The source database 'wal_level' configuration must be equal to 'logical'. Il valore wal_level per il database di origine è impostato su un valore diverso da logical. Imposta wal_level su logical. Consulta Configurazione del livello WAL.
Messaggio di errore: The source database 'max_replication_slots' configuration is not sufficient. Il parametro max_replication_slots non è stato configurato correttamente. Segui queste linee guida per impostare correttamente questo parametro.
Messaggio di errore: The source database 'max_wal_senders' configuration is not sufficient. Il parametro max_wal_senders non è stato configurato correttamente. Segui queste linee guida per impostare correttamente questo parametro.
Messaggio di errore: The source database 'max_worker_processes' configuration is not sufficient. Il parametro max_worker_processes non è stato configurato correttamente. Segui queste linee guida per impostare correttamente questo parametro.

Messaggio di errore: Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

OPPURE

Messaggio di errore: Error promoting EM replica: finished drop replication with errors.

Le impostazioni necessarie per la replica non possono essere cancellate durante la promozione di un job di migrazione.

Per ogni database, esegui i comandi come utente con il privilegio superuser.

Per saperne di più sui comandi da eseguire, consulta Esegui la pulizia degli slot di replica.

Messaggio di errore: x509 certificate signed by unknown authority.

Il certificato CA di origine fornito a Database Migration Service potrebbe contenere solo il certificato radice. Tuttavia, il certificato di origine richiede sia il certificato radice sia eventuali certificati intermedi.

Ad esempio, per Amazon Relational Database Service, l'utilizzo del certificato rds-ca-2019-root.pem potrebbe causare questo problema.

Crea un certificato CA di origine combinato che contenga sia il certificato radice sia tutti i certificati intermedi richiesti.

Per il caso d'uso di Amazon Relational Database Service, utilizza il certificato rds-combined-ca-bundle.pem anziché il certificato rds-ca-2019-root.pem.

Messaggio di errore: ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

Il valore impostato per il parametro max_locks_per_transaction non è sufficiente. Imposta il valore di questo parametro su almeno {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions).

Messaggio di errore: ERROR: no data left in message.

Il pacchetto pglogical non è installato correttamente nell'istanza di origine. Per saperne di più su come installare correttamente questo pacchetto, consulta Installa il pacchetto pglogical nell'istanza di origine.

Messaggio di errore: Cannot assign TransactionIds during recovery.

L'origine configurata è in modalità Recovery. Configura un'origine che non sia in modalità Recovery [Recovery mode].
Il dump completo è lento. La destinazione Cloud SQL potrebbe essere lenta nell'importazione di dati di grandi dimensioni dal database di origine.
  • Quando crei la destinazione, imposta le dimensioni del disco dati in modo che siano vicine alle dimensioni finali. La fase di dump completo utilizza un workload ad alta intensità di scrittura I/O e un disco di dimensioni maggiori offre prestazioni di I/O migliori. Per ulteriori informazioni, vedi Prestazioni dell'archiviazione a blocchi.
  • Scegli un livello superiore per la destinazione Cloud SQL per ottenere la larghezza di banda massima disponibile per la rete e il disco.
  • Ottimizza il flag max_wal_size della destinazione Cloud SQL. In genere, 32 GB o 64 GB è un buon valore da impostare per questo flag. L'aggiornamento di questo flag non richiede il riavvio del server.
Messaggio di errore: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

Il job di migrazione non è riuscito durante la fase di dump completo e non è recuperabile. L'istanza del database di origine è stata riavviata o era in modalità di recupero oppure le connessioni di replica sono terminate a causa di un valore insufficiente impostato per il parametro wal_sender_timeout.

Per trovare la causa principale del problema:

  1. Vai alla pagina Esplora log nella console Google Cloud .
  2. Dall'elenco delle risorse, seleziona la replica Cloud SQL. Viene visualizzato un elenco dei log più recenti per la replica.
  3. Dai nomi dei file di log, seleziona postgres.log.
  4. Imposta il livello di gravità del log su tutti i livelli superiori a Warning. I primi log degli errori potrebbero essere la causa principale dell'errore.
  • Assicurati che Database Migration Service possa sempre connettersi all'istanza del database di origine durante la fase di dump completo.
  • Controlla se il valore del parametro wal_sender_timeout è impostato su un numero maggiore (ad esempio 0) nell'istanza del database di origine.
  • Riavvia il job di migrazione e riprova.
Messaggio di errore: ERROR: unknown column name {column_name}

È stata aggiunta una colonna a una tabella replicata sul nodo principale, ma non sul nodo di replica.

Durante le migrazioni continue, vengono aggiornate automaticamente solo le modifiche del data manipulation language (DML). La gestione delle modifiche al linguaggio DDL (Data Definition Language) in modo che i database di origine e di destinazione rimangano compatibili è responsabilità dell'utente e può essere eseguita in due modi:

  • Interrompi le scritture nel database di origine ed esegui i comandi DDL sia nell'origine che nella destinazione. Prima di eseguire i comandi DDL sulla destinazione, concedi il ruolo cloudsqlexternalsync all'utente Cloud SQL che applica le modifiche DDL.
  • Utilizza pglogical.replicate_ddl_command per consentire l'esecuzione dei comandi DDL nell'origine e nella destinazione in un punto coerente. L'utente che esegue i comandi deve avere lo stesso nome utente sia nell'origine che nella destinazione e deve essere il super utente o il proprietario dell'artefatto di cui viene eseguita la migrazione (ad esempio la tabella, la sequenza, la vista o il database).

Consulta Migrazione continua per trovare esempi di utilizzo di pglogical.replicate_ddl_command.

Messaggio di errore: ERROR: cannot truncate a table referenced in a foreign key constraint

L'utente ha tentato di troncare una tabella con un vincolo di chiave esterna.

Rimuovi prima il vincolo di chiave esterna, quindi tronca la tabella.

Messaggio di errore: ERROR: connection to other side has died

La connessione di replica è terminata a causa di un valore insufficiente impostato per il parametro wal_sender_timeout. L'errore si verifica in genere durante la fase di replica dopo l'esito positivo del dump iniziale.

Valuta la possibilità di aumentare il valore parametro wal_sender_timeout o di disattivare il meccanismo di timeout impostando il relativo valore su 0 nell'istanza del database di origine.

Messaggio di avviso: migration job test configuration has returned the following warnings: Some table(s) have limited support.

L'origine contiene tabelle con supporto limitato, ad esempio tabelle senza chiavi primarie.

Questo è un messaggio di avviso. Puoi procedere con la migrazione, ma tieni presente che non viene eseguita la migrazione delle entità non supportate (ad esempio tabelle senza chiavi primarie). Per saperne di più, consulta Configura i database di origine.

Quando esegui la migrazione dei database selezionati e il job di migrazione non riesce a replicare i dati in uno o più database, nell'elenco dei database viene visualizzato lo stato Non riuscito. Vari errori dei job di migrazione.

Nella colonna Errori, fai clic su Visualizza errori e correggili. Puoi anche rimuovere i database con errori dal job di migrazione.

Per ulteriori informazioni sulla rimozione di un database non riuscito da un job di migrazione, consulta Gestisci i job di migrazione.

Cancella i dati aggiuntivi dall'istanza di destinazione esistente

Quando esegui la migrazione a un'istanza di destinazione esistente, ricevi il seguente messaggio di errore: 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.

Questo problema può verificarsi se l'istanza di destinazione contiene dati aggiuntivi. Puoi eseguire la migrazione solo a istanze esistenti vuote. Consulta le limitazioni note.

Da provare

Cancella i dati aggiuntivi dall'istanza di destinazione e avvia nuovamente il job di migrazione seguendo questi passaggi:

  1. Interrompi il job di migrazione.
  2. A questo punto, l'istanza Cloud SQL di destinazione è in modalità read-only. Promuovi l'istanza di destinazione per ottenere l'accesso in scrittura.
  3. Connettiti all'istanza Cloud SQL di destinazione.
  4. Rimuovi i dati aggiuntivi dai database dell'istanza di destinazione. La destinazione può contenere solo dati di configurazione del sistema. I database di destinazione non possono contenere dati utente (ad esempio tabelle). Esistono diverse istruzioni SQL che puoi eseguire sui tuoi database per trovare dati non di sistema, ad esempio:

    Esempio di istruzione SQL per recuperare i database non di sistema (fai clic per espandere)

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

    Esempio di istruzione SQL per recuperare dati non di sistema nel database postgres (fai clic per espandere)

    Il database postgres è un database di sistema, ma può contenere dati non di sistema. Assicurati di eseguire queste istruzioni sul database postgres. Se utilizzi il client psql per connetterti all'istanza di destinazione, puoi passare a un altro database senza reimpostare la connessione utilizzando il 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. Avvia il job di migrazione.

Esegui la pulizia degli slot di replica

Viene visualizzato uno dei seguenti messaggi:

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

Il problema potrebbe essere

Quando promuovi un'istanza Cloud SQL, se l'istanza di origine non è raggiungibile dall'istanza Cloud SQL (ad esempio, l'istanza di origine non è in esecuzione o hai rimosso l'istanza Cloud SQL dalla lista consentita delle istanze di origine), non è possibile eseguire la pulizia delle impostazioni necessarie per la replica durante la promozione di un job di migrazione. Devi pulire manualmente gli slot di replica.

Da provare

Per ogni database, esegui questi comandi come utente con il privilegio superuser:

  1. Recupera i nomi degli slot di replica dal messaggio di errore, quindi esegui il comando seguente per eliminare gli slot uno alla volta:

    SELECT pg_drop_replication_slot('slot_name');
  2. Se i nomi degli slot di replica non sono disponibili nel messaggio di errore, esegui questo comando per eseguire una query sugli slot di replica esistenti:

    SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots WHERE slot_name LIKE '%cloudsql%' AND active = 'f';
  3. Se non sono presenti repliche Cloud SQL che utilizzano l'istanza di origine, esegui questo comando per pulire le impostazioni di pglogical:

    SELECT pglogical.drop_node(node_name) FROM pglogical.node WHERE node_name LIKE 'cloudsql';
  4. Se l'estensione pglogical non è più necessaria, esegui questo comando per disinstallarla:

    DROP EXTENSION IF EXISTS pglogical;

Messaggio di errore: Cannot connect to invalid database

Durante la migrazione a PostgreSQL versione 15, dopo diversi tentativi di connessione successivi si verifica uno dei seguenti sintomi:

Il problema potrebbe essere

Questo problema è spesso attribuito al problema di deadlock nell'estensione pglogical. Per saperne di più, consulta l'Issue Tracker di pglogical su GitHub.

Da provare

Esegui di nuovo il job di migrazione con una nuova istanza di destinazione

Prova a eliminare il database di destinazione in cui si è verificato il problema e ricrea il job di migrazione. Segui questi passaggi:

  1. Elimina l'istanza di destinazione in cui hai riscontrato i problemi. Consulta Elimina istanze nella documentazione di Cloud SQL per PostgreSQL.
  2. Elimina il job di migrazione non riuscito. Vedi Esamina un job di migrazione.
  3. Ricrea il job di migrazione. Consulta Crea un job di migrazione.

Esegui la migrazione a una versione intermedia

Valuta la possibilità di eseguire la migrazione a una versione precedente di PostgreSQL, ad esempio PostgreSQL 14. Dopo una migrazione riuscita, puoi eseguire l'upgrade all'istanza PostgreSQL 15 desiderata. Consulta Esegui l'upgrade della versione principale del database eseguendo la migrazione dei dati nella documentazione di Cloud SQL per PostgreSQL.


Gestisci utenti e ruoli

Esegui la migrazione degli utenti esistenti

Al momento, Database Migration Service non supporta la migrazione degli utenti esistenti da un'istanza di origine a un'istanza Cloud SQL di destinazione. Puoi gestire questa migrazione creando manualmente gli utenti in Cloud SQL.

Informazioni sull'utente cloudsqlexternalsync

Durante la migrazione, tutti gli oggetti della replica Cloud SQL sono di proprietà dell'utente cloudsqlexternalsync. Una volta eseguita la migrazione dei dati, puoi modificare la proprietà degli oggetti assegnandola ad altri utenti completando i seguenti passaggi:

  • Esegui il comando GRANT cloudsqlexternalsync to {USER}.
  • In ogni database, esegui il comando reassign owned by cloudsqlexternalsync to {USER};.
  • Per rimuovere l'utente cloudsqlexternalsync, esegui il comando drop role cloudsqlexternalsync.

Importa i dati in una nuova istanza Cloud SQL

Se prima esporti i dati da un'istanza Cloud SQL di cui Database Migration Service ha eseguito la migrazione in Cloud Storage, poi importi i dati da Cloud Storage in un'istanza Cloud SQL autonoma, l'importazione potrebbe non riuscire perché l'utente cloudsqlexternalsync non esiste nell'istanza di destinazione.

Per risolvere il problema, crea l'utente cloudsqlexternalsync nell'istanza di destinazione o rimuovi l'utente dall'istanza di cui è stata eseguita la migrazione.