FreeBSDにもそろそろMySQL 8.0を入れても良い時期じゃないかと思って入れてみた。その備忘録。
MySQL 8.0のインストール
例によってFreeBSDのportsでビルド・インストールする。
# cd /usr/ports/databases/mysql80-server
# make install clean
# sysrc mysql_enable="YES"
mysql_enable: -> YES
# sysrc mysql_optfile="/usr/local/etc/mysql/my.cnf"
mysql_optfile: -> /usr/local/etc/mysql/my.cnf
# cp -p /usr/local/etc/mysql/my.cnf.sample /usr/local/etc/mysql/my.cnf
ビルドオプション(make config)は小規模な環境なら初期値のままで良いかと。
/usr/local/etc/mysql/my.cnf.sampleという設定雛形があるのでコピーしてmy.cnfを作る。(後述)
MySQLの古いバージョンから更新
# mysql_dump -u root -pパスワード DB_name > ~/mysql_DB_name.sql # DB別バックアップ
# mv /usr/local/etc/mysql /usr/local/etc/mysql.BAK #5.7用の設定を退避
# mv /usr/local/etc/my.cnf /usr/local/etc/zzz_my.cnf #5.6以前の設定 これは流用できないので要らない
# portupgrade -o databases/mysql80-client -r databases/mysql5x-client #5xの部分は現在のVer
# portupgrade -o databases/mysql80-server -r databases/mysql5x-server #5xの部分は現在のVer
# portupgrade -fr databases/mysql80-server #念の為に再度強制更新
# cp -p /usr/local/etc/mysql/my.cnf.sample /usr/local/etc/mysql/my.cnf #5.6以下からの更新の場合
# cp -p /usr/local/etc/mysql.BAK/my.cnf /usr/local/etc/mysql/ #5.7からの更新でmy.cnfを流用の場合
(後述のmy.cnfの設定を行う)
# service mysql-server restart #MySQLサーバを再起動(ここまで旧バージョンで稼働したままで可)
# mysql_upgrade -u root -pパスワード #データベースの確認と更新
MySQL8.0の設定
基本的にMySQL 5.7と同じ。
/usr/local/etc/mysql/my.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | [client]
中略
default-character-set = utf8mb4
[mysqld]
中略
character-set-server = utf8mb4
#collation-server = utf8mb4_bin
collation-server = utf8mb4_ja_0900_as_cs
log-error = /var/log/mysqld-error.log
中略
[mysqldump]
中略
default-character-set = utf8mb4
後略
|
更新前にMySQL5.7を使用していたならそのmy.cnfを流用できる(筈)。
MySQL5.6以下からの更新の場合は旧my.cnfを流用するとたぶん泣くことになるので古いのを使うのは諦めて新規のつもりで雛形のmy.cnfのコピーを触る。新規の場合、小規模なDBなら雛形の設定からあまり変えなくて良さげ。デフォルトの文字コードの指定を追加しておく。(エラーログも)
MySQLサーバ起動 (新規インストールの場合)
# service mysql-server start
# mysql mysql #mysqlコマンドでmysqlデータベースに接続
新規の場合はあまりトラブる要因は無いと思う。MySQL5.7では初起動時にMySQL管理者用パスワードが勝手に指定されて余計な苦労をさせられたが、8.0では元に戻っているようなのでMySQLのログを漁ってパスワードを見つけるとか --skip-grant-tables オプションを指定してMySQLサーバを起動するという余計な手間はなくなった。逆に8.0では --skip-grant-tables を指定してMySQLサーバを起動してしまうとパスワード変更系のコマンドが蹴られるので注意。
MySQL 5.6以下からの更新したらMySQLが起動しなくなった場合
苦労するのが嫌なら新規構築でバックアップから流し込むのが吉。
# mv /var/db/mysql/var/db/mysql.BAK
# service mysql-server start
% mysql mysql #mysqlコマンドでmysqlデータベースに接続
root@localhost [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySecretPassword'; #MySQLの管理者rootのパスワードを設定
Query OK, 0 rows affected (0.00 sec)
root@localhost [mysql]> CREATE DATABASE DB_name; #DB_nameという名前のデータベースを作成
Query OK, 0 rows affected (0.00 sec)
root@localhost [mysql]> CREATE USER 'DB_User'@'localhost' IDENTIFIED WITH mysql_native_password BY 'DB_UserPassword'; #DB_Userを作成しパスワード設定
Query OK, 0 rows affected (0.01 sec)
root@localhost [mysql]> GRANT ALL PRIVILEGES ON DB_name.* TO 'DB_User'@'localhost'; #DB_UserにDB_nameへの全権付与
Query OK, 0 rows affected (0.01 sec)
root@localhost [mysql]> exit
Bye
% mysql -u DB_User -pDB_UserPassword DB_name < ~/mysql_DB_name.sql #バックアップ流し込み
MySQL 8.0の嫌なところ
たとえばDBにadminという名前のテーブルを作った場合。少なくともMySQL 5.6まではadminという名前でも普通のテーブルとして使えたと記憶。5.7も?
しかし、8.0では
DB_name@localhost [DB_name]> select * from admin;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'admin' at line 1
何故か知らんけどエラーになる。mysqlコマンドでだけ発生するというならいいけど関係なくエラー。テーブル名がadminだと「あいまい」ということなのかしら?
このおかげでメールサーバで使っているpostfixadminというツールがそのままでは正常に使えない。
いつまでそんなレガシーなツールを使ってるんだというツッコミは無しで。
DB_name@localhost [DB_name]> select * from DB_name.admin;
+--+--------------+-----------+---------------------+
|id| username | password | ts |
+--+--------------+-----------+---------------------+
| 1| userhoge | $1$123abc | 2018-04-24 12:34:56 |
+--+--------------+-----------+---------------------+
1 row in set (0.00 sec)
テーブル名の前にDB名を指定(修飾)してやると普通に使える。
MySQL 8.0にするとMySQL 5.7までと比較して最大で2倍速くなるような話だったと思ったが、実際に更新してみて「速くなった」という実感は無い。(ダメじゃん)
関連記事: