Przejdź do treści
Strona główna IntoSQL

Przenieś zrzut PostgreSQL do starszej lub nowszej wersji PostgreSQL

Upuść zwykły zrzut z pg_dump lub pg_dumpall, jako .sql lub .sql.gz, i pobierz jeden skrypt, który ładuje się na PostgreSQL od 13 do 18, niezależnie od wersji, która zapisała zrzut. Kolumny identity, enumy, tablice i jsonb zostają bez zmian, typy z rozszerzeń stają się text, a każda zmiana jest wymieniona w raporcie.

Twój plik
sqlshop_2024_postgres.sqlPlik przykładowy, 6,2 kB
Twoja baza danych

18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych

Pokaż

Tabele w pliku shop_2024_postgres.sqlZrzut PostgreSQL 18.6 · zapisany przez pg_dump · utf8mb4

  • customers8 wierszy
    8 kolumn
    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 wierszy
    10 kolumn
    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

Nieprzekonwertowane

  • Widok paid_orders

Każda baza danych zapisuje je we własnym języku. Przepisz je dla 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);

Poprawki

Nic nie wymagało poprawek.

Do sprawdzenia

  • Widoki, wyzwalacze, procedury i zdarzenia nie są konwertowane: 1 obiekt, każdy wymieniony w raporcie. Utwórz je ręcznie w PostgreSQL.
  • Indeks idx_orders_details w tabeli orders używa wyrażenia, którego nie da się zapisać dla PostgreSQL (a gin index), więc go nie utworzono. Utwórz indeks ręcznie, jeśli zapytania go potrzebują.

Plik jest konwertowany na tym komputerze i nigdy nie jest wysyłany.

Inne przykłady:

Co się zmienia między plikiem a skryptem

Każdy wiersz to reguła stosowana przez konwerter, z wpisem, który dodaje do raportu, gdy reguła coś zmienia w twoich danych.

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

    te same typy

    Te same typy, z tymi samymi długościami.

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

    te same typy i wartości

    Ten sam typ: każda cyfra jest kopiowana tak, jak zapisał ją zrzut.

  • money

    numeric(19,2)

    Zapis money zależy od lc_monetary serwera, więc kwota jest zapisywana jako liczba bez symbolu waluty i ładuje się niezależnie od ustawień regionalnych celu.

    Wpis w raporcie: type_replaced

  • enum types

    te same typy enum, tworzone przed tabelami

    Etykiety zachowują swoją kolejność.

  • enum columns holding values outside their labels

    text bez CHECK

    Typ odrzuciłby te wartości, więc kolumna jest typu text i zachowuje je wszystkie.

    Wpis w raporcie: enum_check_skipped

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

    text z tekstem PostgreSQL

    Skrypt nie tworzy rozszerzeń ani typów złożonych, więc każda wartość zachowuje tekst zapisany przez PostgreSQL; po załadowaniu utwórz typ i zmień kolumnę.

    Wpis w raporcie: type_replaced

  • citext

    text, porównywany dokładnie

    Skrypt nie tworzy rozszerzenia citext, więc te kolumny porównują tekst dokładnie; po załadowaniu utwórz je i przywróć typ kolumn.

    Wpis w raporcie: case_insensitive_collation

  • json, jsonb

    te same typy

    json zachowuje tekst tak, jak go zapisano; jsonb zachowuje wartości tak, jak znormalizował je serwer.

  • timestamp with time zone

    timestamptz, te same momenty

    Każda wartość zachowuje przesunięcie zapisane w zrzucie, więc moment jest ten sam w każdej strefie czasowej.

  • time, time with time zone

    te same typy

    Te same typy, łącznie z 24:00:00.

  • infinity, -infinity and BC dates

    zachowane

    PostgreSQL przechowuje je bez zmian.

  • NaN and Infinity in numeric, real and double precision

    zachowane

    PostgreSQL przechowuje je bez zmian.

  • generated columns

    te same kolumny generowane

    Ta sama formuła, obliczana przez bazę docelową.

  • generated columns with functions IntoSQL doesn't write

    zwykła kolumna z wartościami

    Formuła, której IntoSQL nie potrafi zapisać, zostawia zwykłą kolumnę z wartościami ze zrzutu i wpis w raporcie.

    Wpis w raporcie: generated_not_translated

  • defaults with functions IntoSQL doesn't write

    brak wartości domyślnej

    Wartość domyślna, której IntoSQL nie potrafi zapisać, jest pomijana i zgłaszana w raporcie.

    Wpis w raporcie: default_not_translated

  • CHECK constraints with functions IntoSQL doesn't write

    nie jest tworzone

    CHECK, którego IntoSQL nie potrafi zapisać, jest pomijany i zgłaszany.

    Wpis w raporcie: check_skipped

  • CHECK ... NOT VALID

    dodane jako NOT VALID po wierszach

    Wiersze, które były wcześniej, nigdy nie zostały sprawdzone, więc ograniczenie jest dodawane po nich, nadal jako niezwalidowane.

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

    nie jest tworzone

    IntoSQL zapisuje indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.

    Wpis w raporcie: index_skipped

  • foreign keys to tables the dump doesn't create

    nie jest tworzone

    Klucz nie może wskazywać tabeli, której nie ma.

    Wpis w raporcie: foreign_key_skipped

  • NOT NULL columns with values that become NULL

    NOT NULL usunięte

    Kolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.

    Wpis w raporcie: not_null_relaxed

  • partitioned tables

    jedna tabela z wierszami wszystkich partycji

    Wiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie.

    Wpis w raporcie: partitions_dropped

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

    wymienione w raporcie

    IntoSQL konwertuje tabele i ich wiersze; resztę wymienia do ręcznego odtworzenia.

    Wpis w raporcie: not_converted_objects

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

    typy odczytane z wartości

    Zrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.

    Wpis w raporcie: no_schema

  • expressions in INSERT values

    NULL

    Konwerter, który nie uruchamia bazy danych, nie może ich obliczyć.

    Wpis w raporcie: expression_value

  • types IntoSQL doesn't know

    text

    Tekst mieści każdą wartość; zmień typ po załadowaniu.

    Wpis w raporcie: unknown_type

  • text that isn't valid in its encoding

    błędne bajty jako znak zastępczy

    Tekst w PostgreSQL musi być poprawnym UTF-8.

    Wpis w raporcie: invalid_utf8_replaced

  • text decoded twice (ñ)

    skopiowane bez zmian

    Zrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.

    Wpis w raporcie: mojibake_suspected

