Vai al contenuto
Home di IntoSQL

Porta un dump PostgreSQL su un PostgreSQL più vecchio o più recente

Trascina un dump in testo semplice di pg_dump o pg_dumpall, come .sql o .sql.gz, e scarica uno script che si carica su PostgreSQL da 13 a 18, qualunque versione abbia scritto il dump. Identity, enum, array e jsonb restano come sono, i tipi portati da un'estensione diventano testo, e ogni modifica è elencata nel report.

Il tuo file
sqlshop_2024_postgres.sqlFile di esempio, 6,2 kB
Il tuo database

18 righe convertite, nessuna correzione, nessuna rifiutata

Mostra

Tabelle in shop_2024_postgres.sqlDump PostgreSQL 18.6 · scritto da pg_dump · utf8mb4

  • customers8 righe
    8 colonne
    idinteger not null
    nametext not null
    emailtext not null
    countryvarchar(2) not null
    is_activeboolean not null
    tagstext[] not null
    signed_update
    created_attimestamptz(6) not null
  • orders10 righe
    10 colonne
    idinteger not null
    customer_idinteger not null
    statusorder_status not null
    totalnumeric(10,2) not null
    itemssmallint not null
    ordered_attimestamp(6) not null
    shipped_attimestamp(6)
    notetext
    detailsjsonb
    deliveryinterval

Non convertiti

  • Vista paid_orders

Ogni database li scrive nel proprio linguaggio. Riscrivili per PostgreSQL.

-- Written by IntoSQL from a PostgreSQL dump. Load it with: psql -v ON_ERROR_STOP=1 -f <file>
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET synchronous_commit = off;
SET maintenance_work_mem = '512MB';

CREATE TYPE order_status AS ENUM ('pending', 'paid', 'shipped', 'cancelled');
CREATE TABLE customers (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    name text NOT NULL,
    email text NOT NULL,
    country varchar(2) DEFAULT 'US' NOT NULL,
    is_active boolean DEFAULT true NOT NULL,
    tags text[] DEFAULT '{}' NOT NULL,
    signed_up date,
    created_at timestamptz(6) DEFAULT CURRENT_TIMESTAMP NOT NULL
);

CREATE TABLE orders (
    id integer GENERATED BY DEFAULT AS IDENTITY NOT NULL,
    customer_id integer NOT NULL,
    status order_status DEFAULT 'pending' NOT NULL,
    total numeric(10,2) NOT NULL,
    items smallint DEFAULT 1 NOT NULL,
    ordered_at timestamp(6) NOT NULL,
    shipped_at timestamp(6),
    note text,
    details jsonb,
    delivery interval,
    CONSTRAINT orders_total_check CHECK (total >= (0))
);

COPY customers (id, name, email, country, is_active, tags, signed_up, created_at) FROM stdin;
1	Ana Martínez	ana@example.com	MX	t	{vip}	2023-01-15	2023-01-15 10:24:00+00
2	Zoë Müller	zoe@example.de	DE	t	{}	2023-02-03	2023-02-03 08:11:42+00
3	José Peña	jose@example.es	ES	f	{wholesale,"late payer"}	2023-03-21	2023-03-21 19:05:17+00
4	李雷	lilei@example.cn	CN	t	{}	2023-05-09	2023-05-09 02:40:00+00
5	Noah O'Brien	noah@example.ie	IE	t	{}	\N	2023-06-30 14:00:00+00
6	Amélie Laurent	amelie@example.fr	FR	t	{vip}	2024-01-02	2024-01-02 09:30:00+00
7	Ravi Patel	ravi@example.in	IN	f	{}	2024-02-29	2024-02-29 23:59:59+00
8	Sofia Rossi 🌻	sofia@example.it	IT	t	{}	2024-04-12	2024-04-12 12:12:12+00
\.

