2017年1月27日金曜日

ORACLEデータベースの統計情報に注意!

今回は、ORACLEデータベースのパフォーマンスについての話です。
ちょっと専門用語も出てきます。
■データベースにも反抗期がある
 人の一生と、データベースの一生が似ている気がします。
 
 人は、生まれた日が誕生日です。
 データベースの誕生日は、本番運用開始日がそれにあたります。
 それぞれ、世に出た日が誕生日なのです。
 人は、赤ん坊のころは、泣き叫ぶことで、自分の要求を伝えます。
 データベースも同様。
 運用開始したころは、想定以上の負荷に対して、泣き叫ぶようにエラーを吐き続けます。
 時には、ハングして、親であるデータベースエンジニアをも泣かせます。
 運用開始後1年経つと、障害発生数は少なくなり、あまり手がかからなくなります。
 人だったら、小学生から中学生くらいでしょうか。
 もう色んなことが一人でできるようになり、自立への道を進んでいる時期です。
 自分の意見や主張も出てくる頃です。
 やがて、親に反発して、何もしゃべってくれなかったり、自分で決めたことを勝手にやるようになります。
 大人が嫌いになり、突然不機嫌になるということもあります。
 データベースも、同じように、データベースエンジニアを困らすような、分けのわからない不機嫌さを見せるようになります。
■わがままデータベース
 エラーは出さないのですが、突然パフォーマンスが落ちたり不安定になったり。
 運用開始直後の、分かりやすい障害ではなく、徐々に何かが悪くなっていくような、、、、分かり辛い障害。
 はっきりした兆候がログに記録されていればいいのですが、それも無くて、原因がつかみづらい、、、
  親:データベースエンジニア
   「何か、言いたいことあるのか!?」
  子:データベース
   「親父に言うことなんかねえよ!」
 ここで、人の子ならほっといて様子を見ることもありなのでしょうが、データベースの場合、機嫌よく動いてもらわないと
 いけないので、親父であるデータベースエンジニアが、意地でも何とかします。
■息子よ、おまえは何か隠しているだろう!?
 昨日まで、パフォーマンスが良かった機能が、今日は、パフォーマンスが悪くなり、何もしなくても次の日良くなった
 ということがありました。
 1)突然、不機嫌に
  お客様「何か、この機能、いつもより遅いけど調べてくれない?」
  という依頼を受けて、以下のようなことを調査しました。
   ・アプリケーションが変わってないか
   ・データベースのインデックスや、テーブル構成が変わっていないか
   ・テーブルの統計情報は毎日取得されているか
   ・テーブルのデータ件数は大きく変化していないか
  上記については、特に問題ありませんでした。
  データベースに対しては何も手を加えていないし、データも大きく変わっていないので、何で急にパフォーマンスが
  落ちたのか原因を特定することが出来ませんでした。
  特定の機能だけが遅いだけで、システム全体としては動作するので、とりあえず様子を見ることにしました。
  
 2)翌日、上機嫌に
  お客様「昨日、遅かった機能、パフォーマンス戻ったよ。」
  との連絡を受けました。
  こちらとしては、何もしていないのにパフォーマンスが戻って、良かったと言いたいところですが、腑に落ちない部分が
  ありました。
  とりあえず、再現待ちとして、また何か起これば、そのときはサポートにも問い合わせて調査しましょうということで
  落ち着きました。
  
 3)翌日、また不機嫌に
  お客様「何で、また遅くなってるんだ?ちゃんと調査してくれ!」
  今度は、データベースの内部情報を取得して調査することにしました。
  ・パフォーマンスが良かった昨日の状態
  ・パフォーマンスが悪い今日の状態
  2つの状態を比較するため、昨日と今日(問題となった機能が使用された時間帯に絞って)のAWRレポート(※1)を取得、
  比較しました。
  
  比較の結果、昨日は同じテーブルに対してインデックススキャンをしていたのに、今日はフルスキャンをしていました。
  統計情報を毎日同じ時間に取得しているのに、何で、毎日実行計画が変わるのか不思議でなりません。
  
  (※1)AWRレポートとは、特定の時間帯に絞って、データベースにどういった待機イベントが発生していたか、
    どんなSQLの負荷が高かったかを確認できるHTMLまたは、txt形式のファイル。
■SQLはどう解釈されるのか?
 統計情報とか、アクセスパスとか、色々と専門用語が出てきたので、ちょっと解説します。
 以下の「ORACLEが受け取ったSQLを解釈する」図を見てください。
