KABOOM!!!
この記事はHowToではなく、自分が遭遇したいくつかのエラーの備忘録です。
・うまく動いていないけどエラーログが出ない
・エラーの原因が摩訶不思議
・対処法がググりにくい
などなど、pgloaderを使うにはなかなか落とし穴が多かったので
はまった箇所を共有して解決の一助になれれば幸いです。
pgloaderってなに?
MySQLのテーブルをPostgreSQLにドサっと入れられるすごいやつです。
合計2Gぐらいのテーブルを移行しました。
Windows mac linux 様々なOSで使えます。Qiitaにも紹介記事があります。
CUIで操作しますが、オプションに-dつけるとログがいっぱいでます。基本的にデバッグモードで実行してました
VPSだとかにあるMySQLに接続して移行 とかもできるらしいですが そんなにデータ総量が大きくなかったので、
Postgresの入っているマシンにMySQLを入れて VPSで作ったMySQLのdumpファイルをインポートして localhost MySQL から localhost PostgreSQLにデータを移動しました。
落とし穴たち
・パスワードに特殊記号が含まれてると、うまいことエスケープしないと エラーログなしにプログラムが終了する
・MySQLのバージョンによっては、Authentication ERRORが出る
・同じバージョンでも、apt installで入れたプログラムではエラーが出る
パスワードに特殊記号が含まれるとうまくいかない
これ最悪なのがエラーコードでません。
pgloader version 3.6.3~devel
compiled with SBCL 2.0.1.debian
sb-impl::*default-external-format* :UTF-8
tmpdir: #P"/tmp/pgloader/"
2022-06-16T16:04:27.005000+09:00 NOTICE Starting pgloader, log system is ready.
2022-06-16T16:04:27.010000+09:00 INFO Starting monitor
2022-06-16T16:04:27.011000+09:00 LOG pgloader version "3.6.3~devel"
2022-06-16T16:04:27.011000+09:00 INFO Stopping monitor
こんなかんじで、Starting monitorしたあとすぐ Stopping monitorって出てプログラムが終了します。
MySQL側で起きるエラーなので、MySQLのユーザーのパスワードをいじります。
観測した限りだと、特にアットマーク@とドット.が入ってるとよろしくないようです。
パーセントエンコーディングかエスケープ処理すればよさそうですが、
エンコードする予約文字の種類が多分違ったのか、やり方が間違っているのか(RFC3986準拠なら違うかも)上記の2文字が入っていると
パーセントエンコーディングしても同様のエラーがでてしまったので
新しいユーザーを作成して、「記号もパスワードに含めよ!」に対応するため"!"を含む英語大文字・小文字・数字を使ったパスワードを作成して回避しました。
MySQLのバージョンによってはAuthentication ERRORが出る
ログの一部にこんなかんじのエラーが出ます
QMYND:MYSQL-UNSUPPORTED-AUTHENTICATION
上段で作成したユーザーにテーブルへの権限をGRANTします。
MySQLに入って GRANT ALL ON 'table_name' TO 'user' で権限設定後
ALTER USER 'user' IDENTIFIED WITH mysql_native_password BY 'password' でユーザーの認証プラグインを変更します。
(GRANTの構文がMySQLのバージョンによって変更入っているのでお気をつけください)
使うpgloaderのバージョンによってはMySQLのmy.cnfの使用する認証プラグインを書き換える必要がありますが、
3.6.3-develではmy.cnfはそのままでも大丈夫でした。
データベースに接続できるがプログラムが動かない
これについては成功したいまでもなんでやねんの気持ちが大きいですが、
開発者の方には常に最大級の感謝を忘れておりません。
タイトル通りubuntuでpgloaderを実行しましたが、
sudo apt-cache showpkg pgloaderで最新Ver確認後、
sudo apt-get install pgloader=3.6.3-1.pgdg20.04+1 でインストールをして実験してました。
0件結果で終わってしまって困ってたところ、
たまたま、Githubのフォーラムで「ソースからbuildしたらうまくいった」との情報を発見しました。
wgetでgithubのtar.zipファイルをダウンロードして、もろもろプラグインいれつつmake、
pgloader -V の結果が
pgloader version "3.6.3-devel"
compiled with SBCL 2.0.1.debian になったら
sudo pgloader -v mysql://'mysqlのユーザー名':'特殊記号を含まないパスワード'@localhost/'DB名' postgresql://'postgresのユーザー名':'パスワード'@localhost/'DB名'
を実行すると、無事プログラムが走って移行できました。
なおビルド方式でも3.6.1だと動きませんでした。
あとがたり
そんなこんなで私は結果的にうまくいきましたが、恐らく他の人がはまってる今回紹介できてない落とし穴もいっぱいあると思います。
qiitadepgloaderタグの記事や、pgloaderのgithubのフォーラムをあさると 解決方法が載ってたり載ってなかったりするので、他の落とし穴にハマって抜け出せた人は情報共有してもらえると嬉しいです。