COPY orders (id, customer_id, status, total, items, ordered_at, shipped_at, note, details, delivery) FROM stdin;
1	1	shipped	129.90	3	2024-03-01 10:00:00	2024-03-02 16:30:00	\N	{"gift": false}	1 day 06:30:00
2	2	paid	54.00	1	2024-03-02 11:15:00	\N	Gift wrap 🎁	{"gift": true, "wrap": "red"}	\N
3	1	cancelled	12.50	1	2024-03-03 09:45:00	\N	Customer changed their mind	\N	\N
4	4	shipped	980.00	12	2024-03-05 02:10:00	2024-03-07 08:00:00	请小心轻放	{"fragile": true}	2 days 05:50:00
5	5	pending	45.75	2	2024-03-08 17:20:00	\N	Leave at the door; ring twice	\N	\N
6	6	shipped	310.40	5	2024-03-10 13:00:00	2024-03-11 09:00:00	Fragile: "glass"	{"fragile": true}	20:00:00
7	8	paid	76.20	2	2024-03-11 18:45:00	\N	\N	\N	\N
8	2	shipped	19.99	1	2024-03-12 08:00:00	infinity	Shipped date set to infinity by an old import	\N	\N
9	3	shipped	64.00	2	2024-03-14 15:30:00	2024-03-15 10:00:00	Two parcels	{"parcels": [1, 2]}	18:30:00
10	7	paid	1499.00	1	2024-03-15 21:05:00	\N	C:\\Users\\ravi\\invoice.pdf	\N	\N
\.


-- Keys, indexes and constraints, after the rows so each builds once.
CREATE UNIQUE INDEX customers_email_key ON customers (email);
CREATE UNIQUE INDEX customers_pkey ON customers (id);
CREATE UNIQUE INDEX orders_pkey ON orders (id);
CREATE INDEX idx_orders_customer ON orders (customer_id);
CREATE INDEX idx_orders_status_date ON orders (status, ordered_at);
ALTER TABLE customers ADD CONSTRAINT customers_email_key UNIQUE USING INDEX customers_email_key;
ALTER TABLE customers ADD CONSTRAINT customers_pkey PRIMARY KEY USING INDEX customers_pkey;
ALTER TABLE orders ADD CONSTRAINT orders_pkey PRIMARY KEY USING INDEX orders_pkey;
ALTER TABLE orders ADD CONSTRAINT orders_customer_id_fkey FOREIGN KEY (customer_id) REFERENCES customers (id) NOT VALID;
DO $f$ BEGIN
    ALTER TABLE orders VALIDATE CONSTRAINT orders_customer_id_fkey;
EXCEPTION WHEN foreign_key_violation THEN
    RAISE WARNING 'foreign key % has rows without a parent: it stays NOT VALID, and new rows are checked', 'orders_customer_id_fkey';
END $f$;
SELECT setval(pg_get_serial_sequence('customers', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM customers)::numeric, 0) + 1, 1001), 2147483647)::bigint, false);
COMMENT ON TABLE customers IS 'People who bought at least once';
SELECT setval(pg_get_serial_sequence('orders', 'id'), LEAST(GREATEST(COALESCE((SELECT max(id) FROM orders)::numeric, 0) + 1, 5001), 2147483647)::bigint, false);

Correzioni

Non c'era niente da correggere.

Da controllare

  • 1 vista, trigger, routine o evento non è convertito; il report li elenca uno per uno. Ricreali a mano in PostgreSQL.
  • L'indice idx_orders_details su orders usa un'espressione che non si può scrivere per PostgreSQL (a gin index), quindi non viene creato. Crea l'indice a mano se le query ne hanno bisogno.

Il tuo file viene convertito su questo computer e non viene mai caricato.

Altri esempi:

Cosa cambia tra il file e lo script