Oraclesql_3
 ①端末から投げられたSQLは、ORACLEに受け渡されます。
 ②ORACLEは、受け取ったSQLをオプティマイザという機能で解析します。
  オプティマイザとは、ORACLEの脳みたいなものです。
  投げられたSQLを解析して、テーブルの統計情報(※2)から、最適な実行計画(※3)を決定します。
 ③実行計画を元にディスクからデータを取得して、端末に結果を返します。
  (※2)統計情報とは、テーブルデータのばらつきや、件数などの情報のことです。
     テーブルごとに存在します。
  (※3)実行計画とは、投げられたSQLと統計情報を元に、どういう風にテーブルからデータを取得するかといったORACLEの
    動作についての計画書です。
■データベースが思っていること
 統計情報が、実際のデータと一致していない状態は、パフォーマンス劣化を引き起こす原因になります。
 オプティマイザが、統計情報を参考に実行計画を作成するからです。
 例として、インデックスを作成しているテーブルに対して統計情報を取得したとします。
 このテーブルが0件の時、統計情報を取得したら、ORACLEのオプティマイザはこのテーブルが100万件になっても、
 「0件のまんまだな
 と、ずっと思っています。
 このテーブルに対して、インデックスを使用したSQLを実行しても、応答が遅いかもしれません。
 なぜなら、ORACLEのオプティマイザは
 「0件のまんまだな
 と、今も思っているからです。
 0件だったら、インデックス使う必要無いと思い、フルスキャンでアクセスする可能性が高いです。
■統計情報取得時のデータ件数が問題だった
 問題となった機能で使用されているテーブルAは、ワークのような使い方をするテーブルでした。
 多いときは100万件、少ないときは0件という状態が不定期に発生します。
 パフォーマンスが悪かった日、テーブルAが統計状態を取得される時のデータ件数は0件でした。
 ちなみに、統計情報は毎日夜中2時に取得をします。
 0件の時に統計が取得されたテーブルAは、その日1日、日中に100万件のデータが入った状態でも0件の統計情報を使用して、
 実行計画を作成します。
 この場合、インデックスの項目をwhere句に指定したSQLは、有無を言わさず、100万件のデータに対してフルスキャンを行う
 ような動きをしてしまいます。
 そして、次の日、テーブルAは100万件のデータの状態で、統計情報の取得が行われました。
 その日一日パフォーマンスが回復しました。
 この場合、インデックスの項目をwhere句に指定したSQLは、ちゃんとインデックスが使用されたからです。
 ただ、その日は良くても次の日どうなるか分かりません。
 0件の状態で統計情報を取得される可能性があるからです。
■統計情報を取らないことにしました
 テーブルAのようなテーブル件数の増減が激しいワークのようなテーブルは、統計情報を取得しないことになりました。
 取得しないというよりは、一度、100万件の状態で取得して、その後は取得しないようにする設定を入れました。
 こうすることで、統計情報はずっと同じものを使い続けるので、毎日パフォーマンスが変化することがありません。
 毎日インデックスが使用されるはずです。
 本当なら、設計の段階でワークのようなテーブルを洗い出し、本番運用前にこういった統計情報の固定化対策を入れておくべき
 でした。

2017年1月21日土曜日

ORACLEの32ビット版はメモリサイズに制限がある!

ORACLEの知識だけが先行して、失敗したことがあります。
受発注管理システムに携わっていたころの話です。
コールセンターで、お客さんからの電話を受けて、商品の注文を入力するシステムです。
データベースのパフォーマンスが悪く、電話を受けてからの受発注業務に支障が出ているとのこと。
その会社の情報システム部と話した結果、全体的に遅いので個々のSQLをチューニングするよりは、データベースの構成を
見直したほうが良いということになりました。
■現状調査
データベースを構築した方は既にいませんでした。
取りあえず私は現状の環境調査から始めました。
環境は、
 ・サーバメモリは4GByte
 ・OS:windows server 32bit
 ・ORACLE:10g 32bit
