MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行

HOMEリナックスマスター.JP 公式ブログLinux情報・技術・セキュリティ > MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行
宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
「親テーブルを1行消したはずなのに、レプリカやCDCの先では子テーブルが消えていない」——MySQLを長く運用してきた人なら、一度はこの不気味な不整合に出くわしたことがあるかもしれません。
その長年の弱点に、MySQL 9.6が手を入れました。外部キーの検証とカスケード処理を、InnoDBストレージエンジンの内部からSQLレイヤーへ引き上げる変更です。地味に見えて、レプリケーションやバイナリログを使う現場には影響が小さくない話です。

この記事では、MySQL 9.6で外部キー制約とカスケード処理の何がどう変わったのか、そしてそれが既存スキーマや日々の運用にどう効いてくるのかを、現役のLinuxサーバー管理者の視点で整理します。

この記事のポイント

・MySQL 9.6で外部キーの検証・カスケードがInnoDBからSQLレイヤーへ移行
・これまでバイナリログに残らなかったカスケード変更が記録されるようになった
・レプリケーション・CDC(Debezium等)・監査ログの整合性が改善
・性能はほぼ同等、innodb_native_foreign_keysで一時的に旧挙動へ退避も可能


MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行
「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

何が変わったのか:FK処理がInnoDBからSQLレイヤーへ

MySQL 9.6は2026年1月に出たInnovationリリースです。今回の目玉のひとつが、外部キー(FOREIGN KEY)制約の検証と、ON DELETE CASCADEなどのカスケード動作を、誰が処理するかという根本的な変更でした。

これまでMySQLでは、外部キーの整合性チェックとカスケード処理を、InnoDBストレージエンジンの内部で行っていました。親テーブルに対してDELETEやUPDATEを実行すると、InnoDBがその場で外部キー制約を確認し、カスケードが定義されていれば子テーブルの行をInnoDB自身が消したり更新したりしていたわけです。

MySQL 9.6からは、この処理がSQLレイヤー(SQLエンジン)側で行われるようになりました。Oracleの公式ブログ「No More Hidden Changes: How MySQL 9.6 Transforms Foreign Key Management」でも、外部キーの検証とカスケードをSQLエンジンが担うようになったと説明されています。

一見すると内部実装の話で、アプリケーションからは何も変わらないように見えます。実際、SQL文の書き方やテーブル定義はこれまで通りで構いません。けれども「誰がカスケードを実行するか」が変わったことで、その動作が外から見えるかどうかという点に大きな違いが生まれました。

なぜこれが重要なのか:消えていたカスケードがログに残る

従来の方式で何が問題だったのか。一番の弱点は、InnoDB内部で実行されたカスケードが、バイナリログ(binlog)に記録されなかったことです。

具体例で考えます。orders(親)とorder_items(子)があり、子に ON DELETE CASCADE が定義されているとします。ここで「DELETE FROM orders WHERE id = 1」を実行すると、ordersの1行が消え、関連するorder_itemsの行も自動で消えます。ところが行ベースレプリケーション(RBR)のバイナリログには、親であるordersの削除イベントしか残らず、子であるorder_itemsの削除は記録されませんでした。子の削除はInnoDBの内部処理として完結していて、SQLレイヤーから見えなかったためです。

これは実は、2007年に登録されたBug #32506として古くから知られていた挙動です。当時の公式見解でも「カスケード削除はInnoDBエンジン内部の処理であり、内部で追加の行が影響を受けた事実をサーバーに伝える手段がない」と説明されていました。長年「仕様」として残ってきた弱点だったわけです。

MySQL 9.6でカスケードがSQLレイヤーで処理されるようになったことで、親の削除も子のカスケード削除も、両方がバイナリログに記録されるようになりました。隠れていた変更が表に出てきた、という整理ができます。

PR

MySQL運用・管理[実践]入門(yoku0825・北川健太郎・tom__bo・坂井恵 著/技術評論社)

今回の変更は「InnoDBが内部で何をしているか」を理解していないと影響を読み違えます。本書はMySQLの内部構造・動作原理を運用目線で解説しており、なぜカスケードがbinlogに出ていなかったのかという背景まで腑に落ちる一冊です。現役の管理者・DBA向けの実践書です。


MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行 - 解説1

現場への影響その1:レプリケーションとCDC

この変更が一番効いてくるのは、バイナリログを「正」として使う仕組みです。代表がレプリケーションとCDC(Change Data Capture)です。

従来は、子テーブルのカスケード削除がbinlogに出ないことで、いくつかの厄介な問題がありました。たとえばソースとレプリカでストレージエンジンが違う構成(レプリカ側がMyISAMなど外部キーを扱わないエンジンの場合)では、ソース側でカスケードされた子行の削除がレプリカに伝わらず、データがずれていく恐れがありました。

CDCも同じ問題を抱えていました。Debeziumのようなツールはbinlogを読んで変更イベントを下流へ流しますが、binlogに出てこない子テーブルのカスケード削除は捕捉できません。Debezium自身も、データベースが生成するこの種の削除イベントはbinlogに含まれず捕捉できない、と制約を明言していたほどです。分析基盤やデータレイクへ同期している環境では、親は消えたのに子が残り続ける、という不整合が起きていました。

MySQL 9.6では親子双方の変更がbinlogに記録されるため、これらの不整合の根が断たれます。異種エンジン構成・CDCパイプライン・監査ログのいずれにとっても、データ整合性が一段固くなったと言えます。

現場への影響その2:既存スキーマと運用への波及