Ogni riga è una regola che il convertitore applica, con la riga del report che scrive quando la regola cambia qualcosa nei tuoi dati.

  • varchar(n), char(n), text

    gli stessi tipi

    Gli stessi tipi, con le stesse lunghezze.

  • numeric(p,s), numeric without a precision, NaN and Infinity

    gli stessi tipi e valori

    Lo stesso tipo: ogni cifra viene copiata come l'ha scritta il dump.

  • money

    numeric(19,2)

    Il formato di money dipende da lc_monetary del server, quindi l'importo resta un numero senza simbolo di valuta, e si carica con qualsiasi locale di destinazione.

    Riga del report: type_replaced

  • enum types

    gli stessi tipi enum, creati prima delle tabelle

    Le etichette mantengono il loro ordine.

  • enum columns holding values outside their labels

    text senza CHECK

    Il tipo rifiuterebbe quei valori, quindi la colonna è testo e li mantiene tutti.

    Riga del report: enum_check_skipped

  • composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges

    text con il testo di PostgreSQL

    Lo script non crea né estensioni né tipi composti, quindi ogni valore mantiene il testo scritto da PostgreSQL; crea il tipo e modifica la colonna dopo il caricamento.

    Riga del report: type_replaced

  • citext

    text, confrontato in modo esatto

    Lo script non crea l'estensione citext, quindi queste colonne confrontano il testo in modo esatto; creala e ripristina le colonne dopo il caricamento.

    Riga del report: case_insensitive_collation

  • json, jsonb

    gli stessi tipi

    json mantiene il testo come scritto; jsonb mantiene i valori come li ha normalizzati il server.

  • timestamp with time zone

    timestamptz, gli stessi istanti

    Ogni valore mantiene l'offset scritto dal dump, quindi l'istante è lo stesso in qualsiasi fuso orario.

  • time, time with time zone

    gli stessi tipi

    Gli stessi tipi, 24:00:00 incluso.

  • infinity, -infinity and BC dates

    mantenuto

    PostgreSQL li contiene così come sono.

  • NaN and Infinity in numeric, real and double precision

    mantenuto

    PostgreSQL li contiene così come sono.

  • generated columns

    le stesse colonne generate

    La stessa formula, calcolata dalla destinazione.

  • generated columns with functions IntoSQL doesn't write

    una colonna semplice con i valori

    Una formula che IntoSQL non sa scrivere lascia una colonna semplice con i valori del dump e una riga nel report.

    Riga del report: generated_not_translated

  • defaults with functions IntoSQL doesn't write

    nessun valore predefinito

    Un valore predefinito che IntoSQL non sa scrivere viene omesso e segnalato.

    Riga del report: default_not_translated

  • CHECK constraints with functions IntoSQL doesn't write

    non creato

    Un vincolo CHECK che IntoSQL non sa scrivere viene omesso e segnalato.

    Riga del report: check_skipped

  • CHECK ... NOT VALID

    aggiunto NOT VALID dopo le righe

    Le righe che c'erano prima non sono mai state verificate, quindi il vincolo CHECK viene aggiunto dopo di loro, ancora non valido.

  • gin, gist, brin and hash indexes, partial and expression indexes

    non creato

    IntoSQL scrive indici b-tree su colonne; ricrea gli altri dopo il caricamento.

    Riga del report: index_skipped

  • foreign keys to tables the dump doesn't create

    non creato

    Una chiave non può riferirsi a una tabella che non c'è.

    Riga del report: foreign_key_skipped

  • NOT NULL columns with values that become NULL

    NOT NULL rimosso

    Una colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.

    Riga del report: not_null_relaxed

  • partitioned tables

    una tabella con le righe di ogni partizione

    Le righe sono le stesse; partiziona di nuovo la tabella se serve.

    Riga del report: partitions_dropped

  • views, functions, procedures, triggers, rules, policies, extensions and types other than enums

    elencati nel report

    IntoSQL converte le tabelle e le loro righe; il resto viene elencato perché tu lo ricrei.

    Riga del report: not_converted_objects

  • dumps without CREATE TABLE (--data-only)

    tipi ricavati dai valori

    Un dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.

    Riga del report: no_schema

  • expressions in INSERT values

    NULL

    Un convertitore che non esegue un database non può valutarle.

    Riga del report: expression_value

  • types IntoSQL doesn't know

    text

    Il testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.

    Riga del report: unknown_type

  • text that isn't valid in its encoding

    i byte errati come carattere di sostituzione

    Il testo di PostgreSQL deve essere UTF-8 valido.

    Riga del report: invalid_utf8_replaced

  • text decoded twice (ñ)

    copiato così com'è

    Il dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.

    Riga del report: mojibake_suspected