調査の結果、ORACLEで必要なメモリが足りず、パフォーマンスが悪いようです。
ここで、ざっくりと専門用語の説明を。
ORACLEのメモリはSGAとPGAで構成されています。
SGAにはSQL解析結果をもとにした実行計画や、よく使用されるデータをキャッシュしています。
PGAは、大量のソート処理を行うために確保されています。
SGA、PGA合わせて、500MByte確保されていて、処理量とデータ量に対して足りていませんでした。
メモリ不足からディスクへのアクセスを行っていることが、パフォーマンス遅延の原因のようでした。
■環境変更
そこで、以下のようにORACLEで確保しているメモリを変更しました。
M0
32bitOSなので、ORACLE.exeという一つのプロセスに対してメモリを2GByteまでしか使えません。
本番環境にて、ORACLEが使用できるメモリサイズを500MByteから1900MByteまで拡張しました。(SGA、PGA合わせて)
残り100MByteは、ORACLEのバックグラウンドプロセスなどの予備用に取っておきました。
作業自体は問題なく完了しました。
■負荷テスト
負荷テストをどうするか話し合いました。
テスト環境はありません。本番環境でテストすることになりました。
テストするとなると、システムを停止する必要があります。
日中にシステム停止することは、コールセンターなので無理です。
夜間にテストすることになりました。
そのテストも、夜間バッチが動かない間に行う必要があるとのことで、1時間くらいで出来る内容となりました。
情シスの方が5人くらいで同時に使って、パフォーマンスと動作に問題ないことを確認しました。
実際は、コールセンターの方は40人位いるので、それ位の人数でテストするべきですが、、、
■運用
テレビCMを打った後、コールセンターの電話が一斉に鳴りだします。
そのタイミングで、受発注システムを介したデータベース接続が行われます。
CMを打った直後が、データベースに一番負荷がかかる時間帯ということになります。
■問題発生
画面に接続できないです~
04
データベース接続が出来ず、受発注システムの画面を表示出来ない、との連絡が。
慌ててコールセンターに駆けつけると、コールセンターの方が電話片手に、注文を受け付けることが出来ず混乱状態です。
データベースに接続できない端末は一つだけではなく、沢山ありました。
まずは、ネットワークの問題かと思い、データベースサーバにpingしてみました。
応答がありました。
ORACLEのリスナーも起動しています。
端末からtnspingも通ります。
何より、接続できている端末がいます。
原因が分かりません。
こうしている間にも、CMを観たお客さんからの電話は鳴り続け、商品の注文が取れないよう状態が、、、
そうこうしているうちに、情シスの方から
どうにかしてください!!
08
■復旧
そこで、我に返りました。
こういうときは、原因追求より復旧優先です。
メモリ設定を変更前の状態に戻せば、正常な状態に戻るはずです。
データベース停止の許可を貰い、復旧作業を行いました。
元の状態に戻ったデータベースは、システムからの接続を受け付けるようになりました。
■原因調査
その後、データベースサーバのリスナーログを確認すると、
「ORA-12518: TNS: リスナーはクライアント接続をハンドオフできませんでした」
というエラーが出力されていました。
メモリ不足で、新規接続用のメモリが確保できない状態だったのです。
調査の結果、以下のことが分かりました。
windowsのORACLEはORACLE.exeプロセスに、以下のメモリを保持しています。
・SGA
・PGA
・サーバプロセスのメモリ
・バックグラウンドプロセスのメモリ
サーバプロセスは、端末からデータベースサーバにセッションが確立されると生成されます。
つまり、サーバプロセスはコールセンターの人がシステムにどんどん接続すると、どんどん増えていきます。
32bitOSは、1プロセス当たり2GByteまでという制限があります。
つまり、ORACLE.exeプロセスは2GByteより大きくなれないのです。
<<障害発生までの流れ>>
CMが流れた。

注文が来た。

コールセンターの方が、受発注管理システムを起動し、データベースへの接続が徐々に増えた。
※サーバプロセスが使用するメモリがどんどん増えた。

ORACLE.exeプロセスが2GByteの限界にぶつかり、それで新規接続が出来なくなった。
つまり
・windows版ORACLEの特徴である接続セッションが増加するとORACLE.exeのメモリサイズが肥大することを考慮してなかった。。
・通常業務開始後、接続数の増加と共に限界の2GByteを超え、ORA-12518エラーが発生。
・一定人数までしかシステムに接続できなかった。
激狭の人気ラーメン店に客が押し寄せて、早々に店じまいした感じでしょうか。
後ろで2時間並んでた客は激怒です。
10
変更前の500MByteだったときは、サーバプロセス用のメモリに余裕があり、コールセンターの方が全員接続できたのでしょう。
遅いながらも。
パフォーマンスが悪い問題も残りましたが、今後コールセンターの人が増えた時に、メモリ不足でシステムに接続できなくなる
ことが起こる可能性が出てきました。
対策として、64bitOSに刷新し、メモリを10GByte確保しました。
■振り返り
勉強不足が引き起こした障害です。
・ORACLEの知識だけで対応しようとしたのが問題でした。
 ORACLEだって所詮はOSの上に乗っかているものの一つです。
 ORACLEとOSがどう絡むのかを理解して、どう対応するか決めるべきでした。
