PostgreSQLのデータをMariaDB(MySQL)に移行する方法

最終更新日: 公開日: 2022年04月

あるプログラムのデータは 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 現在の値;

ごく簡単なテーブルやシーケンスの場合はこのぐらいでデータ移行はなんとかなった.

 

Contact

ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.
※このページと無関係な内容のセールスはご遠慮ください.

 
   
contact
Pagetop