Chuyển đến nội dung
Trang chủ IntoSQL

Chuyển bản dump PostgreSQL sang PostgreSQL cũ hơn hoặc mới hơn

Thả bản dump thuần từ pg_dump hoặc pg_dumpall, dạng .sql hoặc .sql.gz, và tải xuống một tập lệnh nạp được trên PostgreSQL 13 đến 18, dù phiên bản nào viết bản dump. Identity, enum, mảng và jsonb giữ nguyên, kiểu do extension mang lại thành text, và mọi thay đổi được liệt kê trong báo cáo.

Tệp của bạn
sqlshop_2024_postgres.sqlTệp mẫu, 6,2 kB
Cơ sở dữ liệu của bạn

Đã chuyển đổi 18 hàng, không có bản sửa, không hàng nào bị từ chối

Hiển thị

Các bảng trong shop_2024_postgres.sqlBản dump PostgreSQL 18.6 · do pg_dump ghi · utf8mb4

  • customers8 hàng
    8 cột
    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 hàng
    10 cột
    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

Không được chuyển đổi

  • Khung nhìn paid_orders

Mỗi cơ sở dữ liệu viết các đối tượng này bằng ngôn ngữ riêng. Hãy viết lại chúng cho 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);

Bản sửa

Không có gì cần sửa.

Cần xem lại

  • 1 khung nhìn, trình kích hoạt, thủ tục hoặc sự kiện không được chuyển đổi; báo cáo liệt kê từng mục. Hãy tạo lại chúng thủ công trong PostgreSQL.
  • Chỉ mục idx_orders_details trên orders dùng một biểu thức không viết được cho PostgreSQL (a gin index), nên không được tạo. Hãy tạo chỉ mục thủ công nếu truy vấn cần nó.

Tệp được chuyển đổi ngay trên máy tính này và không bao giờ được tải lên.

Mẫu khác:

Những gì thay đổi giữa tệp và tập lệnh