・負荷テストを本番想定で行っていなかった
 接続がピークとなる時間帯を想定して、負荷テストを行うべきでした。
 そうすれば、今回の設計ミスも見つけられたでしょう。
 ただ、時間、環境や人といったリソース的な制約もありました。
 そういったことを踏まえて、もう少し情シスの方と話すべきでした。
 想定負荷を掛けるツールが存在するので、そういうものを使用するとか、いくらでも代案はあったのですから。

2017年1月19日木曜日

ORACLEデータベース並列処理の際に気を付けること

バッチ処理などのパフォーマンスを上げるために、処理の並列化を行うことがあります。
今回のコラムでは、ORACLEの知識だけで高速化を試みた結果、痛い目を見た話です。
■要件
営業所ごとに1年の売り上げを集計する夜間バッチがありました。
そのバッチは、年追うごとに扱うデータが増えていき、終了時間も徐々に日中のオンライン開始時間に近づいていました。
そこで、今後のことも考えて、このバッチのパフォーマンスチューニングをすることになりました。
■目標設定
パフォーマンスチューニングは、「早くなればいい」という漠然とした目標ではいけません。
何時間何分で完了するといった、具体的な指標が無ければ、終わりのない旅になってしまいます。
今年の実績は、夜中1時から明け方7時まで6時間掛かっていました。
業務と話し合い、来年は、夜中1時から明け方4時までの3時間という半分の時間で終わらせる目標を設定しました。
■現状調査
今のバッチは、営業所単位で存在するデータを、A営業所目からF営業所目まで順(シリアル)に処理します。
バッチの中身を解析すると、テーブルには営業所コード列があり、営業所コード列単位にデータを取得して処理していました。
serial.jpg
■対策
そこで、テーブルとバッチを営業所単位に分割し、バッチ処理を並列に行うことを検討しました。AからFまで同時に行うのです。
そして、バッチが並列に動作しても、ディスクアクセスの競合が発生しないように、テーブルは営業所コードをキーとしたパーティションテーブルにしました。
para1.jpg
■テスト
開発環境でのテストを行います。
開発と本番サーバのCPU、メモリは同等の性能です。
ディスクは、本番の1/3の容量しかないので、データ量は約1/3でテストします。
まずは、現状のバッチ、テーブル構成で性能測定を行いました。
データを戻した後は、並列化したバッチとパーティションテーブル構成での性能測定です。
順調に動いているように見えましたが、データベースサーバのCPU使用率が右肩上がりなのが気になります。
とうとう、100%でピタリと、はり付いたまま動かなくなりました。
13.jpg
と、同時にデータベースサーバがダウンしました。
一度に起動するプロセスが多く、処理量も6倍になったためCPUが限界に達したのです。
そこで、並列度を以下の通り見直して再測定を行いました。
para2.jpg
1度に並列処理する営業所の数を6つから3つに減らしました。A、C、Eを並列処理し、次にB、D、Fを並列処理します。
今度は、CPU使用率も安定しており、無事バッチ処理が完了しましたが、現状よりも遅いという結果が出ました。
開発環境なので仕方ないのですが、変更後のバッチを動作している裏で、業務の動作テストが行われていたようです。
AWRを確認すると、変更後のバッチが動作している時間帯には、バッチ以外のSQLによる負荷が確認できました。
それで、速いはずの変更後バッチが遅かったのです。
ちなみに、変更前のバッチが実行された時間帯のAWRには、余計な処理は流れていなかったです。
これでは測定にならないので、テストしてる人達には離席していただき、変更後のバッチを再度測定しました。
予想通りの結果が出ました。開発環境で変更前後のバッチの完了時間を比較しました。変更前は2時間、変更後は40分でした。
並列化したことで完了時間が1/3位に短縮されています。
開発なのでデータ量は1/3です。単純計算で、データ量が本番と同じなら、変更後のバッチは2時間で完了するはずです。
なので、3時間以内という目標は達成できるはず。
■運用
修正後のバッチが動作する前日までに、テーブルをパーティション化し、最新のバッチを配置しました。
修正後のバッチが初めて動く日、夜間立ち合いを行いました。
開始数分で、ログにエラーを出力してバッチはダウンしました。
14.jpg
調査すると、同時に3営業所分のデータ処理を行ったことで、undo表領域の単位時間当たりの使用量が3倍になり、現状の
undo表領域の容量では足りなくなったのが原因でした。
開発環境の検証では、データ量が本番の1/3だったため、こういった現象が発生しなかったのだと考えられます。
ちなみに、変更前は1営業所ずつ処理してたので、単位時間当たりのundo消費量は、現状のundo表領域のサイズで間に合って
いたのでしょう。
バッチがダウンしたため、データベースは途中までの処理をrollbackしている状態です。
お客様はかんかんです。
暫定対策として、undo表領域を増やしてリトライすることになりました。
■振り返り
紆余曲折を経て、バッチに掛かる時間は目標時間内に収まるようになりました。
並列化するうえで注意すべき点としては、単位時間当たりのリソース消費量でしょう。
例えば、今まで1時間掛かっていた処理を、3パラレルにして20分で終わらせるためには、ディスク、CPU、メモリなどのリソースに
ついて考慮が必要です。
単位時間当たりの処理量を増やし、1時間の1/3、20分で処理を終わらせるのですから単純計算で、3倍のリソースが必要です。
現状のサーバリソースで持ちこたえられない場合、ディスク、CPU、メモリが枯渇して処理自体が失敗することだってあり得ます。
このあたりの考慮がすっぽり抜けていたため、起きた失敗でした。
高速化と物理的なリソースは切っても切れない縁なのです。

