本文へスキップ
IntoSQL ホーム

PostgreSQL のダンプを古いまたは新しい PostgreSQL へ移す

pg_dump または pg_dumpall のプレーンなダンプ (.sql または .sql.gz) をドロップすると、どのバージョンで書かれたダンプでも、PostgreSQL 13 から 18 で読み込めるスクリプトを 1 つダウンロードできます。IDENTITY、列挙型、配列、jsonb はそのまま残り、拡張機能の型はテキストになります。すべての変更はレポートに記載されます。

ファイル
sqlshop_2024_postgres.sqlサンプルファイル、6.2 KB
データベース

18 行を変換、修正なし、却下なし

表示

shop_2024_postgres.sql のテーブルPostgreSQL 18.6 のダンプ · pg_dump で作成 · utf8mb4

  • customers8 行
    8 列
    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 行
    10 列
    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

未変換

  • ビュー paid_orders

これらはデータベースごとに独自の言語で書かれます。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);

修正

修正が必要な箇所はありませんでした。

確認が必要

  • 1 件のビュー、トリガー、ルーチン、イベントは変換されません。レポートにそれぞれ記載しています。 PostgreSQL で手動で作り直してください。
  • orders のインデックス idx_orders_details は PostgreSQL 用に書き換えられない式を使っているため (a gin index)、作成しません。 クエリに必要なら、手動でインデックスを作成してください。

ファイルはこのコンピューター上で変換され、アップロードされることはありません。

その他のサンプル:

ファイルとスクリプトで変わること

各行はコンバーターが適用するルールです。ルールによってデータが変わったときにレポートに書かれる行も示します。

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

    同じ型

    同じ型、同じ長さです。

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

    同じ型と値

    同じ型です。すべての桁をダンプが書き出したとおりにコピーします。

  • money

    numeric(19,2)

    money の書式はサーバーの lc_monetary で変わるため、金額は通貨記号なしの数値として保ち、ターゲットのロケールにかかわらず読み込めます。

    レポートの行: type_replaced

  • enum types

    同じ enum 型、テーブルより前に作成

    ラベルは順序を保ちます。

  • enum columns holding values outside their labels

    チェックなしの text

    型ではそれらの値が拒否されるため、列は text にしてすべての値を保ちます。

    レポートの行: enum_check_skipped

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

    PostgreSQL のテキストを持つ text

    スクリプトは拡張機能も複合型も作成しないため、各値は PostgreSQL が書き出したテキストを保ちます。読み込み後に型を作成し、列を変更してください。

    レポートの行: type_replaced

  • citext

    厳密に比較する text

    スクリプトは citext 拡張機能を作成しないため、これらの列はテキストを厳密に比較します。読み込み後に拡張機能を作成し、列を元に戻してください。

    レポートの行: case_insensitive_collation

  • json, jsonb

    同じ型

    json は書かれたとおりのテキストを保ち、jsonb はサーバーが正規化した値を保ちます。

  • timestamp with time zone

    timestamptz、同じ時点

    各値はダンプが書き出したオフセットを保つため、どのタイムゾーンでも同じ時点です。

  • time, time with time zone

    同じ型

    24:00:00 を含め、同じ型です。

  • infinity, -infinity and BC dates

    保持

    PostgreSQL はそのまま保持します。

  • NaN and Infinity in numeric, real and double precision

    保持

    PostgreSQL はそのまま保持します。

  • generated columns

    同じ生成列

    同じ式を、ターゲットが計算します。

  • generated columns with functions IntoSQL doesn't write

    値を持つ普通の列

    IntoSQL が書けない式は、ダンプの値を持つ普通の列とレポートの 1 行になります。

    レポートの行: generated_not_translated

  • defaults with functions IntoSQL doesn't write

    デフォルト値なし

    IntoSQL が書けないデフォルト値は含めず、レポートに記載します。

    レポートの行: default_not_translated

  • CHECK constraints with functions IntoSQL doesn't write

    作成しない

    IntoSQL が書けないチェックは含めず、レポートに記載します。

    レポートの行: check_skipped

  • CHECK ... NOT VALID

    行の後に NOT VALID で追加

    既存の行はチェックされていないため、チェックは行の後に、未検証のまま追加します。

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

    作成しない

    IntoSQL が書き出すのは列に対する b-tree インデックスです。その他は読み込み後に作り直してください。

    レポートの行: index_skipped

  • foreign keys to tables the dump doesn't create

    作成しない

    キーは存在しないテーブルを参照できません。

    レポートの行: foreign_key_skipped

  • NOT NULL columns with values that become NULL

    NOT NULL を削除

    値を NULL にする必要があった列は、NOT NULL を保てません。保つと読み込みが止まります。

    レポートの行: not_null_relaxed

  • partitioned tables

    すべてのパーティションの行を持つ 1 つのテーブル

    行は同じです。必要ならテーブルをもう一度パーティション分割してください。

    レポートの行: partitions_dropped

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

    レポートに記載

    IntoSQL が変換するのはテーブルとその行です。それ以外は作り直せるよう一覧にします。

    レポートの行: not_converted_objects

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

    値から読み取った型

    データのみのダンプには行しかないため、型は値から決まります。

    レポートの行: no_schema

  • expressions in INSERT values

    NULL

    データベースを実行しないコンバーターでは、これらを評価できません。

    レポートの行: expression_value

  • types IntoSQL doesn't know

    text

    テキストはどんな値も保持できます。読み込み後に型を変更してください。

    レポートの行: unknown_type

  • text that isn't valid in its encoding

    不正なバイトを置換文字に

    PostgreSQL のテキストは有効な UTF-8 である必要があります。

    レポートの行: invalid_utf8_replaced

  • text decoded twice (ñ)

    そのままコピー

    ダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。

    レポートの行: mojibake_suspected