W plikuW skrypcieWpis w raporcie
varchar(n), char(n), textte same typyTe same typy, z tymi samymi długościami.
numeric(p,s), numeric without a precision, NaN and Infinityte same typy i wartościTen sam typ: każda cyfra jest kopiowana tak, jak zapisał ją zrzut.
moneynumeric(19,2)Zapis money zależy od lc_monetary serwera, więc kwota jest zapisywana jako liczba bez symbolu waluty i ładuje się niezależnie od ustawień regionalnych celu.type_replaced
enum typeste same typy enum, tworzone przed tabelamiEtykiety zachowują swoją kolejność.
enum columns holding values outside their labelstext bez CHECKTyp odrzuciłby te wartości, więc kolumna jest typu text i zachowuje je wszystkie.enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multirangestext z tekstem PostgreSQLSkrypt nie tworzy rozszerzeń ani typów złożonych, więc każda wartość zachowuje tekst zapisany przez PostgreSQL; po załadowaniu utwórz typ i zmień kolumnę.type_replaced
citexttext, porównywany dokładnieSkrypt nie tworzy rozszerzenia citext, więc te kolumny porównują tekst dokładnie; po załadowaniu utwórz je i przywróć typ kolumn.case_insensitive_collation
json, jsonbte same typyjson zachowuje tekst tak, jak go zapisano; jsonb zachowuje wartości tak, jak znormalizował je serwer.
timestamp with time zonetimestamptz, te same momentyKażda wartość zachowuje przesunięcie zapisane w zrzucie, więc moment jest ten sam w każdej strefie czasowej.
time, time with time zonete same typyTe same typy, łącznie z 24:00:00.
infinity, -infinity and BC dateszachowanePostgreSQL przechowuje je bez zmian.
NaN and Infinity in numeric, real and double precisionzachowanePostgreSQL przechowuje je bez zmian.
generated columnste same kolumny generowaneTa sama formuła, obliczana przez bazę docelową.
generated columns with functions IntoSQL doesn't writezwykła kolumna z wartościamiFormuła, której IntoSQL nie potrafi zapisać, zostawia zwykłą kolumnę z wartościami ze zrzutu i wpis w raporcie.generated_not_translated
defaults with functions IntoSQL doesn't writebrak wartości domyślnejWartość domyślna, której IntoSQL nie potrafi zapisać, jest pomijana i zgłaszana w raporcie.default_not_translated
CHECK constraints with functions IntoSQL doesn't writenie jest tworzoneCHECK, którego IntoSQL nie potrafi zapisać, jest pomijany i zgłaszany.check_skipped
CHECK ... NOT VALIDdodane jako NOT VALID po wierszachWiersze, które były wcześniej, nigdy nie zostały sprawdzone, więc ograniczenie jest dodawane po nich, nadal jako niezwalidowane.
gin, gist, brin and hash indexes, partial and expression indexesnie jest tworzoneIntoSQL zapisuje indeksy b-tree na kolumnach; pozostałe utwórz ponownie po załadowaniu.index_skipped
foreign keys to tables the dump doesn't createnie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma.foreign_key_skipped
NOT NULL columns with values that become NULLNOT NULL usunięteKolumna, której wartości musiały stać się NULL, nie może zachować NOT NULL, bo ładowanie by się zatrzymało.not_null_relaxed
partitioned tablesjedna tabela z wierszami wszystkich partycjiWiersze są te same; jeśli trzeba, podziel tabelę na partycje ponownie.partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enumswymienione w raporcieIntoSQL konwertuje tabele i ich wiersze; resztę wymienia do ręcznego odtworzenia.not_converted_objects
dumps without CREATE TABLE (--data-only)typy odczytane z wartościZrzut samych danych zawiera tylko wiersze, więc typy pochodzą z wartości.no_schema
expressions in INSERT valuesNULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć.expression_value
types IntoSQL doesn't knowtextTekst mieści każdą wartość; zmień typ po załadowaniu.unknown_type
text that isn't valid in its encodingbłędne bajty jako znak zastępczyTekst w PostgreSQL musi być poprawnym UTF-8.invalid_utf8_replaced
text decoded twice (ñ)skopiowane bez zmianZrzut zawiera dokładnie te znaki, więc są kopiowane; raport je wskazuje.mojibake_suspected

