Guida all'upgrade delle versioni principali per il database OCI con PostgreSQL
Aggiorna le versioni principali di OCI Database con PostgreSQL utilizzando l'approccio pg_dump/pg_restore o pglogical.
OCI Database with PostgreSQL è un servizio completamente gestito per l'esecuzione di PostgreSQL su Oracle Cloud, progettato per ridurre il sovraccarico operativo associato alla gestione dell'infrastruttura sottostante. Semplifica l'amministrazione quotidiana attraverso il provisioning automatizzato, l'applicazione di patch supportata, i backup automatizzati e le funzionalità di monitoraggio integrate.
La manutenzione degli ambienti PostgreSQL OCI aggiornati è importante per sfruttare i miglioramenti più recenti a livello di prestazioni, aggiornamenti di sicurezza e nuove funzioni.
Le principali versioni supportate di PostgreSQL sono 14, 15, 16 e 17.
I seguenti approcci comunemente adottati per gli aggiornamenti delle principali versioni offrono metodi strutturati e ripetibili per la migrazione dei dati e la transizione delle applicazioni alle versioni più recenti.
pg_dump e pg_restore
L'upgrade di PostgreSQL OCI utilizzando pg_dump e pg_restore è un approccio semplice e affidabile, soprattutto quando si eseguono aggiornamenti di versione principali o si esegue la migrazione tra ambienti. Questo metodo garantisce una migrazione pulita e controllata sia degli oggetti che dei dati del database. Grazie alla gestione corretta dei ruoli, al parallelismo e alla convalida, questo metodo garantisce un processo di migrazione fluido e controllato.
Questo documento descrive il processo di aggiornamento completo utilizzando i comandi esatti.
Note importanti
pg_dumpepg_restoresono strumenti di backup logici.- Adatto per gli upgrade della versione principale.
- Richiede tempo di inattività durante lo switchover finale.
- I ruoli devono essere sempre gestiti separatamente.
Aggiorna flusso di lavoro
Il processo di aggiornamento che utilizza pg_dump e pg_restore consiste nei passi riportati di seguito.
- Passo 1: eseguire il dump degli oggetti globali (ruoli)
Questo passo consente di garantire la conservazione di tutti i ruoli, le autorizzazioni e i controlli dell'accesso, consentendo agli utenti e alle applicazioni di mantenere l'accesso coerente dopo l'aggiornamento.
- Passo 2: eseguire il dump del database
Questo passo crea un backup logico completo del database, fornendo un modo affidabile per trasferire i dati nell'ambiente aggiornato.
- Passo 3: Modificare il file di dump globale
Questo passaggio ci consente di rivedere e modificare il dump in base alle esigenze, contribuendo a garantire la compatibilità con la versione PostgreSQL di destinazione e un processo di ripristino più fluido.
- Passo 4: Ripristino degli oggetti globali
Prima di reintrodurre i dati, il ripristino dei ruoli garantisce la disponibilità degli utenti e delle autorizzazioni appropriati in modo da supportare un ambiente coerente e sicuro.
- Passo 5: ripristinare il database
Questo passo porta i dati nel sistema aggiornato, completando la transizione e rendendo il database pronto per l'uso sulla nuova versione di PostgreSQL.
Passo 1: eseguire il dump degli oggetti globali (ruoli)
In primo luogo, esportare ruoli e oggetti globali dal database di origine (versione precedente):
/usr/lib/postgresql/bin/pg_dumpall -U psql -h <IP_of_Source_DB> -g --no-role-passwords --no-tablespaces -f <all_roles>.sql
-
-g: esegue il dump di oggetti globali quali ruoli e utentiQuesta opzione è incentrata sull'estrazione di oggetti a livello di cluster, ad esempio ruoli, utenti e relativi privilegi associati, anziché su dati specifici del database. L'acquisizione separata di questi elementi consente di garantire che i controlli dell'accesso possano essere ricreati in modo coerente nell'ambiente di destinazione.
-
--no-role-passwords: evita problemi relativi alle passwordCiò esclude le definizioni delle password dei ruoli dal dump, il che può semplificare il processo di ripristino, in particolare quando i criteri delle password o i metodi di autenticazione sono diversi tra gli ambienti. Offre inoltre la flessibilità necessaria per riconfigurare le credenziali dopo l'aggiornamento.
-
--no-tablespaces: impedisce i problemi di dipendenza delle tablespaceQuesta operazione omette le definizioni di tablespace dal dump, evitando così dipendenze da configurazioni di memorizzazione specifiche che potrebbero non esistere nell'ambiente di destinazione. Ciò può rendere il processo di ripristino più portatile e più facile da adattare allo storage gestito da OCI.
-
-f <all_roles>.sql: scrive l'output in un file per il riutilizzoCiò indirizza l'output a un file SQL, semplificando la revisione, la versione e il riutilizzo durante la fase di ripristino. Avere un file separato per gli oggetti globali supporta anche un processo di aggiornamento più controllato e graduale.
Passo 2: eseguire il dump del database
Eseguire un dump del database utilizzando il formato della directory:
/usr/lib/postgresql/bin/pg_dump -v -h < IP_of_Source_DB > -U <username> -d <databasename> -Fd -C -j <Num of parallel jobs> -Z0 -f sampledb_dir_format
-
-Fd: formato della directory (crea più file)L'opzione
-Fd(formato della directory) viene scelta perché supporta i dump paralleli (-j), migliorando le prestazioni per database di grandi dimensioni e consentendo ripristini più granulari e flessibili di singoli oggetti. In questo formato il dump viene memorizzato come directory contenente più file anziché un singolo archivio. Supporta l'elaborazione parallela e offre una maggiore flessibilità durante il ripristino, soprattutto per database più grandi.In alternativa, è possibile utilizzare il formato personalizzato (
-Fc) quando si preferisce un backup a file singolo, pur supportando le funzionalità di compressione e ripristino selettivo. -
-C: include il comando di creazione del databaseQuesta opzione aggiunge le istruzioni necessarie per creare il database durante il ripristino, semplificando il processo di impostazione nell'ambiente di destinazione.
-
-j: abilita i job paralleli per un dump più rapidoCiò consente all'operazione di dump di eseguire contemporaneamente più job, il che può ridurre in modo significativo il tempo complessivo richiesto per set di dati di grandi dimensioni.
-
-Z0: nessuna compressione (migliora le prestazioni)La disabilitazione della compressione può migliorare le prestazioni del dump riducendo il sovraccarico della CPU, il che potrebbe risultare utile quando la velocità è una priorità e i vincoli di storage sono minimi.
-
-v: modalità Verbose per monitorare l'avanzamentoQuesta opzione fornisce un output dettagliato durante l'esecuzione, semplificando il tracciamento dello stato di avanzamento e l'identificazione di eventuali problemi nelle prime fasi del processo di dump.
Passo 3: Modificare il file di dump globale
Prima di ripristinare i ruoli:
Modificare il file <all_roles>.sql come richiesto in base alle istruzioni riportate di seguito.
Rimuovere quanto segue dal file di dump dei ruoli:
- Tutte le istruzioni
CREATE,ALTER ROLE,GRANTper i ruoli che iniziano conoci_* - Qualsiasi attributo di ruolo non supportato (in particolare nei servizi gestiti come OCI PostgreSQL)
- Tutte le istruzioni
CREATEeALTER ROLEper l'utente amministratore creato durante l'impostazione iniziale del database PostgreSQL OCI, poiché deve essere ricreata quando si esegue il provisioning del database con versione successiva. Se si prevede di utilizzare un nome utente amministratore diverso, assicurarsi che l'utente amministratore appropriato sia specificato durante la creazione del database PostgreSQL OCI aggiornato.
Inoltre, aggiornare il file di dump dei ruoli per rimuovere o modificare i comandi che richiedono i privilegi SUPERUSER, poiché non sono supportati negli ambienti gestiti.
Ad esempio:
Originale:
ALTER ROLE test WITH NOSUPERUSER INHERIT CREATEROLE CREATEDB LOGIN NOREPLICATION NOBYPASSRLS PASSWORD 'test';
Modificato:
ALTER ROLE/USER test WITH CREATEROLE CREATEDB LOGIN PASSWORD 'test';
Passo 4: Ripristino degli oggetti globali
Ripristinare i ruoli nel sistema di database di destinazione (versione successiva):
/usr/lib/postgresql/bin/psql -U <username> -d <databasename> -h <IP_of_Target_Database_System> -f <all_roles>.sql
Questo passo garantisce:
- Tutti gli utenti e i ruoli vengono creati
- Autorizzazioni disponibili prima del ripristino dei dati
Passo 5: ripristinare il database
Ignorare quanto segue dal file di dump toc.dat:
- Tutte le istruzioni
CREATE,ALTER ROLEeGRANTnon riescono per i ruoli i cui nomi iniziano conoci_*.
Ripristinare il database nel sistema del database di destinazione utilizzando:
/usr/lib/postgresql/bin/pg_restore -v -h <IP_of_Target_Database_System> -U <username> -j <Num of parallel jobs> -C -d <databasename> sampledb_dir_format
-C: crea il database, connettiti ad esso e ripristina il database-j: ripristino parallelo per un'esecuzione più rapida-v: output dettagliato per tenere traccia dell'avanzamento
Questo passo garantisce:
- Controllare l'output descrittivo dei messaggi
ERROR:e assicurarsi che il comando sia stato completato con un codice di uscita shell0. Gli errori relativi agli utentioci_*possono essere ignorati.
Per gli ambienti con più database, si consiglia di eseguire i comandi precedenti separatamente per ciascun database per garantire un processo di aggiornamento completo e coerente.
Considerazioni sulle performance
- Utilizzare valori
-jsuperiori in base alla CPU disponibile - Usare
-Z0durante il dump per ottenere prestazioni più rapide - Garantisci una capacità di I/O su disco sufficiente
- Monitorare l'avanzamento del ripristino utilizzando log descrittivi
Convalida successiva al ripristino
Dopo aver completato il ripristino, eseguire i task riportati di seguito.
- Verifica conteggi righe
Questo task consente di verificare che la migrazione di tutti i dati sia riuscita e che non vi siano discrepanze tra i database di origine e di destinazione.
- Controllare la connettività dell'applicazione
Questa attività garantisce che le applicazioni possano connettersi e interagire con il database aggiornato come previsto.
- Convalida ruoli e autorizzazioni
Questo task consente di confermare che gli utenti e i ruoli dispongono dell'accesso e dei privilegi appropriati nel nuovo ambiente.
- Eseguire il comando seguente per ogni database
VACUUM ANALYZE <database_name>;Questo comando consente di aggiornare le statistiche interne utilizzate dal pianificatore query, consentendo a OCI PostgreSQL di generare piani di esecuzione più efficienti in base ai dati correnti. Può anche aiutare a ottimizzare le prestazioni complessive dopo il ripristino, in particolare per database o carichi di lavoro più grandi con query complesse.
pglogico
L'estensione pglogical consente la replica logica su più sistemi di database PostgreSQL Oracle Cloud Infrastructure (OCI). Questa estensione supporta la replica PostgreSQL cross-version, rendendola un approccio adatto e affidabile per l'esecuzione di aggiornamenti del database con tempi di inattività minimi. Abilitando la replica logica tra i sistemi di origine e di destinazione, puoi migrare senza problemi i dati tra le versioni mantenendo la disponibilità dell'applicazione.
pglogical è particolarmente utile per le seguenti situazioni:
- Aggiornamenti delle versioni principali
- Migrazioni tra ambienti
pglogical consente una perfetta sincronizzazione dei dati tra:
- Istanze PostgreSQL in diverse aree OCI e domini di disponibilità
- Database distribuiti in reti cloud virtuali (VCN) diverse
- Servizi PostgreSQL gestiti su più provider cloud
- Istanze PostgreSQL autogestite (cloud o on premise)
Questa flessibilità rende pglogical una soluzione potente per upgrade del database, migrazioni e implementazioni ibride.
Requisiti di connettività di rete
- Se entrambi i sistemi di database si trovano all'interno della stessa VCN, la connettività è disponibile automaticamente.
- Se i database si trovano in VCN diverse all'interno della stessa area, configurare il Local Peering Gateway (LPG) per stabilire la comunicazione.
- Se i database si trovano in vCN diverse all'interno di un'area diversa, configurare Dynamic Route Gateway (DRG) per stabilire la comunicazione.
Abilita estensione pglogica nel sistema di database di origine e di destinazione
Eseguire i passi riportati di seguito su entrambi i database origine (versione precedente) e destinazione (versione successiva).
- Connettersi alla console di Oracle Cloud e andare al sistema di database PostgreSQL OCI.
- Modificare la configurazione accedendo al file di configurazione.
- Selezionare Copia configurazione e aggiornare i parametri richiesti. In Variabili utente (lettura/scrittura), eseguire le operazioni riportate di seguito.
wal_level = logicaltrack_commit_timestamp = 1
- Abilita estensione: in Configura estensioni selezionare
pglogicale creare la configurazione. - Passare al sistema di database, selezionare Modifica in Configurazione e applicare la configurazione creata in precedenza al sistema di database.
Lo stato del sistema di database è inizialmente Aggiornamento. Attendere che diventi Attivo prima di continuare.
Questa configurazione prepara entrambi gli ambienti per la replica logica abilitando le impostazioni e le estensioni necessarie, consentendo a
pglogicaldi acquisire e sincronizzare le modifiche in modo affidabile tra i database di origine e di destinazione durante il processo di aggiornamento. - Dopo che il sistema di database è attivo, connettersi al database e verificare le estensioni abilitate utilizzando la query seguente.
SHOW oci.admin_enabled_extensions; - Creare l'estensione
pglogicalutilizzando il comando seguente:CREATE EXTENSION pglogical;
Configura database di origine
Eseguire il login come utente amministratore (l'utente specificato durante la creazione del database PostgreSQL OCI) e concedere i privilegi necessari per abilitare la replica logica.
alter role xxx with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to xxx ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx;
xxx è l'utente di esempio creato durante il provisioning del sistema di database.
Configura pglogical nell'origine (Publisher)
- Creare il nodo publisher nel database di origine.
SELECT pglogical.create_node(node_name := 'provider1', dsn := 'host=<source_database_fqdn> port=5432 user=xxx password=xxxxx dbname=pglogical_source');node_name: specificare il nome del publisher da creare nel database di origine.host: immettere il nome dominio completamente qualificato (FQDN) del database di origine.port_number: fornire la porta su cui è in esecuzione il database di origine.database_name: specificare il database in cui creare la pubblicazione.
- Aggiungere tutte le tabelle nello schema
publical set di replica predefinito.SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']);
Configura database di destinazione
Eseguire il login come utente amministratore (l'utente specificato durante la creazione del database PostgreSQL OCI) e concedere i privilegi necessari per abilitare la replica logica.
alter role xxx with replication;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_reset() to xxx ;
grant EXECUTE on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx ;
grant all on FUNCTION pg_catalog.pg_replication_origin_session_setup to xxx;
xxx è l'utente di esempio creato durante l'impostazione del database.
Ignorare il comando
alter role ...replication per l'utente amministratore nel database PostgreSQL OCI versione 16 e successive, poiché l'utente amministratore eredita il ruolo di replica per impostazione predefinita a partire da OCI PostgreSQL 16.Prima di procedere, assicurarsi che:
-
Tutti gli schemi e gli oggetti necessari esistono nella destinazione
Gli elementi includono schemi, tabelle, indici, estensioni e qualsiasi oggetto di database richiesto. Avere queste operazioni in atto aiuta a garantire che le operazioni di replica o ripristino possano continuare senza errori da dipendenze mancanti. L'esistenza può essere confermata confrontando le liste di schemi (ad esempio, utilizzando
\dne\dtin psql) e convalidando che le estensioni necessarie siano installate sia nell'origine che nella destinazione. -
La struttura del database corrisponde all'origine
Il database di destinazione dovrebbe allinearsi strettamente con l'origine in termini di definizioni di schema, nomi di oggetti e struttura generale. Questa coerenza aiuta a supportare una migrazione dei dati fluida e riduce la probabilità di conflitti o incongruenze durante la sincronizzazione. Verificare esaminando le definizioni di schema (ad esempio utilizzando
pg_dump --schema-only) o confrontando le strutture di tabella e i conteggi degli oggetti tra i sistemi di origine e di destinazione.
Configura pglogical sulla destinazione (sottoscrittore)
- Creare il nodo sottoscrittore nel database di destinazione:
SELECT pglogical.create_node(node_name := 'subscriber1', dsn := 'host=<target_database_fqdn> port=5432 user=xxx password=xxxxx dbname=pglogical_target');node_name: definire il nome del sottoscrittore nel database di destinazione.host: immettere il nome dominio completamente qualificato (FQDN) del database di destinazione.port_number: immettere la porta su cui è in esecuzione il database di destinazione.database_name: fornire il nome del database in cui verrà creata la sottoscrizione
- Creare la sottoscrizione per avviare i processi di sincronizzazione e replica in background:
SELECT pglogical.create_subscription(subscription_name := 'subscription1', provider_dsn := 'host=<source_database_fqdn> port=5432 user=xxx password=xxxxxx dbname=pglogical_source sslmode=require');subscription_name: fornire il nome della sottoscrizione.host: fornire il nome FQDN del database di origine.port_number: fornire la porta su cui è in esecuzione il database di destinazione.database_name: fornire il nome del database d'origine.
Verifica replica
- Controllare lo stato della sottoscrizione (destinazione): eseguire l'istruzione seguente per controllare lo stato della sottoscrizione nel database di destinazione.
SELECT * FROM pglogical.show_subscription_status(); - Controllare lo stato della replica (origine): eseguire l'istruzione seguente per controllare lo stato della replica nel database di origine.
SELECT * FROM pg_stat_replication;
Se entrambi i controlli indicano uno stato attivo senza ritardi o modifiche in sospeso, questo risultato suggerisce che la replica è completa e che il database di destinazione è completamente sincronizzato con l'origine.
Per ulteriori informazioni su pglogical, inclusi passi e spiegazioni dettagliate, vedere Sincronizzazione tra più aree del database OCI con PostgreSQL mediante l'estensione pglogical
Conclusione
In conclusione, gli aggiornamenti delle versioni principali utilizzando pg_dump/pg_restore e pglogical offrono vantaggi distinti a seconda del caso d'uso. L'approccio pg_dump/pg_restore è semplice e affidabile per database più piccoli o quando i tempi di inattività sono accettabili, ma può richiedere molto tempo per set di dati di grandi dimensioni. Al contrario, pglogical consente aggiornamenti con tempi di inattività quasi nulli replicando i dati tra le versioni, rendendoli più adatti per sistemi di grandi dimensioni o mission-critical.
La scelta del metodo giusto dipende da fattori quali le dimensioni del database, i tempi di inattività accettabili e la complessità operativa. Indipendentemente dall'approccio, la pianificazione accurata, i test e la convalida post-aggiornamento sono fondamentali per garantire l'integrità dei dati e una transizione agevole alla versione più recente di OCI PostgreSQL.