Esegui la migrazione da PostgreSQL a Spanner (dialetto GoogleSQL)

Questa pagina fornisce indicazioni sulla migrazione di un database PostgreSQL open source a Spanner.

La migrazione prevede le seguenti attività:

  • Mappatura di uno schema PostgreSQL a uno schema Spanner.
  • Creazione di un'istanza, un database e uno schema Spanner.
  • Refactoring dell'applicazione per funzionare con il database Spanner.
  • Migrazione dei dati.
  • Verifica del nuovo sistema e passaggio allo stato di produzione.

Questa pagina fornisce anche alcuni schemi di esempio che utilizzano tabelle del database PostgreSQL MusicBrainz.

Mappare lo schema PostgreSQL a Spanner

Il primo passo per spostare un database da PostgreSQL a Spanner è determinare le modifiche allo schema da apportare. Utilizza pg_dump per creare istruzioni Data Definition Language (DDL) che definiscono gli oggetti nel database PostgreSQL, quindi modifica le istruzioni come descritto nelle sezioni seguenti. Dopo aver aggiornato le istruzioni DDL, utilizzale per creare il database in un'istanza Spanner.

Tipi di dati

La seguente tabella descrive il mapping dei tipi di dati PostgreSQL ai tipi di dati Spanner. Aggiorna i tipi di dati nelle istruzioni DDL dai tipi di dati PostgreSQL ai tipi di dati Spanner.

PostgreSQL Spanner
Bigint

int8

INT64
Bigserial

serial8

INT64
bit [ (n) ] ARRAY<BOOL>
bit varying [ (n) ]

varbit [ (n) ]

ARRAY<BOOL>
Boolean

bool

BOOL
box ARRAY<FLOAT64>
bytea BYTES
character [ (n) ]

char [ (n) ]

STRING
character varying [ (n) ]

varchar [ (n) ]

STRING
cidr STRING, utilizzando la notazione CIDR standard.
circle ARRAY<FLOAT64>
date DATE
double precision

float8

FLOAT64
inet STRING
Integer

int

int4

INT64
interval[ fields ] [ (p) ] INT64 se memorizzi il valore in millisecondi o STRING se memorizzi il valore in un formato di intervallo definito dall'applicazione.
json STRING
jsonb JSON
line ARRAY<FLOAT64>
lseg ARRAY<FLOAT64>
macaddr STRING, utilizzando la notazione standard dell'indirizzo MAC.
money INT64 o STRING per i numeri con precisione arbitraria.
numeric [ (p, s) ]

decimal [ (p, s) ]

In PostgreSQL, i tipi di dati NUMERIC e DECIMAL supportano fino a 217 cifre di precisione e 214-1 di scalabilità, come definito nella dichiarazione della colonna.

Il tipo di dati NUMERIC di Spanner supporta fino a 38 cifre di precisione e 9 cifre decimali di scalabilità.

Se hai bisogno di una maggiore precisione, consulta l'articolo Memorizzazione di dati numerici di precisione arbitraria per meccanismi alternativi.
path ARRAY<FLOAT64>
pg_lsn Questo tipo di dati è specifico di PostgreSQL, quindi non esiste un equivalente Spanner.
point ARRAY<FLOAT64>
polygon ARRAY<FLOAT64>
Real

float4

FLOAT64
Smallint

int2

INT64
Smallserial

serial2

INT64
Serial

serial4

INT64
text STRING
time [ (p) ] [ without time zone ] STRING, utilizzando la notazione HH:MM:SS.sss.
time [ (p) ] with time zone

timetz

STRING, utilizzando la notazione HH:MM:SS.sss+ZZZZ. In alternativa, può essere suddiviso in due colonne, una di tipo TIMESTAMP e un'altra contenente il fuso orario.
timestamp [ (p) ] [ without time zone ] Nessun equivalente. Puoi memorizzarlo come STRING o TIMESTAMP a tua discrezione.
timestamp [ (p) ] with time zone

timestamptz

TIMESTAMP
tsquery Nessun equivalente. Definisci un meccanismo di archiviazione nella tua applicazione.
tsvector Nessun equivalente. Definisci un meccanismo di archiviazione nella tua applicazione.
txid_snapshot Nessun equivalente. Definisci un meccanismo di archiviazione nella tua applicazione.
uuid STRING o BYTES
xml STRING

Tasti principali