ファイルではスクリプトではレポートの行
varchar(n), char(n), text同じ型同じ型、同じ長さです。
numeric(p,s), numeric without a precision, NaN and Infinity同じ型と値同じ型です。すべての桁をダンプが書き出したとおりにコピーします。
moneynumeric(19,2)money の書式はサーバーの lc_monetary で変わるため、金額は通貨記号なしの数値として保ち、ターゲットのロケールにかかわらず読み込めます。type_replaced
enum types同じ enum 型、テーブルより前に作成ラベルは順序を保ちます。
enum columns holding values outside their labelsチェックなしの text型ではそれらの値が拒否されるため、列は text にしてすべての値を保ちます。enum_check_skipped
composite and range types the dump defines, extension types (citext, hstore, ltree, PostGIS) and multirangesPostgreSQL のテキストを持つ textスクリプトは拡張機能も複合型も作成しないため、各値は PostgreSQL が書き出したテキストを保ちます。読み込み後に型を作成し、列を変更してください。type_replaced
citext厳密に比較する textスクリプトは citext 拡張機能を作成しないため、これらの列はテキストを厳密に比較します。読み込み後に拡張機能を作成し、列を元に戻してください。case_insensitive_collation
json, jsonb同じ型json は書かれたとおりのテキストを保ち、jsonb はサーバーが正規化した値を保ちます。
timestamp with time zonetimestamptz、同じ時点各値はダンプが書き出したオフセットを保つため、どのタイムゾーンでも同じ時点です。
time, time with time zone同じ型24:00:00 を含め、同じ型です。
infinity, -infinity and BC dates保持PostgreSQL はそのまま保持します。
NaN and Infinity in numeric, real and double precision保持PostgreSQL はそのまま保持します。
generated columns同じ生成列同じ式を、ターゲットが計算します。
generated columns with functions IntoSQL doesn't write値を持つ普通の列IntoSQL が書けない式は、ダンプの値を持つ普通の列とレポートの 1 行になります。generated_not_translated
defaults with functions IntoSQL doesn't writeデフォルト値なしIntoSQL が書けないデフォルト値は含めず、レポートに記載します。default_not_translated
CHECK constraints with functions IntoSQL doesn't write作成しないIntoSQL が書けないチェックは含めず、レポートに記載します。check_skipped
CHECK ... NOT VALID行の後に NOT VALID で追加既存の行はチェックされていないため、チェックは行の後に、未検証のまま追加します。
gin, gist, brin and hash indexes, partial and expression indexes作成しないIntoSQL が書き出すのは列に対する b-tree インデックスです。その他は読み込み後に作り直してください。index_skipped
foreign keys to tables the dump doesn't create作成しないキーは存在しないテーブルを参照できません。foreign_key_skipped
NOT NULL columns with values that become NULLNOT NULL を削除値を NULL にする必要があった列は、NOT NULL を保てません。保つと読み込みが止まります。not_null_relaxed
partitioned tablesすべてのパーティションの行を持つ 1 つのテーブル行は同じです。必要ならテーブルをもう一度パーティション分割してください。partitions_dropped
views, functions, procedures, triggers, rules, policies, extensions and types other than enumsレポートに記載IntoSQL が変換するのはテーブルとその行です。それ以外は作り直せるよう一覧にします。not_converted_objects
dumps without CREATE TABLE (--data-only)値から読み取った型データのみのダンプには行しかないため、型は値から決まります。no_schema
expressions in INSERT valuesNULLデータベースを実行しないコンバーターでは、これらを評価できません。expression_value
types IntoSQL doesn't knowtextテキストはどんな値も保持できます。読み込み後に型を変更してください。unknown_type
text that isn't valid in its encoding不正なバイトを置換文字にPostgreSQL のテキストは有効な UTF-8 である必要があります。invalid_utf8_replaced
text decoded twice (ñ)そのままコピーダンプにはまさにこの文字が含まれているため、そのままコピーし、レポートで指摘します。mojibake_suspected