Nel fileNello scriptRiga del report
varchar(n), char(n), textgli stessi tipiGli stessi tipi, con le stesse lunghezze.
numeric(p,s), numeric without a precision, NaN and Infinitygli stessi tipi e valoriLo stesso tipo: ogni cifra viene copiata come l'ha scritta il dump.
moneynumeric(19,2)Il formato di money dipende da lc_monetary del server, quindi l'importo resta un numero senza simbolo di valuta, e si carica con qualsiasi locale di destinazione.type_replaced
enum typesgli stessi tipi enum, creati prima delle tabelleLe etichette mantengono il loro ordine.
enum columns holding values outside their labelstext senza CHECKIl tipo rifiuterebbe quei valori, quindi la colonna è testo e li mantiene tutti.enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multirangestext con il testo di PostgreSQLLo script non crea né estensioni né tipi composti, quindi ogni valore mantiene il testo scritto da PostgreSQL; crea il tipo e modifica la colonna dopo il caricamento.type_replaced
citexttext, confrontato in modo esattoLo script non crea l'estensione citext, quindi queste colonne confrontano il testo in modo esatto; creala e ripristina le colonne dopo il caricamento.case_insensitive_collation
json, jsonbgli stessi tipijson mantiene il testo come scritto; jsonb mantiene i valori come li ha normalizzati il server.
timestamp with time zonetimestamptz, gli stessi istantiOgni valore mantiene l'offset scritto dal dump, quindi l'istante è lo stesso in qualsiasi fuso orario.
time, time with time zonegli stessi tipiGli stessi tipi, 24:00:00 incluso.
infinity, -infinity and BC datesmantenutoPostgreSQL li contiene così come sono.
NaN and Infinity in numeric, real and double precisionmantenutoPostgreSQL li contiene così come sono.
generated columnsle stesse colonne generateLa stessa formula, calcolata dalla destinazione.
generated columns with functions IntoSQL doesn't writeuna colonna semplice con i valoriUna formula che IntoSQL non sa scrivere lascia una colonna semplice con i valori del dump e una riga nel report.generated_not_translated
defaults with functions IntoSQL doesn't writenessun valore predefinitoUn valore predefinito che IntoSQL non sa scrivere viene omesso e segnalato.default_not_translated
CHECK constraints with functions IntoSQL doesn't writenon creatoUn vincolo CHECK che IntoSQL non sa scrivere viene omesso e segnalato.check_skipped
CHECK ... NOT VALIDaggiunto NOT VALID dopo le righeLe righe che c'erano prima non sono mai state verificate, quindi il vincolo CHECK viene aggiunto dopo di loro, ancora non valido.
gin, gist, brin and hash indexes, partial and expression indexesnon creatoIntoSQL scrive indici b-tree su colonne; ricrea gli altri dopo il caricamento.index_skipped
foreign keys to tables the dump doesn't createnon creatoUna chiave non può riferirsi a una tabella che non c'è.foreign_key_skipped
NOT NULL columns with values that become NULLNOT NULL rimossoUna colonna i cui valori sono dovuti diventare NULL non può mantenere NOT NULL, altrimenti il caricamento si fermerebbe.not_null_relaxed
partitioned tablesuna tabella con le righe di ogni partizioneLe righe sono le stesse; partiziona di nuovo la tabella se serve.partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enumselencati nel reportIntoSQL converte le tabelle e le loro righe; il resto viene elencato perché tu lo ricrei.not_converted_objects
dumps without CREATE TABLE (--data-only)tipi ricavati dai valoriUn dump di soli dati contiene solo righe, quindi i tipi vengono ricavati dai valori.no_schema
expressions in INSERT valuesNULLUn convertitore che non esegue un database non può valutarle.expression_value
types IntoSQL doesn't knowtextIl testo contiene qualsiasi valore; cambia il tipo dopo il caricamento.unknown_type
text that isn't valid in its encodingi byte errati come carattere di sostituzioneIl testo di PostgreSQL deve essere UTF-8 valido.invalid_utf8_replaced
text decoded twice (ñ)copiato così com'èIl dump contiene esattamente questi caratteri, quindi vengono copiati; il report li segnala.mojibake_suspected

