DB2即戦略管理術

DB2の仕組み基本

DBに求められる基本機能

隔離性

複数で操作している時にデータの整合性を確保するための専有機能

原子性

データ操作の全部成功か全部失敗かを保証する機能

高速性

データアクセスの高速性を保証する

インデックスを作り少ない手順で目的のデータにアクセスする

メモリによく使用するデータを格納してディスクI/Oを減らす

耐久性

ログに処理を書き込む事で障害時にデータを失わない機能

SQL問い合わせ

高度なDB操作を柔軟かつ簡単に記述できる言語

DB2の内部構造

インスタンス

複数のDBを管理するグループ

エージェント

発行されたSQLを受け取り、解析・実行し結果をDB2クライアントに返す

基本的に1エージェントに対し1コネクション

バッファープール

ディスクキャッシュで、データは一時的にバッファープールで操作され、後でディスク装置に書きだされる

また、ディスクから直接データを読み込む事をせず、全てバッファープールを介して行われる

IO

IOサーバ

エージェントからの要求に対し、ディスク装置にアクセスしバッファーにコピーする

IOクリーナ

バッファー上で更新されたが、データが更新されていないものをディスクに書きだす

表スペース

データ、表は表スペースに作成される

表スペースはコンテナーと呼ばれるディスク領域の集まり

トランザザクション

ロガー

エージェントからSQL更新処理を受け取り、ロガーに伝え、ログバッファーに書き出しCOMMITするタイミングでログパスに書きだす

ログバッファー

一時的なメモリ領域

ログパス

ディレクトリ上のトランザクションログ

ユーザ認証と権限

DB2自体は、ユーザの認証を外部に移譲している

OS側のユーザを作成し、OS側出認証し、それに対してユーザ権限を与える

DB2の基本設定と操作

インスタンスの作成と起動

インスタンスユーザ

通常のDBユーザ

分離ユーザ(fence User)

DB2独自のユーザで、以下実行用ユーザ

ストアドプロシージャ

影響度を最小限にするため

ユーザ定義関数(UDF)

DBと表の作成

インスタンス

db2listコマンド

インスタンス一覧の取得

db2idropコマンド

インスタンスの削除

db2startコマンド

インスタンス起動

表にデータを入れる

INSER文

データを1件ずつ投入

IMPORTコマンド

大量のデータをがっさり取り込む。(ログあり)

LOADコマンド

大量のデータをがっさり取り込む(ログなし)

制約

チェック制約

与えられた条件に一致するデータしか投入できない

プライマリーキー制約

主キー

必ずインデックスが設定される

参照整合性制約(外部キー)

2つの表で整合性をとるための制約

表の再編成

REORGコマンド

統計情報の更新

RUNSTATSコマンド

接続解除

TERMINATEコマンド

接続解除の時点でファイル実行が終了

CONNECT RESETコマンド

DBの接続解除後にファイルの続きを実行する

DB2のコマンド実行

システムコマンド

DB2の操作用コマンドで全てdb2から始まる

CLPコマンド

通常のコマンドで"db2 コマンド"として投入する

DB作成時のポイント

DB作成後に変更できないモノ

DBの文字コード

文字コードによって必要なバイト数が違う

文字コードの変換時のオーバヘッド

文字の並び順

文字列自体の並び順。通常デフォルトのまま

デフォルトページサイズ

DB2のデータ操作時の最小読み書き単位

4,8,16,32KBの中から選択

ページサイズが適切でないと

余分なデータ取得

不要なディスクI/O

バッファプールの使用率低下

DBパスとストレージパス

DBパス

DB2の設定情報を格納するだけで、サイズは小さくアクセス頻度も少ないのであまり意識しない

ストレージパス

データが格納される物理パス

DB構成パラメータ

DB CFG

DB構成パラメータ

DBごとに設定でき、チューニング項目が最も多い

DBM CFG

DBM構成パラメータ

DBCFGの上位パラメータに位置し、インスタンス全体の設定を行う

レジストリー変数

特殊な設定を行うパラメータ

OS環境変数で設定する

通常はプロファイルレジストリーで設定する

本番環境用の最低限の設定

ログを設定する

ログのDBパスを高速デバイスに張り替える