Załaduj skrypt do PostgreSQL

Skrypt tworzy tabele, kopiuje wiersze, a potem dodaje klucze, indeksy i klucze obce, więc ładuje się szybko i zatrzymuje przy pierwszym błędzie.

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

Klucze obce są dodawane jako NOT VALID, a potem sprawdzane. Jeśli wiersz wskazuje na nieistniejący wiersz, skrypt podaje, którego ograniczenia to dotyczy, zamiast przerwać w połowie.

Przy dużym zrzucie najpierw utwórz bazę danych i uruchom skrypt przez psql na tej samej maszynie co serwer.

IntoSQL Pro ładuje plik prosto do PostgreSQL z aplikacji na komputer lub wiersza poleceń, bez pisania skryptu.

Jak zrobić zrzut PostgreSQL dla najlepszego wyniku

Konwerter odczytuje to, co zawiera zrzut. Te opcje zachowują w nim więcej twoich danych:

  • --format=plain, domyślny w pg_dump, zapisuje SQL. Archiwum custom lub directory (-Fc, -Fd) zamienisz na SQL poleceniem pg_restore -f dump.sql, bez serwera bazy danych.
  • --no-owner --no-privileges pomijają role i uprawnienia, które konwerter i tak pomija, więc zrzut jest mniejszy.
  • pg_dumpall zapisuje każdą bazę danych w jednym pliku; nazwy tabel każdej z nich zaczynają się od jej nazwy, więc nic się nie powtarza.

Co nie jest konwertowane

Widoki, wyzwalacze, procedury, funkcje i inne obiekty napisane we własnym języku PostgreSQL są wymienione w raporcie z nazwy i nigdy nie są pomijane po cichu, więc możesz sprawdzić każdy z nich w wersji PostgreSQL, do której ładujesz, zanim go odtworzysz.

Pytania o przenoszenie PostgreSQL między wersjami

Nie ma tu odpowiedzi? Napisz do nas przez stronę kontaktu, a odpowie człowiek. Strona kontaktu

Czy mój zrzut jest wysyłany?

Nie. Konwerter działa w przeglądarce i odczytuje zrzut z dysku po kawałku, więc nigdy nie opuszcza on twojego komputera. Aplikacja na komputer i wiersz poleceń też konwertują na twoim komputerze.

Jak duży może być zrzut?

Konwerter nigdy nie trzyma całego zrzutu w pamięci: czyta plik dwa razy, fragmentami, i zapisuje skrypt na bieżąco. Zrzuty wielogigabajtowe konwertują się w przeglądarce, w aplikacji na komputer i w wierszu poleceń.

Czy odczytuje archiwa pg_dump -Fc?

Nie bezpośrednio: archiwum custom to format binarny. pg_restore -f dump.sql dump.backup zamienia je na zwykły SQL, który czyta konwerter, bez łączenia z serwerem. Konwerter informuje o tym, gdy dostanie archiwum.

Z jakich wersji PostgreSQL może pochodzić zrzut?

Zrzuty zapisane przez pg_dump i pg_dumpall z PostgreSQL od wersji 10, z wierszami COPY lub INSERT. Każdy testowy zrzut pochodzi z PostgreSQL 13 i 18 i jest porównywany ze źródłem komórka po komórce.

Czy wartości serial i identity są zachowywane?

Tak. Kolumny serial i identity pozostają kolumnami identity, każdy wiersz zachowuje swoje id, a każdy licznik idzie dalej od wartości, którą osiągnęła sekwencja w zrzucie.

Co dzieje się z tablicami, typami enum i innymi typami PostgreSQL?

Zostają bez zmian: tablice, zakresy, json i jsonb, ciągi bitów, z wyjątkiem money. Typy enum są tworzone ponownie z ich etykietami. Typy z rozszerzeń (citext, hstore, PostGIS) i typy złożone stają się tekstem, a raport podaje, których kolumn to dotyczy.

A funkcje, wyzwalacze i widoki?

Raport wymienia je z nazwy, ale nie są konwertowane, więc możesz je odtworzyć, gdy tabele będą już na miejscu. Ograniczenia CHECK NOT VALID są dodawane po wierszach, nadal jako niezwalidowane.

Na jakich wersjach PostgreSQL ładuje się skrypt?

PostgreSQL od 13 do 18, niezależnie od wersji, która zapisała zrzut. Ten sam skrypt ładuje się na każdej z nich i zatrzymuje przy pierwszym błędzie, jeśli coś pójdzie nie tak.