Per le tabelle del database Spanner a cui aggiungi spesso dati, evita di utilizzare chiavi primarie con valori in aumento o diminuzione monotoni, in quanto questo approccio causa hotspot durante le operazioni di scrittura. Modifica invece le istruzioni DDL CREATE TABLE in modo che utilizzino strategie di chiave primaria supportate. Se utilizzi una funzionalità PostgreSQL come un tipo di dati o una funzione UUID, tipi di dati SERIAL, colonna IDENTITY o sequenza, puoi utilizzare le strategie di migrazione delle chiavi generate automaticamente che consigliamo.

Tieni presente che dopo aver designato la chiave primaria, non puoi aggiungere o rimuovere una colonna della chiave primaria o modificare un valore della chiave primaria in un secondo momento senza eliminare e ricreare la tabella. Per saperne di più su come designare la chiave primaria, consulta Schema e modello dei dati - chiavi primarie.

Durante la migrazione, potrebbe essere necessario conservare alcune chiavi intere esistenti che aumentano in modo monotono. Se devi conservare questi tipi di chiavi in una tabella aggiornata di frequente con molte operazioni su queste chiavi, puoi evitare di creare hotspot anteponendo alla chiave esistente un numero pseudo-casuale. Questa tecnica fa sì che Spanner ridistribuisca le righe. Per saperne di più sull'utilizzo di questo approccio, consulta What DBAs need to know about Spanner, part 1: Keys and indexes.

Chiavi esterne e integrità referenziale

Scopri di più sul supporto delle chiavi esterne in Spanner.

Indici

Gli indici b-tree di PostgreSQL sono simili agli indici secondari in Spanner. In un database Spanner utilizzi gli indici secondari per indicizzare le colonne più cercate per migliorare le prestazioni e per sostituire eventuali vincoli UNIQUE specificati nelle tabelle. Ad esempio, se il tuo DDL PostgreSQL contiene questa istruzione:

   CREATE TABLE customer (
      id CHAR (5) PRIMARY KEY,
      first_name VARCHAR (50),
      last_name VARCHAR (50),
      email VARCHAR (50) UNIQUE
     );

Utilizzeresti questa istruzione nel DDL di Spanner:

   CREATE TABLE customer (
      id STRING(5),
      first_name STRING(50),
      last_name STRING(50),
      email STRING(50)
      ) PRIMARY KEY (id);

    CREATE UNIQUE INDEX customer_emails ON customer(email);

Puoi trovare gli indici di qualsiasi tabella PostgreSQL eseguendo il meta-comando \di in psql.

Dopo aver determinato gli indici necessari, aggiungi le istruzioni CREATE INDEX per crearli. Segui le indicazioni riportate nella sezione Creazione di indici.

Spanner implementa gli indici come tabelle, pertanto l'indicizzazione di colonne con aumento monotono (come quelle contenenti dati TIMESTAMP) può causare un hotspot. Per saperne di più sui metodi per evitare gli hotspot, consulta What DBAs need to know about Spanner, part 1: Keys and indexes.

Controllare i vincoli

Scopri di più sul supporto dei vincoli CHECK in Spanner.

Altri oggetti di database

Devi creare la funzionalità dei seguenti oggetti nella logica dell'applicazione:

  • Visualizzazioni
  • Trigger
  • Stored procedure
  • Funzioni definite dall'utente
  • Colonne che utilizzano i tipi di dati serial come generatori di sequenze

Tieni presente i seguenti suggerimenti quando esegui la migrazione di questa funzionalità nella logica dell'applicazione:

  • Devi eseguire la migrazione di tutte le istruzioni SQL che utilizzi dal dialetto SQL PostgreSQL al dialetto GoogleSQL.
  • Se utilizzi i cursori, puoi rielaborare la query per utilizzare offset e limiti.

Crea l'istanza Spanner

Dopo aver aggiornato le istruzioni DDL in modo che siano conformi ai requisiti dello schema Spanner, utilizzale per creare il database in Spanner.

  1. Crea un'istanza di Spanner. Segui le indicazioni riportate in Istanze per determinare la configurazione regionale e la capacità di calcolo corrette per supportare i tuoi obiettivi di rendimento.

  2. Crea il database utilizzando la console Google Cloud o lo strumento a riga di comando gcloud:

Console

  1. Vai alla pagina delle istanze
  2. Fai clic sul nome dell'istanza in cui vuoi creare il database di esempio per aprire la pagina Dettagli istanza.
  3. Fai clic su Crea database.
  4. Digita un nome per il database e fai clic su Continua.
  5. Nella sezione Definisci lo schema del database, attiva/disattiva il controllo Modifica come testo.
  6. Copia e incolla le istruzioni DDL nel campo Istruzioni DDL.
  7. Fai clic su