学習記録:12月13日(木):【MySQL8.0アップグレード】5.7.19->5.7.24->8.0.11 アップグレード手順【5.7.24 アップグレード前編】
これは 俺のインプットアウトプット記録 Advent Calendar 2018 の13日目のエントリーです。
MySQL8.0.11を触る必要が出てきて、じゃあ手元の環境をアップグレードしよう!と思い立ったけど一発でうまくいかなかったので、未来の自分のためにエントリーに残します。
現状
$ cat /etc/redhat-release CentOS Linux release 7.3.1611 (Core) $ mysql --version mysql Ver 14.14 Distrib 5.7.19, for Linux (x86_64) using EditLine wrapper
5.7.19->5.7.24
というわけでまず、5.7の最新版にアップグレードしましょう。
MySQL停止
忘れずに。
$ sudo systemctl stop mysqld.service
依存性のアップグレード
yumってなんぞ?って話はさらっと触れるんですが、一言ていうと パッケージの統合管理システム です。
パッケージの!統合管理システム!
なるほどよくわからん。
というわけでWikipedia先生から引用
パッケージ管理システムとは、OSというひとつの環境で、各種のソフトウェアの導入と削除、そしてソフトウェア同士やライブラリとの依存関係を管理するシステムである。
つまるところ、
- OSや各種ソフトウェアが 必要としているライブラリを管理 していて
- 不必要なライブラリをインストールしない ことで
- ちゃんと動くようにパッケージを管理している
ってことかな(自信なし)
yumとは
- Yellowdog Updater Modified の略
- Yellow Dog Linux っていうLinuxがあったんですね
- 2010年4月に開発打ち切り
- こいつのためにボランティアによって開発された
そんなわけで…
依存関係(これからインストールしようとしている、MySQLコミュニティ版がどういうライブラリで構成されているのか)の情報を最新にするために、以下のコマンドを実行します。
$ sudo yum upgrade mysql-community-server 読み込んだプラグイン:fastestmirror base | 3.6 kB 00:00:00 epel/x86_64/metalink | 4.9 kB 00:00:00 epel | 3.2 kB 00:00:00 extras | 3.4 kB 00:00:00 mysql-connectors-community | 2.5 kB 00:00:00 mysql-tools-community | 2.5 kB 00:00:00 mysql57-community | 2.5 kB 00:00:00 remi-safe | 3.0 kB 00:00:00 updates | 3.4 kB 00:00:00 (1/5): epel/x86_64/updateinfo | 940 kB 00:00:00 (2/5): extras/7/x86_64/primary_db | 156 kB 00:00:00 (3/5): epel/x86_64/primary | 3.6 MB 00:00:00 (4/5): updates/7/x86_64/primary_db | 1.3 MB 00:00:00 (5/5): remi-safe/primary_db | 1.4 MB 00:00:04 Loading mirror speeds from cached hostfile * base: ftp.tsukuba.wide.ad.jp * epel: ftp.yz.yamagata-u.ac.jp * extras: ftp.tsukuba.wide.ad.jp * remi-safe: ftp.riken.jp * updates: ftp.tsukuba.wide.ad.jp epel 12748/12748 依存性の解決をしています --> トランザクションの確認を実行しています。 ---> パッケージ mysql-community-server.x86_64 0:5.7.19-1.el7 を 更新 ---> パッケージ mysql-community-server.x86_64 0:5.7.24-1.el7 を アップデート --> 依存性の処理をしています: mysql-community-common(x86-64) = 5.7.24-1.el7 のパッケージ: mysql-community-server-5.7.24-1.el7.x86_64 --> トランザクションの確認を実行しています。 ---> パッケージ mysql-community-common.x86_64 0:5.7.19-1.el7 を 更新 ---> パッケージ mysql-community-common.x86_64 0:5.7.24-1.el7 を アップデート --> 依存性解決を終了しました。 依存性を解決しました ============================================================================================================================================================================= Package アーキテクチャー バージョン リポジトリー 容量 ============================================================================================================================================================================= 更新します: mysql-community-server x86_64 5.7.24-1.el7 mysql57-community 165 M 依存性関連での更新をします: mysql-community-common x86_64 5.7.24-1.el7 mysql57-community 274 k トランザクションの要約 ============================================================================================================================================================================= 更新 1 パッケージ (+1 個の依存関係のパッケージ) 総ダウンロード容量: 165 M Is this ok [y/d/N]: y Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/2): mysql-community-common-5.7.24-1.el7.x86_64.rpm | 274 kB 00:00:00 (2/2): mysql-community-server-5.7.24-1.el7.x86_64.rpm | 165 MB 00:00:07 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 合計 23 MB/s | 165 MB 00:00:07 Running transaction check Running transaction test Transaction test succeeded Running transaction 更新します : mysql-community-common-5.7.24-1.el7.x86_64 1/4 更新します : mysql-community-server-5.7.24-1.el7.x86_64 2/4 整理中 : mysql-community-server-5.7.19-1.el7.x86_64 3/4 整理中 : mysql-community-common-5.7.19-1.el7.x86_64 4/4 検証中 : mysql-community-server-5.7.24-1.el7.x86_64 1/4 検証中 : mysql-community-common-5.7.24-1.el7.x86_64 2/4 検証中 : mysql-community-common-5.7.19-1.el7.x86_64 3/4 検証中 : mysql-community-server-5.7.19-1.el7.x86_64 4/4 更新: mysql-community-server.x86_64 0:5.7.24-1.el7 依存性を更新しました: mysql-community-common.x86_64 0:5.7.24-1.el7 完了しました!
無事に5.7.19 -> 5.7.24 へ、依存関係が更新されたようです。
MySQL 5.7.24 へのアップグレードを実行
以下のコマンドで、アップグレードを実行します。
何をしているかというと、MySQLの全データベースの全テーブルをチェックし、必要であれば修復し、アップグレードしています。
mysql_upgradeとは
まず公式を読んでみます。英語だけど頑張って翻訳機にかけて読むのだ。
公式から引用すると、以下の記述があります。
現在とこれからの非互換性を調べる
mysql_upgradeは、現在のバージョンのMySQL Serverとの非互換性について、すべてのデータベース内のすべてのテーブルを調べます
- 現在のバージョン、つまり5.7.19と
- これからインストールしようとする5.7.24で
- 非互換性について
- 全てのデータベース内の全てのテーブルを調べる
とあります。 つまり、廃止になった機能や型などがないかを全部チェックしてくれると解釈しました。
ここでもしエラーになれば、それを解決しないとバージョンアップできない、もしくは修復などできなかったテーブルは手動であとで修復してね、と僕は理解しました。
ちなみに MySQL 5.7.24 のリリースノート をみてみると、色々興味深い内容が書いてありますが、主題と大きくそれるので割愛します。
1つだけ言えるのは、アップグレードする際は、リリースノート読んで、影響範囲を事前に調べようね、ってことかなって思います。
システムテーブルもアップグレード
mysql_upgradeは、追加された可能性のある新しい特権や機能を利用できるように、システムテーブルもアップグレードします
思えばslow_logも今ではテーブルで管理できるようになっているわけで、そのほかにもたくさんの管理がシステムテーブルで管理できるようになっていると思います。
そういった、バージョンアップに伴いシステムテーブルで管理できるようになった内容なども、最新に対応するためにアップグレードしてくれるわけだな、と解釈しました。
互換性のないテーブルをチェック・修復
mysql_upgradeがテーブルに互換性がない可能性があると判断した 場合は、テーブルチェックを実行し、問題が見つかった場合はテーブル修復を試みます。表を修復できない場合は、2.11.3項「表または索引の再構築または修復」を参照して、手動表修復方法を確認してください
もし互換性がないテーブル(なくなった機能や非推奨のものなどが含まれる場合かな)がある場合は、
- テーブルチェックを実行
- 問題があればテーブル修復を試みる
- 修復できない場合は手動修復
とあります。 実際にやってみたら、でかいテーブル(数百万〜1000万レコードのテーブルでした)でエラーが出ていたので、何かしら問題があったことがわかります。(アップグレード自体は完了しましたが、修復はされなかったようです)
これはまた mysql_upgrade を実行した後の問題解決として書いていきますので、まずは進めます。
アップグレードの都度、mysql_upgradeが必要
公式に書いてある通りですね。マイナーバージョンアップであっても毎回 mysql_upgrade を使いましょうということでしょうか。
mysql_upgrade コマンド実行
というわけで、アップグレードするためにコマンドを実行し、各種チェックや必要であれば修復を行なっていきます。
わかる範囲でコメントを入れてますので、実際は #
で始まるコメントはありません。
$ mysql_upgrade -uroot -p Enter password: Checking if update is needed. Checking server version. Running queries to upgrade MySQL server. # システムデータベースのチェックを実施 Checking system database. mysql.columns_priv OK mysql.db OK mysql.engine_cost OK mysql.event OK mysql.func OK mysql.general_log OK mysql.gtid_executed OK mysql.help_category OK mysql.help_keyword OK mysql.help_relation OK mysql.help_topic OK mysql.innodb_index_stats OK mysql.innodb_table_stats OK mysql.ndb_binlog_index OK mysql.plugin OK mysql.proc OK mysql.procs_priv OK mysql.proxies_priv OK mysql.server_cost OK mysql.servers OK mysql.slave_master_info OK mysql.slave_relay_log_info OK mysql.slave_worker_info OK mysql.slow_log OK mysql.tables_priv OK mysql.time_zone OK mysql.time_zone_leap_second OK mysql.time_zone_name OK mysql.time_zone_transition OK mysql.time_zone_transition_type OK mysql.user OK # システムスキーマはアップグレードに成功しました The sys schema is already up to date (version 1.5.1). # 次に自分のデータベースをチェック Checking databases. mamy1326.ag_media OK mamy1326.bukken_bad OK # おっ、エラーが出ている。これはテスト用に突っ込んだ1000万レコードのテーブル mamy1326.c_log Warning : InnoDB: Tablespace is missing for table mamy1326/c_log. Error : Tablespace is missing for table `mamy1326`.`c_log`. error : Corrupt mamy1326.debug_log OK mamy1326.dr_log OK mamy1326.error_log OK mamy1326.hoge1 OK mamy1326.item_details OK mamy1326.items OK mamy1326.m_ad OK mamy1326.m_ad_base OK mamy1326.m_ad_group OK mamy1326.m_agent OK mamy1326.m_client OK mamy1326.m_company OK mamy1326.m_contact OK mamy1326.m_log OK mamy1326.m_maintenance OK mamy1326.m_media OK mamy1326.m_prefecture OK mamy1326.m_status OK mamy1326.migrations OK mamy1326.ng_log OK mamy1326.no_inc OK mamy1326.paths OK mamy1326.re_log OK mamy1326.report OK mamy1326.report_tmp OK mamy1326.t_access_ip OK mamy1326.t_ad_base_change OK mamy1326.t_ad_change OK mamy1326.t_alert OK mamy1326.t_carrier_ip OK mamy1326.t_error_log OK mamy1326.t_login OK mamy1326.t_mail_spool OK mamy1326.t_resign OK mamy1326.t_retry OK mamy1326.t_session OK # おっ、ここもエラーが出ている。これもテスト用に突っ込んだ数百万レコードのテーブル mamy1326.t_session_log Warning : InnoDB: Tablespace is missing for table mamy1326/t_session_log. Error : Tablespace is missing for table `mamy1326`.`t_session_log`. error : Corrupt mamy1326.time_stamp OK mamy1326.time_stamp2 OK mamy_test.addr_test OK mamy_test.bukken_bad OK mamy_test.bukken_good OK mamy_test.deleted_sites OK mamy_test.m_user OK mamy_test.products OK mamy_test.products_status OK mamy_test.tags OK mamy_test.timestamp_test OK mamy_test.unique_test OK mamy_test.wishlist OK sys.sys_config OK # 修復した結果を表示してくれる Repairing tables mamy1326.c_log Warning : InnoDB: Tablespace is missing for table mamy1326/c_log. Error : Tablespace is missing for table `mamy1326`.`c_log`. error : Corrupt mamy1326.t_session_log Warning : InnoDB: Tablespace is missing for table mamy1326/t_session_log. Error : Tablespace is missing for table `mamy1326`.`t_session_log`. error : Corrupt # 基本的にはこのメッセージが出ていれば、アップグレードは成功 Upgrade process completed successfully. # おや、何かファイルに書き込めないと言われている Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
まずは簡単そうなエラーから解決していきます。
Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
/var/lib/mysql/
に mysql_upgrade_info
ファイルが書き込めないと言われているようです。
ここは素直に /var/lib/mysql/
のパーミッションを変更して再実行してみます。
$ sudo chmod 775 /var/lib/mysql $ ls -lda /var/lib/mysql drwxrwxr-x 7 mysql mysql 4096 12月 13 22:53 /var/lib/mysql
再実行
Checking if update is needed. と表示され、無事エラーが出なくなっていることが確認できます。
$ mysql_upgrade -uroot -p Enter password: (中略) Upgrade process completed successfully. Checking if update is needed.
テーブル修復を試みた原因
先ほどのmysql_upgradeで、テーブルに問題があり、修復を試みた結果、どうやら失敗していたテーブルが2つありました。エラーはどちらも同じ内容でした。
mamy1326.c_log Warning : InnoDB: Tablespace is missing for table mamy1326/c_log. Error : Tablespace is missing for table `mamy1326`.`c_log`. error : Corrupt
試しにSELECTしてみます。
mysql> select * from c_log limit 1; ERROR 1812 (HY000): Tablespace is missing for table `mamy1326`.`c_log`.
mysql_upgradeで出ていたエラーと同じ内容が表示され、SELECTできないことがわかります。
ここの調査などについては、明日に持ち越したいと思います。
やってみて
マイナーバージョンアップ、実は初めてやりました。
やってみて、これ結構ハマるんだな、古いテーブルだったりすると結構クリティカルだな、と思うと共に、
- 正確な実行方法
- リリースノートの内容からの影響範囲調査
をちゃんとやっとかないといきなり躓くよね、と強く思いました。
正直マイナーバージョンアップは軽い気持ちで実行して、サクッと8.0まであげちゃうぞ!とか思ってたんですが、色々と腰を据える必要がありそうです。
しかし、こういうのを1つずつ調べて進めていく、わからなかった原因やエラーがわかっていく。
ほんと楽しいですね。
色々調べているうちに、時間を忘れて2時間ほど経過していて、アドベントカレンダーに間に合わないところでしたw
というわけでこれも継続していくぞ!