Slide 1

Slide 1 text

そのMySQL、どこでテストする? Compose・MySQL Shellで作る再現性のある開発環境 Open Developers Conference 2026 | 2026-08-29 生駒 眞知子/ Machiko Ikoma MySQL Principal Solution Engineer 日本オラクル株式会社

Slide 2

Slide 2 text

DB検証環境で起きる「あるある」 現象例: 彼の環境では発生するのに、自分の環境では発生しない →再現する環境が作れない あるテストだけ、2回目から失敗する → 前回のデータや状態が残っている 手元では確認できたが、クラウドでは失敗する → MySQLのバージョン・設定・初期データの条件が揃っていない …など 同じコードでも環境に差異がある → バグの見逃し → 調査時間の増加 → DB環境もソースコードと同じく「再現できる定義」にする 2 Copyright © 2026, Oracle and/or its affiliates.

Slide 3

Slide 3 text

目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる Compose MySQLShell Sandbox Testcontainers • アプリと一緒に開発 • チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 上記は競合する選択肢ではなく、用途で使い分ける 3 Copyright © 2026, Oracle and/or its affiliates.

Slide 4

Slide 4 text

目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる 4 Compose MySQLShell Sandbox Testcontainers • アプリと一緒に開発 • チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 Copyright © 2026, Oracle and/or its affiliates.

Slide 5

Slide 5 text

Composeは定義 Docker/Podmanは実行基盤 Docker、Podmanは定義を実行する基盤 5 Copyright © 2026, Oracle and/or its affiliates.

Slide 6

Slide 6 text

Compose: 1つのファイルで同じMySQL環境を作る MySQLのイメージ・設定・ポートをプロジェクトで固定 固定する 1 services: 2 mysql: 3 image: container-registry.oracle.com/ 4 mysql/community-server:9.7 5 environment: 6 MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} 7 ports: 8 ["${MYSQL_PORT:-3306}:3306"] バージョン、環境変数、公開ポート、 初期化方法 共有する yamlファイル をGitで管理 3306が使用中なら MYSQL_PORT=13306 などに変更 6 Copyright © 2026, Oracle and/or its affiliates.

Slide 7

Slide 7 text

起動より大事なのは、「初期化の条件」を知っておくこと 起動と確認 1 $ podman compose up -d 2 $ podman compose ps 初期化スクリプト • .sql / .sh を /docker-entrypoint-initdb.d にマウント • 初回DB作成時だけ実行 (volumeが残ると再実行されない) 「壊して作り直す」を、最初から設計する Compose起動 → チェック → 初期化 → 再初期化 7 Copyright © 2026, Oracle and/or its affiliates. ここが落とし穴 SQLを書き換えても、restartだけでは 反映されない 1 $ podman compose down -v 初期化をやり直すときは、対象を確認してから実行

Slide 8

Slide 8 text

「捨てる」ときも、定義してから捨てる 1 volumes: 2 - mysql-data:/var/lib/mysql 永続化:開発DBを残すなら named volume を 明示する 注意 1 本番データを無加工でローカルへ持ち込まない 注意 2 パスワードを compose.yaml に直書きしない 1 $ podman compose down -v 検証環境を捨てる場合 • -v は named volume も削除 • 対象を確認してから実行 8 Copyright © 2026, Oracle and/or its affiliates. 注意 3 Apple Silicon / Windows は対象イメージの 対応を確認

Slide 9

Slide 9 text

目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる 9 Compose MySQL Shell Sandbox Testcontainers • アプリと一緒に開発 • チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 Copyright © 2026, Oracle and/or its affiliates.

Slide 10

Slide 10 text

MySQL Shell Sandbox:MySQLそのものを試す コンテナではなく、 ローカルに複数のmysqldを起動する 使いどころ 複数バージョンの比較 本番構成の代替ではない 複数インスタンスの起動 同一ホスト上で構成を安全に試すためのローカル検証環境 AdminAPI / Cluster の検証 「試して壊す」を高速に反復 3310 → X Protocol 33100 10 Copyright © 2026, Oracle and/or its affiliates.

Slide 11

Slide 11 text

Sandbox インスタンスの作成・接続 1. インスタンスの作成 (JSモード) // ポート 3310 で Sandbox を起動 mysql-js> dba.deploySandboxInstance(3310, { mysqldPath: '/opt/mysql-9.7' }) 2. 接続と操作 # ターミナルから接続 MySQLのバージョンはmysqldPathで変更可能 $ mysqlsh root@localhost:3310 Sandbox でポート 3310 を指定した場合: // 停止 / 再開 / 削除の3コマンド • Classic MySQL Port: 3310 mysql-js> dba.stopSandboxInstance(3310) mysql-js> dba.deleteSandboxInstance(3310) mysql-js> dba.startSandboxInstance(3310) ※作成前にローカルの空きポート状態を 確認しておくこと 11 Copyright © 2026, Oracle and/or its affiliates. • X Protocol Port: 33100 (10倍のポート)

