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
|
INT64 |
Bigserial
|
INT64 |
bit [ (n) ] |
ARRAY<BOOL> |
bit varying [ (n) ]
|
ARRAY<BOOL> |
Boolean
|
BOOL |
box |
ARRAY<FLOAT64> |
bytea |
BYTES |
character [ (n) ]
|
STRING |
character varying [ (n) ]
|
STRING |
cidr |
STRING, utilizzando la notazione CIDR standard. |
circle |
ARRAY<FLOAT64> |
date |
DATE |
double precision
|
FLOAT64 |
inet |
STRING |
Integer
|
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) ]
|
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
|
FLOAT64 |
Smallint
|
INT64 |
Smallserial
|
INT64 |
Serial
|
INT64 |
text |
STRING |
time [ (p) ] [ without time zone ] |
STRING, utilizzando la notazione HH:MM:SS.sss. |
time [ (p) ] with time zone
|
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
|
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
serialcome 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.
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.
Crea il database utilizzando la console Google Cloud o lo strumento a riga di comando
gcloud:
Console
- Vai alla pagina delle istanze
- Fai clic sul nome dell'istanza in cui vuoi creare il database di esempio per aprire la pagina Dettagli istanza.
- Fai clic su Crea database.
- Digita un nome per il database e fai clic su Continua.
- Nella sezione Definisci lo schema del database, attiva/disattiva il controllo Modifica come testo.
- Copia e incolla le istruzioni DDL nel campo Istruzioni DDL.
- Fai clic su