2017年1月18日水曜日

ORACLEデータベースの運用を引き継ぐ際の注意点

データベースを前任者から引き継ぎ、しばらく運用すると、前任者の色んな痕跡があることに気付きます。
障害のもとになるものもありました。
今にして思えば、事前に把握しておけば、対策が取れて障害を防げたというものも。
今回は、そういった引継ぎについてのお話です。
■歴代管理者が作った謎のテーブル
開発環境のデータベースにて、謎のテーブルを多数発見。
例)
・takahashi
・yamada
・tanaka
名称から、検証用として作成したテーブルだと思いました。
何となく不要なのはわかりますが、ちょっと消しづらい。
ですが、あればあったで、ディスク容量の無駄遣いです。
残された開発担当の方に、必要かどうか聞いても「分からない」という回答。
開発環境なので、えいやっ、と思い切って削除しました。
そうすると、実はこのテーブルを参照して動くツール(開発環境独自のもの)がありました。
そのツールが動かなくなったことに気付いた開発者の方に、怒られてしまいました。
■日次バックアップがダンプファイル
1日1度のバックアップが夜中の2時というシステムがありました。
そのバックアップがexpコマンドによるダンプファイルでした。
 ※ORACLEは、expまたはexpdpコマンドでダンプファイル形式の論理バックアップが取得可能です。
論理ということは、物理的な破損からの復旧時には使用できません。
この場合、新しいディスクを用意して、データベースを再構築するところからの復旧になります。
その日の夜中2時に取得したダンプファイルが最新なので、データベースが壊れる直前まで戻すことが出来ないということです。
 ※どう頑張ってリカバリしても、夜中2時の時点が最新の状態です。
お客さんと話し合って、アーカイブログを使用したホットバックアップの方法に直しました。
■開発環境と本番環境の構成が異なる
開発環境は、コストの制約があり、メモリ・CPU・ディスクは本番同等でなくとも、
ORACLE関連の設定は本番同等というミニサイズ環境が理想です。
 ※あくまでORACLEからの観点です。
ミニですが、本番同等の環境でリハーサルを行うことで、本番作業のミスを減らすことをできます。
しかし、コストの関係で、ORACLEに関しても同じ環境にできなかった場合があります。
例えば、本番と開発の表領域構成が違うとか。
今までで一番大きな差異は、開発環境はシングル構成で、本番環境はRAC構成だったというものでした。
本番環境用の手順書を、開発環境でのリハーサルで使用しましたが、開発環境用に読み替える部分が多すぎて、
流れの確認にしかなりませんでした。
本番当日の一発勝負になったことを覚えています。
■メモリ不足でハング、設計書が無い
共有プールが不足して、新規接続を受け付けなくなり、遂にはデータベースがダウンしたことがあります。
引き継いだデータベースには、共有プールの設定値に関する根拠資料がありませんでした。
なぜ今の値になっているのかを、お客さんに説明するのに困りました。
とりあえず、復旧が優先だったので共有プールの値を増やすにしても、どれくらい増やせばいいか検証できる環境もありません。
えいやっ、で大きめの値を設定し、決まった時間に監視する日々が始まりました。
■監査ログでディスクがいっぱいに
ORACLEはバージョンアップする度に、デフォルトセキュリティが強化される傾向にあります。
11gでは、監査テーブルに大量のログを出力するようにデフォルト設定されています。
それを知らずに運用していたデータベースを引き継ぎました。
そしたら、ある日、表領域の閾値超過お知らせが届きました。
調査すると、監査ログテーブルが存在する表領域の使用率が80%を超えていました。
3時間ごとに使用率が1%ずつ上昇しています。
設計書には監査ログを残すことについて書かれていません。
このままだと、ディスクがいっぱいになりデータベースがダウンします。
急ぎで、その監査ログのデータを削除し、監査ログを出力しない設定にしました。
自分が引き継ぐORACLEのバージョンを把握していれば防げる問題ではありました。
 ※「aud$ 肥大」で検索すると分かります。

