Upgrade to Pro — share decks privately, control downloads, hide ads and more …

そのMySQL、どこでテストする? Compose・MySQL Shellで作る再現性のある開発環境

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for mikoma mikoma
August 29, 2026
35

そのMySQL、どこでテストする? Compose・MySQL Shellで作る再現性のある開発環境

2026/8/29 Open Developers Conference 2026でのセッション資料です。
MySQLの検証環境を、目的に応じて選ぶための考え方をご紹介しました。
アプリケーションとDBを一緒に動かすCompose、複数バージョンやGroupReplicationを試すMySQL Shell Sandbox、結合テストを自動化するTestcontainersを取り上げています。
環境を「手順」ではなく、「何度でも作り直せる定義」として残すための、実践的なポイントをまとめました。サンプルコードはGitHubで公開しています。

Avatar for mikoma

mikoma

August 29, 2026

Transcript

  1. 目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる Compose MySQLShell Sandbox Testcontainers • アプリと一緒に開発 • チームで共有する日常的

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

    チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 Copyright © 2026, Oracle and/or its affiliates.
  3. 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.
  4. 起動より大事なのは、「初期化の条件」を知っておくこと 起動と確認 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 初期化をやり直すときは、対象を確認してから実行
  5. 「捨てる」ときも、定義してから捨てる 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 は対象イメージの 対応を確認
  6. 目的が違えば、最適な検証環境も変わる まずは「何を確かめたいか」で分けてみる 9 Compose MySQL Shell Sandbox Testcontainers • アプリと一緒に開発

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

    チームで共有する日常的 に使う環境 • MySQL構成を試す • 複数インスタンスを検証 • テストを自動化 • 毎回まっさらなDBで実行 Copyright © 2026, Oracle and/or its affiliates.
  12. Testcontainers:人ではなく、テストがDBを起動する アプリのCI/自動テスト専用の動的DB • JUnit / PyTest 等のテストコードが、Docker API互換コンテナランタイムを制御するライブラリ • テスト実行ごとに新しくクリーンな

    MySQL コンテナを自動起動 • テスト完了時にコンテナを全自動破棄し、ローカル常設DBへの依存を減らす 役割分担: ➢ Compose は「人間が使う開発環境」 ➢ Testcontainers は「テストフレームワークが使うDB環境」 16 Copyright © 2026, Oracle and/or its affiliates.
  13. Testcontainers の仕組みと導入の流れ CI/自動テストで「毎回、既知の状態」を作成する 1. テスト開始 2. 初期化 3. テスト実行 4.

    自動破棄 MySQLコンテナを自動起動 動的ポートを割当 スキーマ、テストデータ準備 アプリの結合テスト、 APIテストを実行 完了後にコンテナとデータを 完全にクリーンアップ Java, Python, Go, Node.js 等、考え方はプログラミング言語共通 「常に既知の状態からスタート」することで、ローカルPCとCI環境でのテスト実行差分を低減 17 Copyright © 2026, Oracle and/or its affiliates.
  14. 例:テストコードから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の条件差を小さくする
  15. 例: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.
  16. まとめ:目的から選ぶ MySQL検証環境 何を確かめたい? アプリ+DBを動かす 複数MySQLを試す CIで毎回試す 日常開発 構成・バージョン検証 使い捨ての自動テスト →

    Compose → MySQL Shell Sandbox → Testcontainers 選択肢は「どれが優れているか」ではなく、「どの仕事に向いているか」 20 Copyright © 2026, Oracle and/or its affiliates.
  17. まずはComposeで体験 明日から試せるポイント ✓ imageタグでMySQLのバージョンを固定 ✓ DBを破棄して、同じ状態を作り直せるか確認する ✓ compose.yaml と初期化方法をリポジトリ で共有する

    ✓ パスワード等の秘密情報をコードから分離する ✓ 初期データとテストデータを分ける ✓ Sandbox / Testcontainers も試してみる ゴールは「詳しくなる」ではなく、同じ状態をもう一度作れること 21 Copyright © 2026, Oracle and/or its affiliates.
  18. 参考資料 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.
  19. ハンズオン: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.
  20. 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
  21. 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.