技術検証したり、資格等をここに残していきます。技術やらかしたらブログにする。一人でも犠牲者が減ればいいんや...。ちなみに、今回は2つハマりました。(本番DB)事象flywayで参照制約を追加したが、既存のデータが既に参照制約を違反した状態で存在しており、アプリサーバの起動が出来なくなった。flywayとはDBをマイグレーションしてくれるツール。簡単に言うと、自動でDBのテーブル構成を構築できる。ファイルのバージョンごとに実行してくれるので、テーブル作成後にインデックスを作成、といった処理順序が大事な処理も問題なく実行できる。javaの起動時にflywayを起動できる。複数の環境があっても、DBの状態は常に目的通りの最新状態にできる。メリットとしては、テストを実行するときも本番環境と同じ状態を簡単に作成できるので、環境構築の手間がほぼ0になる。詳細事象flywayを使うと自動でテーブル構築はできるのだが、過去ファイルの修正は厳禁となる。TABLEで対応する必要がある。今回、テーブルを別のテーブルにマッピングするようにして、参照制約を追加した。発生し、起動しないアプリケーションが生まれてしまった。「SQL変更すればいいじゃん」って思うかもしれないが、もう遅い。flywayではファイルの修正が厳禁だから。具体的な処理としては、最初に読み込んだ状態のチェックサムが異なると、その時点でエラーになる。一度、チェックサムの異常が出てしまうと、postgresを1から再構築しなければならなくなるので、本番環境なんかに流してしまった日には死あるのみ。今回に関しては最悪、データが無い状態であれば正常に動くので、データパッチをあてれば起動することはできる。それは各環境に手動パッチを当てなきゃならないことを意味するので、各環境のリリースするタイミングを調整しなければならない。それは工数的にも心理的にもよろしくない。今回に関しては、開発者だけが使用するサーバだけ壊してしまった。開発者グループに謝って、postgresを1から作成しなおし、flywayを修正して本番環境に適応した。ちなみに、修正としてはこうなった。参照制約ちなみに、マイグレーションが成功しなければ、ファイル修正しても復活させることができるらしい。javaのライブラリとして使用していたので、その辺はどう処理できるかが分からない。flywayでのマイグレーション失敗時のリカバリ方法に詳しい人教えてほしいです...。今回に関しては、データパッチを当てて一度正常に処理終了させた後に、その方法は運用者にNGと言われたので手遅れだったんですが。参照制約追加のバージョンは別にする。データを使うのってデータの量もあるし、セキュリティ的にもできない可能性がある。修正を人に推奨していると怒られるかもしれないが、マイグレーション失敗時のダメージがえぐいので回避策としてはありだと思ってる。参照制約だめですかね?ちなみに、ここまでが前半戦。上でも記載しましたが、参照制約のあるキーを変更しました。商品テーブルを明細IDと紐づけていたのを、商品テーブルを受注IDと紐づけるようにしました。商品だから、データパッチの当て方として、別テーブルから取得した値を元に更新する必要があります。商品テーブルの明細IDを元に明細テーブルを検索し、明細テーブルの受注IDを商品テーブルに更新する必要がありました。別テーブルの値を取得して更新するUPDATE文って結構DBの方言があるんですね。ローカルDBで確認しているのに、flywayで全く動かなくて非常に焦りました。INSERTには方言が無いと勝手に思い込んでいたので、3時間くらい色んな人に相談してました。結果的に以下のようなSQLで実行できました。副.商品IDoracleもH2の文章で実行できそうなので、どちらかというとPostgresのほうが異端なんですかね...。学んだこと検索するときは対象のSQLがどの環境で動作するかをちゃんと確認する。結局、公式ドキュメントが正義。おわりにこの障害で5時間くらいかかってました。一度この状態にしてしまうと、以降のリリースは全部失敗してしまうので、もうずっとテンパりながら対応してました。落ち着いて対処したら3時間くらいで対応できたとは思います...。flywayって便利ですけど、下手にやらかすと復活もできなくなるので怖いですね。他の人はこんなことにならないように...。「flywayで参照制約を追加してアプリ起動しなくなった話」をお読みいただきありがとうございます。役に立った、と思われましたら、ブックマーク・シェア・フォローをしていただければ嬉しいです。PL/SQL)タイトルのとおり、MySQLのSQLで変数が使えないか検証したとき...2021-11-08SpringBootで実際のDBにつなげてユニットテストするSpringBootで実際に起動してあるDBを使ったユニットテストをし...2021-02-10エンティティを渡すだけでDBのユニットテストのセットアップしたい(SimpleJdbcInsertと...皆さんはDBのユニットテストを行うとき、どのようにテストのセ...2021-01-25SpringBootで特定の環境のみFlywayが動かないようにする既存のシステムが利用しているDBに相乗りしてアプリケーション...2021-01-22FlywayとSpringで検証環境と本番環境で投入するデータを変更する仕事ではDBマイグレーションとしてFlywayを使用しています。12:00問い合わせはこちらから。//List形式の画面で記事を入れる場所。上から2個目と7個目のsectionの後に入れる。//記事内で個別に指定されないときに使うAd挿入場所。//0から始まる値で、2を指定すると3番目のと直前に差し込む。insertAdsense();引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。