この記事はMySQL Advent Calendar 2023 25日目の記事です。
はじめに
アップグレードってどうすればいいの?と言う人にドキュメントベースでアップグレードの流れを書いてみます。
本当はここから全てのリンク先を読むのが一番良いのですが、
これが多くのユーザーにはおそらくツライ(汗)
「ドキュメントのどこ読めばいいんですか?」という問い合わせが非常に多いのです。(わかる気はする)
というわけで、少しチョイスしてみました。(たまに寄り道します)
この記事で上げていったリンクのうち、必要なページを熟読していってみてください。
できれば英語版で最新を読むのが良いんですが、つらい方は和訳版を先に読むのもアリです。
(但し、和訳版は少し古いので、最新のバージョンにする人は最終的には英語版を読みましょう)
そしてその後に手順書を書いて、気になるところを都度調べていくと良いです。
1.どのバージョンにアップグレードするのか決める
まずはどのバージョンにアップグレードするのか決めましょう。(決めないことには始まりません)
「僕は優柔不断なので決められない。誰か決めて!」
と言う人には基本的には最新をお勧めします。理由はバグが可能な限り修正されているから。
しかし、人によっては最新が常に良いとは限らないのが難しいところ。
機能が削除されていたり、リグレッションがあったり、機能追加で新たなバグが生まれたり…
ここを絶対に間違えたくない!と言う人はyoku0825さんの話(これとかこれとかこれ)なんかを参考にしてみるのが良いかもしれません。
アップグレードパス
もしあなたが5.6を使っていて8.0や8.xへのアップグレードを考えている場合、二回以上のアップグレードが必要になります。
と言うのも、MySQL Serverではバージョンまたぎのアップグレードをサポートしていないからです。
(ここでは闇の下法をお勧めしないので標準的なやり方を記載してます)
例えば、
- 5.7から8.0、8.0.34以降から8.xなどは一回です。
- 5.7以前から8.x、8.0.33以前から8.xは二回以上アップグレードが必要です。
そのため、アップグレードパスを確認して、アップグレードが一回で済むのか二回以上かかるのかを確認します。
のアップグレードパスドキュメントを読みます。
以降のクリック先のURLは8.0ベースにしていますが、画面の右上にあるバージョンのリストから自分のアップグレード先を選択してください。
2回以上アップグレードが必要な場合は2ページずつ読む必要があります。
(例:5.6 -> 5.7 -> 8.0 なら5.7と8.0の分をそれぞれ読む)
※アップグレード先のバージョンとOSのコンパチを確認する
アップグレードしたらOSがサポート外なんてことがないように対応プラットフォームのページを必ず見ておきましょう。
※5.7が既にEOLになってて見れません…。そんな時どうすれば良いかについては後述の「余談その3.魚拓を見る」を参考にしてください。
2.新機能・追加・非推奨・削除された機能を確認する。
特に、削除された機能とかオプションとかはアップグレード時(新バージョンのmysqldで起動時)に失敗する元になりやすいので必ず一読しておいてください。
マイナーバージョンアップグレードの場合はリリースノート で差分を読むのもおすすめです
こちらは必須ではありませんが、特定の問題を回避したい場合などに特定の単語やバグIDで検索したりしてどのバージョンが目的を達成するための最低条件なのかが分かります。
ドキュメントには無いけど…
バージョン間の差分を確認するのに便利なのが日本MySQLユーザー会(MyNA)代表のとみたさんが公開しているMySQL Parametersです
使い方等はとみたさんのブログを参照していただくのが良いですが、パラメータに限らず文字コードやシステムテーブル等まで差分比較ができるので非常に便利です。
便利すぎて、海外の中の人やお客さんまでもが使っていたりしますw
細かいことはドキュメントを読んでもらえばいいんですが、大事なのは
「Read Onlyノードからアップグレードし、Read Writeノードは最後!」
ってことです。(=プライマリとかソース(マスター)を最後にアップグレードする)
4.OSごとにアップグレード手順を確認→手順書作成
各OSごとにアップグレードの手順が微妙に異なります。
とは言っても、Windows以外はコマンドの違いとかだったりで、作業パターンとしては共通だったりします。
なので、他のOSのアップグレード手順に、自分のOSのアップグレード作業時にも役立つ話があったりするので、一通り目を通しておくとよりアップグレード手順というものを理解することができるでしょう。
(時間が惜しい人は関連OSの情報のみ読む感じでOKです)
論理アップグレードとインプレースアップグレード
方法としては大きく分けて2つです。
論理アップグレードとインプレースアップグレードです。
論理アップグレードはバックアップを取って、新バージョンのMySQL Serverがインストールされたところにリストアする方法で、
インプレースアップグレードは直接今使っているMySQL Serverをアップグレードする方法です。
論理アップグレードのメリットはアップグレード時やアップグレード後に
「問題が発生したー!Σ(゚д゚lll)ガーン」
ってなった時に切り戻し作業が楽なこと、
インプレースアップグレードのメリットは別インスタンスを作る必要が無い事です。
インプレースアップグレードでやる人は論理アップグレードの方法については読み飛ばせます。
(逆もしかりです)
4-1.論理アップグレードの方法
簡単に言うとインストールして、バックアップ取って、リストアです。
なので、見るべきドキュメントはインストールとバックアップとリストアのものになります。
インストール
Linuxの場合、インストールに関するドキュメントが非常に多く混乱するのはここでしょう。
汎用バイナリを使用したUnix/LinuxへのMySQLのインストール か、
LinuxへのMySQLのインストールに分かれますが、これは最初のほうにあった
対応プラットフォームのページに載っているOSかそうじゃないかで分かれます。
(注:対応プラットフォームのページに載っていないOSにインストールした場合、それは対応プラットフォームでも再現するのであればバグになりますが、そうでない場合そのOS特有の現象とされ、修正されない可能性があります)
対応プラットフォームのページに載っている各LinuxOSごとに用意されているバイナリやインストール方法は以下のように細分化されています。
複数使えたとしても最終的に選ぶのはどれか一つです。関係しそうなものだけ読めばいいでしょう。
Windows(インストール)もいくつかのインストール方法があります。
WindowsについてはインストーラとZIPアーカイブ両方見ておくといいでしょう。なぜなら今後のアップグレードにも役に立つからです。
その他のOSについては以下の通りです。
バックアップとリストア
バックアップのパターンは物理と論理がありますが、それぞれでまた使うツールが変わります。
ここにどのようなバックアップやリストア手法があるかが書かれていますが、論理アップグレードでよく使うのは以下の3つのどれかでしょう。
- mysqldump
- MySQL Shellのダンプロードユーティリティ
- mysqlpump
mysqldump
昔ながらおなじみの論理バックアップの定番、mysqldumpです。
論理アップグレードの手順にもありますが、以下のようなコマンドを実行します。
mysqldump -u root -p
--add-drop-table --routines --events
--all-databases --force > data-for-upgrade.sql
インポートは以下のような感じです。(必ずインポート先で! )
mysql -u root -p < data-for-upgrade.sql
MySQL Shellのダンプロードユーティリティ
mysqldumpだと処理がシーケンシャルなのでCPUをガッツリ使って並列処理化して高速にバックアップ・リストアしたいと言う方にはMySQL Shellのダンプロードユーティリティがおすすめです。
ダンプはここ、ロードはここのドキュメントをじっくり読んで試してみましょう。
多分最初は慣れが必要ですが、使い方に慣れたころにdumpInstanceやdumpSchemasで必要なものを全て取得するようにします。
例えば以下を実行すると、16スレッドでカレントディレクトリ直下にdb-migrateフォルダを作って、ビューやルーチンやイベントおよびトリガからはDEFINER節を削除した定義を作ります。
util.dumpInstance("db-migrate",{threads: 16 , compatibility: ["strip_definers"]})
ロードはフォルダごと取得元から移動して、以下を実行です。
util.loadDump("db-migrate",{threads: 16})
オプションは色々あって、試してもらえばいいですがそんな複雑なことは無いはずです。テスト環境で色々試して雰囲気を一度つかんでみればそんなに難しくないことが分かると思います。
mysqlpump
残念ながらmysqlpumpはMySQL 8.0.34で非推奨(一応使える)となりました。
理由はMySQL Shellのダンプロードユーティリティができたから。
データインポート時は結局シーケンシャルだし、ちょっと致命的なバグもちらほらあったのも原因かもしれません。
それでもmysqldumpっぽく、スキーマ単位ですが、パラレルにダンプを取得できるので、使いたいという人はいるかもしれません。
和訳版を添付しておきますので、使いたい方はご参照ください。
MySQL :: MySQL 8.0 Reference Manual :: 4.5.6 mysqlpump — A Database Backup Program
4-2.OSごとのアップグレード方法(論理以外)
論理アップグレードは既に記載したので、残りはインプレース形式やその他についてです。
インストーラを使ったアップグレードはバージョン間をまたぐアップグレードに使えません。
どうしてもインストーラを使いたい場合は、
- 論理アップグレード
- 旧Verのアンインストール+新Verのインストール+データディレクトリの付替
- マイナーバージョンアップグレードだけ行う
となります。
インストーラを使うと良いのはレジストリの情報が更新されるので、一度でもインストーラでインストールした場合には、その後インストーラを使ってアップグレードをする場合に便利な点です。
逆に言うと、メジャーアップグレードでは2のような方法でしかできないので、この後のWindows ZIP ディストリビューションを使用した MySQL のアップグレードと何が違うんだという話にもなりますが、インストーラーから見えるバージョンが更新したい人にはおすすめです。
通常はWindows ZIP ディストリビューションを使用した MySQL のアップグレードがメジャーアップグレードの基本的な方法です。
その他のアップグレード
ソースからビルドですが、最近はツヨツヨなお兄さんたちがビルドで記事書いてくれてたりするんでそっちを見たほうが良いかもしれませんね。(本番環境でそういうのを使う人は稀でしょうが)
4-3.MySQL Serverが8.0.15以前はmysql_upgrade必須
ここはMySQL Serverが8.0.16にアップグレードする人はスキップしても大丈夫です。
但し、5.6から5.7にアップグレードする人は必ず以下のドキュメントを読んでmysql_upgradeを新バージョン起動直後に行ってください。
mysql_upgradeのドキュメント
5.アップグレードチェッカーで事前チェック
ここで作った手順に過不足ないか、事前作業に漏れが無いかがチェックできます。
開発環境に本番環境のバックアップをリストアし、アップグレードチェッカー(MySQL Shellのutil.checkForServerUpgrade()ユーティリティ)でテーブル等に問題が無いかチェックしましょう。
完璧ではありませんが、新機能・追加・非推奨・削除された機能などのチェック漏れができますので、使って損はありません。
6.アップグレードするためのブツを手に入れましょう
コミュニティエディションはここからダウンロードできます。
ここからダウンロードできるのはコミュニティエディションですが、サポート契約をしている人は別の場所から商用版をダウンロードできます。
また、サポート契約をしている人はドキュメント以外の詳細な作業手順や注意点が書かれたナレッジドキュメントを参照することもでき、かつサポートからも対象のバージョンで注意しておく点などを聞くことができます。(宣伝)
7.作業手順書に基づいてLet's Try!!
- 作業直前にデータベースのバックアップは必ず取りましょう。いざとなったら戻せるように。
- システム止めていられる時間にはバッファをもっておきましょう。
- 切り戻しの手順も固めておきましょう。
- 開発環境で何度もアップグレードと切り戻しのテストをしておきましょう。(作業時間の短縮は作業の慣れに比例する)
- パフォーマンスの問題が無いかについても開発でしっかり検証しておくのをお勧めします。
8.問題が起きたら?
まずはエラーログを見てみましょう。アップグレード作業中のどこかで [ERROR] となっている箇所があればそれについてググってみましょう。
そして、前述の新機能・追加・非推奨・削除された機能にあった各ページを見て、それらが関係していないか確認してみましょう。
次に以下のドキュメントを読んでみましょう。
どうしてもわからない場合、世の中には多くのMySQLに詳しい人がいます。その人たちにSNS上で聞いてみるのも良いでしょう。
でも彼らもいつでも対応できるわけじゃありません。いざという時にすぐ聞ける人が欲しい!と言う人はサポートに聞けばいいのです。
興味のある方はここから問い合わせができます。
もしくは、明らかにバグだと思われる事象にぶつかったのであれば、バグ登録するのもありです。
調査が進めば開発者達から回避方法や今後の修正方針などのコメントをもらえることがあります。
余談
その1.その他のMySQL製品とか
サーバーをアップグレードするなら、クライアントツール、コネクタ、監視ツール、バックアップツールなどのバージョンが対応しているかも確認が必要です。
アップグレード先のバージョンに対応しているか、あらかじめチェックしておきましょう。
その2.必須ではないけど…
アップグレード前にテーブルたちが健康かどうかをチェックしておくのも大事です。
mysqlcheck や CHECK TABLE コマンドでテーブルたちが壊れてないか見ておくことで、普段使ってなかったけどアップグレード時に参照されて「あーーーー」なんてことが無くなります。
その3.魚拓を見る
MySQLのドキュメント、たまにあるんですが
- 更新されててOSとかのサポートがされてるかわからん
- URLクリックしたら記事が無い
とかいうことがあります。
そういう時、魚拓を見に行くことを自分もしばしばやります。
自分が使っているのはこれですが、色々あると思うのでそれは各自探してみてください。
更新されてしまっているページのURLの過去の記事を探し、そのスナップショットを見ることで当時はそうだったんだ…と確認できます。
その4.その他の参考資料
日本MySQLのSEチームは定期的にセミナーを開いてくれていますが、そこにもたくさんのアップグレード関連の資料があります。
MySQL :: 資料ダウンロード
どれもその時々のドキュメントを要約し、わかりやすく書かれているものばかりです。
情報が少し古くなっていたとしても、ドキュメントと比べて圧倒的に読みやすく、一度は目を通しておくことをお勧めします。
(僕も読むことで認識の漏れに気付くことが過去に何度もありました。感謝!)
最後に
書いてみて思ったけど、結局書き出してみるとそれなりの量があってやっぱり見るのはツライままかもしれませんw
それに作ってみたけど、これがみんなの役に立つかどうかはわからない。
でも自分で見直す時に良いかもと思って備忘録的に作ってみたということで自己満足にはなりました。
おそらく、新しいバージョンが出れば、気が向いたときに更新すると思います。
サポートしてない方法も含めれば実はアップグレード方法はこの限りではありません。
それでも、ドキュメントにある話を知った上で使うのとそうでないのとではリスクが全然違います。
どうしてもドキュメントにある方法じゃないやり方をするにしてもまずは基本を知っておくべきです。
こんな駄文でも、誰かのお役にも立てれば幸いです。
MySQL Advent Calendar 2023参加者の皆さん、お疲れさまでした。
MySQLにとっても自分たちにとっても来年もいい年になると良いなあ、と思ってます。
では、良いお年を~~~!!