Mỗi hàng là một quy tắc trình chuyển đổi áp dụng, kèm dòng báo cáo được ghi khi quy tắc thay đổi dữ liệu của bạn.

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

    cùng các kiểu

    Cùng các kiểu, với cùng độ dài.

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

    cùng các kiểu và giá trị

    Cùng kiểu: mọi chữ số được sao chép đúng như bản dump đã ghi.

  • money

    numeric(19,2)

    Cách ghi tiền tệ phụ thuộc vào lc_monetary của máy chủ, nên số tiền được giữ dạng số không kèm ký hiệu tiền tệ, và nạp được với mọi locale của đích.

    Dòng báo cáo: type_replaced

  • enum types

    cùng các enum type, được tạo trước các bảng

    Các nhãn giữ thứ tự của chúng.

  • enum columns holding values outside their labels

    text không có ràng buộc kiểm tra

    Kiểu sẽ từ chối các giá trị đó, nên cột là text và giữ tất cả chúng.

    Dòng báo cáo: enum_check_skipped

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

    text với văn bản của PostgreSQL

    Tập lệnh không tạo tiện ích mở rộng hay kiểu composite, nên mỗi giá trị giữ văn bản PostgreSQL đã ghi; hãy tạo kiểu và sửa cột sau khi nạp.

    Dòng báo cáo: type_replaced

  • citext

    text, so sánh chính xác

    Tập lệnh không tạo tiện ích mở rộng citext, nên các cột này so sánh văn bản chính xác; hãy tạo nó và đổi lại các cột sau khi nạp.

    Dòng báo cáo: case_insensitive_collation

  • json, jsonb

    cùng các kiểu

    json giữ văn bản như đã ghi; jsonb giữ giá trị như máy chủ đã chuẩn hóa.

  • timestamp with time zone

    timestamptz, cùng các thời điểm

    Mỗi giá trị giữ độ lệch bản dump đã ghi, nên thời điểm giống nhau ở mọi múi giờ.

  • time, time with time zone

    cùng các kiểu

    Cùng các kiểu, kể cả 24:00:00.

  • infinity, -infinity and BC dates

    được giữ

    PostgreSQL chứa chúng nguyên trạng.

  • NaN and Infinity in numeric, real and double precision

    được giữ

    PostgreSQL chứa chúng nguyên trạng.

  • generated columns

    cùng các cột tính toán

    Cùng công thức, do đích tính.

  • generated columns with functions IntoSQL doesn't write

    một cột thường với các giá trị

    Công thức IntoSQL không viết được để lại một cột thường với giá trị của bản dump và một dòng trong báo cáo.

    Dòng báo cáo: generated_not_translated

  • defaults with functions IntoSQL doesn't write

    không có giá trị mặc định

    Giá trị mặc định IntoSQL không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: default_not_translated

  • CHECK constraints with functions IntoSQL doesn't write

    không được tạo

    Ràng buộc kiểm tra IntoSQL không viết được sẽ bị bỏ và được báo cáo.

    Dòng báo cáo: check_skipped

  • CHECK ... NOT VALID

    thêm NOT VALID sau các hàng

    Các hàng có từ trước chưa bao giờ được kiểm tra, nên ràng buộc được thêm sau chúng, vẫn ở trạng thái chưa hợp lệ.

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

    không được tạo

    IntoSQL ghi chỉ mục b-tree trên cột; hãy tạo lại các chỉ mục khác sau khi nạp.

    Dòng báo cáo: index_skipped

  • foreign keys to tables the dump doesn't create

    không được tạo

    Khóa không thể tham chiếu tới bảng không tồn tại.

    Dòng báo cáo: foreign_key_skipped

  • NOT NULL columns with values that become NULL

    bỏ NOT NULL

    Cột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.

    Dòng báo cáo: not_null_relaxed

  • partitioned tables

    một bảng chứa các hàng của mọi phân vùng

    Các hàng giữ nguyên; hãy phân vùng lại bảng nếu cần.

    Dòng báo cáo: partitions_dropped

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

    được liệt kê trong báo cáo

    IntoSQL chuyển đổi bảng và các hàng của chúng; phần còn lại được liệt kê để bạn tạo lại.

    Dòng báo cáo: not_converted_objects

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

    kiểu suy ra từ giá trị

    Bản dump chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.

    Dòng báo cáo: no_schema

  • expressions in INSERT values

    NULL

    Trình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.

    Dòng báo cáo: expression_value

  • types IntoSQL doesn't know

    text

    Văn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.

    Dòng báo cáo: unknown_type

  • text that isn't valid in its encoding

    byte lỗi thành ký tự thay thế

    Văn bản PostgreSQL phải là UTF-8 hợp lệ.

    Dòng báo cáo: invalid_utf8_replaced

  • text decoded twice (ñ)

    sao chép nguyên trạng

    Bản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.

    Dòng báo cáo: mojibake_suspected

