MySQL5.x→8.xへのアップグレード¶
前提条件¶
MySQL 5.xのサポート落ちに伴うMySQL8.xへのアップグレードを行う。
RPM版でremi版などPHPに伴ってオフィシャルリポジトリを使っていない環境を想定する。
事前準備¶
- データベースのバックアップを作成する
# mysqldump -u root -p -x --all-databases > mysql.sql
- サービスの停止
# systemctl stop mysqld
- データディレクトリを退避し、空のディレクトリを作成
# cd /var/lib # mv mysql mysql_old # mkdir mysql # chown mysql.mysql mysql
- リポジトリを登録する
RPMはOSに合わせて適宜選択すること# rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm
依存ライブラリ「compat-mysql51」を解消しつつ更新する¶
「compat-mysql51」の依存性でバージョンアップが出来ない(cronやpostfixが依存しているので消せない)
ため、このRPMを依存性の影響の無いパッケージに入れ替えながらアップデートする。
方法としてはyumを対話モードで実行し、「compat-mysql51」削除と代替の「mysql-community-libs-compat」
インストールを同時に行う。その過程でMySQL8.xも同時に導入される。
- yumの対話モードを実行
# yum shell 読み込んだプラグイン:fastestmirror Yum シェルの設定をしています > install mysql-community-libs-compat インストール処理の設定をしています Loading mirror speeds from cached hostfile * remi-safe: ftp.riken.jp > erase compat-mysql51 削除処理の設定をしています > transaction 「compat-mysql51」削除と代替の「mysql-community-libs-compat」およびMySQL8.xのインストールがそれぞれ実行されます。 > exit
初期設定¶
- 初期化を行います(たぶんエラーになります
# mysqld --initialize-insecure
- エラーとなった原因となる非互換の設定をコメントアウトします
# vi /etc/my.cnf -------------------- innodbやtimezoneなどをコメントアウトします timezoneは初回起動が成功してDB復元を行った後にしか有効に出来ません <pre> </pre>
- 初期DBを削除し、再度初期化を行います
rm -rf /var/lib/mysql/* # mysqld --initialize-insecure
- 成功するまでこれを繰り返します
DBのリストア¶
MySQLが起動するようになったので、SQLでDBをリストアします。
- rootユーザのパスワードなどがないとリストア出来ないので初期設定を行います。
# mysql_secure_installation -------------------- パスワードのみ設定し、後はデフォルト
- DBのリストアを実効
# mysql -h localhost -u root -p < mysql.sql
この時点でmysqlコマンドでログインは可能ですが、テーブル参照などは
権限の問題で参照が出来ない状態です。(rootユーザでも
旧形式のテーブルでリストアされてしまったため、システムテーブルに互換性が
なくユーザ情報などが利用できないため、リストア後にアップグレードする必要
があります。
DBのアップグレード¶
従来は「mysql_upgrade」コマンドを実行していたのですが、8.xからは起動時に
mysqldコマンドのオプションでアップグレードチェックをするようになったため
起動スクリプトに追加を行います。
- 起動スクリプトの修正
下記のように「--upgrade=FORCE」を追加する。
systemctlの場合は/usr/lib/systemd/system/mysqld.serviceと思われる# vi /etc/init.d/mysqld -------------------- $exec $MYSQLD_OPTS --datadir="$datadir" --socket="$socketfile" \ --pid-file="$mypidfile" --upgrade=FORCE \ --basedir=/usr --user=mysql $extra_opts >/dev/null & safe_pid=$!
- 上記編集後にサービスを再起動する。
# systemctl restart mysqld
- ログを参照し、DBアップグレード処理が入ったことを確認する
# less /var/log/mysqld.log -------------------- 2021-02-09T07:36:04.606136Z 4 [System] [MY-013381] [Server] Server upgrade from '80023' to '80023' started. 2021-02-09T07:36:08.415146Z 4 [System] [MY-013381] [Server] Server upgrade from '80023' to '80023' completed.
設定の復元¶
- timezoneなど、システムテーブル参照の必要があった互換性のある設定を元に戻します
utf-8はUTF8MB3または後継のUTF8MB4が推奨されています# vi /etc/my.cnf -------------------- character-set-server=UTF8MB4 default-time-zone = 'Asia/Tokyo' など
- 正常に起動することを確認します(互換性が無い設定を復活させていないか
# systemctl restart mysqld
- 正常に利用できることを確認します
# mysql -u root -p mysql> show databases; mysql> quit;
*アプリケーションから参照できることが確認出来れば完了です
片付け¶
完全に必要が無いと見なしたら、バックアップしたmysql.sqlと/var/lib/mysql_oldを削除できます。