41から始めました

文字通り41歳から始めたブログです。DB(MySQL)を使ってお仕事してるので、DB周りの話を中心に最近始めたこととかをTwitterのノリで書いています。なお、本サイトにおいて示されている見解は私個人の見解であり、所属団体や組織を代表するものではありません。

みんな、8.0のEOLは半年後だよ!

みんな、気づいているかい?8.0のEOL半年後だよ!

なんか、ブログ書けって天の声が聞こえた気がしたんで、雑に書いてみました。

ちなみに、ここでの発言は完全に個人の見解なので、

会社を代表して言っていることではない

ことを先にお伝えしておきます。

2026年4月に8.0はEOL

ここで言われる8.0とはMySQLとOCIのMySQL Database Service(HeatWave含む。以下MDSと記載)のことを言います。

4月何日までですかー?って良く聞かれるんですが、日にちが指定されてなければ通常末日までです。

つまりMySQL 8.0は2026年4月30日でEOL。

(とはいえ、実際は、最終マイナーバージョン出たらそれ以上パッチ出ないんで、出たその日って考えても同様ですけどね)

EOLの確認場所

どこで確認するんですか?というと、MySQLOracle Lifetime Support Policy: Technology Productsで、"MySQL" で検索したところに書かれており、

MDSはOCIのドキュメントの「MySQL HeatWaveサービスにおける8.0リリースのスケジュール」に書かれています。

MDSの使用不可はEOLとは別

MySQL Serverと違い、MDSだとEOLとは別に、使用不可となるタイミングがマイナーバージョンにあって、EOL前にアップグレードタイミングが強制的に来ます。(8.0.40以下はMySQLのEOL前に必ずアップグレードタイミングが一回来るというわけです)

データベース周りのアレコレのアップグレード

当然、8.0というバージョンはMySQL Serverだけではなく、他のMySQL関連製品でもEOLになります。

そのため、アップグレードが必要なのですが、ここでEE版も含めて現在提供されている製品一覧を上げると、以下の通りです。

クライアント / ツール バージョン MySQL Server 8.0 MySQL Server 8.4 LTS MySQL Server 9 (Innovation) 推奨事項
MySQL Shell 8.0 / 8.4 LTS / 9 9.x への更新を推奨
MySQL Router 8.0 / 8.4 LTS / 9 9.x への更新を推奨
MySQL Connector 各種 9 9.x が必須
MySQL Shell for VS Code 9 最新サーバーでは VS Code 版の利用を推奨
Oracle Enterprise Manager for MySQL 13.2.4.0.0 OEM の対応バージョンを確認
MySQL Enterprise Backup 各種 ● 同一バージョンでのリストアが必要(例: 8.0.x) ● 最新版を使用(最低 8.4.3 以上) ● 同一バージョンでのバックアップ/リストアが必要 バックアップとリストアで同一バージョンを使用
MySQL Workbench 8.0 VS Code 版 Shell の利用を検討
MySQL Operator for Kubernetes 8.0 / 8.4 LTS / 9 9.x への更新を推奨

凡例:● = 対応/ ⚠ = 一部制限あり / — = 非対応
出典:MySQL Supported Platforms - Compatibility

NDB Cluster

現在はMySQL Serverと同じ...かと思いきや、実はスケジュールが違いますw

こちらは2028年1月までです。なので、安心してご利用継続ください。

mysql クライアント

基本的にはMySQL Serverと同じが良いと思います。

MySQL Serverのローカルのクライアントと、リモートのクライアントのバージョンが違ってて挙動違ってたら嫌ですし。

MySQL Shell & Router

これらが実は方針が変わったやつらで、注意が必要です。

こいつら、最新の9.5とかではまだInnovation Releaseってうたってるのに(Shell,Router)上記の表では9にアップグレードすることを推奨しています。

理由は、MySQL Shellのリリースノートを見るとわかると思います。

機能の差があるとはいえ、修正数が違い過ぎる。。。8.0.44については修正0。

MySQL Shellについては9.xにのみ修正を充てていく方針になったように見えます。

Routerのほうはリリースノートを見比べた感じではMySQL Shellほどあからさまなことはやっていませんが、先のマトリクスでShellと同じ文言を記載している以上、揃えておいたほうが良いでしょう。

ShellもRouterも下位互換性はあるので、最新を使うことによる問題はありませんし、あればそれはバグなので登録すれば修正されます。

逆に8.0や8.4を使っていた場合、バグを登録しても、アップグレードしてください、と言われるだけとなる可能性があります。

Innovation Releaseだからどっちにしろ発生したらアップグレードやんけ!というのはそうなんですが、Serverよりはアップグレードしやすいですし…、Shellだけでも常に最新使うのを強くお勧めします。(Routerは今後のリリースノートを要チェック)

MySQL Operator

こいつも上記のShellの理由から9.xの利用が推奨されているんだと予想。

しかし、新機能がバンバン入っていくので、MySQL Serverも9.xになるMySQL Operatorは本番運用に向いてると言えるのだろうか?という不安が…。

MySQL Connector

いずれも既に9.xがGAなので、Shell同様、最新を使うのがベターです。(というよりはコネクターがそうだからShellがそうしたのではないかという気も)

MySQL Workbench

EOLではないらしいんですが、現在は8.0.42までしか修正は適用されておらず、開発は止まっている様子。(8.4,9.x版は現状は無い)

Workbench8.0からMySQL Server8.4に対して接続・作業をした場合、一部の機能で不具合が発生する可能性があるもよう。

現状では代替品としてはMySQL Shell for VS Code(最新は1.19.18+9.5.0)となります。 (但し、商用版は無いので何かあった場合はバグレポートに登録しましょう)

その他

OEMとかMEBはEEサポートが必要なのでここではスルー

さいごに

あと半年でMySQL Server8.0がEOL。

そうなるとあれやこれやもアップグレードしなきゃ!ってなりますが、大丈夫ですかー、みなさん?

っていう注意喚起しつつ、なんか周辺がややこしいことになってるんで、ちょっと書いてみました。

マジかよーって思いながらご検討ください。

ゆるふわ MySQL AIインストール手順

はじめに

なんか僕らの大好きな(?)ニプンがMySQL AIについて紹介してたんで、じゃ、名前もアレだし、とりあえず手を出してみっか!と軽い気持ちで踏み込んでしまいました。

前提条件/必要要件

項目 内容
サポートされる OS Oracle Linux 8、Red Hat Enterprise Linux 8
ハードウェア要件 CPU:32 論理/仮想コア以上、メモリ:128 GB、ストレージ:512 GB
ライセンス MySQL Enterprise Edition のライセンスが必要
管理者権限 sudo が使えるユーザーで操作できること
TLS 証明書 独自の TLS/SSL 証明書/鍵を利用するなら MySQL の要件を満たすもの。ない場合はセルフサイン証明書を生成可能。