では、すでに外部キーとカスケードを多用しているスキーマは、何か手を入れる必要があるのか。結論から言えば、テーブル定義やSQLを書き直す必要はありません。CREATE TABLEのFOREIGN KEY定義も、ON DELETE CASCADEの書き方も、これまで通りです。

ただし運用面では、いくつか頭に入れておきたい点があります。

第一に、バイナリログの量が増える可能性です。これまでログに出なかった子テーブルのカスケード削除・更新が記録されるようになるため、カスケードを多用していて大量の子行が連鎖的に消えるようなワークロードでは、binlogのサイズが従来より増えることが考えられます。ディスク使用量やbinlog保持期間(binlog_expire_logs_seconds)の設定を見直しておくと安心です。

第二に、レプリカの挙動が変わる点です。これまでカスケードが伝わっていなかった構成では、9.6化によって子行の削除が正しく伝播するようになります。これは整合性としては正しい方向ですが、「これまで残っていた子行に依存していた処理」があると、移行後に挙動が変わって見えることがあります。バックフィルや集計ジョブが子テーブルの残骸を前提にしていないか、念のため棚卸ししておくことをおすすめします。

第三に、検証の重要性です。FK処理の主体がInnoDBからSQLレイヤーへ移るという大きな変更なので、本番投入前にステージング環境で、外部キーを多用する代表的なクエリと、レプリケーション・CDCの流れを通しで確認しておくべきです。


MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行 - 解説2

移行のための退避弁:innodb_native_foreign_keys

大きな挙動変更には、移行を急がせない仕組みが用意されています。MySQL 9.6では innodb_native_foreign_keys という起動変数が追加されました。

これは読み取り専用(起動時に決まる)の変数で、既定値はFALSEです。FALSEのままなら、新しいSQLレイヤーによる外部キー処理が有効になります。一方、ステージングや本番投入の初期段階で慎重に進めたい場合は、この変数をTRUEに設定することで、従来のInnoDBネイティブな外部キー処理に一時的に戻すことができます。新挙動を検証しながら、いざというときの退避先を持っておける、という設計です。

ただしこの変数は移行を楽にするための過渡的なものとされており、コミュニティがSQLレイヤー方式に十分に移行した段階で、将来のリリースで削除される見込みです。つまり「TRUEで旧挙動に固定し続ける」のは長期戦略にはなりません。あくまで検証期間中の保険と捉え、最終的にはFALSE(新方式)で運用する前提で計画を立ててください。

PR

MySQL徹底入門 第4版 MySQL 8.0対応(yoku0825 ほか 著/翔泳社)

外部キーやレプリケーション、文字コードといった実務で迷いやすい論点を、MySQLユーザーグループの面々が体系立てて解説した定番書です。9.6の変更を読み解く土台として、MySQLの基礎から運用知識までを一度きちんと押さえておきたい管理者に向いています。

性能はどうなるのか

処理の主体を変える以上、気になるのは性能です。InnoDB内部で完結していたものをSQLレイヤーで処理するようになると、オーバーヘッドが増えるのではないか、という懸念は自然です。

この点についてOracleは、一般的なトランザクションワークロードで広範なベンチマークを実施し、SQLエンジンによる外部キーの検証・カスケードは、従来のInnoDB方式とほぼ同等の性能で動作すると報告しています。外部キーチェックとカスケードのコストは実質的に変わらず、スループットやレイテンシに目立った劣化は見られなかった、という説明です。

もちろん、これはあくまでベンチマーク上の話です。自分の環境のワークロード次第で結果は変わり得ますから、移行前後で実際のクエリ応答時間とbinlog量を計測して比較しておくのが堅実です。所要時間はステージング環境で代表クエリを流すだけなので、数十分もあれば傾向はつかめます。


MySQL 9.6で外部キーのカスケードがバイナリログに記録|現役Linux管理者が押さえるFK挙動変更と移行 - まとめ

本記事のまとめ

MySQL 9.6の外部キー処理SQLレイヤー化は、派手な新機能ではありません。けれども「カスケードがbinlogに残らない」という、2007年から20年近く付き合ってきた弱点に正面から手を入れた、運用者にとって意味の大きい変更です。レプリケーションやCDCで親子の不整合に悩まされてきた現場ほど、この恩恵は大きいと感じます。

私自身、20年以上Linuxサーバーとデータベースの現場を見てきましたが、外部キーのカスケードは「便利だが挙動が読みにくい機能」の代表でした。今回のように、内部に隠れていた動作が表に出て、ログで追えるようになるのは素直に歓迎したい変化です。

論点 押さえどころ
変更の本質 FK検証・カスケードがInnoDBからSQLレイヤーへ移行
最大の効果 カスケードがbinlogに記録され、レプリケーション・CDCの整合性が改善
スキーマ変更 不要(テーブル定義・SQLはそのまま)
運用で見直す点 binlog量の増加、レプリカの挙動、ステージング検証
退避弁 innodb_native_foreign_keys=TRUEで一時的に旧挙動(将来削除予定)

最終的な細かい仕様や数値は、MySQL公式のリリースノートとリファレンスマニュアルで確認するのが確実です。ただ「なぜこの変更が入ったのか」という背景を理解しておけば、移行計画も落ち着いて立てられます。外部キーを多用しているなら、まずはステージングで一度通しの検証をしておきましょう。

そのデータベース運用、「なぜそう動くか」まで説明できますか?

外部キーの挙動、レプリケーションの仕組み、バイナリログの読み方。記事で知識を仕入れるだけでなく、Linuxサーバー上で実際に手を動かして検証することで初めて、現場で使える力になります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。


Linux無料マニュアル(図解60P) 名前とメールで30秒登録