Slide 12

Slide 12 text

複数起動すればHA構成の検証もできる Group Replication構成をローカルで検証 3310 Primary 3320 Replica 3330 Replica AdminAPI cluster = dba.createCluster('devCluster’) cluster.addInstance('root@localhost:3320’) cluster.addInstance('root@localhost:3330') フェイルオーバーなど Group Replication の挙動をクラウドコストゼロで安全に試せる ※本番のネットワークレイテンシや実際のHW障害特性の完全な再現ではない点にご注意ください 12 Copyright © 2026, Oracle and/or its affiliates.

Slide 13

Slide 13 text

Compose vs Sandbox:違いは「目的」 どちらか一方ではなく、使い分けがポイント Compose Compose MySQL Shell Sandbox Sandbox アプリ+DBの日常開発 MySQL構成・AdminAPI検証 起動の前提 コンテナイメージ ローカル mysqld バイナリ 切替方法 image タグを変更 PATH/バイナリを切替 複数台構築 Compose 定義に追加する ポートを変えて即作成 共有方法 compose.yaml を Git 管理 手順とバイナリを共有 観点 主用途 「アプリと動かす」なら Compose / 「MySQLを試す」なら Sandbox 13 Copyright © 2026, Oracle and/or its affiliates.

Slide 14

Slide 14 text

Sandboxを使う準備 MySQL Shell のダウンロードサイト (GPLライセンス) https://dev.mysql.com/downloads/ → 最新版以外は Archives を参照 https://downloads.mysql.com/archives/shell/ 利用するパッケージ形式に合わせてリポジトリインストール インストール例 cd /tmp curl -LO https://repo.mysql.com/mysql97-community-release-el9.rpm sudo dnf install -y ./mysql97-community-release-el9.rpm sudo dnf install -y mysql-community-server mysql-shell which mysqld mysqlsh mysqlsh --version 14 Copyright © 2026, Oracle and/or its affiliates.

Slide 15

Slide 15 text

目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる 15 Compose MySQLShell Sandbox Testcontainers • アプリと一緒に開発 • チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 Copyright © 2026, Oracle and/or its affiliates.

Slide 16

Slide 16 text

Testcontainers:人ではなく、テストがDBを起動する アプリのCI/自動テスト専用の動的DB • JUnit / PyTest 等のテストコードが、Docker API互換コンテナランタイムを制御するライブラリ • テスト実行ごとに新しくクリーンな MySQL コンテナを自動起動 • テスト完了時にコンテナを全自動破棄し、ローカル常設DBへの依存を減らす 役割分担: ➢ Compose は「人間が使う開発環境」 ➢ Testcontainers は「テストフレームワークが使うDB環境」 16 Copyright © 2026, Oracle and/or its affiliates.

Slide 17

Slide 17 text

Testcontainers の仕組みと導入の流れ CI/自動テストで「毎回、既知の状態」を作成する 1. テスト開始 2. 初期化 3. テスト実行 4. 自動破棄 MySQLコンテナを自動起動 動的ポートを割当 スキーマ、テストデータ準備 アプリの結合テスト、 APIテストを実行 完了後にコンテナとデータを 完全にクリーンアップ Java, Python, Go, Node.js 等、考え方はプログラミング言語共通 「常に既知の状態からスタート」することで、ローカルPCとCI環境でのテスト実行差分を低減 17 Copyright © 2026, Oracle and/or its affiliates.

Slide 18

Slide 18 text

例:テストコードからMySQLを立ち上げる Java 1 MySQLContainer mysql = 2 new MySQLContainer<>( 3 DockerImageName.parse(OCI_MYSQL_IMAGE) 4 .asCompatibleSubstituteFor("mysql")); 5 mysql.start(); 6 7 // schema / test data 8 // integration test 18 Copyright © 2026, Oracle and/or its affiliates. • テスト単位で既知の状態から開始 • ローカル常設DBへの依存を減らす • PCとCIの条件差を小さくする

Slide 19

Slide 19 text