ここで残念なのがEEのライセンスが必要なところだろう…。CEでも試させ、おっと、誰か来たようだ…

インストール手順

以下に、GUI モードおよびコマンドラインモードの二種類のインストール方法を示します。

GUICLI共通 インストール作業

GUIモードおよびコマンドラインモードでも共通部分があるため、まずその部分を記載します。

1. RPM バンドルを取得

My Oracle Support (MOS) または Oracle Software Delivery Cloud から MySQL AI の RPM バンドルをダウンロードする。

Oracle Software Delivery Cloudからダウンロードのイメージ

https://downloads.mysql.com/docs/mysql-ai-9.4-en.pdf

2. バンドルを展開

$> tar -xvf mysql-ai-version.distro.arch.rpm-bundle.tar

もしくは

$> unzip V1051679-01.zip

解凍した後はこんな風になる

$ ls -ltrh
total 12G
-rw-r--r-- 1 takiida common  42M Aug 26 15:26 mysql-ai-client-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 725K Aug 26 15:26 mysql-ai-common-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common  16M Aug 26 15:26 mysql-ai-client-plugins-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common  23M Aug 26 15:26 mysql-ai-devel-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 2.3M Aug 26 15:26 mysql-ai-icu-data-files-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 1.9G Aug 26 15:26 mysql-ai-heatwave-ml-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 4.7M Aug 26 15:26 mysql-ai-libs-compat-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 4.3M Aug 26 15:26 mysql-ai-libs-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 1.9G Aug 26 15:26 mysql-ai-llm-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 100M Aug 26 15:26 mysql-ai-rpdheatpump-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 101K Aug 26 15:26 mysql-ai-selinux-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 230M Aug 26 15:26 mysql-ai-rpdserver-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 531M Aug 26 15:27 mysql-ai-server-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 1.2M Aug 26 15:27 mysql-ai-setup-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 358M Aug 26 15:27 mysql-ai-server-debug-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 238M Aug 26 15:27 mysql-ai-studio-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 3.8M Aug 26 15:27 mysql-commercial-backup-9.4.1-1.5.1.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 467M Aug 26 15:27 mysql-ai-test-9.4.1-1.2.el8.x86_64.rpm
-rw-r--r-- 1 takiida common  68M Aug 26 15:27 mysql-router-commercial-9.4.1-1.5.1.el8.x86_64.rpm
-rw-r--r-- 1 takiida common 116M Aug 26 15:27 mysql-shell-commercial-9.4.1-1.1.el8.x86_64.rpm
-rw-r--r-- 1 takiida common   64 Sep  3 09:44 README.txt
-rw-r--r-- 1 takiida common 5.9G Sep 17 10:48 V1051679-01.zip

ちょっとヘルプを見てみる。

$ sudo mysql-ai-setup --help
usage: mysql-ai-setup [-h] [--cli] [--skip-install] [--script-only] [--datadir D] [--skip-requirements] [--mysql-root-user N] [--mysql-root-password P] [--mysql-root-allow-remote-connections] [--skip-mysql-studio]
                      [--install-mysql-studio] [--mysql-studio-port P] [--skip-mysql-shell-gui] [--install-mysql-shell-gui] [--mysql-shell-gui-port P] [--skip-mysql-router] [--install-mysql-router]
                      [--mysql-router-port P] [--mysql-router-jwt-secret P] [--secure-file-priv P] [--mysql-server-tls-certificate P] [--mysql-server-tls-private-key P] [--skip-ai-encryption]
                      [--ai-plugin-certificate P] [--ai-plugin-private-key P] [--ai-plugin-common-name P] [--ai-services-certificate P] [--ai-services-private-key P] [--ai-services-common-name P]
                      [--ai-plugin-create-self-signed-certificate CN] [--ai-services-create-self-signed-certificate CN] [--mysql-studio-https-certificate P] [--mysql-studio-https-private-key P]
                      [--mysql-shell-https-certificate P] [--mysql-shell-https-private-key P] [--mysql-router-https-certificate P] [--mysql-router-https-private-key P]

Install MySQL AI.

options:
  -h, --help            show this help message and exit
  --cli                 run in command line mode only
  --skip-install        do not apply any of the choices made
  --script-only         Do not install, only output the steps as a shell script
  --datadir D           The location of the MySQL data directory
  --skip-requirements   ignore unmet system requirements
  --mysql-root-user N   the user name of the administrative MySQL user
  --mysql-root-password P
                        the password of the administrative MySQL user
  --mysql-root-allow-remote-connections
                        allow remote connections as the administrative MySQL user
  --skip-mysql-studio   do not install MySQL Studio
  --install-mysql-studio
                        install MySQL Studio
  --mysql-studio-port P
                        the port to use for the MySQL Studio https server
  --skip-mysql-shell-gui
                        do not install the MySQL Shell GUI service
  --install-mysql-shell-gui
                        install the MySQL Shell GUI service
  --mysql-shell-gui-port P
                        the port to use for the MySQL Shell GUI https server
  --skip-mysql-router   do not install the MySQL Router service
  --install-mysql-router
                        install the MySQL Router service
  --mysql-router-port P
                        the port to use for the MySQL REST service
  --mysql-router-jwt-secret P
                        the JWT secret to use for MySQL Router
  --secure-file-priv P  the path to configure for secure file access by mysqld and vector store
  --mysql-server-tls-certificate P
                        the certificate for encrypted connections to use by MySQL Server
  --mysql-server-tls-private-key P
                        the private key for encrypted connections to use by MySQL Server
  --skip-ai-encryption  disable encryption between MySQL Server and the AI&ML services
  --ai-plugin-certificate P
                        the certificate for encrypted connections to use by the MySQL Server AI&ML plugin
  --ai-plugin-private-key P
                        the private key for encrypted connections to use by the MySQL Server AI&ML plugin
  --ai-plugin-common-name P
                        the common name to use by the MySQL Server AI&ML plugin
  --ai-services-certificate P
                        the certificate for encrypted connections to use by AI&ML services
  --ai-services-private-key P
                        the private key for encrypted connections to use by AI&ML services
  --ai-services-common-name P
                        the common name to use by AI&ML services
  --ai-plugin-create-self-signed-certificate CN
                        create a self-signed certificate for the AI plugin
  --ai-services-create-self-signed-certificate CN
                        create a self-signed certificate for the AI services
  --mysql-studio-https-certificate P
                        the certificate for https connections to use by MySQL Studio
  --mysql-studio-https-private-key P
                        the private key for https connections to use by MySQL Studio
  --mysql-shell-https-certificate P
                        the certificate for https connections to use by the MySQL Shell GUI
  --mysql-shell-https-private-key P
                        the private key for https connections to use by the MySQL Shell GUI
  --mysql-router-https-certificate P
                        the certificate for https connections to use by the MySQL REST Service
  --mysql-router-https-private-key P
                        the private key for https connections to use by the MySQL REST Service