ログの最大サイズを設定

LOGFILSIZ

ログファイル1つのサイズ。(4kb単位)

LOGPRIMARY

1次ログ

最初に(LOGFILSIZ*LOGPRIMARY)が確保

LOGSECOND

2次ログ

LOGPRIMARYが足らなくなると、LOGFILSIZ*LOGSECONDを確保

ロギング

循環ロギング

ログファイルを上書きして再使用する

アーカイブログ

ログファイルを上書きしないで貯めこむ

再編成でパフォーマンス

再編成が必要な理由

データの入れ替えによって物理的にデータのばらつきができ、ディスクアクセスが増大するため

再編成

デフラグメンテーション

定期的にデータを並び替える

コンパクション

データ間の隙間をつめる

最適な再編成とは?

データの傾向によって最適が違うためコマンドによって指定できる

一度に多くの行を取得するWHERE句で使用される

多くのSQLのWHERE句で指定されている

再編成が必要かどうか

REORGCHKコマンド

用意された式で再編成が必要かチェックされる

REORGコマンド

INPLACEオプションあり

シャドーコピーで実施

メリット

インデックスも同時再編成

高速処理

LOBの再編成が可能

デメリット

表サイズの2倍程度の一時領域が必要

REORG中の表は更新できない

途中で再編成を中止できない。

一時領域にコピーしながら再編成をする

INPLACEオプションなし

インプレースで実施

自身の表領域内で再編成をする

メリット

一時領域がいらず、同一内に20%空きがあれば十分

REORG中の更新が可能

一時停止、再開が可能

デメリット

ログの使用料が増加する

インデックスの再編成が別に必要

効率的な再編成

再編成を減らす

PCTFREE

データページ内にどの程度余白を残すか

予め余分にページサイズをとっておく事で、増大しても再編成が必要としない様にする

クラスターインデックス

INSERT時の断片化を防ぐもの

Subtopic

アクセスプランの精度

アクセスプランの役割

1.クライアントがSQLを発行

2.SQLをエージェントが受け取る

3.アクセスプランが実行される

1.SQLの書き換え

2.複数のアクセスプランを作成

3.コストの見積もり

4.アクセスプランの決定

4.アクセスプランに沿って実行される

良くないアクセスプランとは?

実際のデータやインデックスと一致しないアクセスプラン

アクセスプランの統計情報とは

行数

SYSSTAT.TABLES

この列はどの程度値が散らばっているか

SYSSTAT.COLDIST

