DBeaverを使ってPostgreSQLからMySQLにDB移行するver.2


mysqlworkbanchを使った方法や、PostgreSQLのdumpファイルを手修正してmysqlにインポートする方法などがあるようですが、上手くいかなかったため、最終的にDBeaverを使ってDB移行する事ができました。

日本語情報にうまくたどりつかなかったので、ざっくりですが記事化しました。

また以前の方法(dbeaverでデータ移行&mysqlにテーブル自動作成)では、インデックスやカラムコメントが移行できてなかったので、手順見直しました。

環境

  • local環境 mariadb(mysql) xampp, PostgreSQL
  • dbeaverでDB移行

前提

  • windows
    • xamppインストール済み
    • PostgreSQLインストール済み
    • dbeaverインストール済み
      • dbeaverからxamppのmariadb, localのPostgreSQLに接続済み

※ おそらくdbeaverから接続できれば、PostgreSQLはlocalでも外部サーバでも移行できると思います。

手順

PostgreSQLへインポート

windows(SQL Shell (psql))の場合

\i 'C:\\path_to_folder\\dumpfile.dump'

Linuxの場合

# su - postgres

// インポート
-bash-4.2$ psql < dumpfile.dump

dbeaverでDB移行

PostgreSQL のDBテーブルのDDLを取得

  • dbeaverでpostgress に接続
    • 対象テーブルを全選択>右クリック>Generate SQL>DDL を選択
      • 下部のSettingの■ Use fully qualified names ■ Compact SQL ■ Show commentsをチェックONして「Copy」ボタン押下
      • ※ 実際はSQL PreviewにDDL文が表示されます。

DDLをMySQL用に変換する

コピーしたDDLをメモ帳に貼り付けして編集する

PostgreSQL
CREATE TABLE public.table_name (
    colum_id1 varchar NOT NULL, -- カラム1
    colum_id2 varchar NULL, -- カラム2
    age int4 NULL, -- 年
    CONSTRAINT table_name_key PRIMARY KEY (colum_id1)
);
COMMENT ON TABLE public.table_name IS 'テーブル名';

-- Column comments

COMMENT ON COLUMN public.t_person.colum_id1 IS 'カラム1';
COMMENT ON COLUMN public.t_person.colum_id2 IS 'カラム2';
COMMENT ON COLUMN public.t_person.age IS '年';

MySQL
CREATE TABLE mysql_dbname.table_name (
    colum_id1 varchar(255) NOT NULL COMMENT 'カラム1',
    colum_id2 varchar(255) NULL COMMENT 'カラム2',
    age int4 NULL COMMENT '年',
    CONSTRAINT table_name_key PRIMARY KEY (colum_id1)
) COMMENT 'テーブル名';
  • varchar ⇒ varchar(255) に置換
    • ポスグレはvarchar引数なしで1GBまで可。mysqlは64KBまでで引数なしダメ。DBの中身みてたいして文字列なかったため、255文字までで設定
  • テーブルコメントは、CREATE文末尾に) COMMENT 'テーブル名';に記述
  • カラムコメントは、カラム末尾に移動(テキストエディタの置換を使うと早い)
    • , --COMMENT 'に置換
    • \r\n正規表現ON ⇒',にして必要なところを置換
  • COMMENT ON TABLE COMMENT ON COLUMNは削除
  • public.mysql_dbname.(移行先のMySQLのDB名)に置換

このCREATE文をMysqlに流すと、テーブル構造、インデックス、外部インデックス、コメントが移行できます。

データをMySQL用に移行する

  • dbeaverでpostgress に接続
    • 対象テーブルを全選択>右クリック>Export Data
      • Databaseを選択>Nextボタン押下
      • 右上フォルダボタン押下
        • 移行先のスキーマ選択
      • Mapping列がexistingになっている事を確認して「Next」ボタン押下
      • 変更せず「Next」ボタン押下
      • 「Start」ボタン押下 でデータ移行始まる

外部キー制約により、移行エラーが出る事があります。
その時は、
 1. マスタ系テーブルのみ選択して再度データ移行
 2. 外部キーのあるデータ系テーブルのみ選択して、再度データ移行
すれば移行できます。

参考URL

postgresql 文字型

character varying(n), varchar(n) 上限付き可変長
text 制限なし可変長
(省略)
character varyingが長さ指定なしで使われた時は、いかなる長さの文字列でも受け付けます。

MySQLとPostgresのデータ型対応表 - Qiita