Trong tệpTrong tập lệnhDòng báo cáo
varchar(n), char(n), textcùng các kiểuCùng các kiểu, với cùng độ dài.
numeric(p,s), numeric without a precision, NaN and Infinitycùng các kiểu và giá trịCùng kiểu: mọi chữ số được sao chép đúng như bản dump đã ghi.
moneynumeric(19,2)Cách ghi tiền tệ phụ thuộc vào lc_monetary của máy chủ, nên số tiền được giữ dạng số không kèm ký hiệu tiền tệ, và nạp được với mọi locale của đích.type_replaced
enum typescùng các enum type, được tạo trước các bảngCác nhãn giữ thứ tự của chúng.
enum columns holding values outside their labelstext không có ràng buộc kiểm traKiểu sẽ từ chối các giá trị đó, nên cột là text và giữ tất cả chúng.enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multirangestext với văn bản của PostgreSQLTập lệnh không tạo tiện ích mở rộng hay kiểu composite, nên mỗi giá trị giữ văn bản PostgreSQL đã ghi; hãy tạo kiểu và sửa cột sau khi nạp.type_replaced
citexttext, so sánh chính xácTập lệnh không tạo tiện ích mở rộng citext, nên các cột này so sánh văn bản chính xác; hãy tạo nó và đổi lại các cột sau khi nạp.case_insensitive_collation
json, jsonbcùng các kiểujson giữ văn bản như đã ghi; jsonb giữ giá trị như máy chủ đã chuẩn hóa.
timestamp with time zonetimestamptz, cùng các thời điểmMỗi giá trị giữ độ lệch bản dump đã ghi, nên thời điểm giống nhau ở mọi múi giờ.
time, time with time zonecùng các kiểuCùng các kiểu, kể cả 24:00:00.
infinity, -infinity and BC datesđược giữPostgreSQL chứa chúng nguyên trạng.
NaN and Infinity in numeric, real and double precisionđược giữPostgreSQL chứa chúng nguyên trạng.
generated columnscùng các cột tính toánCùng công thức, do đích tính.
generated columns with functions IntoSQL doesn't writemột cột thường với các giá trịCông thức IntoSQL không viết được để lại một cột thường với giá trị của bản dump và một dòng trong báo cáo.generated_not_translated
defaults with functions IntoSQL doesn't writekhông có giá trị mặc địnhGiá trị mặc định IntoSQL không viết được sẽ bị bỏ và được báo cáo.default_not_translated
CHECK constraints with functions IntoSQL doesn't writekhông được tạoRàng buộc kiểm tra IntoSQL không viết được sẽ bị bỏ và được báo cáo.check_skipped
CHECK ... NOT VALIDthêm NOT VALID sau các hàngCác hàng có từ trước chưa bao giờ được kiểm tra, nên ràng buộc được thêm sau chúng, vẫn ở trạng thái chưa hợp lệ.
gin, gist, brin and hash indexes, partial and expression indexeskhông được tạoIntoSQL ghi chỉ mục b-tree trên cột; hãy tạo lại các chỉ mục khác sau khi nạp.index_skipped
foreign keys to tables the dump doesn't createkhông được tạoKhóa không thể tham chiếu tới bảng không tồn tại.foreign_key_skipped
NOT NULL columns with values that become NULLbỏ NOT NULLCột có giá trị phải chuyển thành NULL không thể giữ NOT NULL, nếu không quá trình nạp sẽ dừng.not_null_relaxed
partitioned tablesmột bảng chứa các hàng của mọi phân vùngCác hàng giữ nguyên; hãy phân vùng lại bảng nếu cần.partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enumsđược liệt kê trong báo cáoIntoSQL chuyển đổi bảng và các hàng của chúng; phần còn lại được liệt kê để bạn tạo lại.not_converted_objects
dumps without CREATE TABLE (--data-only)kiểu suy ra từ giá trịBản dump chỉ có dữ liệu thì chỉ có các hàng, nên kiểu được suy ra từ giá trị.no_schema
expressions in INSERT valuesNULLTrình chuyển đổi không chạy cơ sở dữ liệu thì không tính được chúng.expression_value
types IntoSQL doesn't knowtextVăn bản chứa được mọi giá trị; hãy đổi kiểu sau khi nạp.unknown_type
text that isn't valid in its encodingbyte lỗi thành ký tự thay thếVăn bản PostgreSQL phải là UTF-8 hợp lệ.invalid_utf8_replaced
text decoded twice (ñ)sao chép nguyên trạngBản dump chứa đúng các ký tự này, nên chúng được sao chép; báo cáo chỉ ra chúng.mojibake_suspected

Nạp tập lệnh vào PostgreSQL

Tập lệnh tạo bảng, sao chép các hàng, rồi thêm khóa, chỉ mục và khóa ngoại, nên nạp nhanh và dừng ở lỗi đầu tiên.

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

Khóa ngoại được thêm dưới dạng NOT VALID rồi được xác thực. Nếu một hàng trỏ tới hàng không tồn tại, tập lệnh cho bạn biết ràng buộc nào, thay vì thất bại giữa chừng.

Với bản dump lớn, hãy tạo cơ sở dữ liệu trước và chạy tập lệnh bằng psql trên cùng máy với máy chủ.

IntoSQL Pro nạp tệp thẳng vào PostgreSQL từ ứng dụng máy tính hoặc dòng lệnh, không cần tạo tập lệnh.