列の取り得る値は何種類あるか(カーディナリティ

SYSSTAT.COLUMS

インデックスの有無

SYSSTAT.INDEXES

統計情報の基本

RUNSTATSコマンド

統計情報をシステムカタログ表に格納

統計の精度を上げるには

データに偏りがある場合

通常は、データの分散を計算していない

DISTRIBUTIONオプションを使用すると、データの偏りも含めて統計をとる

列が文字列の場合

通常は前方一致の統計しか取得しない

LIKE統計を実施

詳細な統計情報の収集、アクセスプランの精度に直結するがコストがかかる

効率的に統計をとる

どのタイミングで統計情報をとるか?

表のデータを大きく入れ替えたとき

新しくインデックスを作成したとき

更新、削除が多く実施され表のデータの20%以上が入れ替わった場合

REORGを実行した後

RUNSTASの実行時間を短くする

RUNSTATSの実行時間は行数に比例する

頻繁に使用される列にのみ対してRUNSTATSを実行

表の一部のみで統計をとる(サンプリング

SYSTEM

ページ単位で雑

BERNOULI

行単位で細かく

バックアップに統計情報も含まれる

パフォーマンスチューニング

基本的なチューニング

パフォーマンスとは?

システム応答時間

スループット

リソース使用率

チューニングとは?

限られたリソースをトレードオフする事

チューニングには限界点が存在し、限界点に近づくほどチューニングが難しくなる(チューニングの作業時間コストが増加する)

チューニングの範囲を決める

ヒアリングをして遅い部分を特定する

遅いとは?

応答速度

画面切り替え速度

いつぐらいから?

特定の処理の時のみか?

Subtopic

問題を切り分けて調査する

チューニングする対象は一度にひとつでシステム全体への影響を確認する

チューニングの心得

チューニングのゴールを設定

明確な目標を立ててチューニングする

一度に一箇所のみ調整

チューニング影響の切り分けをするため一度に一つ

システム全体を考慮

変更箇所に対するシステム全体への影響度を想像する

必ず測定する

チューニング後は必ず測定し間隔で進めてはいけない

元に戻せるようにしておく

チューニング結果を元に戻せるようにしておく

チューニング方法の選択

影響の小さくかつ簡単にできるものから実施

1ハードウェアの増強

2.パラメータを調整する

DB CFGなど

3.インデックスを見直す

4.DB2独自の機能を使う/物理設計を変更

MQTやMDCなど

5.論理設計を変更

表の定義を変えたり、遅いクエリーを変更など アプリケーションへの影響が大きい

バックアップ

基本コマンド

BACKUP DATABASEコマンド

基本BKUPコマンド

LIST UTILITIESコマンド

BKUPの進行状態の確認

LIST HISTORYコマンド

BACKUPの結果を確認

バックアップ種類

オンラインバックアップ

他者が操作中の状態で行う

アーカイブログでないと実施できない

オフラインバックアップ

誰も操作していない状態で行う

差分バックアップ

拡張用のBACKUP

INCREMENTALコマンド(累積)

常にフルバックアップ+累積バックアップ

INCREMENTAL DELTA コマンド(DELTA)

フルバックアップ+デルタバックアップ複数

バックアップイメージの圧縮

BACKUPコマンドオプション

COMPRESS

バックアップイメージのファイル例

MYDB.0.DB2.NODE00.CA00.YYYMMTT.001

MYDB

DB名

0

0

データベースBACKUP

3

表スペースBACKUP

DB2

インスタンス名

オフラインモードで作業

FORCE APPLICATIONSコマンド

強制的にDB利用中のユーザの接続を切る

リストア

RECOVERコマンド

Subtopic

バックアップの計画に重要な事

DBのサイズ

DBの更新量

DBの増加量

DBアクセスの傾向

バックアップの保存先

BACKUPが必要な量

バックアップの実行時間

リストアにかけてよい時間

*LOBがあるTBLは差分バックアップができない

その他のバックアップ方法

EXPORTコマンド

任意の条件でSELECTし、バックアップファイルを吐き出す

DEL(カンマ区切り)、IXF(バイナリ)形式で出力される

SET WRITE SUSPENDコマンド

高速コピーだが、実査には後ろでバックアップが実行されている

バックアップ運用で注意する事

バックアップイメージとアーカイブログの保存先

データ領域とは別の物理ディスクであること

バックアップに十分な容量のDISKを用意すること

DBの設定変更

アーカイブログを有効にする

差分バックアップを有効にするため、TRACKMODパラメータをYESにする

アーカイブモードにした直後に、フルバックアップをとる必要がある

Subtopic

物理設計

監視

監視とは?

事前に障害発生を防ぐ事

重要な事は平常な状態を把握しておくこと

監視すべき対象とは

プロセス

CPUやメモリ使用量

ログファイル

ストレージの使用率

トランザクション数、デッドロック数

ハードウェア層の監視で大事な事

基本的には故障していないか?

死活監視

機能が生きているか死んでいるか

NICやケーブル、プロセッサやディスク装置

OS層の監視で大事な事

リソース状況の監視が重要

原因として、予想以上にリソースを使っている事が原因になる事が多くある

CPU使用率、メモリ使用率、ハードディスク容量

AP層 DB2の監視で大事な事

死活監視が重要

DB2の表スペースは最大容量で確保されるため、実際にどの程度使用しているかはDB2から確認する必要がある

DB2の状態を確認

DB2確認機能

モニター表関数

要求メトリック

DB2ni対する処理要求、接続要求やトランザクション処理など

アクティビティメトリック

実行されているSQL

オブジェクトメトリック

表やインデックスなどへのアクセス状況

スナップショット関数

DB2のリソースを監視

リソース監視

DB2のプロセス監視

プロセス/スレッドの死活監視

DB2のメモリ監視

メモリ使用量、メモリの最高水準点

DB2のディスク監視

表スペースの使用率、トランザクションログ領域の使用率

パフォーマンス監視

1分あたりのトランザクション数(TPM)

COMMITの発行数

トランザクション数=COMMIT発行数

SNAPDBビューから得られる値

実行したSQLの更新系SQLの割合を確認

バッファープールヒット率

I/Oリクエストのうち何割がバッファープールを占めているか

トランザクションあたりのディスク読み書き数

アプリケーションに戻された行数のうち物理的に読み取った行数の比率

通常は1より大きい値がでる

データを全部所得してからマッチさせているため

1以下の場合は、インデックスがうまく動作している

ソートに費やされた時間

ソートに掛かった時間をトランザクション数で割り1トランザクションあたりを

ロックウェイト

ロックの待ち時間の合計を図るが値が小さいので1000倍

Subtopic

デッドロック数とロックタイムアウト数

ダーティスティールの回数

パッケージキャッシュ挿入数

トランザクションログがディスクにフラッシュされるのを待機した時間

パラメータ調整

自動保守

自動保守の基本

BACKUP,REORG、RUNSTATSを自動的に実施

パラメータの親子関係に注意

自動保守の親パラメータはAUTO_MAINT

親パラメータと各機能のパラメータを両方有効にする

BACKUPの自動保守で可能なこと

バックアップ実行期間

どの程度のデータが更新されるとバックアップするか

REORGの自動保守で可能なこと

対象の表を絞りこむ

オンラインかオフラインで実施可能

RUNSTATSの自動保守で可能な事

対象の表を絞りこむ

自動保守機能の注意点

RUNSTATSの自動保守間隔は2時間のため、高速なアクセスがある場合最適でない場合がある

リアルタイム統計情報更新

RUNSTATS実行から任意時間以内に終わらない場合は処理を中断する

失敗した場合は擬似の統計情報を取得する

トラブル解決

トラブル解決の基本4step

1.冷静になってトラブル発生の前後動作を確認

障害内容の確認

障害発生時刻の確認

障害発生前に何か変更しなかったか?

2.ざっくりと問題を切り分ける

動かない場合

アプリケーションのログやネットワーク、プロセスの有無、ディスク使用率を確認

とても遅い場合

CPU使用率、ネットワーク使用率などリソースを中心に確認

3.DB2内を切り分ける

1.HDD,リソース面を確認

2.OSの障害を確認

3.DB2の障害を確認

4.DB2内部を確認

4.ログを確認し、OSコマンドで切り分け

OSコマンド

メモリ状況

vmstat,free(linux

タスクマネージャ(windows

OSのログ

syslog(linux

イベントビューア(windows

CPUログ

ps,sar(linux

タスクマネージャ(windows

ネットワーク状況

ping

nslookup

ディスク容量

vmstat,iostat,sar,df(linux

エクスプローラ,

原因不明の障害対処法

1.現状を観察

注意:スイッチオン、DB2に接続しないと使えいない

スナップショットとモニター表関数

メリット

詳細な情報を取得

デメリット

事前準備が必要

DB2コネクト必要

負荷が大きい

db2pdコマンド

メリット

db2コネクト不要

事前準備不要

デメリット

詳細な情報ではない

整合性に欠ける情報

2.仕掛けて待つ

db2diag.log

出力される情報を増やす

イベントモニターで詳細な稼働情報を取得する

イベントモニターの使い方

SQLステートメントの例

1.イベントモニターの作成

作成モニターのアクセス権限に注意

2.イベントモニターを活性化

イベントログと管理用のファイルが作成される

3.アプリケーション稼働

SQLに関する情報が.EVTファイルに格納される

4.イベントモニター非活性化

5.取得した情報の変換

バイナリ形式のため、db2evmonコマンドで変換する

よくあるトラブル

1.容量問題

ディスクス容量が限界になる問題で、テンポラリ、ログ領域、表スペースなどが対象となる

2.特定の日時だけ遅くなる

特定の日だけイベントが発生していないか確認する ウィルスチェックやユーザの集中、バックアップなど

DB2異常終了場合

db2cos(コールアウトスクリプト)

db2が異常終了すると自動的に起動され障害時の情報を集めてログを書きだす

ネットワークやCPU使用率、I/O状況などを書きだす