はじめに Oracle に携わるようになって、どれくらい経つのでしょう。以前は DB2 という データベースに関わっていましたが、今思えばあまり理解していなかったような 気がします。しかし Oracle に携わるようになって、データベースに関するいろい ろなことがクリアになってきました。DB2 をやっていたわたしも、今こうして Oracle をさわっているわたしも、同じわたしなのに何かが違ったのです。もちろ ん DB2 での基礎があったから、というのは間違いありません。ですが、理解して いく過程を楽しく感じたというか、理解している自分を感じられたのは Oracle で した。それは多分、わからないことがあるときにとことん質問できる相手がいた からだと思います。バカな質問をしても答えてくれる、わかるまで説明してくれ る方々の存在と、自分で体験できる環境があるということが大きかったのでしょ う。どんな技術者でも最初は初心者。理解していく過程があったはずです。その 過程をなるべくわかりやすく説明したい、という強い思いがこの書籍の根底にあ ります。 そしてこの書籍に出てくる先輩と後輩はわたしの理想 (ちょっと大げさ?) の形であり、Oracle に関わりはじめた人は好奇心を大切にし、そんな人を育てな くてはいけない人は少し厳しくしつつも疑問の解決のためには助け舟をだしてね、 という気持ちもこめられています。まだまだ至らない点はあるとは思いますが、こ の書籍が少しでもOracleに携わる人々のお役に立つことを願うばかりです(なお、 本書での内容は Oracle8 を前提としたものになっています)。 最後に、連載および出版の機会を与えてくださった(株)翔泳社の方々、 本当にあ りがとうございました。そして連載からはじまり、書籍化されるまでを支えてく ださった小幡一郎さん、 石川雅也さんをはじめとする (株) インサイトテクノロジー の皆様方、そして中でもとくに、忙しい中でも嫌がらずに面倒をみてくださった 小林修(ちゃむ)さんに、心からの感謝を捧げます。 2000 年 11 月 住民となって 6 年目の茅ヶ崎にて 鵜飼 淳代 目次 第 1 章 DBA のお仕事 --- Oracle の構成を知る --- ................................ 2 やっぱり。........................................................................................ 2 Oracle の構成 ................................................................................ 3 REDO ログ ..................................................................................... 6 コントロールファイル .................................................................... 8 インスタンス .................................................................................. 9 DBA のお仕事って ....................................................................... 12 本日の成果 ................................................................ 14 Oracle の構成 .............................................................................. 14 DBA の仕事 .................................................................................. 15 第 2 章 ロック待ちトラブルの解消 --- データディクショナリを活用する --- ........................................ 18 トラブル発生!! ......................................................................... 18 ロック状況の確認と対応 .............................................................. 21 ほかにできることは? .................................................................. 24 DBA_DEPENDENCIES .............................................................. 26 DBA の醍醐味 .............................................................................. 29 本日の成果 ................................................................ 30 インスタンスリカバリ .................................................................. 30 ロック待ちによるユーザークレームへの対処 ............................. 30 必要なデータディクショナリを探す ........................................... 32 DBA_DEPENDENCY の活用 ...................................................... 32 DBA のお仕事の醍醐味(?)を垣間見る ....................................... 33 第 3 章 SQL の効率を考える --- TRACE と EXPLAIN PLAN の活用 --- .................................... 34 終わらない! ................................................................................ 34 iv SQL_TRACE ............................................................................... 35 EXPLAIN PLAN .......................................................................... 37 本日の成果 ................................................................ 42 SQL_TRACE ............................................................................... 42 EXPLAIN PLAN .......................................................................... 43 アンチジョインは NOT EXISTS で ............................................. 44 第 4 章 領域の管理 --- 拡張エラーに対応する --- .................................. 46 拡張エラー .................................................................................... 46 ADD DATAFILE .......................................................................... 47 今度はインデックス! .................................................................. 52 インデックスのメンテナンス ...................................................... 54 ロールバックセグメント .............................................................. 57 本日の成果 ................................................................ 61 テーブルスペースの拡張 ............................................................. 61 PCTINCREASE ........................................................................... 62 インデックスのメンテナンス ...................................................... 63 ロールバックセグメントの使い分け ........................................... 64 ロールバックセグメントを適正サイズに .................................... 65 第 5 章 メモリの効率を考える --- いろいろなバッファのチューニング --- .................................... 68 バッファのヒット率 ..................................................................... 68 データベースバッファ .................................................................. 70 マルチバッファプール ................................................................. 72 ログバッファ ................................................................................ 74 共有プールエリア ......................................................................... 78 本日の成果 ................................................................ 82 データベースバッファのヒット率を調べよう ............................. 82 データベースバッファの管理機構 ............................................... 83 マルチバッファプール ................................................................. 83 ログバッファ ............................................................................... 84 チェックポイント ........................................................................ 85 共有プールエリアの効率化 .......................................................... 86 v 第 6 章 パフォーマンスチューニング その 1 --- ANALYZE とオプティマイザの活用 --- ................................... 90 やってしまった?! ..................................................................... 90 ANALYZE のオプション .............................................................. 94 オプティマイザ ............................................................................ 96 ジョインの方法 ............................................................................ 97 コストベースは正しい? ........................................................... 101 ヒ ン ト ........................................................................................ 104 本日の成果 .............................................................. 107 ANALYZE .................................................................................. 107 オプティマイザ .......................................................................... 110 ジョインの方式 .......................................................................... 111 ヒ ン ト ........................................................................................ 112 第 7 章 パフォーマンスチューニング その 2 --- インデックスをもっと活用する --- ........................................ 114 インデックスが使われない? ..................................................... 114 DECODE .................................................................................. 118 ビットマップインデックス ........................................................ 120 インデックスのダンプ ............................................................... 125 本日の成果 .............................................................. 129 インデックスが使われない SQL ............................................... 129 DECODE ................................................................................... 130 ビットマップインデックス ........................................................ 132 インデックスのダンプ ............................................................... 134 第 8 章 データベースの移行 その 1 --- エクスポート時の注意点 --- ................................................... 136 データベース移行任務 ................................................................ 136 エクスポート .............................................................................. 137 ハイウォーターマーク(HWM).................................................. 141 vi 本日の成果 .............................................................. 149 エクスポート ............................................................................. 149 ハイウォーターマーク ............................................................... 151 エクステントの拡張 ................................................................... 154 コアレス(COALESCE)............................................................ 155 第 9 章 データベースの移行 その 2 --- データベースの作成 --- .......................................................... 158 RAID ディスク ........................................................................... 158 データファイルの配置 ................................................................ 163 データベースの作成 ................................................................... 165 MINIMUM EXTENT .................................................................. 166 PCTFREE ................................................................................... 168 本日の成果 .............................................................. 172 RAID ディスク ........................................................................... 172 ファイルの配置 .......................................................................... 174 データベースの作成 ................................................................... 175 MINIMUM EXTENT .................................................................. 177 PCTFREE ................................................................................... 178 第 10 章 データベースの移行 その 3 --- インポートとテスト --- .......................................................... 180 インポート .................................................................................. 180 インポート時の COMMIT .......................................................... 183 FREE LIST ................................................................................. 185 本日の成果 .............................................................. 196 インポート ................................................................................. 196 競合の調査方法 .......................................................................... 197 FREE LIST ................................................................................. 199 OS レベルのロックリソース ...................................................... 202 vii 第 11 章 ロールバックセグメントとテンポラリ --- 一時使用領域についても考慮する --- ..................................... 204 ORA-01555 ............................................................................... 204 ロールバックセグメントの考慮点 .............................................. 206 テンポラリテーブルスペース ..................................................... 209 SORT_AREA_SIZE ................................................................... 210 ソートはメモリで ...................................................................... 212 本日の成果 .............................................................. 216 ロールバックセグメントの役割 ................................................. 216 ORA-01555 ............................................................................... 217 設定時の考慮点 .......................................................................... 218 テンポラリテーブルスペース .................................................... 220 ソートはメモリで ...................................................................... 221 第 12 章 ユーザーの管理 --- 権限あれこれ --- .................................... 224 ユーザーと権限 ........................................................................... 224 ロール ......................................................................................... 226 オプション .................................................................................. 229 クォータ ..................................................................................... 234 縁の下の力持ち? ....................................................................... 236 本日の成果 .............................................................. 239 ユーザーと権限 .......................................................................... 239 ロ ー ル ........................................................................................ 241 オプション ................................................................................. 242 クォータ ..................................................................................... 244 ビューおよび列ごとの権限の設定 ............................................. 246 第 13 章 バックアップ&リカバリ --- いざというときに備える --- ................................................... 248 現在の運用状況 ........................................................................... 248 バックアップの練習 ................................................................... 252 viii リカバリの練習 ........................................................................... 254 DROP しちゃった? .................................................................. 256 普通にやってもだめ? ............................................................... 257 DROP されたテーブルを戻すには? ......................................... 259 リカバリ本番 ............................................................................. 261 Recovery Manager .................................................................. 264 眠気も吹っ飛ぶ! ....................................................................... 265 本日の成果 .............................................................. 266 REDO ログの運用 ...................................................................... 266 バックアップ ............................................................................. 268 データベースのリカバリ ........................................................... 271 エラーでない状態のリカバリ .................................................... 273 リファレンス ................................................................. 276 DBA_DATA_FILES ................................................................... 276 DBA_DEPENDENCIES ............................................................ 277 DBA_EXETNTS ......................................................................... 277 DBA_INDEXES ......................................................................... 278 DBA_OBJECTS ........................................................................ 278 DBA_ROLLBACK_SEGS ........................................................ 278 DBA_ROLES ............................................................................. 279 DBA_SEGMENTS .................................................................... 279 DBA_SOURCE ......................................................................... 279 DBA_TABLESPACES .............................................................. 280 DBA_USERS ............................................................................. 280 DICTIONARY ............................................................................ 281 INDEX_STATS .......................................................................... 281 SESSION_PRIVS ...................................................................... 281 SESSION_ROLES .................................................................... 281 USER_ROLE_PRIVS ................................................................ 282 USER_SYS_PRIVS ................................................................... 282 USER_TS_QUOTAS ................................................................. 282 V$BACKUP ............................................................................... 283 V$DB_OBJECT_CACHE ......................................................... 283 V$LATCH_CHILDREN ............................................................. 284 ix V$LOCK .................................................................................... 284 V$LOCKED_OBJECT .............................................................. 285 V$LOGFILE ............................................................................... 285 V$ROLLSTAT ............................................................................ 286 V$SESSION .............................................................................. 286 V$SESSION_WAIT ................................................................... 286 V$SQLAREA ............................................................................. 287 V$SYSSTAT .............................................................................. 287 V$SYSTEM_EVENT .................................................................. 288 V$TRANSACTION .................................................................... 288 V$WAITSTAT ............................................................................ 288 統計情報 ..................................................................................... 289 索引 x ......................................................................... 290 第 1 章 DBA のお仕事 --- Oracle の構成を知る --- それは突然のことだった. . . い、異動ですか?冗談. . .じゃないですよね。でも、システム部で開発をはじめてま だ3ヶ月も経ってないんですよ?研修を受けて、ようやく何とか慣れてきて、これからっ てときにどうしてなんでしょう?よくわからんって、課長冷たいなぁ。それでどこに異 動なんですか?運用管理. . .?オペレータってことかな?ほかに何かあったっけ?いっ たいどんな仕事をするんだろう?すごく不安。あ、部長だ。部長に聞けばわかるかな? ちょっと聞いてみよう。 データベース管理者の見習い、ですか?それって、いったいどんなことをするんで しょうか。よくわからないんですけど. . .データベースを管理する仕事?そんなことを 聞いてるんじゃありませんよ。あーぁ、部長に聞いても無駄だな。聞いたわたしがバカ だったよね。そりゃ確かに、毎日データベースにはアクセスしているけれど、そのデー タベースの管理をするなんて考えたこともなかった。そんな仕事、わたしにできるんだ ろうか. . .? 心配だなぁ。でも、決まってしまったことは仕方ない。どうせやるんだっ たら楽しくやらないと損だもんね。見習いっていうことは、とりあえず誰かが教えてく れるんだろうし、一生懸命やればなんとかなるか。 D B A の お 仕 事 やっぱり。 何もわからないまま異動の日を迎えてしまったけど、 大丈夫なのかな?新しい部 署って言うのは何だかとっても緊張する。開発の方には同期もいるけど、こっち には同期もいないし...課長さんは優しそうな人だけど、わたしに直接いろいろ 教えてくれる予定のデータベース管理者、つまり DBA(Data Base Administrator) はどの人なんだろう?今日は 10 時に出社予定ってことだから、まだ来ていないん だな、きっと。 2 「売上リスト、取ってきて。」 ん?この人、無愛想でちょっと恐そうだけどかっこいいなぁ。背も高いし... 「あのさ、リスト取ってきて欲しいんだけど。」 え?わたし?わたしに向かって言ってたんだ。 でもリストってどこに取りにいけ ば...、来たばっかりでよくわからないんです。 「あ?もしかしたら、新しく配属になった...」 はい、そうです。 「道理で見ない顔だなと思った。じゃ、これから DBA の勉強をするってわけだ。 で? Oracle のことはどれくらい知ってる?」 どれくらいって言われても、 どう言えばいいんでしょう?ユーザーとして使って いただけで、中身についてはよくわからないんです。 「あ、そう。じゃあとりあえず...場所教えるからリスト取ってきて。」 あ、はい。なんなんだ?この人は? なんだかんだと用を言いつけられて、結局午前中は終わってしまった。 人遣いの 荒い人だったな。おかげでどこに何があるかは理解できたけど、結構たいへんだっ た。ところで DBA の先輩はどうしたのかな。ていうか、この人遣いの荒い人がそ の先輩のような気がしてるんだよねぇ。何となく...この人かっこいいんだけど、 こう人遣いが荒いんじゃあね。できればもっと優しそうな人がいいなぁ。 「それじゃ、午後は勉強でもするか。」 あーあ、やっぱりこの人だったのね。これは先が思いやられるなぁ。つらいDBA 修行になりそうだ。 D B 勉強でもするか、っていうから一緒になって何かやってくれるのかと思ったら、 A いきなり本を積み上げられてしまった...忙しいのはわかるけど、ちょっと冷た の お いんじゃない?開発に異動になったときに受けた研修で、Oracle については勉強 仕 事 した。でも結局その後の仕事では、SQL を使ってデータを操作するっていうこと Oracle の構成 くらいしかやっていないんだよね。あ...、このあたりのことなんてあんまり覚え 3 てないなぁ。そういえば Oracle ってこういう構成だったのね。 <Oracleの構成> SGA (System Global Area) 初期化 パラメータ バックグラウンドプロセス 起動時に 各種設定を 読み込み Oracleインスタンス データ ファイル 制御 ファイル REDOログ Oracleデータベース Oracleを機能させる中心部分をインスタンス、 Oracleを構成するファイル群をOracleデータベースと呼ぶ。 ファイル群は以下の3つより構成される。 データファイル:データおよびデータ構造、データディクショナリが収められている。 コントロールファイル:データベースの現状と物理構成が記録されている。 REDOログ:データベースに対して行われたすべての更新情報が記録される。 こうして改めて考えると、 プログラムでアクセスしていたのはデータファイルな んだよね。で、その中にはユーザーのデータの入っているテーブルスペース、ソー トとかで一時的に使用されるテンポラリテーブルスペース、それにロールバック のために使うデータが入るロールバックセグメントがある。開発のときに使った D B A の お 仕 事 Product マスターなんかはユーザーデータのテーブルスペースに入ってたんだよ ね。インデックス専用のテ−ブルスペースもこの仲間だな。でも SYSTEM テーブ ルスペースのデータは、こういったユーザーのデータとは別物で管理のために使 われるらしい...ってことは、これからはこのデータを使って仕事をするってこ とか。 「そうだな。」 あ、先輩。 4 「DBA の仕事には欠かせない管理用のデータは、SYSTEM テーブルスペースに あって、データディクショナリっていうんだ。 」 SYSTEM テーブルスペースのデータディクショナリか... 「で、このデータディクショナリから自由にデータを取り出すことができるのは、 管理者としての権限を持ったユーザーだけなんだ。」 管理者としての権限、というとわたしにもそれがもらえるんですね?何だか、偉 くなった気分。 参考になる書籍 データベースの管理をするにあたって、 参考になる書籍をいくつかここであげてみ よう。 「Oracle パフォーマンスチューニング」 ● Mark Gurry,Peter Corrigan 共著 オライリージャパン 「Oracle8 プロフェッショナルテクニック」 ● 小幡一郎 著 ソフト・リサーチ・センター 「Oracle8 新機能活用ガイド」 ● 日本オラクル 監修 ソフトバンクパブリッシング 「Oracle 実践 Q & A 上級編」 ● 日本オラクル 編著 ソフト・リサーチ・センター 「Oracle & UNIX パフォーマンスチューニング」 ● アハメド・アロマリ 著 ピアソン・エデュケーション 「Oracle8DBA ハンドブック」 ● ケビン・ロニー 著 翔泳社 D B A の お 仕 事 5 「管理者権限を持ってると、 データベースをシャットダウンすることもできるし、 テーブルの DROP なんかも簡単にできてしまう。」 うーん。偉いっていうだけじゃなくて、一歩間違えばたいへんなことにもなりか ねないってことですねぇ。うかつなことはできないなぁ。" 権限がありません " っ て拒否されちゃう方がかえって気楽な面もあるんだな。 「そして、そういう権限を管理し、権限を付与したり取り上げたりするのも DBA の仕事の 1 つということだ。」 なるほど、 具体的に言ってもらうとこれからの仕事がどんなものがイメージがわ いてくるな。 REDO ログ それからこの REDO ログっていうのも聞いたことはあるけど...データベース に対して行われた更新情報をすべて記録しておくためのファイルで、障害からの 回復のために使われる...確かに、元の情報とすべての途中経過があれば、万が 一データがどうにかなってしまった場合でも復元できるもんね。 でも、すごーくたくさん更新があったりしたら、ログもたくさんになってしまっ て回復するのが大変そうだ。それにずっと以前のログなんて、果たして取ってあ るものなんだろうか?消えちゃってたりしないのかな? 「毎日バックアップをとっておけば、一日分のログを利用するだけで復元できる だろ?」 バックアップね。要はその日のデータの状態をコピーしておくんだ。全部のデー D B A の お 仕 事 タを毎日バックアップしてるんですか? 「読取専用のテーブルスペースの場合、毎日バックアップする必要もないだろ。」 確かにそうだ。 「あとREDOっていうのはディスクにあるんだけど、古くなってきたものは順次 テープに書き出してとってあるんだよ。それのことをアーカイブログって言うん だ。ま、これはうちの場合で、全部ディスクにあるっていう運用をしているとこ ろもあるかもしれないし、アーカイブログは取っていないっていうところもある 6 だろうな。」 <元のデータとログさえあれば> 変更以前のデータ EMPNO NAME DEPT 1111 1112 1113 1114 1115 ・ ・ ・ ・ 鈴木 山田 富士 佐藤 高橋 第一営業 総務 経理 第二営業 企画部 ・ ・ ・ ・ XXXX YYY XXY ZZZZ OO ・ ・ ・ ・ POST 課長 主任 ・ ・ ・ ・ MGR 2135 4545 3333 1287 3255 ・ ・ ・ ・ 現在のデータ EMPNO NAME DEPT 1111 1112 1113 1115 ・ ・ ・ ・ 鈴木 山田 富士 高橋 第二営業 総務 経理 企画部 ・ ・ ・ ・ XXXX YYY XXY OO ・ ・ ・ ・ POST 部長 主任 ・ ・ ・ ・ MGR 3256 0117 3333 3255 ・ ・ ・ ・ 障害により データファイルが破損! その後の変更はすべて ログに記録される REDOログ ・EMPNO=1111 第二営業へ異動、 異動に伴い上司も変更 ・EMPNO=1112 課長から部長に昇進 それに伴い上司も変更 ・EMPNO=1114 都合により退社 元のデータとログが揃っ ていれば現在のデータへ の復旧が可能。 元のデータから現在に至 るまでのすべてのログが 必要。 アーカイブログか...ログ 1つとっても、いろいろなやり方があるっていうこと ですね。 「そう。こういうバックアップのプランとか、障害が起きたときにデータベース を復旧するっていうのも DBA の仕事だな。」 じゃ、障害が起きたらすごくたいへんなんだ。夜中に障害が起こったりしたらど うするんですか? 「呼び出されて対応することになるかもな。」 ひぇー!いやだなぁ。 「そんなことはめったにないよ、きっと。」 それならいいんですけど...不安だなぁ。 D B A の お 仕 事 7 <バックアップ頻度とログ> バックアップを毎日取る 月 火 水 木 金 土 日 月 Backup Backup Backup Backup Backup Backup Backup Backup ログ ログ ログ ログ ログ ログ ログ 何曜日に障害が起きても、どの時間帯であっても、復旧に必要なログは最大1日分。 そのログと前日のコピーから復旧することができる。 バックアップは週に1度 月 日 火 水 木 金 土 Backup 日 Backup 障害のタイミングによっては最大1週間分のログが必要。 バックアップ頻度により、必要となるログが変化する。 ログ ログ ログ ログ ログ ログ ログ ログ ログの量は更新量によって異なるため、たとえ一ヶ月に1度しかバックアップを取っていな くても、ほとんど更新が発生しなければ、ほんのわずかのログを適用するだけで復旧するこ とが可能になる(読取専用ならバックアップから戻すだけでOK。)つまりテーブルスペース やアプリケーションの性格により、最適なバックアップ頻度も異なってくる。 コントロールファイル そうそう、このコントロールファイルって馴染みがないんですよね。いったい何 なんですか? 「ユーザーの立場から見たら馴染みはないだろうな。でもOracleにとってはなく D B A の お 仕 事 てはならない、とても重要なものなんだ。 『制御ファイル』となっているマニュア ルも多いかな。」 というと、大切な情報が入っているっていうことでしょうか? 「うん。何ていうか、データベースの整合性に関するデータが入ってるんだけ ど...」 ???? 「わからないよなぁ。たとえば、障害から回復するときにどのログを使うかって 8 いう情報が入っていたり、データベースを構成するデータファイルが、物理的に どこにあるかっていう情報が入っているんだ。」 ということは、 このファイルが壊れちゃったりすると、ファイルの物理的な位置 がわからなくなってしまったりするんですね。 「そういうことだ。だから、バックアップもさることながら、ミラーリングする 場合が多いんだよ。」 ミラーリングって、同じものを 2 つ持つってことですよね。そうすれば片方が壊 れてもどうにかなりますもんね。 「だけど、ただ 2 つ持てばいいってもんじゃないからな。」 え? <ディスクの分散> Oracleインスタンス Disk1 Disk2 コントロール ファイル1 コントロール ファイル2 Oracleインスタンス Disk3 Disk1 Disk2 Disk3 コントロール ファイル1 コントロール ファイル2 ディスクが分散されていなければ、 コントロールファイルを2つ持っていても意味がない。 それはそうですよね。言われなくても気づいたと思いますよ、それくらいは、多 分...とにかく、それくらい大事なファイルだっていうことですね。 「そう、ちゃんとしたコントロールファイルがないと、Oracle は立ち上がってく れないからな。」 覚えておきます。 インスタンス D B A の お 仕 事 インスタンスはバックグラウンドプロセスと SGA(System Global Area)から成 9 るっていうことだけど、このインスタンスを構成している SGA っていうのは... メモリ上にとられる領域で Oracle の情報が入れられている。高速でやりとりする ことができ、さまざまなプロセスからアクセスされる。うーん。だから何?って 感じだなあ。 「SGA っていうのはメモリ上に確保されるエリアで、Oracle の処理はこの SGA を介して行われているんだ。ユーザーが使うデータっていうことで考えてみる と...」 <データを読み込む> SGA ユーザー 共有 プール エリア 制御情報 DBバッファ 上にあるので DB 読み込み バッファ 商品A ログ 商品B バッファ 商品T DBバッファ上に ないので ディスクから 読み込み ユーザー データ 商品S 商品Aの データが 欲しい Oracleの処理はすべてこのSGAを介して行わ れる。 アクセススピードは、ディスクに比べメモリ の方が高速なので、SGAに必要なデータが読 み込まれていれば、ディスクにアクセスする ことなく必要なデータを取り出すことができ る。 SGA上にデータがない場合、ディスクから SGAに読み込んでこなければならないため、 時間がかかることになる。 SGAが大きければ、SGA上に必要なデータが 存在する確率が高くなる。 ユーザー 商品Sの データが 欲しい ということは、 このエリアが大きければ高速に処理することができて、パフォー D B A の お 仕 事 マンスも良くなるってことでしょうか。 「確かに、データがすべてこの中に入ってたら速いだろうな。でも、資源は無限 ではないからな。限られた資源の中で最大のパフォーマンスを得られるように チューニングするのも、DBA の仕事ってわけだ。データの種類によって、SGA の どのエリアに入るかも違ってくるから、 そのあたりも考慮しないといけないしな。 」 はぁ...ということは、今まで遅いとか散々文句をいってたことを、解決しなけ ればいけない立場だということか...厳しそうだ。 10 SGA 補足 SGA にある各エリアについて、もう少し補足することにしよう。 データベースバッファ:データファイルから読み出されたデータが格納されるエ リア。読み込みは Oracle ブロック単位で行われるので、実際には必要とされた データと同じブロックにあるデータも SGA 上に持って来られることになる。読み 込もうとしたデータが SGA 上に存在することを「ヒットする」といい、パフォー マンスが悪いときにはこのヒット率をみたりする。 またデータの更新もここで行わ れる。 共有プールエリア:ユーザーが使用する SQL が格納され、複数のユーザー間で SQL 文を共有し、再利用する目的で使用されるほか、頻繁に参照されるデータ ディクショナリの情報、ストアドプロシージャ等が格納される。やはりここでも、 効率良く再利用されることがパフォーマンスの向上につながる。 ログバッファ:ユーザーが更新処理を行うと、回復処理に必要となる REDO ログ にその内容が書き出されるが、実際には書き出される前にいったんこのログバッ ファに格納され、その後 REDO ログファイルに書き込まれている。 主要構成要素は以上のようなものだが、そのほかにも SGA には、Oracle のプロ セスが処理を行う際に利用する、ユーザーとのセッション情報や、ロックの情報等が 格納される。SGA 内の動きに関しては、またの機会に。 「ついでに言っておくと、Oracleには初期化パラメータっていうパラメータファ イルがあるんだ。そこに、このエリアの大きさをどれくらいにするか、とかって いう指定があるんだよ。」 初期化パラメータ...ですか。聞いたことはありますね。その中に Oracle のさ まざまな設定がしてあるんですよね。ということはそのパラメータを調整するっ ていうのは、DBA の仕事なんでしょうね。 「そのとおり。いろんなパラメータがあるから知らずにすんでしまうものもある んだけど、知っているに越したことはない。ま、そのうちいろいろわかってくる D B A の お 仕 事 よ。」 11 わかってくるよっていうか、わかるようにならなくっちゃいけないんだろうな。 DBA になる以上は... 初期化パラメータ 初期化パラメータは INITxxxx.ora(xxxx は SID 名)というファイルに記述されて いて、Oracle がスタートするときに参照されている。初期化パラメータの設定には 動的に変えられるものもあれば、Oracle を再スタートさせないと変更できないもの もある。この設定次第で Oracle の動き方が変わってくるので、DBA としてはこれ をうまくコントロールする必要がある。代表的なものをいくつかあげてみよう。 DB_BLOCK_SIZE:Oracle ブロックのサイズを指定。Oracle はこの単位でデー タを処理する。 DB_BLOCK_BUFFERS:データベースバッファのサイズを設定。データが読み 込まれるエリアなので、このサイズを増やせばディスク I/O が減少すると考えられ るが、システム全体のメモリの余裕度、あるいは SHARED_POOL_SIZE との調 整は必須。実際の大きさはDB_BLOCK_SIZE×DB_BLOCK_BUFFERSとなる。 SHARED_POOL_SIZE:共有プールエリアのサイズ。この値が小さすぎると、 オブジェクトを読み込むために非常に多くのディスクアクセスが必要となり、パ フォーマンスを低下させる。このエリアの不足による影響は大きい。 LOG_BUFFERS:REDO ログバッファに割当てるバイト数。更新の多いアプリ ケーションでは、 REDO ログへの I/O はパフォーマンスに多大な影響を与える。 REDO ログが存在するディスク上で I/O が問題となった場合には、このバッファ サイズを大きくすると効果が得られることがある。 D B A の お 仕 事 DBA のお仕事って それにしても、DBA の仕事はデータベースを管理することだって言われたと きはどういうことかわからなかったけど、だんだんとわかってきたような気がす る。今まで何も考えずにデータベースを使っていたけれど、その影で DBA が権限 12 をうまく管理してくれたり、パフォーマンスを調整してくれてたんだなぁ。それ に、万が一に備えてバックアップも取っていてくれるんだもんね。 「そうそう、それから領域の管理っていうのも DBA の大事な仕事の 1 つだよ。」 領域の管理ですか? 「たとえば、お客さんがどんどん増えれば顧客マスターのデータはどんどん増え るよな。」 そうですよね?あ、そうか。でもディスクの大きさとかには限界がありますよ ね。そういうデータ量とディスクの領域との調整も DBA がやるってことですね。 なるほど。要するに、ユーザーが毎日ストレスを感じることなく、無意識のうち にデータベースを使えるようにするためにがんばる。そしてデータベースで問題 が起こらないよう、問題が起こったらすばやく対処できるよう、日頃からあらゆ る面で気を配っておく。そういうことですね? 「まぁな。加えて Oracle 自体のインストールやアップグレードなんかも DBA の 仕事になる。新バージョンが出たら新しい機能も追加されるだろうから、そういっ た勉強もしなくちゃいけないしな。」 聞けば聞くほどたいへんそう。でもたいへんな割には目立たなくって、地味な存 在のような気もするなぁ.. .あ、先輩に電話みたいですよ。向こうで呼ばれてます。 「ああ、本当だ...きっとクレームだな。」 クレーム?そういえばそうだ。データベースに不都合が起こったときなんかに、 システム部に電話したことがあったっけ。トラブルが起こった場合には、今まで わたしたちがしてきたように、文句の電話がじゃんじゃんかかってきちゃうんだ。 つまり、クレームの電話を受けて状況説明するのもお仕事の1 つだし、クレームを 受けるだけじゃなくて対処しなくっちゃいけないんだな、これからは... D B それはできれば避けたかったけど、そうもいかないって感じ...覚悟しなくっ A ちゃ。あーあ、何だか気が重くなってきたな。とてもたいへんそうなんだもん。 の お 仕 「ま、結構面白い面もあるよ。やっていけばわかるって。」 事 そうでしょうか...そういう境地に早く達することができるといいんですけど 「そういうことだ。」 ね。とにかくがんばりますので、よろしくお願いします。 13 本日の成果 Oracle の構成 DBAとしてOracleを管理するためには、Oracleの構成に関する知識が必要不可 欠である。Oracle データベースは、複数のプロセスからなる「Oracle インスタン ス」と、物理的なファイルからなる「Oracle データベース」で構成されている。 Oracleインスタンス SGA(System Global Area) 制御情報 クライアント プロセスからの要求 を受取り、処理を実行。 (要求されたデータがSGA 上にあるかどうかを判断し、 なければファイルから 読み込んでくる) ユーザーの接続 状態を監視し、異常 終了時にはリソース の解放等を行う 変更されたデータを データファイルに 書き出すプロセス ログバッファ セッション情報、ロック情報等 共有プール ディクショナリ、 スドアド プロシージャ、 ディクショナリ等 SMON PMON データベース バッファ データ REDOログへ 書き込む 更新データ REDOログへの 書き込みを受け 持つプロセス サーバー プロセス DBWR LGWR 主なバックグラウンドプロセス Oracleそのものを監視 システムの回復処理や 使わなくなった資源の 解放などをつかさどる コントロール ファイル データベースの 物理構成ログ情報 データ ファイル ユーザーデータ SYSTEMデータ等 Oracleデータベース 14 REDOログ データベース への変更を記録 DBA の仕事 DBAの仕事には、リソースの管理やバックアップ&リカバリといった一般的な 運用管理だけでなく、Oracleソフトウェアのインストールやアップグレード、パ フォーマンスチューニングも含まれる。さらには、ユーザーからのクレームやリ クエストに対応するのも DBA の仕事である。 リソースの管理 ユーザーのクォータやアクセス権限、ディスク領域、あるいはメモリといったリ ソースの管理は DBA の仕事の重要な要素である。これらはセキュリティ、パ フォーマンスに影響を与え、 ずさんな管理は業務自体にも支障をきたす可能性が あるため、注意が必要である(個々の詳細については、本書の中で解説してい く) 。またリソースの限界を見極め、キャパシティプランニングを行う必要もあ る。 バックアップ&リカバリ トラブルが発生した場合にどのように対処するか?またそのときのためにどんな 準備をしておくか?バックアップとリカバリについての計画を立てるのも DBA の役割である。実際にコトが起こったときに被害を最小限にとどめるためにも、 トラブル発生を想定したシミュレーションやリハーサルを行っておくとよい。 パフォーマンスの調整 初期化パラメータの設定やテーブルスペースの物理的配置、SQL の書き方はパ フォーマンスに影響を及ぼす。DBA は効率よく資源を使い、最適なパフォーマ ンスを得るための調整を行わなければならない。 15 Oracle ソフトウェアのインストールやアップグレード Oracle をインストールしデータベースを作成する、あるいはアップグレードを行 いデータベースを移行するのも DBA の役割。新機能について勉強し、自分のシ ステム環境にマッチするかどうか、 そして使用するかどうか判断することも必要。 クレームやリクエストへの対応 トラブルに伴うユーザークレームに対応するだけでなく、ユーザーからの要望 (リ クエスト)にも対処する必要がある。リクエストに応えられるかどうか、あるいは そのプライオリティ等を判断し、各部門と調整を行う必要もある。 16 第 2 章 ロック待ちトラブルの解消 --- データディクショナリを活用する --- 管理のことなんて考えたこともなかったのに、異動によりDBA見習いになってしまっ た (させられてしまった) 。 データベースがらみで何か起こればクレームをつければよかっ たユーザーの立場から、クレームを受ける立場となって2ヶ月あまり。とりあえずマニュ アルを読んだりして勉強してきたけれど身についているのか、いないのか。やはり実践 してみないと、自分のものにならないのではないかと感じている今日このごろ。なにし ろ勉強をすすめながら今までにやる機会があったことといえば、ユーザー管理の一部で あるユーザーの作成と権限付与やユーザーからのクレーム対応がほとんど。このクレー ム対応って結構多い。DBA のお仕事って、ずーっとこんな感じなんだろうか. . .だとし たら、ちょっとつまらないよねぇ。 トラブル発生!! 何だか、急に電話がたくさん鳴り出した。トラブルかな?Oracleに接続中のユー ザー画面が突然終了してしまい、そのせいで管理部門に問合せが殺到しているよ ロ ッ ク 待 ち ト ラ ブ ル の 解 消 18 うだ。ユーザーの立場での経験はあるけれど、管理部門に来てからははじめてだ。 どうするんだろう?あ、先輩が呼んでる。 「こういう場合は、まずアラートログを確認するんだ。」 先輩に言われるままエラー状況を記録するアラートログを確認してみると次のよ うなエラーメッセージが発生していた。 Errors in file /export/home1/oracle/app/oracle/admin/oracle1/bdump/oracle1_s001_16200.trc: ORA-00600: 内部エラー・コード,引数:[729],[152],[space leak],[],[],[],[],[] ここに表示されているファイルを見れば何かわかるのかな?中身を見てみよう。 Dump file /export/home1/oracle/app/oracle/admin/oracle1/bdump/oracle1_s001_16200.trc Oracle7 Server Release 7.3.4.2.0 - Production With the distributed option PL/SQL Release 2.3.4.2.0 - Production ORACLE_HOME = /export/home1/oracle/app/oracle/product/7.3.4 System name: SunOS Node name: p4epsv1 Release: 5.5.1 Version: Generic_103640-03 Machine: sun4u Instance name: oracle1 Redo thread mounted by this instance: 1 Oracle process number: 11 Unix process pid: 16200, image: ora_s001_oracle1 *** 1999.07.09.16.38.22.000 *** SESSION ID:(71.1136) 1999.07.09.16.38.22.000 ******** ERROR: UGA memory leak detected 152 ******** ****************************************************** HEAP DUMP heap name="session heap" desc=0x8029a65c extent sz=0x108c alt=32767 het=32767 rec=0 flg=3 opc=3 parent=8000001c owner=810bb7b4 nex=0 xsz=0x108c EXTENT 0 Chunk 8156b114 sz= 3828 perm "perm " alo=3336 Chunk 8156c008 sz= 400 free " " ----- 中略 ----EXTENT 9 Chunk 803212e4 sz= 2808 perm "perm " alo=2808 Chunk 80321ddc sz= 1404 free " " Total heap size = 35376 FREE LISTS: Bucket 0 size=76 Chunk 813634e4 sz= 120 free " " Bucket 1 size=140 --- 中略 ---Bucket 7 size=8204 Bucket 8 size=16396 Bucket 9 size=32780 Total free space = 24836 UNPINNED RECREATABLE CHUNKS (lru first): PERMANENT CHUNKS: Chunk 8156b114 sz= 3828 perm "perm " alo=3336 Chunk 804be474 sz= 112 perm "perm " alo=112 Chunk 8095cc5c sz= 144 perm "perm " alo=144 Chunk 8136273c sz= 3496 perm "perm " alo=3496 Chunk 803212e4 sz= 2808 perm "perm " alo=2808 Permanent space = 10388 ****************************************************** *** 1999.07.09.16.38.22.000 ksedmp: internal or fatal error ORA-00600: 内部エラー・コード,引数:[729],[152],[space leak],[],[],[],[],[] ----- Call Stack Trace ----calling call entry argument values in hex location type point (? means dubious value) ------------ --------- ------------ ----------------------------------------------ksedmp()+156 CALL ksedst()+0 746CB4 ? 746CA0 ? 746C80 ? 44 ? EFFFC47C ? 0 ? kgeriv()+220 PTR_CALL 3 ? 0 ? 0 ? 258 ? 0 ? 2D9 ? kgesiv()+104 CALL kgeriv()+0 821E90 ? 84ED9C ? 2D9 ? 2 ? EFFFCA90 ? 81BF90 ? ksesic2()+48 CALL kgesiv()+0 821E90 ? 84ED9C ? 2D9 ? 2 ? EFFFCA90 ? 2894 ? ksmuhe()+476 CALL ksesic2()+0 2D9 ? 0 ? 98 ? 1 ? A ? 74C1A8 ? ksmugf()+452 CALL ksmuhe()+0 74C1A8 ? 822C00 ? 8029A658 ? 1 ? 98 ? 82979C ? ロ ッ ク 待 ち ト ラ ブ ル の 解 消 19 何のことだかさっぱりわからない。 「どうすればいいかわかるか?」 うーん。とりあえず使えるようにするしかないですよねぇ。再起動するんじゃな いでしょうか? 「じゃ、やってみてよ。」 ということは私が実行するってこと?普通にSTARTUPコマンドで立ち上げれば いいんだよね。あれ?全然立ち上がってこない。いつもなら1分もあれば起動され るのに、おかしいなあ。待つこと 5 分、ようやく正常に起動された。よかった。一 安心。でも、どうして時間がかかったんだろう? 「インスタンスリカバリを行っていたせいで時間がかかったんだよ。」 インスタンスリカバリですか?というと... 「正常にコミットされた情報がすべてディスク上に書き出されたことを保証し、 コミットされなかった情報をロールバックするために時間がかかったっていうこ とだ。」 へぇ、こういう起動時のリカバリを指してインスタンスリカバリと呼ぶんだ。な るほどね。ところでさっき見たファイルは? 「あれはだな、Oracle のダンプファイルっていうんだ。サポートに問合せる際に 使用するもので、この内容に関しては専門家に解析を依頼するしかないな。 」 さらに障害時のエラー番号として「ORA-00600:内部エラー・コード , 引数 ロ ッ ク 待 ち ト ラ ブ ル の 解 消 20 :[729],[152],[space leak],[],[],[],[],[]」というのはサポートに問合せる際の重要な キーワードであることも教えてもらった。この ORA-00600 の原因究明は Oracle の サポートに依頼するしかないらしい。道理でよくわからないと思った(ほかのエ ラーならわかるというわけでもないけれど.. .)。 今日はいい勉強になった。と、感慨にふけっていたところにユーザーからのク レームの電話を受けてしまった。画面が「お待ち下さい」状態で動かないので何 とかして下さい、という電話である。あれ?先輩どこに行ったんだろう?運の悪 いことに今日は人が出払ってしまっていて、今現在この業務が遂行できるのは見 習いの私しかいない!仕方がない。やってみるしかないか。実践、実践! アラートログファイル アラートログファイルは、/Oracle_home/RDMBSxx/SIDalert.log というファイ ル名で自動的に作成されている。このアラートログには、Oracle の内部エラーに関 する情報が書き込まれている。どんどん蓄積されていくので、定期的にチェックした 方がよい。そして必要であれば削除しよう。アラートログファイルに書き出されるエ ラーのうち、主なものを参考までに以下に挙げる。これらのエラーが頻発するようで あれば、対応しなければならない。 ORA-0052 ORA-0055 ORA-0104 ORA-0270 ORA-0272 ORA-1630 ORA-1650 ORA-1653 最大エンキュリソース数 num が発生しました。 最大 DML ロック数を超えました。 デッドロックを検出したため共有サーバーはすべてブロックされ、リソース待機します。 アーカイブ・ログの作成でエラーが発生しました。 アーカイブ・ログの書込みでエラーが発生しました。 一時セグメントで最大エクステント:num に達しました( 表領域:name) ロールバックセグメント:name を拡張できません(:num、表領域:name) 表領域 name で表 name.name のエクステントを num によって拡張できませんでした。 ロック状況の確認と対応 こういう状況になるときの原因として考えられるのは、ロック待ちだったっけ。 必要なリソースを要求したものの、ほかの人が使用中のため待たされてしまって いるということだと思うんだよなあ。たとえば更新処理の途中でPCがハングアッ プしてしまったので電源を切ってしまった、あるいは誰かがロックをかけたまま COMMITもロールバックもしないままトランザクションを放りっぱなしにしてし まっているなどが考えられる。自分では確認画面で OKにしたつもりなのに、その ままだったっていう経験は誰でもあるはず。文書を印刷したつもりでしばらく席 をはずして戻ってきたら、印刷の確認画面がまだ出ていたとか。同じことを更新 系のトランザクションでやってしまうとロックがかかったままになってしまうん だよね、これが。もちろんプログラムの組み方に問題がある場合もある。とにか く、この状況から抜け出すためにまず状況を確認しなければ... えーと、たぶんロックの問題ということで...現在ロック待ちしているユーザー が存在するかどうかを確認してみればいいんだよね。ということは、データディ ロ ッ ク 待 ち ト ラ ブ ル の 解 消 クショナリの V$LOCK を確認するんだと思うんだけど、待たされている人はどん 21 な人で、どんな処理をしようとしていて、どれくらい待っているのかもわかると いいよね。そのためには、セッション情報が入っている V$SESSION とか、共有 SQL 領域の情報が入っている V$SQLAREA なんていうデータディクショナリも使 えそうだ。必要な列を指定して...待ち時間は分単位にしてみようかな。で、条 件は待機中のロックのアドレスと、SQL のアドレスでいいかな。そして、待ち時 間の長いものから表示することにしよう。(でも、たくさん出てきたらいやだ なぁ。)こうやってデータディクショナリを活用すると、必要な情報が得られるん だよね。よし、実行だ!この結果からロック待ちをしている SQL 文とその状況が わかる... SQL> select a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') Min, c.sql_text from v$session a, v$lock b, v$sqlarea c where a.lockwait = b.kaddr and a.sql_address = c.address order by b.ctime desc; SID SERIAL# TY MIN SQL_TEXT ----- --------- ----- ------- ------------------------------------------12 46536 TX 21.2 update dept set loc='HQ' あーっ!このSQL文はなんと21.2分間(!!)もロックが解除されるのを待って いることになる。ユーザーが電話をかけたくなるのも当然だ。ていうか、よくこ こまで我慢したなあって思う。上記のSQLの結果が複数だった場合 (あまりあって はならないことだけど)にはどれが電話をかけてきた人のものか、あるいは表示さ ロ ッ ク 待 ち ト ラ ブ ル の 解 消 れたのが本当に当の電話の主なのかを確認するためにV$SESSIONを参照する必要 があるかもしれない。見習いDBA としては念には念を入れて確認することにしよ う。 SQL> select username,osuser,machine,terminal,program,client_info from v$session where sid=12 AND serial#=46536; USERNAME OSUSER MACHINE TERMINAL PROGRAM CLIENT_INFO ------------ ---------- ----------- ------------ ------------ --------------------E12345 kxb012 aix pts/4 pe123 (TNS V1-V2) よし、ユーザー名などから間違いないということはとりあえず確認できた。で は、この人を待たせている犯人は誰なのか?それをつきとめなければ問題が解決 22 しないので犯人を見つけ出すための SQL を実行しなくては...前に先輩が使って いた SQL をメモしておいたんだけど、どこだったかな?あ、あったあった。この SQL文を実行すると待たせている側および待たされている側のセッション情報が ペアになって表示されるはずなんだけど...ペアで表示されれば今問題となって いるユーザーを待たせている犯人が一目でわかって便利だもんね。今待たされて いるのはSID=12のユーザーだということはわかっているので、その情報とペアに なってくるのが犯人というわけだ。 SQL> select b.id1,a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') MIN ,decode(b.lmode ,1,'null' ,2,'row share' ,3,'row exclusive' ,4,'share' ,5,'share row exclusive' ,6,'exclusive') LMODE ,decode(b.request ,1,'null' ,2,'row share' ,3,'row exclusive' ,4,'share' ,5,'share row exclusive' ,6,'exclusive') REQUEST from v$session a, v$lock b where a.sid = b.sid and (b.id1,b.id2) in (select d.id1,d.id2 from v$lock d where d.id1=b.id1 and d.id2=b.id2 and d.request > 0) order by b.id1,b.ctime desc; ID1 SID SERIAL# TY MIN LMODE REQUEST --------- -------- ----------- --------- ------- ------------ -----------131077 7 34937 TX 25.0 exclusive 131077 12 46536 TX 22.0 exclusive ロ ッ ク 待 お!表示されたぞ。LMODE が現在かかっているロックで、REQUEST が要求さ ち ト れているロックだから、この結果により先ほどの SID=12 を待たせているのは、 ラ ブ SID=7であることが判明!SID=7はexclusiveモードのロックを25分も取得しつづ ル けているということになり、そのため SID=12 が 22 分も待たされているというわ の 解 けだ。ユーザー情報を取得して SID=7 のユーザーに連絡をとるとしますか。以前 消 実行したSELECT文を使えばユーザー情報が取得できるから本人に連絡がとれる はず。そうすれば ROLLBACK もしくは COMMIT してもらってロックを解除する 23 ことができる...え?ハングアップしちゃったからPCの電源をOFF?そういうこ とですか。なるほどね。今回みたいに PC の電源を切ってしまったことによりセッ ションが中途半端に残ってしまっているような状況の場合、あるいは本人が外出 してしまった場合などはセッションをKILLするしかないんだよね。ということで SID と SERIAL を使って... SQL> alter system kill session ‘7,34937’ これでとりあえず、 電話をかけてきたユーザーの要求には応えることができたよ うだ。めでたし、めでたし。 ほかにできることは? 頻発するロック待ちによるクレームに、 毎回電話で対応していると嫌気がさして くることがある(大きな声では言えないけど) 。今回みたいなケースは仕方がない としても、プログラムに問題があったりする場合もあるわけだし。ロック待ちと なる原因を追究して、 そこを解決してしまえばクレームは減るんじゃないかと思っ たりするんだけど。何とかならないかなあ?ロック待ちの場合、必ず待たせてい るトランザクションが1 つ存在し、待たされているトランザクションが1つあるい は複数存在しているはず。待たせている側が使用しているオブジェクトがわかれ ロ ッ ク 待 ち ト ラ ブ ル の 解 消 ば、問題の解決に一歩近づくにちがいない。よし、どのオブジェクトがロックさ れているのかをちょっと調べてみよう。時間もあることだしね。SQL はこんな感 じでいいかな。 SQL> select object_id, session_id, process, locked_mode from v$Locked_object; OBJECT_ID SESSION_ID PROCESS LOCKED_MODE ------------- ------------- -------------- ----------------------------9398 10 24216 3 9398 25 25644 3 ここで使用している V$LOCKED_OBJECT を参照すれば、ロックされているオ 24 ブジェクトを簡単に見つけることができるけれど、具体的なリソース名判別のた めには DBA_OBJECTS を参照した方が良さそうだ。ついでにロックしている時間 がでてくるともっとわかりやすいんだけどなあ。どのデータディクショナリを使 えばいいんだっけ?これがまだ、ぱっとひらめかないんだよねぇ。 「こんな感じだろうな。」 あ、先輩。いつの間に? SQL> select to_char(sysdate,'HH24:MI') TIme,a.owner||'.'||a.object_name OBJECT ,decode(b.locked_mode ,1,'null' ,2,'row share' ,3,'row exclusive' ,4,'share' ,5,'share row exclusive' ,6,'exclusive') LOCKED_MODE ,to_char(c.ctime/60,'999990.9') MIN from dba_objects a, v$locked_object b, v$lock c where a.object_id = b.object_id and b.session_id = c.sid and b.xidsqn = c.id2 and b.xidusn > 0; TIME OBJECT LOCKED_MODE MIN ------------ -------------- ---------------------- ----------------13:24 INT.MTRM row exclusive 12.0 なるほど。オブジェクト名もきちんとわかりますねえ。12 分間のロックか... 長々とロックをかけてしまっているということは、これだけでも十分大変なこと だと思うんだけど、たくさん更新してるのかな? 「でもこれだけでは、本当にこのオブジェクトによって待たされている人がいる かどうかわからないよな。待っている側を表示するように変えてみるか。」 SQL> select to_char(sysdate,'HH24:MI'), a.owner||'.'||a.object_name OBJECT, to_char(c.ctime/60,'999990.9') Min from dba_objects a, v$session b, v$lock c where c.sid = b.sid and c.id1 = a.object_id and b.username = a.owner and c.type = 'TM' and c.sid = (select sid from v$lock d where d.type = 'TX' and d.request>0); ロ ッ ク 待 ち ト ラ ブ ル の 解 消 TIME OBJECT MIN ------------ ------------------ -------------13:25 INT.MTRM 3.0 25 結局先輩にやってもらってしまったけど、とにかくこれでテーブル MTRM を 待っているトランザクションが存在するということがわかったわけだ。モードは 表示されていないけど、とりあえずはこれで問題ないよね。けど、この結果から 該当テーブルに対する更新要求が結構あることがうかがえる。しかもほかの人が ロックを取得したときに、同じテーブルを要求しようとした人は要求が拒否され るのではなく、待たされてしまっているというわけだ。たしか SELECT FOR UPDATE NOWAIT と指定することにより、ロックで無意味に待たされる状況は避け られるはずなんだけどな。いったいどんなふうにプログラムを組んでいるのか興 味がわいてきたなあ。このテーブルに対してアクセスしている SQL 文を発見する 方法はないものだろうか?ね、先輩。あれ?またいなくなっちゃった。 DBA_DEPENDENCIES それでは、DBA らしくリファレンスマニュアルでも見てみるとしますか。デー タディクショナリにそれらしい情報はないのかなあ?ここで見つからないとお手 上げって感じなんだけど。DBA_DEPENDENCIES?これはオブジェクト間の依存 性がわかるテーブル...そうか、どのプロシージャあるいはパッケージ、トリガ が、どのテーブルを参照しているかがわかるんだ。なるほど、これを調べれば何 かわかるかもしれないなあ。問題となっているテーブルINT.MTRMを参照してい ロ ッ ク 待 ち ト ラ ブ ル の 解 消 るプログラムをピックアップしてみよう。 SQL> select * from dba_dependencies where referenced_owner = 'INT' and referenced_name = 'MTRM'; OWNER NAME TYPE REFERENCED _OWNER ----- ------------ -------------- ----------INT ACCESS_MTRM PACKAGE BODY INT INT REF$_MTRM TRIGGER INT REFERENCED _NAME -----------MTRM MTRM REFERNECED REFERENCED _TYPE _LINK_NAME ------------ ----------TABLE TABLE これでテーブル INT.MTRM を参照しているのは ACCESS_MTRM というパッ ケージとREF$_MTRMというトリガだということが判明!!正直なところここで たくさんの行が返ってきたらたいへんだなあと思っていたけど、今回はたまたま 26 2 つだったから何とかなりそうだよね。よかった。たくさんの中からどれがこの ロック待ち状況を作り出しているのかを判断するのは難しそう。けれどとりあえ ず SELECT 文はロックとは関係なさそうだから、それ以外を対象とすればいいと して、どうすればいいのかな?そういえばデータディクショナリにあるテーブル 名とその内容に関するコメント情報が入っているビューがあると先輩がいってい たような気がする。そうそう、DICTIONARY!その中からソースがわかりそうな ものが見つからないかな? SQL> select * from dictionary where table_name like '%SOURCE%'; TABLE_NAME -------------------ALL_SOURCE DBA_SOURCE USER_RESOURCE_LIMITS USER_SOURCE RESOURCE_COST V$RESOURCE COMMENT -------------------------------------------------------------Current source on stored objects that user is allowed to create Source of all stored objects in the database Display resource limit of the user Source of stored objects accessible to the user Cost for each resource Synonym for V_$RESOURCE うーん。そうだなあ。この DBA_SOURCE というのが使えそうだ。関係あるの はとりあえず update と delete かな。 (insert も外部キー次第では関係あるかもしれ ないけれど。)この 2 つに絞ってみるか。 SQL> select ltrim(text) from dba_source where owner='INT' and name='ACCESS_MTRM' and type='PACKAGE BODY' and (upper(text) LIKE '%UPDATE%' or upper(text) LIKE '%DELETE%') order by line; LTRIM(TEXT) ----------------------------------------------------------------------------------UPDATE mtrm SET resv = 'Y' WHERE day = :resvday AND no=:rmno; あ、出てきた出てきた。ということはこれが怪しいってことだよねぇ。こうやっ てロック待ちオブジェクトを調べて修正できたら、電話が減るのかもしれない。け ど、アクセスしているストアドオブジェクトがたくさんあったらちょっと面倒。ス ロ ッ ク 待 ち ト ラ ブ ル の 解 消 クリプトを作ってみるっていうのも手だけど。そもそもストアドオブジェクトに 27 なっていなかったらどうするのかな?プログラムを GREP してみるしかないの か...けどまさにロック待ちしているっていう瞬間をねらえば、SQL 文まで特定 できるからそれと合わせればかなり絞り込めるということだよね。 外注さんが作っ たプログラムが問題を起こしているときなんかは問題を発見するのがとくに難し いけど、こうやっていけば何とかなりそうな気がしてくるのは私だけだろうか? 先輩に話したら「あ まい! !」って 言われ るかも しれな い... だけどこの D B A _ D E P E N D E N C I E S ってほかにも使えるのではなかろうか?たとえば、 DBA_DEPENDENCIESによってどのストアドオブジェクトがどのテーブルを参照 しているかがわかるわけだから、アプリケーションの変更によって、影響を受け る可能性のあるオブジェクトを調べるということもできるんじゃないかな?今日 変更されたオブジェクトにより影響を受ける可能性のあるオブジェクトをリスト するには...うーん。一気に表示させようとすると何だか思ったより難しい SQL になりそうだなあ。 SQL> select o.owner,o.object_name CHANGED_OBJECT,o.object_type ,o.created,o.last_ddl_time,o.status ,o2.owner,o2.object_name REFRENCE_OBJ,o2.object_type from dba_objects o, dba_objects o2, dependency$ d where o.last_ddl_time = sysdate and o.owner not in ('SYS','SYSTEM') and d.d_obj# = o.object_id and d.p_obj# = o2.object_id and o.object_name != o2.object_name and o2.owner != 'SYS'; ロ ッ ク 待 ち ト ラ ブ ル の 解 消 OWNER CHANGED_OBJECT OBJECT_TYPE CREATED ----INT INT INT INT INT INT XPRT -----------VIEW VIEW PACKAGE BODY PACKAGE BODY PACKAGE BODY PACKAGE BODY TRIGGER --------98-05-08 98-05-08 99-01-31 99-01-31 99-01-31 99-01-31 98-12-30 ---------------SCOPE_USER_TAB SCOPE_USER_IDX ACCESS_MTRM ACCESS_MTRM ACCESS_MTRM ACCESS_MTRM EPI_SGA_SA LAST_DDL _TIME ---------99-06-21 99-06-21 99-06-21 99-06-21 99-06-21 99-06-21 99-06-21 STATUS OWNER REFERNECED _OBJECT ------- ------ ------------VALID INT USER_TABLE VALID INT USER_INDEXES VALID INT MTRM_HQ VALID INT LOG_MTRM VALID INT MTRM VALID INT EMP VALID XPRT XPRT_EPI_SGA OBJECT _TYPE -------SYNONYM SYNONYM SYNONYM SYNONYM TABLE TABLE TABLE ふぅー、やっとできた。それにしても知らなかった、こんなにあるなんて。この 変更による影響だとは知らないままクレームに対応するっていうのも何だか悲し いな。けど、ある日を境に急にロック待ちが多くなったなんていうときは、その 日付で変更されたオブジェクトとロックの対象になっているオブジェクトを照ら 28 し合わせれば、役立つかもしれない。SYSDATE をその日付にすれば簡単にわかる よね。逆にテーブルの方を変更したいときもあるだろうから、そんなときは前に 実行した SQL 文を使えば、このテーブルを変更したときに影響を受けてしまうス トアドオブジェクトもピックアップできるといわけだ。うーん、使える、使える。 DBA の醍醐味 こうしていろいろとやってみると DBA の仕事って、ユーザーからのクレームに 対応するだけじゃなくて、自分でクレームを減らす働きかけもできるんだよね。ク レームの原因を見つけ出したときとか、解決したときには達成感もある。DBA の 仕事としては領域の管理、チューニング、バックアップとほかにもいろいろある けれど、今起きている問題を追究していくといろんなことが見えてくるんだろう な。やっぱりマニュアルを読んでるだけではきちんと身につかない気がする。そ れにしてもデータディクショナリってとっても重要。データディクショナリを活 用するとしないとでは DBA の仕事って大きく違ってくるよね、きっと。優秀な DBA になるためにもデータディクショナリともっともっと仲良くなるぞ!!あ、 先輩が戻ってきた。よーし、今までやったことを報告してみよう。 え?そんなことわかってる?なーんだ。ちょっと自慢してみたのに、冷たいな あ。ま、自分の理解が深まったからよしとするか... ロ ッ ク 待 ち ト ラ ブ ル の 解 消 29 本日の成果 インスタンスリカバリ Oracle (DBWR) は通常、ディスクI/Oを減らすために、バッファが足りなくなっ たときなどのタイミングにだけ、更新されたデータをファイルに書き込んでいる (遅延書き込み) 。そのため、Oracle インスタンスが突然止まってしまったような 場合には、ファイル上のデータとバッファ上のデータに不整合が生じてしまう。 再起動時にこの不整合を解消するための処理をインスタンスリカバリという。 具体的には、正常にコミットされた情報をすべてディスク上に書き出し、コミッ トされなかった情報についてはロールバックするという処理が行われる。このよ うな処理が行われるため、インスタンスリカバリが行われると、通常より起動に 時間がかかる。 ロック待ちによるユーザークレームへの対処 トラブルの原因としてロック待ちが考えられる場合には、まず、どのセッショ ンがロック待ちになっているのか状況を確認し、次に、ロックの原因になってい るセッションはどれかを突き止める必要がある。ロック待ち状況とロックの原因 になっているセッションは次のようなSQLを使って確認することができる。確認 できたら、状況に応じて対処するまでが DBA の仕事である。 ロック待ち状況を確認する SQL どのセッションが待たされているのかを調査するための SQL。同時に、どれくら い待たされているかも知ることができる。 SQL> select a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') Min, c.sql_text from v$session a, v$lock b, v$sqlarea c where a.lockwait = b.kaddr and a.sql_address = c.address order by b.ctime desc; 30 ユーザーから、「お待ち ください」のまま動かな いというクレームがあっ たら試してみよう。 犯人を特定する SQL 原因となっているセッションを見つけるには以下の SQL を使う。待たされてい るセッションとペアで表示されたのが原因のセッションである。 SQL> select b.id1,a.sid, a.serial#, b.type, to_char(b.ctime/60,'999990.9') MIN ,decode(b.lmode,1,'null',2,'row share',3,'row exclusive' ,4,'share',5,'share row exclusive',6,'exclusive') LMODE ,decode(b.request,1,'null',2,'row share',3,'row exclusive' ,4,'share',5,'share row exclusive',6,'exclusive') REQUEST from v$session a, v$lock b REQUEST=0の場合ロ where a.sid = b.sid ックを取得していない and (b.id1,b.id2) in ということになる。 (select d.id1,d.id2 from v$lock d where d.id1=b.id1 and d.id2=b.id2 and d.request > 0) order by b.id1,b.ctime desc; 状況に応じて対処 どのように対処するかは、状況によって変わってくる。COMMIT しないまま作 業を続けている場合には、ロックを取得しているユーザーに COMMIT してもら うことになるし、PC の電源を切ってしまったために、セッションが中途半端に 残ってロックを取得したままになっているような場合には、該当セッションを KILL する必要がある。 COMMIT; ROLLBACK; ALTER SYSTEM KILL SESSION sid, serial$ etc. 該当ユーザーに連絡をとる等、 状況に応じて対応しよう 31 必要なデータディクショナリを探す 数多くのデータディクショナリから自分が欲しい情報を見つけ出すためには、 以下のような SQL を、WHERE 条件に必要なキーワードを指定して実行する。 DICTIONARY ビューを使う この例はソースに関する情報の入ったデータディクショナリを調べたい場合。名 前に SOURCE が含まれるテーブルを SELECT している。調べたい情報に応じ てキーワードを変えてみる。 SQL> select * from dictionary where table_name like '%SOURCE%'; DBA_DEPENDENCIES の活用 DBA_DEPENDENCIESを参照すれば、オブジェクト間の依存関係がわかる。こ れを使えば、ロックされているテーブルに依存しているテーブルを調べることが できる。また、アプリケーションの変更による影響を調べて事前に手を打つよう な場合にも利用できる。 今日変更されたオブジェクトと影響を受けるオブジェクト アプリケーションの変更を知らずにユーザーからのロック待ちに対するクレーム 対応をさせられるのではたまらない。下記の SQL のようにすれば、アプリケー ションの変更による影響度を調査できる。 SQL> select o.owner,o.object_name CHANGED_OBJECT,o.object_type ,o.created,o.last_ddl_time,o.status ,o2.owner,o2.object_name REFRENCE_OBJ,o2.object_type from dba_objects o, dba_objects o2, sys.dependency$ d where o.last_ddl_time = sysdate and o.owner not in ('SYS','SYSTEM') and d.d_obj# = o.object_id and d.p_obj# = o2.object_id and o.object_name ! = o2.object_name and o2.owner ! = 'SYS'; 32 =SYSDATEを>= SYSDATE−10とすれば 10日以内に変更された ものが対象となる。 ロックの競合が起きているテーブルにアクセスしているのは ロックが多発している場合などは、 あるテーブルに対する更新が入り乱れている かもしれない。SCOTT.EMP にアクセスしているオブジェクトは、以下のよう にして調査できる。 SQL> select * FROM dba_dependencies where referenced_owner = ‘SCOTT’ and referenced_name = ‘EMP'; テーブル定義の変更で影響を 受けるストアドオブジェクト も調査できる DBA のお仕事の醍醐味(?)を垣間見る ユーザーからのクレームに対応する、要望に応える、といった受身の姿勢でな く、いろいろな角度から常に先手をうっていく。それがDBAのお仕事の醍醐味? 33
© Copyright 2024 Paperzz