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　を選択
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/7f7631bb-d96f-34fc-c2cb-1479f82ca439.png)
        * 下部のSettingの`■ Use fully qualified names` `■ Compact SQL` `■ Show comments`をチェックONして「Copy」ボタン押下
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/86b30cdb-3d82-9b82-1277-6e6e01f3d81a.png)
        * ※ 実際はSQL PreviewにDDL文が表示されます。

#### DDLをMySQL用に変換する

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

```sql:PostgreSQL
CREATE TABLE public.table_name (
	colum_id1 varchar NOT NULL, -- カラム１
	colum_id2 varchar NULL, -- カラム２
	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 'カラム１';
COMMENT ON COLUMN public.t_person.colum_id2 IS 'カラム２';
COMMENT ON COLUMN public.t_person.age IS '年';
```

↓

```sql:MySQL
CREATE TABLE mysql_dbname.table_name (
	colum_id1 varchar(255) NOT NULL COMMENT 'カラム１',
	colum_id2 varchar(255) NULL COMMENT 'カラム２',
	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
    * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/92f3783f-cec4-663e-0bef-6c45b8c247d6.png)
        * Databaseを選択＞Nextボタン押下
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/8eaced84-6e76-5aad-3299-e4ec38eb19d6.png)
        * 右上フォルダボタン押下
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/2740bd11-3205-612b-c8a8-f0c00c43d2b7.png)
            * 移行先のスキーマ選択
            * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/63fea7cd-a18a-31d2-1d7e-1e55208df9b2.png)
        * Mapping列が`existing`になっている事を確認して「Next」ボタン押下
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/2740bd11-3205-612b-c8a8-f0c00c43d2b7.png)
        * 変更せず「Next」ボタン押下
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/2baf815e-f5f9-b9ec-379e-5b21553bac3a.png)
        * 「Start」ボタン押下　でデータ移行始まる
        * ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109904/497b28d3-61cd-0e3b-4eff-b3fae0e06fa0.png)


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

## 参考URL

* DBeaver 
    * [Data migration · dbeaver/dbeaver Wiki](https://github.com/dbeaver/dbeaver/wiki/Data-migration)
    * [DBeaver公式サイト](https://dbeaver.io/)
* postgresql
    * [ダウンロード | 日本PostgreSQLユーザ会](https://www.postgresql.jp/download)
    * [Windowsでpsqlコマンドでエラーが出た時の文字化けを修正する | ハックノート](https://hacknote.jp/archives/5246/)

[postgresql 文字型](https://www.postgresql.jp/document/9.4/html/datatype-character.html)
> character varying(n), varchar(n)	上限付き可変長
> text	制限なし可変長
> （省略）
> character varyingが長さ指定なしで使われた時は、いかなる長さの文字列でも受け付けます。 

[MySQLとPostgresのデータ型対応表 - Qiita](https://qiita.com/suin/items/85b1e3eebb99777b171d)