Langsung ke konten
Beranda IntoSQL

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.

File Anda
sqlshop_2024_postgres.sqlFile contoh, 6,2 kB
Database Anda

18 baris dikonversi, tanpa perbaikan, tidak ada yang ditolak

Tampilkan

Tabel di shop_2024_postgres.sqlDump PostgreSQL 18.6 · ditulis oleh pg_dump · utf8mb4

  • customers8 baris
    8 kolom
    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 baris
    10 kolom
    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

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 fileDi skripBaris laporan
varchar(n), char(n), texttipe yang samaTipe yang sama, dengan panjang yang sama.
numeric(p,s), numeric without a precision, NaN and Infinitytipe dan nilai yang samaTipe yang sama: setiap digit disalin seperti yang ditulis dump.
moneynumeric(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 typestipe enum yang sama, dibuat sebelum tabelLabel mempertahankan urutannya.
enum columns holding values outside their labelstext 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 multirangestext 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
citexttext, 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, jsonbtipe yang samajson mempertahankan teks seperti ditulis; jsonb mempertahankan nilai seperti dinormalkan server.
timestamp with time zonetimestamptz, momen yang samaSetiap nilai mempertahankan selisih yang ditulis dump, jadi momennya sama di zona waktu mana pun.
time, time with time zonetipe yang samaTipe yang sama, termasuk 24:00:00.
infinity, -infinity and BC datesdipertahankanPostgreSQL menyimpannya apa adanya.
NaN and Infinity in numeric, real and double precisiondipertahankanPostgreSQL menyimpannya apa adanya.
generated columnskolom generated yang samaRumus yang sama, dihitung oleh target.
generated columns with functions IntoSQL doesn't writekolom 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 writetanpa defaultDefault yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan.default_not_translated
CHECK constraints with functions IntoSQL doesn't writetidak dibuatCHECK yang tidak bisa ditulis IntoSQL dihilangkan dan dilaporkan.check_skipped
CHECK ... NOT VALIDditambahkan 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 indexestidak dibuatIntoSQL menulis indeks b-tree pada kolom; buat ulang indeks lainnya setelah pemuatan.index_skipped
foreign keys to tables the dump doesn't createtidak dibuatKey tidak bisa merujuk ke tabel yang tidak ada.foreign_key_skipped
NOT NULL columns with values that become NULLNOT NULL dihapusKolom yang nilainya harus menjadi NULL tidak bisa mempertahankan NOT NULL, atau pemuatan akan berhenti.not_null_relaxed
partitioned tablessatu 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 enumsdicantumkan 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 valuesNULLKonverter yang tidak menjalankan database tidak bisa mengevaluasinya.expression_value
types IntoSQL doesn't knowtextTeks memuat nilai apa pun; ubah tipenya setelah pemuatan.unknown_type
text that isn't valid in its encodingbyte 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.sql

Foreign 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.