PostgreSQLのデータをMariaDB(MySQL)に移行する方法
あるプログラムのデータは Postgres で動かしていたのだが,他のサーバーからアクセスするとスピード的に問題があることが発覚したので,別のサーバーに移す必要が出てきた.
その際,PostgreSQL をインストールするのが面倒そうだったので,そのサーバーに既に存在している MariaDB(MySQL) に移すことにした.
たいしたテーブルでもないので,ほとんど同じだと思っていたら,少しだけ面倒だったので備忘録がてら書いておく.
Postgres からのデータのダンプ(抜き出し)
特に理由はないが,分かりやすいのでスキーマとデータと分けておく.
まず定義(スキーマ)だけ取り出す.
pg_dump --schema-only --no-owner --no-privileges --disable-dollar-quoting -U ユーザ名 -p ポート番号 -h Postgresデータベースが動作しているサーバー名 Postgresデータベース名 > dump_schema.sql
データを取りだすが --inserts を入れておく.そうすると COPY でなく,INSERT を使ったダンプをしてくれる.
pg_dump --inserts --data-only --no-owner --no-privileges --disable-dollar-quoting -U ユーザ名 -p ポート番号 -h Postgresデータベースが動作しているサーバー名 Postgresデータベース名 > dump_data.sql
ダンプデータの加工
MySQL で読み込めるようにデータを加工する.
スキーマ(データ定義)
- SET 文を削除
- ALTER TABLE ONLY … のONLYを削除
シーケンスを使っている場合はさらに注意が必要だ.
例えば,以下のようなテーブル定義があったとしよう.
CREATE TABLE sample (
inno integer NOT NULL,
sttext text
);
CREATE SEQUENCE sample_inno_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
ALTER SEQUENCE sample_inno_seq OWNED BY sample.inno;
ALTER TABLE ONLY sample ALTER COLUMN inno SET DEFAULT nextval('sample_inno_seq'::regclass);
このまま,MySQL に流し込むとエラーになるので,例えば以下のように変更する.(dump_schema.sql)
CREATE SEQUENCE sample_inno_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
CREATE TABLE sample (
inno int NOT NULL DEFAULT nextval(sample_inno_seq),
sttext text,
);
MySQLへの流し込みは以下のようになる.
mysql -u ユーザー名 -h MariaDBデータベースホスト名 -p -D MariaDBデータベース名 < dump_schema.sql
データ
シーケンスに関する以下のような初期値の行は削除しておく.(dump_data.sql)
SELECT pg_catalog.setval('sample_inno_seq', 現在の値, true);
MySQLへの流し込みは以下のようになる.
mysql -u ユーザー名 -h MariaDBデータベースホスト名 -p -D MariaDBデータベース名 < dump_data.sql
現在の値を初期値として代入しておく.
ALTER SEQUENCE sample_inno_seq RESTART 現在の値;
ごく簡単なテーブルやシーケンスの場合はこのぐらいでデータ移行はなんとかなった.
ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.
※このページと無関係な内容のセールスはご遠慮ください.