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へ続く