Copyright (c) 2025, Oracle and/or its affiliates.

3. インストーラをインストール

$> sudo dnf localinstall mysql-ai-setup-version.distro.arch.rpm

上の例だと

$ sudo dnf localinstall mysql-ai-setup-9.4.1-1.2.el8.x86_64.rpm
Last metadata expiration check: 1 day, 11:33:12 ago on Tue 16 Sep 2025 04:25:27 PM CEST.
Dependencies resolved.
============================================================================================================================================================================================
 Package                                         Architecture                            Version                                        Repository                                     Size
============================================================================================================================================================================================
Installing:
 mysql-ai-setup                                  x86_64                                  9.4.1-1.2.el8                                  @commandline                                  1.2 M

Transaction Summary
============================================================================================================================================================================================
Install  1 Package

Total size: 1.2 M
Installed size: 4.8 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                                    1/1
  Installing       : mysql-ai-setup-9.4.1-1.2.el8.x86_64                                                                                                                                1/1
  Running scriptlet: mysql-ai-setup-9.4.1-1.2.el8.x86_64                                                                                                                                1/1
  Verifying        : mysql-ai-setup-9.4.1-1.2.el8.x86_64                                                                                                                                1/1

Installed:
  mysql-ai-setup-9.4.1-1.2.el8.x86_64

Complete!

これで mysql-ai-setup コマンドが使えるようになる。

A. GUI インストール作業

まずはGUIインストール方法を以下記載します。(CLIで行う人はBまでスキップ)

(実は自分はGUI未タッチです。ドキュメント等から転記してますが、間違ってたらごめんね)

4. GUI インストーラを起動

展開した RPMディレクトリで、以下を実行:

$> sudo mysql-ai-setup

GUI モードでのインストールが始まる。

5. GUI による設定ページを順に進める

GUI によって以下のような設定を順番に行う:

ページ 内容
Introduction 続行 (“Continue”) をクリック。
System Requirements ハードウェア/ソフトウェア要件のチェック。足りない場合は“Continue Anyway”かインストール中止を選択。
User & password root ユーザー名とパスワードを設定。validate_password コンポーネントのポリシー(少なくとも “MEDIUM”)を満たす必要あり。ローカル接続のみ許可するかなどを選択。
MySQL Studio ウェブ GUIMySQL Studio” のインストール/ポート番号設定(デフォルトは 8080)
Router & Shell MySQL Shell GUI**(Workbench)や MySQL Router / MySQL REST Service の設定。どちらを入れるか選択。ポート番号の変更可能。 JSON Web Token のシークレット設定。
Vector Store ドキュメントなどをロードするベクトルストアのディレクトリを指定。 secure_file_priv システム変数で mysqld がそのディレクトリから安全にインポートできるよう設定されている必要あり。デフォルトは /var/lib/mysql-files。存在しなければ作成される。
Certificates コンポーネント間の TLS 通信のための証明書/鍵を指定。証明書・鍵ファイルは root によって読み込め、パスフレーズなし。CN(Common Name)などを確認。指定しなければセルフサイン証明書が生成される。)
Finalize Installation 設定内容を最終確認し、ポートの重複など問題がなければインストール開始。インストール完了後は各コンポーネントの URL/エンドポイントが表示される。

6. インストール完了後

GUI が終了すると、MySQL Studio や Shell GUI、REST Service のエンドポイントの情報が出力されるのでメモしておく。

B. コマンドラインCLI)インストール作業

こちらはコマンドラインCLI)によるインストールです。(Aで作業をしている場合は不要)

GUI を使いたくない、サーバー環境などで GUI が使えない場合はこの方法で行います。

4. mysql-ai-setup を CLI モードで起動:

$> sudo mysql-ai-setup --cli [オプション]

主なオプションについては以下参照:

オプション 内容
--skip-install 実際のインストールはせず、要件チェックやオプション指定のテストのみ行う。
--skip-requirements 最低要件を満たしていなくてもインストールを強行する。 ※性能や動作保証に問題が出る可能性あり。
--mysql-root-user=ユーザー名 root ユーザー名指定
--mysql-root-password=パスワード root パスワード指定(validate_password の MEDIUM レベルを遵守)
--mysql-root-allow-remote-connection root に対してローカル以外からの接続を許可する設定
--install-mysql-studio / --skip-mysql-studio MySQL Studio の導入/スキップを指定
--mysql-studio-port=ポート番号 MySQL Studio 用ポートの指定
--install-mysql-shell-gui / --skip-mysql-shell-gui Shell GUI(Workbench 相当)を入れるかどうか指定
--mysql-shell-gui-port=ポート番号 Shell GUI 用ポート指定
--skip-mysql-router / --mysql-router-port=ポート番号 REST サービスを含む Router の導入・ポート指定
--mysql-router-jwt-secret=シークレット REST Service の JWT シークレットを指定。指定しないとランダムに生成される。
--secure-file-priv=ディレクトリ ベクトルストア用ディレクトリ。mysqld の secure_file_priv と整合性を持たせる必要あり。
TLS 証明書/鍵指定オプション コンポーネントの通信を暗号化したい場合に証明書や鍵をパラメータで渡す。ファイル/バンドル/秘密鍵など。パスフレーズ保護なし。

CLIによるインストール例

$> sudo mysql-ai-setup --cli \
  --mysql-root-user=root \
  --mysql-root-password="StrongPassw0rd!" \
  --mysql-root-allow-remote-connection \
  --install-mysql-studio \
  --mysql-studio-port=8080 \
  --install-mysql-shell-gui \
  --mysql-shell-gui-port=8081 \
  --mysql-router-port=6446 \
  --mysql-router-jwt-secret="MyJWTSecret123" \
  --secure-file-priv=/var/lib/mysql-files

しかしである。

System requirements not met.
Disk Space:   168.2 G < 512 G!
Note: The requirements check can be disabled with --skip-requirements.
Installation cancelled.

そう、そんなにでかい領域簡単に手に入らないわけで。。。どーせ、テストだと思い、言われるがままに--skip-requirementsをつけてみると今度は

No certificates for communication between MySQL Server and the ML and AI subsystems.
Encryption between these components needs to be disabled explicitly (--skip-ai-encryption).
Installation cancelled.

証明書ですか。今から作るのめんどいな(オイ!)。よし、--skip-ai-encryptionしちゃおう!ってんで、自分は先に進めちゃいました。

みんなはマネしちゃだめですよ?w

