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 に接続
DDLをMySQL用に変換する
コピーしたDDLをメモ帳に貼り付けして編集する
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 '年';
↓
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 に接続
外部キー制約により、移行エラーが出る事があります。
その時は、
1. マスタ系テーブルのみ選択して再度データ移行
2. 外部キーのあるデータ系テーブルのみ選択して、再度データ移行
すれば移行できます。
参考URL
- DBeaver
- postgresql
character varying(n), varchar(n) 上限付き可変長
text 制限なし可変長
(省略)
character varyingが長さ指定なしで使われた時は、いかなる長さの文字列でも受け付けます。