Tạo bản dump PostgreSQL để có kết quả tốt nhất

Trình chuyển đổi đọc những gì bản dump chứa. Các tùy chọn sau giữ lại nhiều dữ liệu hơn trong đó:

  • --format=plain, mặc định của pg_dump, ghi ra SQL. Kho lưu trữ custom hoặc directory (-Fc, -Fd) thành SQL bằng pg_restore -f dump.sql, không cần máy chủ cơ sở dữ liệu.
  • --no-owner --no-privileges bỏ vai trò và quyền, những thứ trình chuyển đổi vốn bỏ qua, nên bản dump nhỏ hơn.
  • pg_dumpall dump mọi cơ sở dữ liệu vào một tệp; bảng của mỗi cơ sở dữ liệu có tên của nó ở đầu, nên không có gì trùng.

Những gì không được chuyển đổi

View, trigger, thủ tục, hàm và các đối tượng khác viết bằng ngôn ngữ riêng của PostgreSQL được liệt kê theo tên trong báo cáo, không bao giờ bị bỏ âm thầm, để bạn kiểm tra từng cái với phiên bản PostgreSQL bạn nạp vào trước khi tạo lại.

Câu hỏi về chuyển PostgreSQL giữa các phiên bản

Chưa có câu trả lời ở đây? Hãy viết cho chúng tôi từ trang liên hệ, sẽ có người trả lời. Trang liên hệ

Bản dump của tôi có bị tải lên không?

Không. Trình chuyển đổi chạy trong trình duyệt và đọc bản dump từ ổ đĩa theo từng phần, nên nó không bao giờ rời khỏi máy tính của bạn. Ứng dụng máy tính và dòng lệnh cũng chuyển đổi ngay trên máy tính của bạn.

Bản dump có thể lớn đến đâu?

Trình chuyển đổi không bao giờ giữ toàn bộ bản dump trong bộ nhớ: nó đọc tệp hai lần, theo từng đoạn, và ghi tập lệnh trong lúc đọc. Bản dump nhiều gigabyte vẫn chuyển đổi được trong trình duyệt, trong ứng dụng máy tính và bằng dòng lệnh.

Nó có đọc được kho lưu trữ pg_dump -Fc không?

Không trực tiếp: kho lưu trữ custom là định dạng nhị phân. pg_restore -f dump.sql dump.backup chuyển nó thành SQL dạng plain mà trình chuyển đổi đọc được, không cần kết nối máy chủ. Trình chuyển đổi sẽ báo khi nhận một kho lưu trữ.

Bản dump có thể đến từ những phiên bản PostgreSQL nào?

Bản dump do pg_dump và pg_dumpall ghi từ PostgreSQL 10 trở lên, với các hàng COPY hoặc INSERT. Mọi bản dump thử nghiệm đến từ PostgreSQL 13 và 18 và được so với nguồn từng ô một.

Giá trị serial và identity có được giữ không?

Có. Cột serial và identity vẫn là cột identity, mọi hàng giữ id của nó, và mỗi bộ đếm tiếp tục từ giá trị mà sequence của bản dump đã đạt tới.

Mảng, enum và các kiểu PostgreSQL khác sẽ ra sao?

Chúng giữ nguyên: mảng, range, json và jsonb, chuỗi bit, trừ money. Enum type được tạo lại với các nhãn. Kiểu do tiện ích mở rộng mang lại (citext, hstore, PostGIS) và kiểu composite thành text, và báo cáo cho biết những cột nào.

Còn hàm, trình kích hoạt và khung nhìn thì sao?

Chúng được liệt kê theo tên trong báo cáo và không được chuyển đổi, để bạn tạo lại sau khi có các bảng. Ràng buộc kiểm tra NOT VALID được thêm sau các hàng, vẫn chưa hợp lệ.

Tập lệnh nạp được trên những phiên bản PostgreSQL nào?

PostgreSQL 13 đến 18, bất kể phiên bản nào đã ghi bản dump. Cùng một tập lệnh nạp được trên từng phiên bản, và dừng ở lỗi đầu tiên nếu có sự cố.