41から始めました

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

MySQL キーリングプラグインからコンポーネントへの移行

はじめに

この記事は MySQL Advent Calendar 2025 6日目の記事です。

MySQL キーリングプラグインからコンポーネントへの移行

今年、対応した作業で個人的に多かったな、と感じたのがこれでした。

移行したいけど、よくわからん!っていうのが多くて、んじゃ俺も試してみるか、

「うーん、確かにわかりづれえ!」

ってポイントが多かったんで、放流して参考にしてもらうのが正しいかと思って。

ら、楽したいとかそういうんじゃないんだからね!

MySQL キーリングって?

そもそもキーリングって何?っていう人のために、簡単に説明すると、データ暗号化(Transparent Data Encryption 略してTDE)を行うためのプラグインまたはコンポーネントです。

よーわからん、っていう人は、まあ、データ暗号化したかったらそれ設定せえ、っちゅうことで覚えてください。

ちゃんと知りたいって人は個別にMySQL セミナーのセキュリティ関連の資料読んだり、それこそキーリングのドキュメントを読んでくださいね。

プラグインからコンポーネント

さて、色んな前情報は各自自分で調べて読んでもらうとして、ここからは本題の移行作業へ

ただ、ここでは気軽に試してみたいっていう人のために、キーリングプラグインのインストールから書いてみる

1 MySQL Serverを用意する

適当なMySQL Serverを1台ご用意ください

2 my.cnf|my.iniの編集

MySQL コンフィグファイルを編集します。

$ vim my.cnf

以下を追加してください。

### keyring
early-plugin-load=keyring_file.so
plugin-load=keyring_udf.so
keyring_file_data=/home/takiida/mysql-keyring/keyring-encrypted

### エラー表示時にNoteも出力するようにしておく
log_error_verbosity=3

log_error_verbosity=3は、キーリングとは関係ないんですが、作業の可視化のためです。

キーリング管理用関数を設定するためにプラグイン(keyring_udf.so)もここで入れてます。

keyring_file_dataの/home/takiida/mysql-keyringはファイルの作成場所として自分で作った場所です。

指定しないとデフォルトがありますが、何度も行き来するので、分かりやすいところに作っておきましょう。

話はちょっとずれますが、エラーログのローテーションをしているところはこの設定がおススメです。

クライアント周りのエラーをつかむのや、今回のような作業の成功時のメッセージが見れるので便利ですし、安心感が違います。

3 再起動してプラグインが読み込まれる

keyring_file プラグインとkeyring_udf プラグインが読み込まれます。

keyring_udf はSQLでキーリング管理(ランダムキー作成など)をするためのプラグインです。

今回はSQLでちゃちゃっと試すために入れてます。

再起動後に確認して以下のようになってればOKです。

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
+------------------------+---------------+
| PLUGIN_NAME            | PLUGIN_STATUS |
+------------------------+---------------+
| keyring_file | ACTIVE        |
| keyring_udf            | ACTIVE        |
+------------------------+---------------+
2 rows in set (0.00 sec)

ランダムキー作成

ここに手順が全て書かれていますが、サラッと記載しておきます。

キーリング管理用関数をこしらえます。

-- INSTALL PLUGIN keyring_udf SONAME 'keyring_udf.so'; <-- これは既にmy.cnfで読み込んだのでスキップ
CREATE FUNCTION keyring_key_generate RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_fetch RETURNS STRING
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_length_fetch RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_type_fetch RETURNS STRING
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_store RETURNS INTEGER
  SONAME 'keyring_udf.so';
CREATE FUNCTION keyring_key_remove RETURNS INTEGER
  SONAME 'keyring_udf.so';

keyring_key_generate関数でランダムキーを作成します。

以下の例はMyKey という名前の 2,048-bit DSA 暗号化キーを作成しています。

mysql> SELECT keyring_key_generate('MyKey', 'DSA', 256);

5 キーリングプラグインでTDE設定

mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE ENCRYPTION='Y' ;
Empty set (0.00 sec)

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
Empty set (0.01 sec)

mysql> SELECT * FROM performance_schema.keyring_keys;
Empty set (0.00 sec)

mysql> create database testdb;
Query OK, 1 row affected (0.03 sec)

mysql> use testdb;
Database changed

mysql> CREATE TABLE testdb.A1(ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(20)) ENCRYPTION = 'Y';
Query OK, 0 rows affected (0.11 sec)

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME LIKE 'keyring%';
+------------------------+---------------+
| PLUGIN_NAME            | PLUGIN_STATUS |
+------------------------+---------------+
| keyring_file | ACTIVE        |
| keyring_udf            | ACTIVE        |
+------------------------+---------------+
2 rows in set (0.00 sec)

