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.
18 wierszy przekonwertowanych, bez poprawek, brak odrzuconych
Tabele w pliku shop_2024_postgres.sqlZrzut PostgreSQL 18.6 · zapisany przez pg_dump · utf8mb4
customers8 wierszy
8 kolumn id integer not null name text not null email text not null country varchar(2) not null is_active boolean not null tags text[] not null signed_up date created_at timestamptz(6) not null orders10 wierszy
10 kolumn id integer not null customer_id integer not null status order_status not null total numeric(10,2) not null items smallint not null ordered_at timestamp(6) not null shipped_at timestamp(6) note text details jsonb delivery interval
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 pliku | W skrypcie | Wpis w raporcie |
|---|---|---|
| varchar(n), char(n), text | te same typyTe same typy, z tymi samymi długościami. | |
| numeric(p,s), numeric without a precision, NaN and Infinity | te same typy i wartościTen 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. | type_replaced |
| enum types | te same typy enum, tworzone przed tabelamiEtykiety zachowują swoją kolejność. | |
| enum columns holding values outside their labels | text 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 multiranges | text 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 |
| citext | text, 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, jsonb | te same typyjson zachowuje tekst tak, jak go zapisano; jsonb zachowuje wartości tak, jak znormalizował je serwer. | |
| timestamp with time zone | timestamptz, 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 zone | te same typyTe same typy, łącznie z 24:00:00. | |
| infinity, -infinity and BC dates | zachowanePostgreSQL przechowuje je bez zmian. | |
| NaN and Infinity in numeric, real and double precision | zachowanePostgreSQL przechowuje je bez zmian. | |
| generated columns | te same kolumny generowaneTa sama formuła, obliczana przez bazę docelową. | |
| generated columns with functions IntoSQL doesn't write | zwykł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 write | brak 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 write | nie jest tworzoneCHECK, którego IntoSQL nie potrafi zapisać, jest pomijany i zgłaszany. | check_skipped |
| CHECK ... NOT VALID | dodane 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 indexes | nie 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 create | nie jest tworzoneKlucz nie może wskazywać tabeli, której nie ma. | foreign_key_skipped |
| NOT NULL columns with values that become NULL | NOT 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 tables | jedna 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 enums | wymienione 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 values | NULLKonwerter, który nie uruchamia bazy danych, nie może ich obliczyć. | expression_value |
| types IntoSQL doesn't know | textTekst mieści każdą wartość; zmień typ po załadowaniu. | unknown_type |
| text that isn't valid in its encoding | błę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.sqlKlucze 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.