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

新卒3年目の私がやらかしたユーザー影響0件の「隠れた障害」

Avatar for y.satoshi y.satoshi
September 05, 2026

 新卒3年目の私がやらかしたユーザー影響0件の「隠れた障害」

Avatar for y.satoshi

y.satoshi

September 05, 2026

Other Decks in Programming

Transcript

  1. 背景 2025年6月。とあるプロジェクト対応中 システム:Nuxt(フロント) × Java SpringBoot(API/バッチ) × MySQL 担当タスク:ユーザー向けメール通知機能の対象拡張 決済通知テーブルのシャーディングテーブル追加(←

    私の担当) バッチ処理・APIの改修(← 他メンバー) 文言等のフロントエンドの改修(← 他メンバー) 既存テーブル:通知ON/OFF機能はすでに存在(今回は触る予定なしだった) 4
  2. 実行したALTER TABLE 言われた通り、既存の通知ON/OFFテーブルのカラムコメントを ALTER TABLE で修正。 実はこれが危険だった: MySQLの ALTER TABLE

    は「変更」ではなく 「再定義」。 コメントだけ変えたつもりが、 DEFAULT 句をまるごと消してしまった。 -- Before status TINYINT NOT NULL DEFAULT 0 COMMENT '旧コメント' -- After(コメント変更のつもりが) ALTER TABLE notifications MODIFY COLUMN status TINYINT NOT NULL COMMENT '新しいコメント'; -- ※ DEFAULT 0 が消えた 7
  3. やらかし発生 「吉田さん。これ、さっきの作業の影響です。」 観点 内容 症状 あるバッチが特定の条件でINSERTが失敗 原因 DEFAULT 消失 →

    NULL → NOT NULL 制約で弾かれる 影響なしの理由 INSERT失敗=機能が未開放なだけ NOT NULLがなければ? NULLのままINSERT → 後続処理でユーザー影響発生 10
  4. 学んだこと MySQLの ALTER TABLE は再定義に注意! MODIFY COLUMN は指定した定義で丸ごと再定義される 変更前に現在の定義を確認する: SHOW

    CREATE TABLE テーブル名; 大事なのは 「差分が見える仕組み」 を持つこと GUIがあればいいわけじゃない 実行前後のDDLを比較できるプロセスがないといけない 退勤後に家で検証して Zenn に投稿しました https://zenn.dev/y_satoshi/articles/article20250620 12
  5. まとめ 「ユーザーに気づかれなかった」は「問題なかった」じゃない。 NOT NULL が偶然セーフガードになっただけ。次は防いでくれるとは限らない。 ALTER TABLE は「変更」ではなく「再定義」 SHOW CREATE

    TABLE で変更前後の差分を確認する 今回の一件も、さっきのテーブル移行の苦労も、根っこは同じ DBは一度作ると変えにくいという前提を忘れない 14