mysql> SELECT SPACE, NAME, SPACE_TYPE, ENCRYPTION FROM INFORMATION_SCHEMA.INNODB_TABLESPACES WHERE ENCRYPTION='Y' ;
+-------+-----------+------------+------------+
| SPACE | NAME      | SPACE_TYPE | ENCRYPTION |
+-------+-----------+------------+------------+
|     2 | testdb/A1 | Single     | Y          |
+-------+-----------+------------+------------+
1 row in set (0.00 sec)

mysql> SELECT TABLE_SCHEMA, TABLE_NAME, CREATE_OPTIONS FROM INFORMATION_SCHEMA.TABLES WHERE CREATE_OPTIONS LIKE '%ENCRYPTION%';
+--------------+------------+----------------+
| TABLE_SCHEMA | TABLE_NAME | CREATE_OPTIONS |
+--------------+------------+----------------+
| testdb       | A1         | ENCRYPTION='Y' |
+--------------+------------+----------------+
1 row in set (0.01 sec)

mysql> SELECT * FROM performance_schema.keyring_keys;
+--------------------------------------------------+-----------+----------------+
| KEY_ID                                           | KEY_OWNER | BACKEND_KEY_ID |
+--------------------------------------------------+-----------+----------------+
| INNODBKey-00008040-0000-0000-0000-000000008040-1 |           |                |
+--------------------------------------------------+-----------+----------------+
1 row in set (0.00 sec)

ってな感じで準備ができました。

さて、したごしらえができたので、ここからが移行作業です。

6 キーリングコンポーネント移行前確認

コンポーネントはまだ表示されないことを確認

mysql> SELECT * FROM performance_schema.keyring_component_status;
Empty set (0.00 sec)

keyring-encrypted fileを確認

$ ll mysql-keyring/
total 12
drwxr-x---  2 takiida takiida 4096 Feb 20 10:28 ./
drwxr-xr-x 29 takiida takiida 4096 Feb 20 09:34 ../
-rw-r-----  1 takiida takiida  229 Feb 20 10:28 keyring-encrypted

もしkeyring-encryptedファイルが0バイトだと、そもそもキーリングプラグインの設定が失敗してるのでやり直してください。

7 component_keyring_file の設定ファイルを作成する

mysql> SHOW GLOBAL VARIABLES LIKE 'plugin_dir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| plugin_dir    | {path1}/plugin/ |
+---------------+-----------------+

ここで表示された {path1}/plugin/ 配下にcomponent_keyring_file.cnfファイルを作る必要があります。

$ vim {path1}/plugin/component_keyring_file.cnf
$ cat {path1}/plugin/component_keyring_file.cnf
{
 "path": "/home/takiida/mysql-keyring/component_keyring_file",
 "read_only": false
}

この設定ファイル内のpathはkeyring_file_dataと同じがいいでしょう。

このcomponent_keyring_file.cnfファイルを作成する手順がドキュメントだと無いんですよね…。

インストール関係として別ページにあるから厄介

あと、グローバルとローカルっていうのがありますが、ここではグローバルオンリーにしてます。

8 キーリングプラグインからコンポーネントへの移行です

移行方法としてオフラインとオンラインの方法があります。

昔はオフラインしかできなかったんですが、今はオンラインでできるってことで、オンラインでやっちゃいましょう。

$ /home/takiida/opt/mysql/8.0.40/bin/mysqld  \
--keyring-file-data=/home/takiida/mysql-keyring/keyring-encrypted \
--keyring-migration-to-component \
--keyring-migration-source=keyring_file.so \
--keyring-migration-destination=component_keyring_file.so \
--keyring-migration-host=<ip> \
--keyring-migration-user=root \
--keyring-migration-password=<password> \
--keyring-migration-port=<port> \
--log-error-verbosity=3

キモはlog-error-verbosity=3です。なぜかというと、以下のような表示が出力されるのを確認するためです。

[Note] [MY-013713] [Server] Component component_keyring_file reported: 'Keyring component initialized successfully.'
[Note] [MY-011085] [Server] Keyring migration successful.
[Note] [MY-010120] [Server] Binlog end
[Note] [MY-010733] [Server] Shutting down plugin 'keyring_file'
[System] [MY-010910] [Server] /home/takiida/opt/mysql/8.0.40/bin/mysqld: Shutdown complete (mysqld 8.0.40-commercial)  MySQL Enterprise Server - Commercial.

Noteとしてメッセージが表示されるので、ここでlog-error-verbosity=3にしとかないと成功したのかどうか不安になります。

オフラインでマイグレーションした場合はさっきのmy.cnfに設定したやつが利きます。

9 component_keyring_file fileの確認

component_keyring_fileファイルが0バイトじゃなければ移行は成功しています。