■まとめ
引き継いだデータベースが安定稼働しているからと言って、油断できません。
いつ何時、発火するか分からない時限装置が、どこかに仕掛けられているかもしれません。
 ※前任者は仕掛けたつもり何て無いけど。
引き継いだデータベースは、引き継いだ時点で、半年以上再起動せず稼働していますか?
定期的に再起動をしてきたようなデータベースは、これから半年以上無停止で動作するとどうなるか考えておいたほうがいいです。
ずーっと稼働してないと発生しないような問題も多いからです。
引き継ぎは、設計書を用いて行われることがありますが、設計書だけだと、今のデータベース状態が分かりません。
また、設計書には記載されていないことも多いです。
 ※先に環境への対応をして、後で設計書に記載しようとして忘れた、とか。
引き継がれる人は時間が取れるなら、実際の環境を覗いてみて下さい。
問題ありそうなところを見つけ、訊きたいところを洗い出しましょう。

2017年1月17日火曜日

ORACLEデータベース理想的な対応と現実的な対応の比較

データベースが停止すると、業務システムが使えなくなります。
データベースが停止する原因とは?
ORACLEの場合、以下の原因が考えられます。
・ORACLE自体のバグ
・アプリ自体の問題
・システムの使われ方が変わった
・作業ミス
・設計ミス
・ユーザー操作ミス
・サーバ、ディスクの老朽化
上記の項目一つ一つについて、理想的な対策があります。
ただ、コストの関係やその現場のやり方があり、現実的な対策を採用することが多いです。
現実的な対策は、不十分な面もあるので、なるべく理想に寄せる努力をしています。
実際に行っている対策を、いくつか紹介します。
※凡例
◎に理想的な対策を書いてます。
●に実際やった現実的な対策を書いてます。