Carica lo script in PostgreSQL

Lo script crea le tabelle, copia le righe, poi aggiunge chiavi, indici e chiavi esterne, così si carica in fretta e si ferma al primo errore.

psql -v ON_ERROR_STOP=1 -d mydb -f postgresql.postgresql.sql

Le chiavi esterne vengono aggiunte come NOT VALID e poi validate. Se una riga punta a una riga che non esiste, lo script ti dice quale vincolo, invece di fallire a metà.

Per un dump grande, crea prima il database ed esegui lo script con psql dalla stessa macchina del server.

IntoSQL Pro carica il file direttamente in PostgreSQL dall'app desktop o dalla riga di comando, senza scrivere uno script.

Fai il dump di PostgreSQL per il miglior risultato

Il convertitore legge ciò che il dump contiene. Con queste opzioni il dump conserva più dei tuoi dati:

  • --format=plain, il default di pg_dump, scrive SQL. Un archivio custom o directory (-Fc, -Fd) diventa SQL con pg_restore -f dump.sql, senza un server di database.
  • --no-owner --no-privileges escludono ruoli e permessi, che il convertitore comunque salta, così il dump è più piccolo.
  • pg_dumpall esporta ogni database in un solo file; le tabelle di ognuno hanno il suo nome davanti, così niente entra in conflitto.

Cosa non viene convertito

Viste, trigger, procedure, funzioni e altri oggetti scritti nel linguaggio di PostgreSQL sono elencati per nome nel report, mai eliminati in silenzio, così puoi verificare ognuno con la versione di PostgreSQL in cui carichi prima di ricrearlo.

Domande sul passaggio di PostgreSQL tra versioni

Non trovi la risposta? Scrivici dalla pagina dei contatti e ti risponde una persona. Pagina dei contatti

Il mio dump viene caricato?

No. Il convertitore funziona nel tuo browser e legge il dump dal tuo disco a pezzi, quindi non lascia mai il tuo computer. Anche l'app desktop e la riga di comando convertono sul tuo computer.

Quanto può essere grande il dump?

Il convertitore non tiene mai l'intero dump in memoria: legge il file due volte, per intervalli, e scrive lo script man mano. I dump di più gigabyte si convertono nel browser, nell'app desktop e con la riga di comando.

Legge gli archivi pg_dump -Fc?

Non direttamente: un archivio custom è un formato binario. pg_restore -f dump.sql dump.backup lo trasforma nel SQL plain che il convertitore legge, senza connettersi a un server. Il convertitore lo dice quando riceve un archivio.

Da quali versioni di PostgreSQL può provenire il dump?

Dump scritti da pg_dump e pg_dumpall da PostgreSQL 10 in poi, con righe COPY o INSERT. Ogni dump di test viene da PostgreSQL 13 e 18 ed è confrontato con la sorgente cella per cella.

I valori serial e identity vengono mantenuti?

Sì. Le colonne serial e identity restano colonne identity, ogni riga mantiene il suo id e ogni contatore riparte dal valore che la sequenza del dump aveva raggiunto.

Cosa succede ad array, enum e altri tipi di PostgreSQL?

Restano come sono: array, range, json e jsonb, stringhe di bit, money a parte. I tipi enum vengono ricreati con le loro etichette. I tipi portati da un'estensione (citext, hstore, PostGIS) e i tipi composti diventano testo, e il report dice quali colonne.

E funzioni, trigger e viste?

Sono elencati per nome nel report e non vengono convertiti, così puoi ricrearli una volta caricate le tabelle. I CHECK NOT VALID vengono aggiunti dopo le righe, ancora non validi.

Su quali versioni di PostgreSQL si carica lo script?

PostgreSQL dalla 13 alla 18, qualunque versione abbia scritto il dump. Lo stesso script si carica su ognuna, fermandosi al primo errore se qualcosa va storto.