FreeBSDにMySQL 9.0をインストール

FreeBSDにMySQL 9.0をインストール

FreeBSDにpkg/portsでMySQLサーバをインストールする場合、mysqlXX-serverとmysqlXX-clientの2つのインストールすることになります。mysqlXX-clientは要らないから入れないということはできません。MySQL 9.0の場合はmysql90-serverとmysql90-clientです。(mysqlXX-serverを入れないということは可能です)
そして、2025年1月1日現在ではmysql90-clientのportsにはとても簡単で重大なバグがあります。このバグはfreshportsで2024年9月上旬に報告されているものの未だに放置されています。FreeBSDでMySQL 9.0をportsでビルドして利用したい人がいないのがメンテナがサボっているのか不明です。簡単すぎるため修正するまでもないということかもしれません。

portsで普通にビルド&インストールすると次のようなエラーでインストールが失敗します。
cd /usr/ports/databases/mysql90-client&&make install

===>   Registering installation for mysql90-client-9.0.1
pkg-static: Unable to access file /usr/ports/databases/mysql90-client/work/stage/usr/local/lib/mysql/plugin/mysql_native_password.so:No such file or directory
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/databases/mysql90-client
*** Error code 1
修正:
/usr/ports/databases/mysql90-client/pkg-plist
bin/comp_err
bin/my_print_defaults
bin/mysql
bin/mysql_config
bin/mysql_config_editor
bin/mysql_migrate_keyring
bin/mysqladmin
bin/mysqlbinlog
bin/mysqlcheck
bin/mysqldump
bin/mysqlimport
bin/mysqlshow
bin/mysqlslap
bin/perror
include/mysql/errmsg.h
include/mysql/field_types.h
include/mysql/my_command.h
include/mysql/my_compress.h
include/mysql/my_list.h
include/mysql/mysql.h
include/mysql/mysql/client_plugin.h
include/mysql/mysql/plugin_auth_common.h
include/mysql/mysql/udf_registration_types.h
include/mysql/mysql_com.h
include/mysql/mysql_time.h
include/mysql/mysql_version.h
include/mysql/mysqld_error.h
lib/mysql/libmysqlclient.a
lib/mysql/libmysqlclient.so
lib/mysql/libmysqlclient.so.24
lib/mysql/libmysqlclient_r.a
lib/mysql/libmysqlclient_r.so
lib/mysql/libmysqlclient_r.so.24
lib/mysql/plugin/mysql_native_password.so  この1行を削除します
%%SASLCLIENT%%lib/mysql/plugin/authentication_ldap_sasl_client.so
%%SASLCLIENT%%lib/mysql/plugin/authentication_oci_client.so
%%SASLCLIENT%%lib/mysql/plugin/authentication_webauthn_client.so
libdata/pkgconfig/mysqlclient.pc
share/aclocal/mysql.m4

おそらくMySQL 8.xまでのpkg-plistを流用したと思われます。MySQL 9.0ではnative_passwordは非推奨から削除に変更になっているので存在しません。この行が残っているとそれをコピーしようとしてエラーになります。

インストール後の新規利用方法

MySQLの新規利用はメジャーバージョンごとに変更されるため以前のバージョンの知識が利用できず、やることが簡単な割に苦労させられることがあります。

MySQL5.7以降は管理者パスワードを知らないと最初のログインができません。管理者パスワードを無効にして起動する方法もありますが、バージョンによってその手法が潰されることが続いているため素直にパスワードを使ってログインする方が無難です。

pkg/portsでmysql90-serverをインストールするとMySQLのデータディレクトリに初期データベースが置かれます。pkg/portsでインストールした場合はこの初期データベースのパスワードがわかりません。そのため一旦それを削除します。

# rm -R /var/db/mysql/*

mysql90-serverをserviceコマンドで起動せずmysqldを手動で起動します。(以下)

# /usr/local/libexec/mysqld --initialize --user=root --datadir=/var/db/mysql
2025-01-02T23:07:26.648165Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2025-01-02T23:07:26.649043Z 0 [System] [MY-013169] [Server] /usr/local/libexec/mysqld (mysqld 9.0.1) initializing of server in progress as process 66152
mysqld: Error on delete of '/var/db/mysql/auto.cnf' (OS errno 2 - No such file or directory)
2025-01-02T23:07:26.670107Z 0 [Warning] [MY-010107] [Server] World-writable config file '/var/db/mysql/auto.cnf' has been removed.
2025-01-02T23:07:26.671695Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-01-02T23:07:27.054670Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-01-02T23:07:27.779337Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: SECRET_PASSWORD    管理者パスワードが表示される
2025-01-02T23:07:29.298006Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

管理者パスワード(仮)が表示されるのでメモするかコピーします。

普通にserviceコマンドでmysql90-serverを起動します。

# service mysql-server start
メモしたパスワードを使用しmysqlコマンドでMySQLにログインして管理者パスワードを変更します。
# mysql -u root -p'SECRET_PASSWORD' mysql

//管理者バスワードの変更(必ず最初に)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewSecretPassword';

//新しいユーザー(userAAA@localhost)を作成する(任意)
CREATE USER 'userAAA'@'localhost' IDENTIFIED BY '123.UserPassword.!#$';

//既存のユーザー(userBBB@localhost)を削除する(参考)
DROP USER user 'userBBB'@'localhost';

自動生成されたパスワードを使い続けたいと思うかもしれませんが、最初に管理者パスワードを変更しないと管理者として他のコマンドを実行できないようです。
その後は、以前のバージョンと同じです。

データバックアップ GTID無効化

バックアップSQLにGTIDが含まれているとGTIDを使用しない環境でデータリストアがトラブる場合があります。

--set-gtid-purged=OFFを付けます。(パージがオフでGTIDを付けないというのは直感的ではありませんが。)
以下のようにダンプを取ります。

$ mysqldump -u root -p'SECRET_PASSWORD' --single-transaction --set-gtid-purged=OFF DB_NAME > DB_backup.sql

リストアの手順は変わりません。

関連記事:

記事へのコメント

いただいたコメントは管理人が確認した後に記事の 下部(ここ)に公開されます。
コメントスパム対策: 2022年4月以降、コメント内にリンクURLを含めると自動破棄されます。(記録されません)