この日記は私的なものであり所属会社の見解とは無関係です。 GitHub: takahashikzn

MariaDBをメジャーダウングレードする

mariadb-java-client-2.0.1がリリースされたので試してみた所、よくわからないエラーでテストがコケるようになりました。

特定のSelect文を打つと、こんなエラーがでることがあります。

java.sql.SQLIntegrityConstraintViolationException: (conn:50) Column 'id' in order clause is ambiguous

件のSelect文、そもそもorder by句すら含んでいないんですけど…マジでわけがわかりません。

mariadb-java-client-1.6.0でも同じエラーになるので、どうやら直近の変更が影響していそうです。


ソースの履歴を追ってみた所、どうもこの変更が怪しい。

changing default option value useServerPrepStmts to false - use text protocol by default

とはいえ、サーバサイドプリペアードステートメントを使わなかったとしても正しく動作すべきです。


MariaDB-10.2のバグ?

エラーになるSelect文をコマンドラインから直接実行してみると、なんと同じエラーになりました。 2月ぐらいにMariaDB-10.2にアップグレードしたのですが、どうやらサーバ側のバグのようですね…


というわけでMariaDB-10.1にダウングレードすることにしたのですが、単に

yum downgrade MariaDB-server

としてももちろん失敗します。

メジャーバージョン間で、データファイル(*.ibd)の互換性は保証されていません。 ドキュメントにも明確にそう書いてあります。

http://dev.mysql.com/doc/refman/5.7/en/downgrading.html


MariaDBダウングレードスクリプト

というわけでダウングレード手順はこんな感じでした。(CentOS7)

/etc/yum.repos.d/mariadb.repoを10.1に合わせた上で実行して下さい。

#!/bin/sh

# フルダンプ
mysqldump -u root --all-databases --routines --triggers \
    | gzip > /tmp/all.sql.gz
systemctl stop mysql

# yumによるダウングレードが出来ないので削除
yum -y remove MariaDB-server

# これは失敗しない
yum -y downgrade MariaDB-common MariaDB-compat MariaDB-client

# データディレクトリを作っておく
mv /var/lib/mysql /var/lib/mysql-10.2
mkdir /var/lib/mysql
chown mysql:mysql /var/lib/mysql

# SELinuxがONならこれが必要
chcon system_u:object_r:mysqld_db_t:s0 /var/lib/mysql

# インストールし直す
yum -y install MariaDB-server

# レストア
systemctl start mysql
gzip -d < /tmp/all.sql.gz | mysql -u root
systemctl restart mysql

# 接続テスト
echo 'select version();' | mysql -u root

要はフルダンプをとってrpmを入れ替えているだけです。 メジャーアップグレードも同様の手順でいけると思います。