5. CLI モードでインストール実行後、同様にエンドポイントやサービスが起動し、設定内容が有効になる。

完了すると、こんな感じのメッセージが出ます。

==============================================================================
Installation finished.
==============================================================================

To access MySQL Studio, navigate to the following
URL in a web browser:

    https://honyarara-hogehoge.com:8080/

To access a SQL shell for this MySQL AI instance, navigate to the following
URL in a web browser:

    https://honyarara-hogehoge.com:8081/


==============================================================================

https://honyarara-hogehoge.com:8080/のほうにつなぐとMySQL Studioである。AI Chatなどもこっちにあるし、ドキュメントにそれぞれの使い方は書いてあるようだ。

8080

しかし、

https://honyarara-hogehoge.com:8081/のほうにつなぐと、なんとMySQL SHELL Workbenchなるものが!

8081
詳細な情報はどこにもない。(名前だけMySQL AIのドキュメント上にあるが、使い方などはさっぱり。)今後に期待しよう…。

作業後の確認ポイント

  • インストール後、以下が期待どおりに動作するか確認:
    1. MySQL Server が起動していること(systemctl status mysqld 等)
    2. MySQL AI プラグインや Machine Learning Service コンポーネントがロードされているか
    3. REST サービス、Shell GUI、Studio などをブラウザからアクセス可能か(設定したポートおよび URL)
    4. TLS 通信を有効にした場合、証明書が正しく読み取られているか、ブラウザなどで HTTPS 接続がエラーにならないか
    5. ベクトルストアのディレクトリの読み書き権限、セキュリティ設定が正しいか
  • 性能テストを行い、必要ならリソース(CPU、メモリ、ディスク)のモニタリングを実施。
  • セキュリティ面で、不要な公開ポートを閉じる、ルートユーザー/管理者ユーザーのリモートアクセス制限を確認する。

おわりに

MySQL EEのライセンスが無いと遊べない、RHEL系8のみ、OSリソース結構デカい(まあ、AI動かすんやし、しゃあなし?)という感じであんまり気軽に遊べないのだが、これらすべてクリアできる人は試してみて欲しい。

参照情報

https://dev.mysql.com/doc/mysql-ai/9.4/en/

https://downloads.mysql.com/docs/mysql-ai-9.4-en.pdf

https://dev.mysql.com/doc/dev/mysql-studio/latest/#my-files

【番外編】ウォルト・ディズニー・ワールド(WDW)へ(旅行編その1[移動関連])

備忘録として準備編と今回の旅行編を書きなぐった。

誰かのWDW旅行の参考になれば良いし、そうじゃなくても自分のアメリカ再上陸時に使えればと思って。

今回は旅行編の前半、移動に関する部分を記す。

家-成田空港

AirCanadaは成田空港第一ターミナル。今は上大岡という横浜市のある街が最寄りなので、成田空港までは以下のような経路があった。

他にも時間をずらせば色々あるのだが、行きは成田エクスプレス、帰りは京成成田スカイアクセスを使って乗り換えを最少にした。

家と最寄り駅の上大岡間は車で荷物と人を運んだ。

at 成田空港

AirCanadaは T1 南ウイング / 4F

しかし、午前中は誰もいなかったw

機械でチェックインだけはできたので、とりあえずチェックインはしつつ、お昼を食べに行った。

お昼後に再度窓口に行ったら、日本語が通じるお姉さんがいたので、その人と話して荷物を預け、ANAマイレージもつけてもらい(カードを見せてお願いしないと付けてくれないらしい)、経由のモントリオール空港では荷物受け取らなくていいのよね?と再確認しました。(もちろん受け取らなくていい)

事前に見た時は空席だらけだったのに、行ってみたら満員状態。

しかもゾーン毎に早々に列が出来てて、早く機内に載って荷物を棚に入れようという人だらけ。自分たちも並んで、無事荷物を不要な棚に入れることができました。

AirCanada

飛行機としては可もなく不可もなく。

機内食は自分は完食したし、味も悪くない。凄くうまい!とは言わないが、問題はない。

枕とブランケットを1つずつくれたが、予備は無いらしく、足りない人は自分で用意したほうが良いかも。

エコノミーは狭い。これはどの飛行機でもそうだと思うけど…。もう自分はエコノミー、無理かもしれないw

