MySQL 8.0からMariaDB 11.4に移行したメモ。思ったよりいろいろと大変だった……。
環境
- FreeBSD 14.1
- nginx 1.26.1
- MySQL 8.0.35
- MariaDB 11.4.2
背景
MySQLを8.0から8.4にアップグレードしようと作業を始めたところ、認証プラグインのデフォルトが変更されていたりして、さくっとは動きそうもなかった。
どうせハマるなら、この機会にMariaDBに移行してしまえ! というわけで、移行決定。
移行完了してみたら、はっきり体感できるほどWordPressの表示が速くなった。こんなに違うとは。移行してよかった。
移行作業手順
MySQLデータベースをバックアップ
mysqldump
で全データをバックアップ。
# mysqldump -u root -p --all-databases --set-gtid-purged=OFF --triggers --routines --events --source-data > allbackup.sql
--master-data
を指定するとobsoleteなオプションだと文句を言われたので、指示に従って--source-data
に変更してみた。
ユーザ情報や権限を新規登録し直すつもりなら、データベースのみバックアップしてもよい。
# mysqldump -u root -p --databases --set-gtid-purged=OFF DB1 DB2 DB3 > dbbackup.sql
MySQLをアンインストール
バックアップが完了したら、MariaDBをインストールする前に、まずMySQLをアンインストールする。
# sudo pkg delete mysql80-server
不要になったリポジトリも削除しておく。もちろん、ディスクの空き容量に余裕があるなら、念のためMariaDBが正常に動作するまで残しておくほうが安全。
# sudo rm /var/db/mysql
MariaDBをインストール
次に、portmaster
でMariaDBをインストール。
# sudo portmaster databases/mariadb114-server
my.cnf
を書き換える。/usr/local/etc/mysql/my.cnf
には、MySQL用に作成したものがそのまま残されているので、念のため名前を変更してしばらく残しておく。
# cd /usr/local/etc/mysql
# sudo cp my.cnf my.cnf.mysql80
# sudo cp my.cnf.sample my.cnf
このmy.cnf
は、conf.d
の下にある拡張子が.cnfのファイルをすべて読み込むだけの内容となっている。conf.d
の下のファイルを編集し、必要に応じて旧my.cnfの内容を反映させる。基本的にはserver.cnf
を編集するだけでいい、はず。必要ならclient.cnf.sample
をclient.cnf
にコピーして編集する。
設定ファイルの編集が終わったら、SQLサーバを起動。
# sudo service mysql-server start
データベースをインポート
バックアップしてあったデータベースをインストールする。
# sed -e '/@@GLOBAL.GTID_PURGED=/d' \
-e -e 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_520_ci/g' allbackup.sql | \
sudo mysql -u root -p
パスワードには何も入力せずにリターンキーを押す。初期状態では、root権限でmysql
を実行すると、パスワードなしで実行できる。MariaDBへのインポート時には、エラーが出るものを、sed
を使って削除したり置換したりしておく。
インポートしたら、ユーザ情報を確認する。ユーザ情報まで含めてインポートしているので、mariadb-secure-installation
を使った初期化は行わない。
MariaDB [(none)]> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------------+-----------------------+
| user | host | plugin |
+------------------+-----------------+-----------------------+
| root | 127.0.0.1 | caching_sha2_password |
| root | ::1 | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
| user1 | localhost | caching_sha2_password |
+------------------+-----------------+-----------------------+
7 rows in set (0.008 sec)
MySQL 8.0ではデフォルトの認証プラグインがcaching_sha2_password
だったが、MariaDBのサーバではcaching_sha2_password
がサポートされていない。caching_sha2_password
の認証プラグインは存在するが、これはMariaDBクライアントがMySQLサーバに接続するためのものでしかない。
cf. Authentication Plugin – SHA-256 (MariaDB Server Documentation)
なので、MariaDBでデフォルトのmysql_native_password
に変更しておく。なお、MariaDBでパスワード管理のセキュリティレベルを上げたい場合には、ed25519の利用が推奨されている。
cf. Authentication Plugin – ed25519 (MariaDB Server Documentation)
こちらは当然、MariaDBサーバでもサポートされている。設定ファイルにplugin_load_add = auth_ed25519
の行を追加するか、mysqlで接続してINSTALL SONAME 'auth_ed25519';
を発行してインストールして利用する。
認証プラグインを変更するにあたっては、まずはFLUSH PRIVILEGES
を発行しておく。これをしないと、ALTER USER
の実行時にエラーが出るため。
MariaDB [(none)]> FLUSH PRIVILEGES;
mysql.infoschema
、mysql.session
、mysql.sys
は不要なので削除しておく。
MariaDB [(none)]> DROP USER mysql.infoschema;
ALTER USER
を使用して、ひとつずつ認証プラグインを変更する。
MariaDB [(none)]> ALTER USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password USING PASSWORD('password');
すべて変更し終わったら、再度確認。
MariaDB [(none)]> SELECT user,host,plugin FROM mysql.user;
+------------------+-----------------+-----------------------+
| user | host | plugin |
+------------------+-----------------+-----------------------+
| root | 127.0.0.1 | mysql_native_password |
| root | ::1 | mysql_native_password |
| root | localhost | mysql_native_password |
| user1 | localhost | mysql_native_password |
+------------------+-----------------+-----------------------+
4 rows in set (0.005 sec)
root
にパスワードを設定したので、この後はスーパーユーザでなくてもmysql
を実行できるようになる。
PHPの設定
MySQLとはデフォルトのsocketの場所が異なるので、/usr/local/etc/php.ini
を編集して、次のように位置を指定する。
mysqli.default_socket = /var/run/mysql/mysql.sock
php-fpm
を再起動して、設定を反映させる。
Webページにアクセスして、WordPessがきちんと動いていることを確認する。
参考
- MySQL8.0新機能 (caching_sha2_password 認証プラグイン)
- ALTER USER (MariaDB)
- MySQL (MariaDB) ユーザー追加コマンド(ユーザー作成、権限付与)
- [MySQL]権限の確認と付与
- How to resolve ERROR 1396 (HY000): Operation ALTER USER failed for ‘root’@’localhost’?
- MySQLにコマンドラインからパスワードを入力せず接続
- MariaDB – MySQL – ALL-DB Import – Table ‘user’ already exists
- ERROR 1193 (HY000): Unknown system variable ‘GTID_PURGED’