■ORACLE自体のバグ
ORACLE製品自体のバグによる障害。
処理のスローダウンから、ハングするものまで大小さまざま。
◎理想
既知のバグなら事前に調査して、速やかにパラメータを変更したり、個別パッチを当てたりする。
●現実
24時間無停止のシステムだと、上記のような対策をすぐに行うことが難しいです。
計画停止のタイミングで、対策を行います。
世界初のようなレアなバグを引き当てることがあり、こういった場合は個別パッチが無いため、どうしようもありません。
ORACLE社が個別パッチなり、回避策を提供してくれるまで、待つしかありません。
■アプリ自体の問題
アプリのプログラムの作りが悪く、それが原因でORACLEの障害を引き起こす場合。
例)
・SQLがバインド化されていないため、多種類のSQL解析結果が共有プールを圧迫して、メモリ不足を起こす。
・commitをまめに行わったために、UNDO表領域がいっぱいになる。
・SQLで不要なソートや結合が指定されていて、PGAや一時表領域を大量に使用した結果、領域不足になる。
・デッドロックを引き起こすような処理がある。
これらが頻発し、データベース停止につながります。
◎理想
開発担当者にプログラムを、以下の観点で見直してもらう。
・SQL文がバインド化されてるか。
・確定処理(commit,rollback)のタイミング。
・SQL文で不要なソートや結合が無いか。
・デッドロックになるような処理が無いか。
そして、データベース管理者が、ソースコードレビューにも参加し、DBアクセス周りを特に注意深く確認する。
●現実
皆、時間が無いので、見直されなくなることが多いです。
データベース管理者も、レビューに参加する時間が無く、見逃している部分があります。
上記のようなことを考慮して、共有プール、一時表領域、UNDO上領域などのリソースを大きめに設計します。
■システムの使われ方が変わった
お客さんの使い方は、時間の流れとともに変わります。
ある日を境に、或いは徐々にといった具合に。
使用する人数が増えたり、ある機能とある機能を同時に使いだしたり、データの参照頻度が変わったり、データ量が増えたりなど。
全てデータベースに影響します。
それがもとで、ディスクやメモリがいっぱいになったり、ORACLEのバグを引き起こしたりということもあります。
また、データ量が増えたことにより、一時表領域・UNDO表領域やアーカイブログ出力領域が当初の設計では足りなくなることがあります。
◎理想
システムの使われ方が変化させるようなイベントを抑えて置く。
常にメモリ、ディスク、CPUの使用量の情報を取得し、DBサーバの動きを観察する。
少しでも、普段と異なる動きが見られた場合は、調査をする。
●現実
常に情報を取得し、分析する時間が無い。
各種リソースは多めにとって、変化を許容できるようにする。
■作業ミス
開発データベースを停止するつもりが、接続先を間違えて、本番データベースを停止してしまったなど、人手による作業ミス。
資材を取り違えて、間違ったSQLを実行しデータを破壊してしまうことも。
◎理想
本番と開発環境につながる端末を分ける。
本番と同等の開発環境を用意し、リハーサルを本番と同じ手順で行えるようにする。
本番作業は実行者と確認者のペアで作業する。
ミスしたときのことを考えて、データのバックアップを取っておく。
●現実
本番と開発環境につながる端末を分けています。
本番作業は実行者と確認者のペアで作業を行っています。
なるべく本番で行う作業を、事前にリハーサルできるように同等に近い開発環境を用意しています。
ミスしたときのことを考えて、バックアップを取っておきますが、作業時間の制約があるため、部分的なところだけに限られること
があります。
(例えば、スキーマ全体取りたいけど、時間が掛かるので、データ変更するテーブルだけに絞るとか。)
■設計ミス
データベースの設計について抜けがあり、設計を元に構築したデータベースが、メモリ、ディスク不足を引き起こす。
◎理想
常に業務と連係して設計を行う。
業務設計で、データ件数、トランザクション数、など変更があれば、情報の提供を受けて、再設計する。
●現実
常に業務と連係できる時間が無いです。
そのため、当初、業務にヒアリングしたパラメータで設計してそのまま構築しています。
システムテストなどで、本番同等の使い方をして、各種リソースの使用量を実測し、設計、構築に反映しています。
また、各種パラメータを大きめに設計してデータベースを構築します。
■まとめ
ディスク容量については、データ件数やレコード長からある程度、正確に見積もれます。
ただそれも、設計時点のパラメータであり、実際に使われ出すとデータ件数はもっと多かったり、思い通りにいかないことが多い。
また、メモリに関しては、共有プールやバッファキャッシュなどを正確に見積もる式というのは存在しません。
各環境でOS、サーバ、ディスク、メモリ、CPUやトランザクション数、そしてデータ量などが異なるので公式として定義することが
できないのだと思います。
このように、データベースの各種パラメータは、ぴたりと正確な値を見積もることが難しい。
また、お客さんの使い方が変われば、正確にに見積もった値では、許容出来ないことだってあります。
そういったことを踏まえて、ほとんどの障害対策は、リソースに余裕を持たせて、急激な変化や不測の事態に対応するというものになりました。
設計、構築している側からすると、実測したり、計算で出した値に、安全率という形で余裕を持たせてます。
これは、予測がつかない部分(ORACLEの明かされてない仕様や、細かいシステムの使われ方)を補うためです。

2017年1月16日月曜日

ORACLE MASTERとは何なのか!?

皆さんのORACLE MASTERのバージョンはいかがでしょうか?
10gまでの場合、去年2016/2/29で失効しています。
2017/1現在、11gか12cが認められています。
■ORACLE MASTERって何?
 ORACLE社が、ORACLEデータベースの技能について認定する資格です。
