Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

SQLアンチパターン~ファントムファイル

社内SQLアンチパターン輪読会の資料、第11章ファントムファイル(幻のファイル)です。

  • Login to see the comments

SQLアンチパターン~ファントムファイル

  1. 1. SQLアンチパターン ~ファントムファイル~ CB部ADチーム 板橋正之 2014/05/07
  2. 2. とあるところに 画像とコメントをアップロードすると 一覧表示するサービスが ありました。
  3. 3. A====== ======= ======= ======= A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX アップロード
  4. 4. ある日、 サーバに障害が発生しました。
  5. 5. A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX
  6. 6. こんなこともあろうかと データベースのバックアップを 取っていたのでリカバリを かけました。
  7. 7. A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX リカバリ
  8. 8. データベースは無事復旧しました が
  9. 9. × A====== ======= ======= ======= XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX XXXXXXXXXXXXXX リカバリ × ×
  10. 10. 画像が表示されませんorz
  11. 11. 何故か!?
  12. 12. バックアップ対象 /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg A====== ======= ======= ======= アップロード アプリ
  13. 13. サイズが大きくなりやすい 画像ファイル(バイナリ)は データベースではなく ファイルシステムに 保存する仕組み。
  14. 14. 目的: 画像をはじめとする 大容量メディアファイルを格納する
  15. 15. アンチパターン: 物理ファイルの使用を 必須と思い込む
  16. 16. 注意 物理ファイルを「使用する」 ではなく 「必須と思い込む」が アンチパターン
  17. 17. このアンチパターンに陥ると
  18. 18. /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ファイルの削除時の問題 この行を 削除しても 自動的には 削除されない
  19. 19. Aさんの処理 Bさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 1.トランザクション開始 2.reportID:002のデータを参照 ・ 3.画像ファイルを参照 ・ ・ x.コミット /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg トランザクション分離の問題 コメントは参照できるけど 画像が取得できない!?
  20. 20. Aさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 例外発生 ロールバック! /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ロールバック時の問題 データベースのデータは 元に戻っても 画像は消えたまま
  21. 21. バックアップ バックアップ Aさんの処理 1.トランザクション開始 2.reportID:002のデータを 削除 3.Roads.jpgを削除 ・ ・ ・ x.コミット /var/upload/img/ データベース Hiyoko.jpg Roads.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg バックアップツール使用時における問題 reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg Hiyoko.jpg Penguis.jpg バックアップ ツール バックアップ コマンド トランザクションや 参照整合制約などを 考慮して矛盾なく バックアップ
  22. 22. /var/upload/img/ データベース Hiyoko.jpg Penguis.jpg reportID comment imagePath 001 XXXXXXX・・・ Penguins.jpg 002 XXXXXXX・・・ Roads.jpg 003 A======・・・ Hiyoko.jpg ファイルはSQLデータ型ではない SQLアクセス権限使用時における問題 単なる文字列 - 文字列であること以外に内容の保証はしない - BMSは実際のファイルが存在することの検証はし ない。 - ファイルが変更、削除、移動しても自動的に更新 されない。 - OSファイルの命名規則に従わない(大文字小文 字の区別や使用禁止文字)。 テーブルや列への アクセス権限とは無関係 OSファイルの適切なパーミッションを行う必要が ある。/var/www/html/配下などにファイルを保 存してしまうと予期せぬ参照が行われる可能性 がある。
  23. 23. アンチパターンの見つけ方
  24. 24. 次の質問への答えが曖昧であったり、即答できないようである ならば、きちんと検討されないまま、外部ファイルの使用が採用 されている可能性が高い。 • 「データバックアップとリストアの手順は確立されているか」、「バックアッ プの検証方法はどうか」、「クリーンサーバーやバックアップを実施した サーバーとは別サーバーで、データのリストアをテストしたか」 • 「画像が増える一方になるのではなく、不要になった時にシステムから削 除されるような仕組みになっているか」、「不要な画像ファイルを削除する 手順はあるか」、「その手順は自動化されているか、それとも手動か」 • 「画像ファイルへのアクセス権を持っているアプリケーションユーザは誰 か」、「アクセス権はどのように適用されているか」、「権限を持たない画 像を参照するリクエストをした場合、ユーザには何が表示されるか」 • 「画像に対する変更をキャンセルできるか」、「キャンセルできる場合、ア プリケーションは前の状態に復旧できるか」
  25. 25. いろいろ書いてあるけど 画像や動画扱う場合は 大抵やっている。 大事なのは検討したか否か。
  26. 26. アンチパターンを用いてよい場合
  27. 27. データベースの容量を減らせる
  28. 28. データベースの容量を減らせる =バックアップが短時間 =バックアップファイルの容量も
  29. 29. メディアファイルは データベース外にあるので 単体や一括での扱いが楽
  30. 30. アンチパターンにメリットがあって 問題点が深刻じゃなければ 採用もおk
  31. 31. 大容量メディアファイルを外部ファ イルに格納することが常に最善の 方法であるという一般論に従うの ではなく、十分な情報に基づき、 よく検討して上で判断
  32. 32. 解決策: 必要に応じてBLOB型を採用する (DBMS内で完結)
  33. 33. BLOB型を採用した場合、「アンチパターン」のすべての問題が 解決できる。 • 画像データはデータベースに格納されるので、読み込みのための追加の ステップは不要です。誤ったファイルパスを格納するというリスクもありま せん。 • 行を削除すると、自動的に画像も削除されます。 • 画像の変更は、コミットするまで、他のクライアントには見えません。 • トランザクションをロールバックすると、画像を以前の状態に復元できま す。 • 行の更新時は、ロックが行われます。このため、他のクライアントは同時 に同じ画像を更新できません。 • データベースのバックアップには、すべての画像が含まれます。 • SQLの権限管理によって、行と画像へのアクセスを管理できます。
  34. 34. Oracle MySQL PostgreSQL SQL Server BLOB型 最大4GB(9i) 最大128TB(10g) 最大64KB (※1) - - TINYBLOB型 - 最大255B - - MEDIUMBLOB型 - 最大16MB - - LONGBLOB型 - 最大4GB - - ラージオブジェクト - - 最大4GB - varbinary 型 - - - 最大2GB Image型 - - - 最大2GB Railsでカラムをbinaryで指定するとBLOB型(64KB)になる。64KB以上のオブジェクトを 保存したい場合は、limitで上限サイズを指定する。 ※1 ファイルを透過的に扱うためのデータ型としてBFILE(Oracle)やFILESTREAM(SQL Server)もある。尚、BFILEはトランザクション制御外である。 ※
  35. 35. パフォーマンスをとるか セキュリティや整合性をとるか
  36. 36. ぶっちゃけBLOBは扱いがめんどい
  37. 37. LOBロケータとか 特別な機能使ったりして データ登録する必要がある。
  38. 38. 8章メタデータトリブル 8.5.2
  39. 39. 大容量メディアデータを Webサーバから クライアントに送信するのは 回避したいので サーバを分散させたい。
  40. 40. CDP:Web Storageパターン & CDP:URL Rewritingパターン ※ 但し、画像ファイルなどが第三者に参照されても問題ないか、ファイル名に連続性 がなく予測も難しい場合に限る。
  41. 41. まとめ: データベース外部のリソースは、 データベースでは 管理できないことに注意しましょう。
  42. 42. 以上、 ご清聴ありがとうございました。

×