$  ll mysql-keyring/
total 36
drwxr-x---  2 takiida takiida  4096 Nov 26 10:32 ./
drwxr-xr-x 30 takiida takiida 20480 Nov 26 10:27 ../
-rw-r-----  1 takiida takiida   210 Nov 26 10:32 component_keyring_file
-rw-r-----  1 takiida takiida   187 Nov 26 10:20 keyring-encrypted

10 マニフェストの作成

実はまだ完了ではありません。

マニフェストファイルというものを作成し、どのキーリングコンポーネントをロードするかを設定する必要があります。

ファイルは起動時に使用するmysqldインストールディレクトリ配下に作成します。

$ vim {basedir}/bin/mysqld.my
$ cat {basedir}/bin/mysqld.my
{
  "read_local_manifest":false,
  "components": "file://component_keyring_file"
}

この話も移行のドキュメント上に無くて、コンポーネントインストールのドキュメントにあるんで、そこが不便なんですよね…

ここでも、グローバルとローカルっていうのがありますが、ここではやはりグローバルオンリーにしてます。

11 MySQL Server を再起動します

再起動して、キーリングコンポーネントが使われることを確認します。

ちなみに、再起動前にキーリングプラグイン関連のパラメータをコメントアウトしておくとより分かりやすいと思います。

# early-plugin-load=keyring_file.so
plugin-load=keyring_udf.so
# keyring_file_data=/home/takiida/mysql-keyring/keyring-encrypted

12 エラーログを確認します

以下のようなメッセージが表示されていればOKです。

[Note] [MY-013713] [Server] Component component_keyring_file reported: 'Keyring component initialized successfully.'

13 performance_schema.keyring_component_statusテーブルで確認

以下のような結果が確認できれば移行は終了です。

mysql> SELECT * FROM performance_schema.keyring_component_status;
+---------------------+-------------------------------------------------+
| STATUS_KEY          | STATUS_VALUE                                    |
+---------------------+-------------------------------------------------+
| Component_name      | component_keyring_file                          |
| Author              | Oracle Corporation                              |
| License             | GPL                                             |
| Implementation_name | component_keyring_file                          |
| Version             | 1.0                                             |
| Component_status    | Active                                          |
| Data_file           | /usr/local/mysql/keyring/component_keyring_file |
| Read_only           | No                                              |
+---------------------+-------------------------------------------------+

おわりに

キーリング関連のドキュメント、充実してるけど導線が微妙でわかりづらいので、流れをまとめてみました。

誰かの参考になれば幸いです。

明日は@yoku0825さんの「ConoHaとクロスポストでビルドの話」です。

MDS8.0のEOL関連の話

はじめに

MySQL Advent Calendar 2025 およびOracle Cloud Infrastructure Advent Calendar 2025 その2の5日目です。

前日のMySQLネタはyoku0825さんのyt-sandboxの話でしたね。僕も試すぞ!

今日は1か月前くらいに書いた話にプラスアルファ的に書いときました。

MDSのEOL

みなさんご存じの通り、MySQL8.0のEOLは来年の2026年4月となっています。

(半年切ってますよ。システム要件とにらめっこして、塩漬けするのかアップグレードするのか決めないとヤバいですよ)

MySQL Serverは8.0.46が4月に出て、それ以降は新しい8.0のバージョンは出ません。

一方、OCIのMySQL Database Service(以下MDS、HeatWaveも含む)のほうもEOLは同じタイミングなのですが、いくつか注意点があります。

一つ目はMDSの場合は、2026年4月がEOLなので、5月にはメンテナンスにより強制アップグレードが行われるという話になります。

そんな感じなので、MDSの場合は8.0.46が出ません。最終リリース版は8.0.45(2026年1月)の予定です。

MDS8.0は8.4.いくつになるのかは現在のドキュメントではわかりません。

それについてはサポートに確認するか、ドキュメントに今後その情報が上がるのを待ちましょう。

mysql_native_passwordプラグインの扱い

8.0から8.4にアップグレードするとmysql_native_passwordプラグインが無効になり、オンプレ環境の場合は使いたい場合はプラグインをインストールすることで有効にできます。

参考:Smart Styleさんのブログ

では、MDSだとどうなのか?というと、それが二つ目で、8.4ではmysql_native_passwordプラグインを手動で有効化することができません。

将来的にmysql_native_passwordは削除されるので、8.4の時点でcaching_sha2_passwordに移行することを推奨しているためです。

オンプレミス環境のような回避策が無いかと言われると、実はあります。それが8.0経由にすることです。

8.0でmysql_native_passwordで設定されたユーザーは8.4でもそのままmysql_native_passwordとして認証されるようになります。

(しかし、8.4で新規にmysql_native_passwordユーザーを作ることはできません)

