mariadbへの移行(その1:自宅マシン)

FreeBSDでのmysql 8.0.Xのサポート状況が非常に悪いため、mariadbへ移行することにしました。
遂にoracleはmysql community serverのFreeBSDサポートを止めたみたいですし、そろそろmysqlは諦める時期のようです。いきなりこのサーバを移行するのは無謀なので、まずは自宅マシンをmysql 8.0.25からmariadb 10.5.12へ移行してみました。(まだmariadb 10.6.Xのportsは作られていないため。)その結果、以下の点でハマりました。
(1) mysql_upgradeはやはり動かない。
(2) 仕方ないので、mysqlのweekly backupをmariadbで読み込ませようとしたら、以下のエラーが出る。
(2-1) mariadb 10.5.12にはformat_bytes()関数がないため、https://fossies.org/linux/misc/mariadb-10.6.3.tar.gz/mariadb-10.6.3/scripts/sys_schema/functions/format_bytes.sqlを入れる必要がある。なお、mariadb.sys所有のfunctionである必要はないので、今回は該当ユーザのfunctionとして定義した。
(2-2) たった14000行程度のテーブルなのに、mysql 8.0.25のdumpは1行が長すぎてmariadbでは読み込めなかったため、sed 's/,(/,\n(/g'でバックアップファイルの行を複数行に分割して読み込ませた。
(3) tcp_wrappersをlinkしていることに気付かず、随分無駄な時間を浪費した。telnet hoge 3306してtcp_wrappersのエラーメッセージが表示されていることにやっと気付いた。/etc/hosts.allowにLAN内マシンからの接続を許容する設定を追加して(daemon_listはmariadbdになる)LAN内マシンから接続できるようになった。
(4) バックアップを読み込ませる際、結構エラーが発生するため、mysql -fでエラーを無視して続行させるように指定した。

実際の手順は以下の通り。

# rm -rf /var/db/mysql
# /usr/local/etc/rc.d/mysql-server start
# /usr/local/bin/mysql_secure_installation
(root userのパスワードを入力する以外は全てYのままとした)
# mysql -u root
mysql> create user FOO identified by 'PASSWORD';
mysql> create database HOGE character set UTF8MB4;
mysql> grant all on HOGE.* to FOO;
mysql> exit
# cat format_bytes.sql | sed s/mariadb.sys/FOO/ |mysql -u root HOGE
# exit
% cat BACKUP.sql | sed 's/,(/,\n(/g' | mysql -f -u FOO -p HOGE
Password:PASSWORD
ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, BINLOG ADMIN privilege(s) for this operation
ERROR 1193 (HY000) at line 24: Unknown system variable 'GTID_PURGED'
ERROR 1273 (HY000) at line 15733: Unknown collation: 'utf8mb4_0900_ai_ci'
ERROR 1227 (42000) at line 15758: Access denied; you need (at least one of) the SUPER, BINLOG ADMIN privilege(s) for this operation

エラーの発生した行が問題ないことを確認して、移行が完了した。

P.S. その後、mysqldumpで--flush-logsできるように

# mkdir /var/db/mysql/log
# chown mysql:mysql /var/db/mysql/log

して、/usr/local/etc/mysql/conf.d/server.cnfの[mysqld]のinnodb_log_group_home_dir、general_log_file、log_bin、relay_log、slow_query_log_file、innodb_doublewrite、innodb_flush_methodのコメントを外した。

その2へ続く