叫ぶうさぎの悪ふざけ

うさぎが目印のWebエンジニアが、得たことや思ったことを言の葉に乗せて叫ぶ場所です。

学習記録: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とは

そんなわけで…

依存関係(これからインストールしようとしている、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をアップグレード するたびに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 1213 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

というわけでこれも継続していくぞ!