カナダ乗り継ぎ(モントリオール

モントリオールまで約12時間半。遠い。ハワイまでの7~8時間とか軽い軽い。

ヨーロッパ行った時と変わらんのに驚いた。(しかも、パリとかミラノとか、直行だったからより堪える…)

ちなみに、乗り継ぎ自体は超楽。ほぼ一直線で、みんなの流れに乗りつつ、案内に従えばあっという間に終わる。

パスポートにETAの情報が紐づいてるので、聞かれることとしても受け答えが必要なのは「なんか食べ物とか持ち込んでる?」くらい。

並ぶ時間もほぼ無く、カナダ楽!(帰りの成田に着いて、日本人以外が長蛇の列になっているのを見たら、ああ、これがアメリカだと起きるんだな…と)

アメリカへの入国はこのカナダ上で行うので、オーランドでは何もなく、荷物を受け取るだけになります。

そういえば、ここでキオスクっていう機械での対応がある、みたいな話だったけど、それ、成田でやったからか、モントリオール空港では一切無かったなー、今回。

オーランド空港

乗り継いだ飛行機で3時間半ほどかけてオーランド空港へ。着いたのは深夜の23時30分頃。

この空港、バカでかい。流れに乗ってモノレールに乗って、別の場所で荷物を受け取る必要がある。

こんな作りになってて、飛行機発着の部分が長方形の角のところから出てるモノレールでつながってるイメージ

オーランド空港

荷物を受け取った後、MEARS CONNECTのバス乗り場が分からないw

実は荷物を受け取ったのが2階だったので、1階に降りる必要がありました。(階のことを現地ではレベルって呼んでて、それに最初気付かず)

1階の端っこにMEARS CONNECTのバス乗り場があります。(ターミナルBレベル1、地上交通機関、バス乗り場B42からB48までってあるけど、初回だと分かりにくい…)

1階にエレベーターで降りたら回れ左でまっすぐ歩く感じですね。遠くのつきあたりにそれっぽいのが見えたら正解。

帰りはこれを逆順に行い、オーランド空港で受付に行って、荷物を預けてモノレールに乗って、自分たちの乗る飛行機の乗り場に行くだけ。

MEARS CONNECT(バス)

入り口でスマホに来たSMSに添付されたQRコードを見せると、「おめーらはどこのホテル行くんだ?」と聞かれるので、「xxxだ」というと、レーンを案内されます。

ちなみに、バスに乗る時にも「どのホテルに泊まるんだ?」と聞かれるので答えてください。

バスを降りたらチップを渡すと良いです。(渡さない人もいましたが、自分は行きも帰りも5ドルずつ渡してました)

帰りはホテルの前にAIRPORT SHUTTLEと書かれた看板があるので、その前で待っていればそこに来ます。

バスの車内が非常に寒くて、凍えました。クーラーがガンガン効いてて。上着無かったら風邪ひいてたかも。

チェックイン・ホテルについて

スマホでディズニーアプリから部屋のチェックインができます。部屋のアンロックもできるので、スマホを使えば直接部屋へ行けそうですが、翌日以降にパークに入るためにもカードが必要です。

そのため、ホテルのフロントに寄り、カードをもらいに行きました。

車で来る人はパークチケットがあれば駐車場代は無料らしいです。

あと、帰ってから気付きましたが、ホテル内にゲームセンターがあるんですが、それらのゲーム、基本無料らしい・・・。子供が悔しがっていましたw

大抵のホテルにプールがついてて、それらも自由に使えます。

フードコートやショップなどもあります。

ランドリーなんかもあり、洗濯物が溜まれば洗濯・乾燥もできます。洗剤も売ってます。

チェックアウト

チェックアウトはスマホでディズニーアプリからできます。

グレーアウトしてできない時間帯があったりしますが、いずれできますし、しなくても勝手に11時になったらチェックアウトされるので、心配いりません。フロントによる必要は一切ありません。

飛行機の遅延

帰りの飛行機が1時間遅れて、乗り継ぎ時間1時間10分しかなく、ヤバイ!と思ったが、到着が10分巻いて、さらに手続き簡略化して10分で搭乗w(いいのか?)

まあ、AirCanadaのモントリオール空港での乗り継ぎに関しては1時間10分の乗り継ぎ時間はぶっちゃけ十分すぎるんだろうとw

飛行機を変えた場合は、荷物の受け取りなどが発生するので、十分な時間が必要だと思います。

飛行機を変えないというのは、こういうところで余計な心配がなく楽ですね。

MCO Reserve

自分たちは朝クッソ早かったので、結果的に不要だったが、MCO Reserveというものがあり、オーランド空港のゲート通過時にできるだけならばなくて済むように予約通路を使う方法がある。

自分たちは朝5時頃に空港にいたので人も少なく、使わなかったが、8時以降なら使ったほうが良いらしい。

免税とかのアレ

黄色い紙で国外での高価な買い物とか、一部の嗜好品などの場合に書く黄色いカードこと税関申告書。

あれが、Visit Japan Webっていうので代用できることに。

Visit Japan Webやってたのに、黄色いあの紙と同じだと気づいておらず、成田でオバちゃん「これ書いたか?」って聞かれて、わざわざ税関申告書を書いて、Visit Japan Webどこで見せるんや?となって、後で気づいた自分w

やっとくとスムーズらしいですが、別に税関申告書でもスムーズだったんで、あまり変わらんかなー、と。

まとめ

今回は移動編です。パークの話はまた後日。

【番外編】ウォルト・ディズニー・ワールド(WDW)へ(準備編)

子供の春休みに併せてアメリカのフロリダにあるウォルト・ディズニー・ワールド(WDW)に行ってきた。 今回はそのことについてつらつら書いてみる。

嫁さんの夢をかなえる旅

と書くと家族思いのような言い方だが、別にそういうわけじゃないw

嫁さんが行きたいと10年以上言い続けており、自分も嫁さんもいい歳で、子供も長時間飛行機に乗れる年齢になったし、周りのお友達は海外旅行したことあるのに、自分は海外旅行したことないと言い始めてきたので、ちょうどいいタイミングかと思い計画した。

パスポート取得

これは事前にしていたので問題無し。

ただ、パスポートが意外とめんどくさいし、時間がかかるので、取ってない人は計画前に用意するのを最初にしたほうが良いかもしれない。

もちろん、行くまでの日数がある程度ある(数か月先)のであれば後回しでもいいんだろうが。

まずは日程を決める

当初、昨年の子供の夏休みか冬休みでの旅行を考えていたのだが、嫁さんのスケジュールが合わず、流れた。

2月頃から嫁さんが仕事量に都合がつきそう、みたいな感じになり、「春休みに行こう!」となって、予定まで2か月を切った状態からスタートw

予定としては3月25日頃から28日頃をスタートとした6泊8日の旅にすることにした。(最終的に3/27~4/3に)

これは、WDWが4つのテーマパーク+お土産エリア+α(ウォーターパークと呼ばれる巨大なプール施設)等で構成され、4つのテーマパークを回るだけでも1日1つだとして4日、何かのアクシデントがあったり、お土産エリアを探索したり、リトライ的なことを考えて1日余分に取って5日にした。 (結果的には5日でちょうど良かったと思ってる)

旅行会社に相談しに行く

いくつかの旅行会社に相談しに行き、おおよその流れを確認しつつ、もし値段やホテルの空き具合、その他旅行会社を使ったメリットがあればそれに乗っかろうかと考えた。

残念ながら旅行会社で手配してくれるのは航空券とホテルだけ。現地の移動やパークチケットなどは全部自分で手配してね!なのに、料金的には倍プッシュなので自分たちで全て手配することにした。

【ホテル手配】

グーグル、便利すぎないか?

こんな感じで検索してみると、周辺ホテルの最安値出てめっちゃありがたい。

ググり結果(WDWホテル)

地図の方開くと、こんな感じ

ググり結果(WDWホテル2)

日付をずらしつつ、嫁さんと話して、以下の条件で安いところにしようと決めた。

  • 一つのホテルにとどまり、ホテルを変更しない
  • 寝泊りするだけなので、ベッドと風呂があってそこそこの広さがあればいい
  • 但し、パークへの交通手段(バス・モノレール)のため、必ず公式ホテルを使う

ある程度候補を見つけつつ、そもそも飛行機が無いと行けないので、そっちも並行で探しました。

最終的に Disney's All-Star Movies Resortにして費用をグッと抑えましたが、ホテルに関しては移動距離なども大事なので、マジックキングダム近くのホテルでできるだけ安い日程で計画するというのもアリっちゃーアリでしたね。

あと、よく表示されてなかったホテルが表示されたり、同じ条件なのに値段が変わるので、毎日ちょこちょこ見てました。

【飛行機手配】

飛行機の方もExpediaやグーグルなどで比較し、上記日程で以下の条件に合うものを探した。

  • 飛行機会社をできれば乗り換えない
  • 羽田発が良いが、良い時間が無ければ成田でOK
  • 日本を夕方発にする
  • 乗り換えは1回のみにしたい(オーランド空港へは直行便が無い)
  • 可能ならカナダ経由に(入国手続きが楽という話を聞いて)
  • 20時間以内に到着したい(往路と復路両方で)
  • エコノミーで最大でも3人で100万くらいに抑えたい

探していたらこれらの条件にほぼ合致するのがあった。それが AirCanada

AirCanadaは日本語対応不完全だけど、割とわかりやすかった。

成田では日本語通じるし、ANAマイレージとか行きで帰りの分もつけてくれてたみたいだし、オーランド空港でも英語だったけど分かりやすく丁寧だったので、結果的に困ることは無かった。

ただ、事前に調べていた話で、いくつかの不安点があった。

機内食についてはそんなに心配するほどでは無かった。

自分は4回の機内食を全て完食したし、味も問題なかった。

嫁さんは食べたかったやつ(朝食のオムレツ)が無くなってて、焼きそばにされたので一回憤慨してたがw

遅延しやすい、のほうは帰国時に喰らった。

これは旅行編のほうで書きたいと思う。

パークチケットorパークホッパー

パークチケットは1枚で1つのテーマパークに入ることができるチケット、パークホッパーは1枚で複数のテーマパークに入ることができるチケット。

さらにオプションとしてウォーターパーク・アンド・スポーツ・オプションというものをつければウォーターパークやゴルフまで楽しめます。

自分たちはウォーターパークやゴルフを楽しむほど長居しないのでつけませんでしたが、長期間いる人はつけても良いかも?

オンラインでのチケットは以下のいずれかで購入可能です。

  • オーランド観光
  • ジャルパック
  • ミッキーネット
  • ANAトラベラーズ
  • HIS
  • 楽天トラベル観光体験

実は、よーく見ると、各サイトで値段が微妙に違っています。

なので、一つずつ入って見てみるのが良いと思います。

自分たちの時は楽天トラベルが一番安かったので、そこでパークホッパーを買いました。

大抵のパークは1日1つしか回れなかったので少し高い買い物でしたが、二日ほど2か所回った日があり、全くの無駄では無かったかなと。

その他に特別なイベントのためのチケットもあり、それについてはレストランとセットだったり、別でアプリから購入したりします。

詳しくはこのオフィシャルページを確認してみてください。

My Disney Experienceでアレコレ紐づけ作業

ウォルト・ディズニー・ワールドサイトに行き、アカウントを取得します。

その後、My Disney Experienceタブをクリックし、そこで以下の作業を行います。

  1. Family & Friendsを登録
  2. Resort Hotelを登録
  3. Park Ticketsを登録
  4. Park Reservationsについてはパークホッパーの場合は無視でOK
  5. Diningでレストランを予約

この中でめんどくさかったのが2のResort Hotelの登録。

ホテルはAgodaで取ったんですが、Confirmation Numberって言ってるけど、どこにそんなのがあるねん?と。

ホテル予約WDW

Agodaで日本語で聞けたけど、対応したのが日本語不得意な外人で、わからないからホテルに直接聞いてくれと。

んで、ホテルに聞いたけど、ホテル自体はわからんと。

しょうがないんで、WDWサイトのContact UsでEmailで質問すると、1日後に回答があり、ホテルとの紐づけこっちでやっとくよ!とのこと。

この辺はもしかすると、旅行会社通せば楽だったかも?(そうじゃないかもしれないし、わからないw)

パークチケットの登録もLink Ticketsで紐づけが必要ですが、こっちはIDが楽天トラベルの明細に書かれてたのですんなり登録完了。

No.5のレストラン予約もツラいのが、レストランのメニューに写真が無いので、どういう食べ物かイメージしづらいところです。

一応英文で説明が簡単に書かれているのですが、写真が無いのでイマイチ分からない。

しかも、予約できるレストランって、基本料理が高い。

ただ、キャンセルが3h前まで無料なので、気軽に登録しておけるのが魅力。

そこで、料理や味ではなく、別の要素で決めることにしました。

  • 変わった体験ができそう
  • 見たいアトラクション・イベントのチケットがもらえる

結局、登録したうち、ちゃんと行けたのは1か所だけだったんですが…。

ESTAETA

入国するのがカナダとアメリカになるので、二つ申請が必要。

カナダがETAアメリカがESTA

気をつけなきゃいけないのがESTA申請を民間起業に間違って依頼しちゃうこと。

値段が7倍くらいするんで。。。(自分は間違って申請して、色んな言い訳してキャンセルしてもらった)

アメリカしか行かない場合はESTAのみでOK。

だけど、モントリオール空港経由で良かった。導線がほぼ一直線な上に、並ぶ時間が短かった。

ETAで余分なお金が発生したとしてもそっちのほうが全然いいし、今後もアメリカ入国はもしかするとあえてカナダ経由にするかもしれない。

ETAについてはここに日本語で申請の方法が書いてあります。

ESTAについてはここで動画とかも含めて日本語で確認できるんですが、まあ、ETAと比べてややこしかったので大変でした。(グループIDとメンバーの紐づけとかが必要)

空港からホテルへの移動(バスorタクシー)

自分らはMEARS CONNECTと呼ばれるシャトルバスを使うことにしました。

往復で大人が$33.6、子供が$27.3です。

ネットスーパー

自分が使ったのはGarden Grocer

買ったものはこれら

注文履歴

バナナが表示は複数なんですが、実は1本(Single)です(ちゃんとSingleのところを見ずにポチっとしてて、現地で「おい!」ってなりましたw)

水、ジュース、ミルク、フルーツ類はホテルのフードコートにもありますがちょっとお高め。

特に水が高いです。

あとは、ティッシュは買っといて良かったです。うちの家族はやたらと使う人が多いのでw

このネットスーパーのツラいところは配送料が$15かかること($250超えたら無料らしいけど、そんなに買わない…)

購入が前もって行われると多少割引(120日前=25%、90日前=20%、60日前=10%、30日前=7%、15日前=5%割引)になるので、ナルハヤが良いです。

うちはそもそも計画したのが60日前を切ってるので7%に。旅行は計画的にするほうがお得というのはここにもありますね。

僕らは使わ(え)なかったけど、車で数十分行ったところにPublixというスーパーもあります。

車で移動できる人や、タクシー使って買い出しするならネットスーパーより安くて良いですね。

その他旅行に必要そうなものを集める作業

スーツケース

大きめのを一つ持っているが、もう一個くらい欲しいので、自分はR&YRENTALで1台レンタル。

AirCanadaが預け入れ最大158cmだったので、それに合うやつを適当に探して、軽めのやつを選んだ。

ご飯と味噌汁(ふりかけが必要だった!)

向こうで和食はEPCOTの日本館でしか食べられないこと、和食がマジで恋しくなると色々なブログで読み、サトウのご飯的なやつと、持ち運び可能な味噌汁を購入。

ふりかけを忘れたのが失敗だったが、ご飯とみそ汁、向こうで食べきった。マジ役に立った。

ふりかけはEPCOTの日本館で売ってて、それを買ったよ、高かったけど…。

お茶の粉末

これはネットスーパーで水を大量に購入しておいたので、それに入れる用。

毎回飲み切った。本当に喉が渇くんですが、硬水じゃないはずなのにそれでも水が若干硬い(いろはすとかに慣れてるとそう感じる)んで、お茶入れとくと良いです。

上着・日焼け止め

行くのが3月末~4月の頭だったんですが、その時期の最高気温が29度~32度くらいあるとのことなので、日焼け止めは必須だろうと。

そして、室内はクッソ寒いというのをあちこちで見かけたので上着も。

あと、日よけの帽子も必須ですね。

全てめっちゃ使いました。(最終日に帽子を無くしましたが…)

海外旅行保険

カードに付帯されてるやつだけでいいやと。

物損とか大けがならカードのやつで対応できることがわかってたので、多少の病気は持ってる薬でしのいで、日本で治す予定だった。

薬類

とりあえず以下を用意

大人と子供用をそれぞれ用意。

ばんそうこう以外、結構フル活用w

オーランド空港やホテルのフードコートにも売ってるんですが、体に合うかわからんので、日本から持って行くのが吉。

機内で使うもの

とりあえず以下を用意

  • ネックピロー
  • ヒマつぶしできるもの
  • 予備の上着

その他

あったほうが良いものを書き出してみる

  • コップ
  • お椀
  • 歯ブラシ・歯磨き粉 ←部屋に無かったので持って行った
  • タオル(体を洗う用)
  • 石鹸・シャンプー・リンス ←体に合わない人は必須
  • 子供の朝ごはん用シリアル
  • 水筒(冷たい飲み物を飲めるように) ←持って行けば良かった一品
  • 雨合羽と折り畳み傘
  • 髭剃り
  • 整髪料(ワックス)
  • ウォーキングシューズ
  • 寝巻
  • リュック
  • モバイルバッテリー(パーク内で凄いスマホの電池が減る)
  • チップ用のドル札(使う機会は少なかったけど、バスや、ホテルの清掃に渡すのに使った。20ドルくらい1ドル札のバラであれば十分だった)
  • ポチ袋(チップを清掃に渡すときに部屋に置いとくんだが、それにちょうどいい感じ)

機内が寒かった時のために防寒できるものがあったほうが良いです。外はマイナス60度とかで、空調入ってるとまあまあ寒いんで…。

向こうで買い物すると、円安のせいで全てがクソ高かったり、気軽に手に入らないので、持てるなら持って行ったほうが良いです。 使い捨てのものにしておけば、あいた分のスペースがお土産に変わるので。

WISE(デビットカード

オーストラリアの同僚から作ったほうが良いよと言われて作った WISE

気軽に作れて、手に届くまでに時間もかからず(ゆっくりゲットするなら1か月、急ぎなら配送料がかかるが1週間程度で手に入る)、使いすぎを抑えつつ、キャッシュカードほど手数料がかからないので便利です。

ただ、使い方に慣れる必要があるので、少し国内で使ってみてから持って行くのが良いかも。

スマホ

基本的にWifiが空港、ホテル、パーク内で使えるのだが、パーク内の建物外とか、移動時とかはそれらが使えない。

そのため、各社が提供する、海外パケット定額的なものに入っておくことをお勧め。

自分はポケGOのために au海外放題 を契約した。

1日800円(予約割による値段。通常料金は1200円)は安くはないが、必要経費と考え、その分ガンガン使ったw

会社に休みの連絡

予定がある程度確定したので会社に連絡。

上司のA氏が昨年WDWに行ってたらしく、行く前SlackのDMで非常に盛り上がったw

旅行準備編はここまで

書きなぐるつもりが、結構時間かかった…。

ただ、振り返ることでやって無いことを思い出せたり、次回の旅行ではここ気を付けよう!って思えたりしたので良かった。

次回旅行編を書く予定。

オラ、internal_tmp_disk_storage_engineなんてパラメータ知らねえぞ~!

はじめに

この記事は MySQL Advent Calendar 2024 シリーズ2 1日目の記事です。

せっかくシリーズ2があるので、25日過ぎたけど簡易的なネタでもぶっこんでみようかと。

何をしてどうなった?

アップグレードの時に以下のエラーメッセージが出てアップグレードできなかった。

エラーメッセージ

エラーログに以下のようなメッセージが出ます。

[ERROR] [MY-000067] [Server] unknown variable 'internal_tmp_disk_storage_engine=InnoDB'.

理由

internal_tmp_disk_storage_engineってパラメータなんですが、5.7.5で入り8.0.16で削除されました。

そのため、8.0.16よりも前のバージョン(※5.7.5以降)でmy.cnfやmy.iniにinternal_tmp_disk_storage_engineを設定して、それをそのまま使って起動すると上記のようなメッセージが出るというわけです。

オンディスク内部一時テーブルのエンジンを設定できるパラメータで、デフォルトがInnoDBなんですが、それをMyISAMにすることができました。

理由はいくつかありますが、InnoDBMyISAMよりもサイズ的な制限が多いこと、内部一時テーブルがでかくなりやすくて再起動しないと縮小できないのが困ること、またはバグ対応などでしょう。

場合によってはワーニングに

ちなみに、これ、面白いのが、my.cnf | my.ini に書かれてる場合だけで、SET PERSISTで設定した場合はエラーじゃなくて以下のようにワーニングに格下げするところです。

[Warning] [MY-013185] [Server] Currently unknown variable 'internal_tmp_disk_storage_engine' was read from the persisted config file.

ワーニングなんで起動はします。でも、RESET PERSISTで削除しといたほうがログ的にはいいでしょうね。

対応方法

8.0.16以上にアップグレードした際に、MySQL Server起動前にmy.cnfからinternal_tmp_disk_storage_engineパラメータの記述を削除するかコメントアウトすればいいだけです。

ワーニングの場合でも先ほども書いたようにRESET PERSISTで削除しとくことをお勧めします。

ところで、なんでinternal_tmp_disk_storage_engineは削除されたんだろ?

Bug #91377対応でしょう。

しかし、削除したことで・・・

internal_tmp_disk_storage_engineがInnoDBで固定化されたことで別のバグ(Bug #95285)が回避できないという問題もありました。

これについては、5.7では5.7.31に、8.0では8.0.21にアップグレードすることで修正されました。

そのため、8.0.16から8.0.20を使用している場合はこのバグの回避策が無いので、アップグレードが必要という話になりますね。

(8.0の迷走がこの辺はすさまじい頃ですね・・・)

関連ドキュメント

終わりに

実はこれ書いているのアドカレ終わった12月26日w

休みにMySQLのことを色々と見直そうと思ってデカい記事書きたかったんだけど、なかなかまとまらないので小出しにできるやつはそういう風にしようと思って書いているのでした。

addInstanceがIP allowlistが原因で失敗する

はじめに

この記事は MySQL Advent Calendar 2024 15日目の記事です。

(なんか、いつの間にか15日の人のが消えていたので代わりに埋めてみました)

何をしてどうなった?

MySQL Shellを使って、既存のグループレプリケーションaddInstance()を追加しようとして、以下のようなエラーで失敗した。

エラーメッセージ

エラーログに以下のようなメッセージが出ます。

[GCS] Connection attempt from IP address ::ffff:xxx.xxx.xxx.xxx refused. Address is not in the IP allowlist.

理由

group_replication_ip_allowlistで追加可能なアドレスを絞っていて、追加しようとしたインスタンスのIPが含まれていなかった。

そんなのmy.cnfに設定した覚えない!と思ってるのに、SHOW GLOBAL VARIABLES;実行すると設定されている場合、createCluster()、addInstance、rejoinInstance()とかで過去にipAllowlistというオプション使ったんじゃないかなと思います。

ipAllowListオプションについてはコチラ

対応方法

グループのメンバーが通信に使用するすべてのIPアドレスを、group_replication_ip_allowlistに追加します。

例えば、my.cnfなどに

group_replication_ip_allowlist = '10.11.172.10,10.11.172.11,10.11.172.12'

と書いてあり、追加したいのが10.11.172.13だとすれば、

mysql> SET GLOBAL group_replication_ip_allowlist = '10.11.172.10,10.11.172.11,10.11.172.12,10.11.172.13';
-- my.cnfにも再起動時のため追加しておく

または

mysql> SET PERSIST group_replication_ip_allowlist = '10.11.172.10,10.11.172.11,10.11.172.12,10.11.172.13';
-- こっちは mysqld-auto.cnf に自動で書き込まれるのでmy.cnfの対応不要

上記の例のように、IPv4アドレスで設定している場合、エラーログに IPv4 アドレスの前にIPV4-mapped IPv6 アドレスの「::ffff:」が付く形で表示されますが、パラメータ設定時は普通の書き方でOKです!

メンバーの再起動は不要ですが、メンバー全てに対して行う必要があることに注意してください。

関連ドキュメント

終わりに

実はこれ書いているのアドカレ終わった12月26日w

次は 社内の人間よりMySQLに詳しい気がする、自他ともに認めるAPI @yoku0825 さんです。

INSTANT DDLは64回までヨ!

はじめに

この記事は MySQL Advent Calendar 2024 18日目の記事です。

INSTANT DDLを64回したらテーブル再構築が必要

INSTANT DDL操作がサポートされていても、INSTANTスキーマ変更の操作回数には上限があります。テーブル毎に計64回のINSTANTスキーマ変更に対応しており、この上限に到達したらテーブルの再構築が必要になります。

なにやら不穏な話が聞こえてきますね。

これは以下のOracleブログに書かれている話です。

INSTANT DDL操作を用いたMySQL InnoDBのスキーマ変更

つまりどんな話?

主にカラム追加時ですが、ALTER TABLE文でALGORITHM=INSTANT句を使って高速にDDL実行を完了することができます。これはINSTANT DDLという機能です。

これを行える回数に制限があることをご存じでしたか?

それが64回までという話です。

ドキュメントにもこう書かれています。

The maximum number of row versions permitted is 64, as each row version requires additional space for table metadata.

65回目を行いたい場合、テーブルの再構築が必要になります。

今まで何回やったかどうやって確認するの?

INFORMATION_SCHEMA.INNODB_TABLESテーブルTOTAL_ROW_VERSIONSカラムで確認することができます。

mysql>  SELECT NAME, TOTAL_ROW_VERSIONS FROM INFORMATION_SCHEMA.INNODB_TABLES 
        WHERE NAME LIKE 'test/t1';
+---------+--------------------+
| NAME    | TOTAL_ROW_VERSIONS |
+---------+--------------------+
| test/t1 |                  0 |
+---------+--------------------+

この例はまだ一回もやってないので0になってますが、例えば自分の実行した例だと、

6って出てますよね。

エラーメッセージ

こんなんが出ます。

MySQL Error (4092): Maximum row versions reached for table <db_name>/<table_name>. No more columns can be added or dropped instantly. Please use COPY/INPLACE.

テーブル再構築って?

大丈夫です、DROP & IMPORTし直せって話じゃありません。

OPTIMIZE TABLE または ALTER TABLE ... ENGINE=InnoDB を実行すればOKです。

OPTIMIZE TABLEって内部でANALYZE TABLEとALTER TABLE ... ENGINE=InnoDBを行っているので、要するにALTER TABLE ... ENGINE=InnoDBをやれって話です。

65回も同じテーブルにカラム追加するんですから、一回くらいOPTIMIZE TABLEやALTER TABLE ... ENGINE=InnoDBしてデータを綺麗に並べ替えとくのも良いですよね?

ちなみに9.1からは255回まで行ける

The maximum number of row versions permitted is 255 in MySQL 9.1.0 and later, as each row version requires additional space for table metadata. https://dev.mysql.com/doc/refman/9.1/en/innodb-online-ddl-operations.html#online-ddl-column-operations

dict0mem.hにそれはある

const uint8_t MAX_ROW_VERSION = 64

Maximum number of rows version allowed when columns are added/dropped INSTANTly.

After this limit is reached, any attempt to do ADD/DROP INSTANT column will result in error.

このMAX_ROW_VERSIONの数を超えてInstant DDLを実行するとコけるよとありますね。

https://dev.mysql.com/doc/dev/mysql-server/8.0.40/dict0mem_8h.html#a127c70e6c84930312e47d93dcfaa5609

9.1では255に増えてます。

const uint8_t MAX_ROW_VERSION = 255

https://dev.mysql.com/doc/dev/mysql-server/9.1.0/rem0types_8h.html#a127c70e6c84930312e47d93dcfaa5609

試してみた

については既に前述のブログ内で書かれてますんで、そっちを参照してください。

なんでこんな仕様に?

軽く調べてみましたが。わかりません。

65回も実行してる間にALTER TABLE ... ENGINE=InnoDB一回くらいやっとけや、って言うことなんですかね。

いや、それにしてもサラッと変な制限入れてるなあと。

終わりに

意外と知られてない(長時間運用しててやっと気づく)躓きポイントについて書いてみました。

ブログに書かれているんで、既に公にはなってるんですが、こういうのは何度言ってもいいと思いますしね。

明日は @asahide さんです。ポケGO仲間ですが、実は直でお会いしたことは無いんですw(いつかポケモン交換したいなあ)