スクリプトを PostgreSQL に読み込む

スクリプトはテーブルを作成して行をコピーしてから、キー、インデックス、外部キーを追加します。そのため読み込みが速く、最初のエラーで止まります。

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

外部キーは NOT VALID で追加してから検証します。存在しない行を参照している行があれば、途中で失敗する代わりに、どの制約かをスクリプトが示します。

大きなダンプでは、先にデータベースを作成し、サーバーと同じマシンから psql でスクリプトを実行してください。

IntoSQL Pro なら、デスクトップアプリやコマンドラインからファイルを PostgreSQL に直接読み込めます。スクリプトを書き出す必要はありません。

PostgreSQL を最適な方法でダンプする

コンバーターはダンプの内容を読み取ります。次のオプションを使うと、より多くのデータがダンプに残ります。

  • pg_dump のデフォルトである --format=plain は SQL を書き出します。custom または directory 形式のアーカイブ (-Fc, -Fd) は、pg_restore -f dump.sql でデータベースサーバーなしに SQL にできます。
  • --no-owner --no-privileges を使うと、コンバーターがどのみちスキップするロールと権限付与が除かれ、ダンプが小さくなります。
  • pg_dumpall はすべてのデータベースを 1 つのファイルにダンプします。各テーブルにはデータベース名を付けるため、名前は衝突しません。

変換されないもの

ビュー、トリガー、プロシージャ、関数など PostgreSQL 独自の言語で書かれたオブジェクトは、黙って削除されることなくレポートに名前で記載されます。読み込む先の PostgreSQL のバージョンで確認してから作り直せます。

PostgreSQL のバージョン間の移行に関する質問

ここに答えがない場合は、お問い合わせページからご連絡ください。担当者が返信します。 お問い合わせページ

ダンプはアップロードされますか?

いいえ。コンバーターはブラウザ上で動作し、ダンプをディスクから少しずつ読み込むため、ダンプがコンピューターの外に出ることはありません。デスクトップアプリとコマンドラインも、お使いのコンピューター上で変換します。

ダンプはどのくらいの大きさまで扱えますか?

コンバーターはダンプ全体をメモリに保持しません。ファイルを範囲ごとに 2 回読み、読みながらスクリプトを書き出します。数 GB のダンプも、ブラウザ、デスクトップアプリ、コマンドラインで変換できます。

pg_dump -Fc のアーカイブを読めますか?

直接は読めません。custom 形式のアーカイブはバイナリ形式です。pg_restore -f dump.sql dump.backup を使えば、サーバーに接続せずにコンバーターが読めるプレーンな SQL にできます。アーカイブを受け取るとコンバーターがその旨を表示します。

どの PostgreSQL バージョンのダンプに対応していますか?

PostgreSQL 10 以降の pg_dump と pg_dumpall で作成した、COPY または INSERT の行を含むダンプです。すべてのテスト用ダンプは PostgreSQL 13 と 18 で作成し、ソースとセル単位で比較しています。

serial と identity の値は保持されますか?

はい。serial と identity の列は IDENTITY 列のままで、すべての行が ID を保ち、各カウンターはダンプのシーケンスが到達していた値から続きます。

配列、enum など PostgreSQL の型はどうなりますか?

money を除き、配列、範囲型、json と jsonb、ビット列はそのままです。enum 型はラベルごと作り直します。拡張機能の型 (citext, hstore, PostGIS) と複合型は text になり、対象の列はレポートに記載されます。

関数、トリガー、ビューはどうなりますか?

変換はせず、レポートに名前で一覧するので、テーブルを読み込んだ後に作り直せます。NOT VALID のチェックは行の後に、未検証のまま追加します。

スクリプトはどの PostgreSQL バージョンで読み込めますか?

ダンプを書き出したバージョンにかかわらず、PostgreSQL 13 から 18 です。どのバージョンでも同じスクリプトを読み込め、問題があれば最初のエラーで止まります。