Pindahkan dump PostgreSQL ke PostgreSQL versi lebih lama atau lebih baru
Letakkan dump biasa dari pg_dump atau pg_dumpall, sebagai .sql atau .sql.gz, lalu unduh satu skrip yang dimuat di PostgreSQL 13 sampai 18, versi mana pun yang menulis dump-nya. Identity, enum, array, dan jsonb tetap apa adanya, tipe dari ekstensi menjadi text, dan setiap perubahan dicantumkan di laporan.
18 baris dikonversi, tanpa perbaikan, tidak ada yang ditolak
Tabel di shop_2024_postgres.sqlDump PostgreSQL 18.6 · ditulis oleh pg_dump · utf8mb4
customers8 baris
8 kolom 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 baris
10 kolom 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
Tidak dikonversi
- View paid_orders
Setiap database menulis objek ini dalam bahasanya sendiri. Tulis ulang untuk 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);
Perbaikan
Tidak ada yang perlu diperbaiki.
Perlu diperiksa
- 1 view, trigger, rutin, atau event tidak dikonversi; laporan mencantumkan masing-masing. Buat ulang secara manual di PostgreSQL.
- Indeks idx_orders_details pada orders memakai ekspresi yang tidak bisa ditulis untuk PostgreSQL (a gin index), jadi tidak dibuat. Buat indeks secara manual jika kueri memerlukannya.
File Anda dikonversi di komputer ini dan tidak pernah diunggah.
Contoh lain:
Apa yang berubah antara file dan skrip
Setiap baris adalah aturan yang diterapkan konverter, beserta baris laporan yang ditulisnya saat aturan itu mengubah sesuatu di data Anda.
varchar(n), char(n), text
tipe yang sama
Tipe yang sama, dengan panjang yang sama.
numeric(p,s), numeric without a precision, NaN and Infinity
tipe dan nilai yang sama
Tipe yang sama: setiap digit disalin seperti yang ditulis dump.
money
numeric(19,2)
Cara money ditulis bergantung pada lc_monetary server, jadi jumlahnya disimpan sebagai angka tanpa simbol mata uang, dan dimuat apa pun locale target.
Baris laporan: type_replaced
enum types
tipe enum yang sama, dibuat sebelum tabel
Label mempertahankan urutannya.
enum columns holding values outside their labels
text tanpa CHECK
Tipenya akan menolak nilai itu, jadi kolomnya menjadi text dan mempertahankan semuanya.
Baris laporan: enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges
text berisi teks PostgreSQL
Skrip tidak membuat ekstensi maupun tipe komposit, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL; buat tipenya dan ubah kolom setelah pemuatan.
Baris laporan: type_replaced
citext
text, dibandingkan secara persis
Skrip tidak membuat ekstensi citext, jadi kolom ini membandingkan teks secara persis; buat ekstensinya dan kembalikan kolom setelah pemuatan.
Baris laporan: case_insensitive_collation
json, jsonb
tipe yang sama
json mempertahankan teks seperti ditulis; jsonb mempertahankan nilai seperti dinormalkan server.
timestamp with time zone
timestamptz, momen yang sama
Setiap nilai mempertahankan selisih yang ditulis dump, jadi momennya sama di zona waktu mana pun.
time, time with time zone
tipe yang sama
Tipe yang sama, termasuk 24:00:00.
infinity, -infinity and BC dates
dipertahankan
PostgreSQL menyimpannya apa adanya.
NaN and Infinity in numeric, real and double precision
dipertahankan
PostgreSQL menyimpannya apa adanya.
generated columns
kolom generated yang sama
Rumus yang sama, dihitung oleh target.
generated columns with functions IntoSQL doesn't write
kolom biasa berisi nilainya
Rumus yang tidak bisa ditulis IntoSQL menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan.
Baris laporan: generated_not_translated
defaults with functions IntoSQL doesn't write
tanpa default
Default yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan.
Baris laporan: default_not_translated
CHECK constraints with functions IntoSQL doesn't write
tidak dibuat
CHECK yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan.
Baris laporan: check_skipped
CHECK ... NOT VALID
ditambahkan NOT VALID setelah baris
Baris yang sudah ada sebelumnya tidak pernah diperiksa, jadi CHECK ditambahkan setelahnya, tetap tidak valid.
gin, gist, brin and hash indexes, partial and expression indexes
tidak dibuat
IntoSQL menulis indeks b-tree pada kolom; buat ulang indeks lainnya setelah pemuatan.
Baris laporan: index_skipped
foreign keys to tables the dump doesn't create
tidak dibuat
Key tidak bisa merujuk ke tabel yang tidak ada.
Baris laporan: foreign_key_skipped
NOT NULL columns with values that become NULL
NOT NULL dihapus
Kolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.
Baris laporan: not_null_relaxed
partitioned tables
satu tabel dengan baris dari setiap partisi
Barisnya sama; partisi ulang tabel jika diperlukan.
Baris laporan: partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enums
dicantumkan di laporan
IntoSQL mengonversi tabel dan barisnya; sisanya dicantumkan agar Anda buat ulang.
Baris laporan: not_converted_objects
dumps without CREATE TABLE (--data-only)
tipe dibaca dari nilainya
Dump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya.
Baris laporan: no_schema
expressions in INSERT values
NULL
Konverter yang tidak menjalankan database tidak bisa mengevaluasinya.
Baris laporan: expression_value
types IntoSQL doesn't know
text
Teks memuat nilai apa pun; ubah tipenya setelah pemuatan.
Baris laporan: unknown_type
text that isn't valid in its encoding
byte yang rusak menjadi karakter pengganti
Teks PostgreSQL harus berupa UTF-8 yang valid.
Baris laporan: invalid_utf8_replaced
text decoded twice (ñ)
disalin apa adanya
Dump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya.
Baris laporan: mojibake_suspected
| Di file | Di skrip | Baris laporan |
|---|---|---|
| varchar(n), char(n), text | tipe yang samaTipe yang sama, dengan panjang yang sama. | |
| numeric(p,s), numeric without a precision, NaN and Infinity | tipe dan nilai yang samaTipe yang sama: setiap digit disalin seperti yang ditulis dump. | |
| money | numeric(19,2)Cara money ditulis bergantung pada lc_monetary server, jadi jumlahnya disimpan sebagai angka tanpa simbol mata uang, dan dimuat apa pun locale target. | type_replaced |
| enum types | tipe enum yang sama, dibuat sebelum tabelLabel mempertahankan urutannya. | |
| enum columns holding values outside their labels | text tanpa CHECKTipenya akan menolak nilai itu, jadi kolomnya menjadi text dan mempertahankan semuanya. | enum_check_skipped |
| composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multiranges | text berisi teks PostgreSQLSkrip tidak membuat ekstensi maupun tipe komposit, jadi setiap nilai mempertahankan teks yang ditulis PostgreSQL; buat tipenya dan ubah kolom setelah pemuatan. | type_replaced |
| citext | text, dibandingkan secara persisSkrip tidak membuat ekstensi citext, jadi kolom ini membandingkan teks secara persis; buat ekstensinya dan kembalikan kolom setelah pemuatan. | case_insensitive_collation |
| json, jsonb | tipe yang samajson mempertahankan teks seperti ditulis; jsonb mempertahankan nilai seperti dinormalkan server. | |
| timestamp with time zone | timestamptz, momen yang samaSetiap nilai mempertahankan selisih yang ditulis dump, jadi momennya sama di zona waktu mana pun. | |
| time, time with time zone | tipe yang samaTipe yang sama, termasuk 24:00:00. | |
| infinity, -infinity and BC dates | dipertahankanPostgreSQL menyimpannya apa adanya. | |
| NaN and Infinity in numeric, real and double precision | dipertahankanPostgreSQL menyimpannya apa adanya. | |
| generated columns | kolom generated yang samaRumus yang sama, dihitung oleh target. | |
| generated columns with functions IntoSQL doesn't write | kolom biasa berisi nilainyaRumus yang tidak bisa ditulis IntoSQL menyisakan kolom biasa berisi nilai dari dump dan satu baris laporan. | generated_not_translated |
| defaults with functions IntoSQL doesn't write | tanpa defaultDefault yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan. | default_not_translated |
| CHECK constraints with functions IntoSQL doesn't write | tidak dibuatCHECK yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan. | check_skipped |
| CHECK ... NOT VALID | ditambahkan NOT VALID setelah barisBaris yang sudah ada sebelumnya tidak pernah diperiksa, jadi CHECK ditambahkan setelahnya, tetap tidak valid. | |
| gin, gist, brin and hash indexes, partial and expression indexes | tidak dibuatIntoSQL menulis indeks b-tree pada kolom; buat ulang indeks lainnya setelah pemuatan. | index_skipped |
| foreign keys to tables the dump doesn't create | tidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada. | foreign_key_skipped |
| NOT NULL columns with values that become NULL | NOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti. | not_null_relaxed |
| partitioned tables | satu tabel dengan baris dari setiap partisiBarisnya sama; partisi ulang tabel jika diperlukan. | partitions_dropped |
| views, functions, procedures, triggers, rules, policies, extensions and types other than enums | dicantumkan di laporanIntoSQL mengonversi tabel dan barisnya; sisanya dicantumkan agar Anda buat ulang. | not_converted_objects |
| dumps without CREATE TABLE (--data-only) | tipe dibaca dari nilainyaDump yang hanya berisi data hanya punya baris, jadi tipenya berasal dari nilainya. | no_schema |
| expressions in INSERT values | NULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya. | expression_value |
| types IntoSQL doesn't know | textTeks memuat nilai apa pun; ubah tipenya setelah pemuatan. | unknown_type |
| text that isn't valid in its encoding | byte yang rusak menjadi karakter penggantiTeks PostgreSQL harus berupa UTF-8 yang valid. | invalid_utf8_replaced |
| text decoded twice (ñ) | disalin apa adanyaDump berisi persis karakter ini, jadi karakter itu disalin; laporan menunjukkannya. | mojibake_suspected |
Muat skrip ke PostgreSQL
Skrip membuat tabel, menyalin baris, lalu menambahkan kunci, indeks, dan foreign key, jadi pemuatan berjalan cepat dan berhenti di galat pertama.
psql -v ON_ERROR_STOP=1 -d mydb -f postgresql.postgresql.sqlForeign key ditambahkan sebagai NOT VALID lalu divalidasi. Jika sebuah baris merujuk ke baris yang tidak ada, skrip memberi tahu constraint mana, bukan gagal di tengah jalan.
Untuk dump yang besar, buat database terlebih dahulu dan jalankan skrip dengan psql dari mesin yang sama dengan server.
IntoSQL Pro memuat file langsung ke PostgreSQL dari aplikasi desktop atau command line, tanpa menulis skrip.
Buat dump PostgreSQL untuk hasil terbaik
Konverter membaca apa yang ada di dump. Opsi berikut membuat lebih banyak data Anda tetap ada di dalamnya:
- --format=plain, default pg_dump, menulis SQL. Arsip custom atau directory (-Fc, -Fd) menjadi SQL dengan pg_restore -f dump.sql, tanpa server database.
- --no-owner --no-privileges menghilangkan role dan grant, yang memang dilewati konverter, jadi dump lebih kecil.
- pg_dumpall menyimpan setiap database dalam satu file; tabel masing-masing diberi nama sesuai database-nya, jadi tidak ada yang bentrok.
Yang tidak dikonversi
View, trigger, procedure, fungsi, dan objek lain yang ditulis dalam bahasa PostgreSQL sendiri dicantumkan di laporan berdasarkan nama, tidak pernah dibuang diam-diam, jadi Anda bisa memeriksa masing-masing dengan versi PostgreSQL tujuan pemuatan sebelum membuatnya ulang.
Pertanyaan tentang memindahkan PostgreSQL antarversi
Tidak terjawab di sini? Tulis ke kami dari halaman kontak, dan seseorang akan membalas. Halaman kontak
Apakah dump saya diunggah?
Tidak. Konverter berjalan di browser Anda dan membaca dump dari disk Anda sepotong demi sepotong, jadi dump tidak pernah meninggalkan komputer Anda. Aplikasi desktop dan command line juga mengonversi di komputer Anda.
Seberapa besar dump yang bisa dipakai?
Konverter tidak pernah menyimpan seluruh dump di memori: file dibaca dua kali, per rentang, dan skrip ditulis sambil berjalan. Dump berukuran beberapa gigabyte bisa dikonversi di browser, di aplikasi desktop, dan dengan command line.
Apakah arsip pg_dump -Fc bisa dibaca?
Tidak langsung: arsip custom adalah format biner. pg_restore -f dump.sql dump.backup mengubahnya menjadi SQL plain yang dibaca konverter, tanpa terhubung ke server. Konverter memberi tahu saat menerima arsip.
Dump dari versi PostgreSQL mana yang bisa dipakai?
Dump yang ditulis pg_dump dan pg_dumpall dari PostgreSQL 10 ke atas, dengan baris COPY atau INSERT. Setiap dump uji berasal dari PostgreSQL 13 dan 18 dan dibandingkan dengan sumbernya sel demi sel.
Apakah nilai serial dan identity dipertahankan?
Ya. Kolom serial dan identity tetap menjadi kolom identity, setiap baris mempertahankan id-nya, dan setiap penghitung berlanjut dari nilai yang sudah dicapai sequence di dump.
Apa yang terjadi pada array, enum, dan tipe PostgreSQL lainnya?
Tetap apa adanya: array, range, json dan jsonb, string bit, kecuali money. Tipe enum dibuat ulang dengan labelnya. Tipe dari ekstensi (citext, hstore, PostGIS) dan tipe komposit menjadi text, dan laporan menyebutkan kolomnya.
Bagaimana dengan fungsi, trigger, dan view?
Semuanya dicantumkan di laporan berdasarkan nama dan tidak dikonversi, jadi Anda bisa membuatnya ulang setelah tabel masuk. CHECK NOT VALID ditambahkan setelah baris, tetap tidak valid.
Di versi PostgreSQL mana skrip bisa dimuat?
PostgreSQL 13 sampai 18, versi mana pun yang menulis dump. Skrip yang sama dimuat di setiap versi itu, dan berhenti di galat pertama jika ada yang salah.