目的(+本記事の背景)
Redmine の Database を MySQL で運用していたのですが、
MySQL 5.6 以上や MariaDB には、 Redmine Issue #19344 , #19395 , #17460 という不具合があるのと、
これらのチケットが数年も放置されている状況を踏まえて、
PostgreSQL に移行することにしました。
幸いにも、Qiita の記事 『RedmineのデータベースをMySQLからPostgreSQLへ移行した』 に、
目的とする内容の手順が書かれていたので、
記事の著者に感謝しつつ、記事の内容どおりに行ったのですが、
wiki の履歴が移行できなかったので、
対策した結果を以下に記します。
謝辞
元記事 の ryouma_nagare さんには深く感謝申し上げます。
内容
実施環境
- OS: Ubuntu 18.04.03 LTS
- Redmine: 3.4.6
- Ruby 2.4.9
- MySQL Server 5.7.27
- PostgreSQL Server 10.10
元記事 と同様に、
同一ホストで MySQL -> PostgreSQL へ migration します。
手順
元記事 のとおりです。
本題:遭遇した不具合
元記事 のとおりに実行したら、
以下のエラーメッセージが表示され、wiki の履歴が移行できていませんでした。
org.embulk.exec.PartialExecutionException: java.lang.RuntimeException: org.postgresql.util.PSQLException: ERROR: invalid input syntax for type bytea
場所: COPY wiki_content_versions_ ...
対策
元記事 の投稿者さんも留意点で書かれているように、
embulk は longblob や bytea などに対応していないので、
元記事 では、
wiki_content_versions テーブルの data カラム (MySQL では longblob型) を utf8 の string に変換し,
PostgreSQL に string 型 (PostgreSQLの wiki_content_versions テーブル内では bytea型) で
データをコピーしていましたが、
その部分を、以下のパッチのように変更しました。
%diff extra/wiki_content_versions.yml.liquid extra/wiki_content_versions.yml.liquid,orig
14c14
< ,cast(data AS BINARY) as data
---
> ,convert(data using utf8) as data
33c33
< data: {value_type: byte}
---
> data: {value_type: string}
この変更で、無事に履歴もコピーできました。