期間が限られていますが、オンプレミス環境からOCIのMDSへ移行する場合、このmysql_native_passwordプラグインの話が影響するユーザーがあるのであれば、

  1. ユーザーの認証方式をcaching_sha2_passwordにする。
  2. MDS8.0にまず移行し、その後8.4へアップグレードする。

の2択になります。

いや、今オンプレで8.4なんだけど…と言う人は強制的に1となりますが。(それか頑張ってオンプレでダウングレードするか…。)

OCPUシェイプのEOL

実はMDSのEOLよりこっちのEOLのほうが早く、

2026年3月13日以降、すべてのOCPUシェイプが使用できなくなります。

ドキュメントにあります

なので、こっちはより緊急度を上げて対応を検討することをお勧めします。

切り替え方法はこちら

EOL関連の対応デッドライン

  • OCPUシェイプ - 2026年3月13日
  • MDS8.0 - 2026年4月末

MDS使ってる人は今すぐシェイプとバージョンをチェック!

最後に

MySQLのほうは明日も僕です。引き続きおつきあいください。

MySQL Routerは最新にしとけ

MySQL Advent Calendar 2025 1日目のネタはMySQL Routerのバグの話

と言っても、バグを掘り下げるっていうわけじゃないです。

こういうのあるんで、最新にしとこーぜ!って話を軽ーくするんで、流し読みしてくだせえ。

どんなバグの話するの?

MySQL Routerがクラッシュする系のバグの紹介です。

なんでそんな話をするの?

MySQL Routerを8.4にアップグレードして、Routerがクラッシュするって話、今年よく聞いたんですよ。

なので、MySQL Serverを、InnoDB Cluster構成を8.0から8.4にアップグレードする人がこれから日本でも増えるでしょうから、その準備の参考情報としてってところです。

バグその1(37499075)

The http_server plugin would throw an uncaught exception and terminate when given an invalid URL. Now the exception is caught with a 400 HTTP (Bad Request) error returned to the client. (Bug #37499075)

訳:http_serverプラグインは、無効なURLが渡された場合に未処理の例外をスローして終了していました。現在は例外がキャッチされ、クライアントに400 HTTPエラー(Bad Request)が返されます。(Bug #37499075)

MySQL :: MySQL Router Release Notes :: Changes in MySQL Router 8.4.5 (2025-04-15, LTS Release)

8.4.5で解消したやつです。terminate=止まっちゃった、ってことですね。

http_serverプラグインってことはつまり、MySQL Router REST API関連ですね。

--disable-restオプションでMySQL Rouer REST APIを使わないようにするのもありなんでしょうが、Routerくらい大人しくアップグレードササッとやっちゃうのが吉です。

なぜなら、8.4.5にはもう一つ後述のバグが内在してるから…。

バグその2(37303055)

Under certain circumstances, with Connection Sharing enabled, MySQL Router could crash due to a race condition in the connection pool. MySQL Router tried to close a connection while also making that connection available to another thread. Errors were returned similar to the following:

Process Core Dump (PID XXXXXX/UID 0) 
Resource limits disable core dumping for process XXXXXX (mysqlrouter)

(Bug #37303055)

訳:特定の状況下で、接続共有が有効な場合、MySQL Router は接続プール内の競合状態によりクラッシュする可能性があります。MySQL Router は、ある接続を閉じようとする一方で、その接続を別のスレッドでも利用可能にしようとしたためです。以下のようなエラーが返されました:

Process Core Dump (PID XXXXXX/UID 0) Resource limits disable core dumping for process XXXXXX (mysqlrouter)

(Bug #37303055)

MySQL :: MySQL Router Release Notes :: Changes in MySQL Router 8.4.6 (2025-07-22, LTS Release)

8.4.6で解消したやつです。MySQL Routerってコネクションプール機能持ってるんですよ。それ絡みですね。

というわけで、アップグレードするなら8.4.6以上がおススメ!

…と言いたいところですが、そうは問屋が簡単には卸さないのが今のMySQL

MySQL ShellとMySQL Routerは9.xの最新を使え

MySQL :: Supported Compatibility: MySQL Server, Clients, & Tools

一つ前の自分のブログでも書いたのだが、MySQL Routerは9.xの最新を使うべきというのが公式の見解になっている。

正直 キメェ という気持ちはグッと抑えて、安全のために9.xの最新(今現在だと9.5)を使うのが無難である。

まあ、そんなこと言ってると、もうすぐ9.7(かな?)がLTSとしてリリースされるはずなんで、そこで綺麗に揃えましょう。

最後に

明日は @shunyasu さんの「Spatial Indexなどの空間検索の性能調査」です。

Spatial Index周り、自分もあまり調べてないから興味津々です。

みんな、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

旅行準備編はここまで

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

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

次回旅行編を書く予定。