例:Mavenを使ってテストする 0. mvn -Dtest=TodoRepositoryIT test ↓ 1. Mavenが TodoRepositoryIT を起動 ↓ 2. Testcontainersが Podman にMySQL起動を依頼 ↓ 3. MySQLコンテナを起動 テーブル作成 → INSERT → SELECT ↓ 4. JUnitが結果を検証 Tests run: 1 / Failures: 0 実行結果例 ↓ 5. テスト終了後、MySQLコンテナを破棄 Running example.TodoRepositoryIT Tests run: 1, Failures: 0, Errors: 0 BUILD SUCCESS 19 Copyright © 2026, Oracle and/or its affiliates.

Slide 20

Slide 20 text

まとめ:目的から選ぶ MySQL検証環境 何を確かめたい? アプリ+DBを動かす 複数MySQLを試す CIで毎回試す 日常開発 構成・バージョン検証 使い捨ての自動テスト → Compose → MySQL Shell Sandbox → Testcontainers 選択肢は「どれが優れているか」ではなく、「どの仕事に向いているか」 20 Copyright © 2026, Oracle and/or its affiliates.

Slide 21

Slide 21 text

まずはComposeで体験 明日から試せるポイント ✓ imageタグでMySQLのバージョンを固定 ✓ DBを破棄して、同じ状態を作り直せるか確認する ✓ compose.yaml と初期化方法をリポジトリ で共有する ✓ パスワード等の秘密情報をコードから分離する ✓ 初期データとテストデータを分ける ✓ Sandbox / Testcontainers も試してみる ゴールは「詳しくなる」ではなく、同じ状態をもう一度作れること 21 Copyright © 2026, Oracle and/or its affiliates.

Slide 22

Slide 22 text

参考資料 MySQL Container images dev.mysql.com/doc /refman/9.7/en/docker-mysql-getting-started.html MySQL Shell Sandbox dev.mysql.com/doc /mysql-shell/9.7/en/admin-api-sandboxes.html MySQL Shell AdminAPI dev.mysql.com/doc /mysql-shell/9.7/en/admin-api-userguide.html Compose Specification docs.docker.com/compose/intro/compose-application-model/ Testcontainers MySQL java.testcontainers.org/modules/mysql/ 22 Copyright © 2026, Oracle and/or its affiliates.

Slide 23

Slide 23 text

ハンズオン:OCI上で3つの方法を試す GitHub: github.com/ikomachi226/mysql-testenv-handson 01 事前準備 OCI ComputeにSSH接続し、Podman・Java・Mavenを準備 02 Compose MySQL 9.7を起動し、初期化SQLと永続化を確認 03 Sandbox 3ノードのInnoDB Clusterを作成し、フェイルオーバーを確認 04 Testcontainers JavaテストからMySQLを起動し、CREATE / INSERT / SELECTを検証 23 Copyright © 2026, Oracle and/or its affiliates.

Slide 24

Slide 24 text

Tips: より本番環境に近いデータでテストを実行するには 個人情報・認証情報・機密データを無加工でテスト環境に持ち込まない 元データに影響を与えずにデータマスキング/動的データマスキング を利用してテスト環境のセキュリティを向上 データマスキング 本番データをコピー後、 テスト用コピーの値を加工して匿名化 24 Copyright © 2026, Oracle and/or its affiliates. 動的データマスキング 権限に応じて表示を制御

Slide 25

Slide 25 text

25 Copyright © 2026, Oracle and/or its affiliates.

Slide 26

Slide 26 text

MySQL EE 9.7 MySQL Enterprise Edition 9.7 : 動的データマスキング アプリケーション側のクエリを変更せずに機微なデータを保護する • ユーザーアカウントやロールに応じて、 元の値またはマスクされた値を返す機能 • 元データは変更されず、アプリケーションの修正 不要 • MySQL Enterprise Editionで利用可能 • クエリがマスク対象列を参照すると 「ゲートキーパー」を評価し、返す値を決定 • 「ゲートキーパー関数」 CURRENT_USER_IN('...’) ユーザーベースで判定する場合 CURRENT_ROLE_IN('...’) ロールベースで判定する場合 • マスキングの処理はMySQLが持つ マスキング関数を利用 Copyright © 2026, Oracle and/or its affiliates

Slide 27

Slide 27 text

Tips: MySQLのバージョン選択 リリースライン 最新版 (2026年8末現在) 主な用途 Innovation Release (IR) 26.7.1 新機能をいち早く試す Long-Term Support (LTS) 9.7.3 長期運用の新しい基盤 Long-Term Support (LTS) 8.4.11 既存環境での継続利用 https://blogs.oracle.com/mysql-jp/mysql-cpu-and-cspu-versioning-for-more-frequent-security-updates-jp 27 Copyright © 2026, Oracle and/or its affiliates.

Slide 28

Slide 28 text

No content