■その特徴
 ・ベンダー系の資格にしては、メジャーです。
 ・資格レベルの表現が貴金属。
  ・Platinum
  ・Gold
  ・Silver
  ・Bronze
  危険物取扱者みたいに甲・乙・丙とかじゃないです。
  さすが、外資系です。オシャレ。
  もちろんPlatinumが最高レベルです。
 ・合格するためには、下位レベルから順番に受験する必要がある。
  例えば、いきなりGoldを受験することはできません。
  Bronze試験から順番に合格する必要があります。
 ・受験費用が鬼。
  今は1教科あたり、26600円です。
  もちろん上位資格に行けば行くほど、講習受けたり、実技試験があったりで、受験費用が跳ね上がります。
 ・ORACLEについてしか問われない。
  正規化とか、ER図とか、業務知識とか、そういった話は出てきません。
  出てくる問題は、あくまでORACLEに関することばかり。
  新機能についてや、パフォーマンスチューニング、起動停止、バックアップ方法などなど。
  IPAが行うデータベーススペシャリスト試験とは根本から異なります。
  実務でORACLEを使用してると有利です。
 ・試験がバージョンアップする。
  ORACLE自体がバージョンアップすると、試験も追随してバージョンアップされます。
  例えば、ORACLE12cがリリースされると、試験も12c対応のものが出てきます。
  つまり、同じGoldでも10gや11gそして12cのものが存在するということです。
  もちろん、最新バージョンの資格のほうが持っていて色々と有利です。
■失効ってどういうこと?
 ORACLEのサイトを見たり、有識者のブログを見て、以下のようなことが分かりました。
 「今後、ORACLE社としては、最新と認めているバージョン(※1)以外は、資格として認めないよ。」
  (※1)12cまたは11g
 ということです。
 私の場合、10gのORACLE MASTERなので、見事に失効の対象になっています。
 皆さんのORACLE MASTERのバージョンはいかがでしょうか?
 そういった資格に関するポリシーを作った理由として、ORACLE社としては、以下の理由を挙げています。
 
 「ORACLEデータベース管理者は、最新のORACLEテクノロジーの知識とスキルを持っていることが
  期待されているから、ORACLE MASTERの資格は常に最新を保っていなさいよ。」
 一理ありますが、バージョンが新しくなるたびに、取り続けるのは、お金がかかります、、、。
■失効しないためには
 10gの場合、2016年の2月29日までに、11gまたは12cにバージョンアップしないと失効してしまうそうです。
 
■失効するとどうなるの?
 資格として認めないとはどういうことかというと、
 「認定証や認定ロゴが使用できない。」
 といったことらしいです。
 分かりやすく言うと、名刺にORACLE MASTERロゴを載せちゃダメなんです。
 その他に、どういった不都合が起きるかは分からないですが、ORACLEが認めないということは、資格として、
 あまりよくないことだと思います。
 失効した古いバージョンのORACLE MASTERしか持ってなくても、職場の雑談なんかで「ORACLE MASTER持ってます!」と
 自称するくらいだったら問題ないと個人的には思います。
 ただ、何十年後かに、ORACLEが30zとかいうバージョンになってても、自分が持ってるバージョンが10gのままのだったら、
 それは、ちょっと恥ずかしい気もしますが、、、、、
■私がORACLE MASTERに掛けた金額
 ざっくり覚えている範囲で、私がORACLE MASTERを取得するのに使った金額です。
 ・ORACLE MASTER 9i Silver Ferrow
  2教科×15,000円=30,000円
 
 ・ORACLE MASTER 9i Silver
  1教科×15,000円=15,000円
 ・ORACLE MASTER 10g Silver
  1教科×15,000円=15,000円
 ・ORACLE MASTER 10g Gold
  1教科×15,000円=15,000円
  パフォーマンスチューニング講習=250,000円
 ・ORACLE MASTER 10g Platinum
  実技試験(2回分)(※2)×230,000円=460,000円
  RAC講習×450,000円=450,000円
  ORACLE Platinum特訓講習×250,000円=250,000円
  (※2)実技試験は、1回落ちました。なので2回分の費用です。
  
 足掛け6年掛かってます。
 教材代、旅費(地方在住なので実技試験や講習は東京まで受けに行ってました。)なども含めると、150万円は
 掛かっています。
 軽の新車と同じかそれ以上くらいです。
 我ながら、よく使ったなあと思います。
■ORACLE MASTER持っててよかったこと
 良かったことばかりです。
 これは、資格に対するお世辞でも何でもないです。
 あくまで、私の場合ですが、、、
 まず、今のデータベースエンジニアとして働くきっかけになったことですね。
 IT業界4年目で、特に得意分野もなかった私は、
 「何もかも人並みレベルなんで、いずれ仕事無くなるなー」と思ってました。
 じゃあORACLEどうかな、SQL少し知ってるし、と思って、試験受けたのがきっかけです。
 Silverを取得して、履歴書に書くようになってから、今みたいなデータベース管理者としての仕事に就くことが出来ました。
 そこから、苦労しましたが、データベース管理、運用、設計、構築する経験がもらえました。