RedmineのデータベースをMySQLからPostgreSQLへ移行した(補足)


目的(+本記事の背景)

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 の履歴が移行できていませんでした。

error
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}

この変更で、無事に履歴もコピーできました。