PostgreSQL のダンプを古いまたは新しい PostgreSQL へ移す
pg_dump または pg_dumpall のプレーンなダンプ (.sql または .sql.gz) をドロップすると、どのバージョンで書かれたダンプでも、PostgreSQL 13 から 18 で読み込めるスクリプトを 1 つダウンロードできます。IDENTITY、列挙型、配列、jsonb はそのまま残り、拡張機能の型はテキストになります。すべての変更はレポートに記載されます。
18 行を変換、修正なし、却下なし
shop_2024_postgres.sql のテーブルPostgreSQL 18.6 のダンプ · pg_dump で作成 · utf8mb4
customers8 行
8 列 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 行
10 列 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
未変換
- ビュー 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 | 同じ型と値同じ型です。すべての桁をダンプが書き出したとおりにコピーします。 | |
| 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 |
スクリプトを 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 です。どのバージョンでも同じスクリプトを読み込め、問題があれば最初のエラーで止まります。