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 # キャッシュ削除しないと`yum downgrade`が失敗することがある yum clean all # フルダンプ 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を入れ替えているだけです。 メジャーアップグレードも同様の手順でいけると思います。