かぴぶろぐ

またかぴったかと思った・・・(´A`;)

MysqlからPostgresへ移行

カテゴリ[ Postgres ]
PostgresからMysqlへの移行記事は良く目にするが、MysqlからPostgresへの移行はあまりなかったのでまとめ。
(まあ下の参考URLの人のがあるんだけど・・)
MySQLからエクスポート
echo "SELECT * FROM [TABLE_Name] INTO OUTFILE '/opt/tmp/[DB_Name]/[TABLE_Name].csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';" | mysql -u root [DB_Name]
これを各テーブルごとにやってく。
余分な文字等を取り除くこの後下記のPostgresにインポートするやり方で進めればデータは入るのだが、移行データに余計な文字などが入る場合があるので、その場合はエクスポートしたcvsから予め取り除く必要がある。
今回行った際には改行の箇所に「\」マークが入ってしまった。
excerptに変な
----------
,"あああ","\  ←\マーク
もじもじ",2,3
----------
が入る。
以下のコマンドで取り除いてく。
tr -d '\\\n' < [Table_name].csv > [Table_name]_remove.csv

PostgreSQLへインポート
予めインポート先のDBは作っておく。
その後、ログインして以下のコマンドを実行。

echo "COPY [TABLE_Name] FROM '/opt/tmp/[DB_Name]/[TABLE_Name].csv' WITH CSV NULL AS '\\\\N' escape '\\\\' ;" | psql -U postgres [DB_Name]
auto incrementだったcolumnのlastIDを揃える
ERROR: duplicate key violates unique constraint
とか出たらindexのlast_valueと該当tableのselect max(id) ...の値が等しいか確認。違っていたらserial型でエラーになるのでsetvalでlast_valueを更新する。
select setval('[TABLE_Name]_id_seq', (select max(id) from [TABLE_Name] ));
これでシーケンスのIDも一致する。

参考URL

http://kapi.jp/kapi_blog/217

2009年03月03日

関連カテゴリ Postgres

この記事のコメント

この記事にコメントする