株式会社インサイトテクノロジー 発行
http://www.insight-tec.com/jp/
・;*;・゜’★,。・*;・゜’♪☆。・;*;゜’♪★。・;*;゜’☆ ●●●●
● Vol.53 ●●●
●● おら!オラ!Oracle −どっぷり検証生活− ●●
●●● ☆ 2001.04.25 ●
●●●●☆。・;*;・゜’★,。・*;・゜’♪☆。・;*;゜’♪★。・;*;゜;♪
◎● I┃ N┃ D┃ E┃ X┃!┃◎●
━┛━┛━┛━┛━┛━┛
◆Oracle検証生活・・・ロールバック・セグメントに関する検証 その9
(おら!オラ! ソングついにデビュー♪)
◆お知らせ・・・◇Oracle管理ツール Performance Insight
◇SQeeLのご案内 ◇連載情報
◇書籍ご購入受付中 ◇QAについて
◆編集者より
■▽注意事項!!▽■
本文中にテーブルが含まれていますので、お読みになる際はMSゴシック等、
等幅フォントをお使いただくことをお勧めします。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□■ Oracle検証生活 □■÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
〜ロールバック・セグメントに関する検証 その9〜
ペンネーム ちゃむ
今回も、読み取り一貫性の仕組みを説明する上で必ず出てくる「ORA-1555」の
エラーに関して、引き続き検証していく。
前回は、残念ながら22個のトランザクションでは、ORA-1555を発生させるのに
は不十分であると判断して、今回は、49個のトランザクションを発生させる検
証を試みてみることにしよう。
-------------ORA-1555が発生する原因------------------
1.TRN TBLのスロットが上書きされてしまったとき
2.UNDOブロックが上書きされてしまったとき
3.データブロックのITLが上書きされてしまったとき
-----------------------------------------------------
弊社のPOPSQLという言語を用いて、49個のテーブルを、一つのロールバック・
セグメントで、49個のセッションからUPDATEするという簡単な検証プログラム
を作成した。
以下のtrun49_3.callがtrun49_3.jobを49回呼び出す。49個のテーブルは、Emp
表のコピーなのですべてのデータは1ブロックに納まっていて、更新するとUNDO
ブロックも1ブロックに納まる。
使用するロールバック・セグメントはRB_FIND50で、すべてのトランザクション
はこのRB_FIND50に書き込む。
initial 25ブロック、next 25ブロックで作成したので、使用できるブロック数
は、拡張しなければセグメント・ヘッダーを除いた49ブロックである。
SQL> select block_id,blocks from dba_extents where segment_name = 'RB_FIND50' ;
BLOCK_ID BLOCKS
--------- ---------
29439 25
29464 25
実質的には、block_id = 29440から29488の49ブロックが使用される。
(29439はセグメントヘッダー)
今回の検証は、49個の小さなテーブル(1ブロック)を別セッションでupdateする。
これは、ロールバック・セグメントは、別々のトランザクションの場合、別の
UNDOブロックに順番に書き込まれるという特性を利用した検証である。
************trun49_3.call*************************
CONNECT SCOTT/TIGER
LOOP( I=0 ; I<49 ; I++)
/* POPSQLのSYSTEMコマンドはシェルの起動
& はプログラムをバックグランドで実行させる */
SYSTEM popsql trun49_3.job \I\ &
ENDLOOP
**************************************************
以下で出てくるSLEEPコマンドとは、指定した秒数だけスリープさせるためのも
のだが、これをやっている理由は、順番どおりにUNDOブロックを使用させるた
めの工夫である。
************trun49_3.job***********************************************
GETOPT I
DIM OERR2_SET
CONNECT SCOTT/TIGER
SLEEP \I\
/* 使用するロールバック・セグメントを指定 rb_find50' */
PLSQL DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT ('rb_find50');
LET OERR2_SET ='\OERR\'
SQL UPDATE A_\I\ SET ENAME = 'KOBA4';
/* ロールバック・セグメントのどのスロットでどのDBA(UBA)を使用しているかを確認
MESSAGEコマンドでその内容を出力 */
SAMPLE select r.segment_name SEG_NAME,UBABLK , XIDSLOT
from dba_rollback_segs r,v$session s ,v$transaction t
where r.segment_id=t.XIDUSN
and s.audsid=userenv('sessionid') and s.SADDR = t.SES_ADDR;
/* ロールバックの使用状況を画面に出力 \で囲まれたものは、値が展開されます。 */
MESSAGE UPDATE A_\I\ \OERR\ OERR2_SET=\OERR2_SET\ \SEG_NAME\ UBABLK=\UBABLK\ XIDSLOT=\XIDSLOT\
SLEEP 25
COMMIT
SLEEP 3
***********************************************************************
trun49_3.callを実行すると、以下のようなメッセージを49行出力する。
****************画面出力の結果(ロールバックの使用状況)**************
元情報はプログラム中にある以下のSQLで取得
select r.segment_name SEG_NAME,UBABLK , XIDSLOT
from dba_rollback_segs r,v$session s ,v$transaction t
where r.segment_id=t.XIDUSN
and s.audsid=userenv('sessionid') and s.SADDR = t.SES_ADDR;
UPDATE A_0 0 OERR2_SET=0 RB_FIND50 UBABLK=29483 XIDSLOT=1
UPDATE A_1 0 OERR2_SET=0 RB_FIND50 UBABLK=29484 XIDSLOT=9
UPDATE A_2 0 OERR2_SET=0 RB_FIND50 UBABLK=29485 XIDSLOT=19
UPDATE A_4 0 OERR2_SET=0 RB_FIND50 UBABLK=29486 XIDSLOT=15
UPDATE A_3 0 OERR2_SET=0 RB_FIND50 UBABLK=29487 XIDSLOT=13
UPDATE A_6 0 OERR2_SET=0 RB_FIND50 UBABLK=29488 XIDSLOT=18
UPDATE A_5 0 OERR2_SET=0 RB_FIND50 UBABLK=29440 XIDSLOT=2
UPDATE A_7 0 OERR2_SET=0 RB_FIND50 UBABLK=29441 XIDSLOT=16
UPDATE A_8 0 OERR2_SET=0 RB_FIND50 UBABLK=29442 XIDSLOT=10
UPDATE A_9 0 OERR2_SET=0 RB_FIND50 UBABLK=29443 XIDSLOT=6
UPDATE A_10 0 OERR2_SET=0 RB_FIND50 UBABLK=29444 XIDSLOT=7
UPDATE A_11 0 OERR2_SET=0 RB_FIND50 UBABLK=29445 XIDSLOT=0
UPDATE A_12 0 OERR2_SET=0 RB_FIND50 UBABLK=29446 XIDSLOT=4
UPDATE A_13 0 OERR2_SET=0 RB_FIND50 UBABLK=29447 XIDSLOT=3
UPDATE A_14 0 OERR2_SET=0 RB_FIND50 UBABLK=29448 XIDSLOT=8
UPDATE A_15 0 OERR2_SET=0 RB_FIND50 UBABLK=29449 XIDSLOT=14
UPDATE A_16 0 OERR2_SET=0 RB_FIND50 UBABLK=29450 XIDSLOT=20
UPDATE A_18 0 OERR2_SET=0 RB_FIND50 UBABLK=29451 XIDSLOT=5
UPDATE A_17 0 OERR2_SET=0 RB_FIND50 UBABLK=29452 XIDSLOT=11
UPDATE A_19 0 OERR2_SET=0 RB_FIND50 UBABLK=29453 XIDSLOT=12
UPDATE A_20 0 OERR2_SET=0 RB_FIND50 UBABLK=29454 XIDSLOT=17
UPDATE A_21 0 OERR2_SET=0 RB_FIND50 UBABLK=29455 XIDSLOT=1
UPDATE A_22 0 OERR2_SET=0 RB_FIND50 UBABLK=29456 XIDSLOT=9
UPDATE A_23 0 OERR2_SET=0 RB_FIND50 UBABLK=29457 XIDSLOT=19
UPDATE A_24 0 OERR2_SET=0 RB_FIND50 UBABLK=29458 XIDSLOT=15
UPDATE A_25 0 OERR2_SET=0 RB_FIND50 UBABLK=29459 XIDSLOT=13
UPDATE A_26 0 OERR2_SET=0 RB_FIND50 UBABLK=29460 XIDSLOT=18
UPDATE A_27 0 OERR2_SET=0 RB_FIND50 UBABLK=29461 XIDSLOT=2
UPDATE A_28 0 OERR2_SET=0 RB_FIND50 UBABLK=29462 XIDSLOT=16
UPDATE A_29 0 OERR2_SET=0 RB_FIND50 UBABLK=29463 XIDSLOT=10
UPDATE A_30 0 OERR2_SET=0 RB_FIND50 UBABLK=29464 XIDSLOT=6
UPDATE A_31 0 OERR2_SET=0 RB_FIND50 UBABLK=29465 XIDSLOT=7
UPDATE A_32 0 OERR2_SET=0 RB_FIND50 UBABLK=29467 XIDSLOT=4
UPDATE A_33 0 OERR2_SET=0 RB_FIND50 UBABLK=29466 XIDSLOT=0
UPDATE A_34 0 OERR2_SET=0 RB_FIND50 UBABLK=29468 XIDSLOT=3
UPDATE A_35 0 OERR2_SET=0 RB_FIND50 UBABLK=29469 XIDSLOT=8
UPDATE A_37 0 OERR2_SET=0 RB_FIND50 UBABLK=29470 XIDSLOT=14
UPDATE A_36 0 OERR2_SET=0 RB_FIND50 UBABLK=29471 XIDSLOT=20
UPDATE A_38 0 OERR2_SET=0 RB_FIND50 UBABLK=29472 XIDSLOT=5
UPDATE A_39 0 OERR2_SET=0 RB_FIND50 UBABLK=29473 XIDSLOT=11
UPDATE A_40 0 OERR2_SET=0 RB_FIND50 UBABLK=29474 XIDSLOT=12
UPDATE A_41 0 OERR2_SET=0 RB_FIND50 UBABLK=29475 XIDSLOT=17
UPDATE A_42 0 OERR2_SET=0 RB_FIND50 UBABLK=29476 XIDSLOT=1
UPDATE A_43 0 OERR2_SET=0 RB_FIND50 UBABLK=29477 XIDSLOT=9
UPDATE A_44 0 OERR2_SET=0 RB_FIND50 UBABLK=29478 XIDSLOT=19
UPDATE A_45 0 OERR2_SET=0 RB_FIND50 UBABLK=29479 XIDSLOT=15
UPDATE A_46 0 OERR2_SET=0 RB_FIND50 UBABLK=29480 XIDSLOT=13
UPDATE A_47 0 OERR2_SET=0 RB_FIND50 UBABLK=29481 XIDSLOT=18
UPDATE A_48 0 OERR2_SET=0 RB_FIND50 UBABLK=29482 XIDSLOT=2
**********************************************************************
上記の検証スクリプトを流す前に、SQL*plusより、以下のようなコマンドを発
行して古いSCNを取得しておく。
(文レベルではなく、トランザクションレベルの読み取り一貫性の取得)
SQL> set transaction read only ;
トランザクションが設定されました。
わかりやすくするため、上記のリスト(MESSAGEコマンドの出力結果)は、21行
毎に手で改行を施してある。単純にこのリストだけ見ても、スロットが順番に
使用される様子や、UNDOブロックが順番どおりに使用される様子が見れて面白
い(SLEEP秒数を工夫しないと、このようにきれいな順番では使用されなかった)。
22行目から、スロットを上書きする様子が伺えると思うが、そこでは ORA-1555
が発生しなかった。このように、49個発生させて、やっとポロポロと ORA-1555
が発生したのである。
では、実際の結果はどうであろうか?
結果は、49個のトランザクションを発生させたときには、以下の5つのテーブル
でORA-1555が発生した(事前にSQL> set transaction read only ;を設定した
セッションで発行したSQL文である)。
SQL> select count(*) from a_0
にエラーが発生しました。ORA-01555: スナップショットが古すぎます
(ロールバック・セグメント番号: 17、名前:RB_FIND50が小さすぎます)。
SQL> select count(*) from a_1
にエラーが発生しました。ORA-01555: スナップショットが古すぎます
(ロールバック・セグメント番号: 17、名前:RB_FIND50が小さすぎます)。
SQL> select count(*) from a_2にエラーが発生しました。
ORA-01555: スナップショットが古すぎます
(ロールバック・セグメント番号: 17、名前:RB_FIND50が小さすぎます)。
SQL> select count(*) from a_3
にエラーが発生しました。ORA-01555: スナップショットが古すぎます
(ロールバック・セグメント番号: 17、名前:RB_FIND50が小さすぎます)。
SQL> select count(*) from a_4にエラーが発生しました。
ORA-01555: スナップショットが古すぎます
(ロールバック・セグメント番号: 17、名前:RB_FIND50が小さすぎます)。
まず、ORA-1555が発生した理由についてだが、前述した3つの理由のうちの
「2.UNDOブロックが上書きされてしまったとき」ではない。
ロールバック・セグメントは、49個の使用可能領域があり(initial = 25、
next = 25 の場合)、きれいにその49個のブロックを使用しているので、上書
きされていない様子は分かる。
また、「3.データブロックのITL(テーブルなどのデータブロックにあるトラ
ンザクション情報)が上書きされてしまったとき」でもない。なぜなら、テー
ブルはすべて別々の A_0 から A_48 のテーブルを使用しているからである。
となると、残りは「1.TRN TBLのスロットが上書きされてしまったとき」
しかない。
ただし、21 × 2 = 42 までは、前回説明した「トランザクション表自体のロー
ルバック情報」が存在しているため、ORA-1555は発生しなくても納得がいくが、
それ以降の7つに関しては、ORA-1555がすべて発生しないと納得がいかない。だ
が、結果は 7つのうち 5つしか発生しなかった。
残念ながら、今回はなぜ、7つのテーブルすべてでORA-1555が発生しなかったか
の原因を突き止めることができなかったが、この件に関しては、何時か必ずリ
ベンジしたいと思っている。
読者の方で、何かこれはと思うことがあれば、ご一報いただけるとうれしいっす。
以上 検証敗北 茅ヶ崎にて
今回で、ロールバック・セグメントに関する検証は終わりにしますが、検証が
完結に至れなかったことについてのお詫びとして、読者の皆様限定に、
「♪♪♪ ロールバック・セグメントの歌 ♪♪♪」をささげます。
一度聴いたら、必ず脳裏にやきつくこと請け合いです。
また、複雑なロールバック・セグメントの構造も、この歌を聴けば簡単に理解
できるかもしれません。
仕事中に、この歌を口ずさんでいただけると、我々としては嬉しいです。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
↓発進!茅ヶ崎移住計画↓
http://www.insight-tec.com/jp/company/career.html
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■□ Oracle 管理ツール Performance Insight ■□÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Oracleを知り尽くしたメンバーが開発したOracleパフォーマンス監視ツール
の決定版。それがPerformance Insightです。インサイトテクノロジーの技術
者の知恵とノウハウがここに結集!
パフォーマンス監視だけでなくOracleを使用しているシステムの運用、管理、
そして開発にも役立つ機能がいっぱいです。
詳しくは以下のURLをご覧ください。
http://www.insight-tec.com/jp/products/products.html
また無料で試使用することも可能です。
是非お問い合わせください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□■ SQeeLのご案内 □■÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<プログラマ待望の言語SQeeL>
●手軽に使える、速い、そしてWEBに適した新言語SQeeL!
フリーソフトSQeeLは、以下のURLより好評ダウンロード中!
既に多くの方々にご利用いただいております。
あなたもSQeeLの世界を体験してみませんか?
http://www.SQeeL.org/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■□ 連載情報 ■□÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<雑誌連載>
Oracleのエキスパートとして定評のある弊社のスタッフが執筆しております
連載記事に関してご紹介しています。
現在「DB Magazine」に、Oracleビギナー向け連載が掲載されています。
5月号が発売中ですので、是非ご覧下さい。
http://www.insight-tec.com/jp/topics/magazine.html
上記のURLでタイトルがご覧になれます。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□■ 書籍ご予約受付中 □■÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<送料無料でお届けします>
1.「Oracle8 プロフェッショナルテクニック」
弊社のHPよりお申し込みいただいた方に限り、送料無料でお届けします。
専門書としては異例の速さで増刷が決定するほどの好評をいただいている
「Oracle8 プロフェッショナルテクニック」をぜひご活用ください。
2.「Oracleデータベース管理を極める13章」
「DB Magazine」に連載され大好評だった「体験的・DBAのお仕事」が
加筆され書籍化された同書は、おかげさまで発売以来3ヶ月足らずで第3刷
となりました。
好評につき、キャンペーンを拡大いたしました!上記の書籍はいずれも
消費税サービス+送料無料、つまり本体価格のみでご購入いただけます。
この機会をお見逃し無く。
さらに書籍をお買い上げいただいた方にはもれなく「Oracleの知恵袋」進呈中!
数に限りがございますので、在庫がなくなり次第終了とさせていただきます。
お早めに!
書籍ご購入のお申し込みは以下のURLより受付中!
http://www.insight-tec.com/jp/topics/books.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■□ QAについて ■□÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<皆様からのQAを受付けております>
皆様のQAにはできるだけ、お答えしたいと思っています。
すべてのQAにお答えすることはできないかもしれませんが、
適宜メルマガ内でとりあげていく予定ですので、是非QAをお寄せください。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
□■ 編集者より □■÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷÷
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ついに風邪をひいてしまいました。最近暖かいと思ったら、急に寒くなった
りしてましたよねー。ゴールデンウィークも近いというのに。遊ぶ予定は入
れているのに、このままだと寝込んでいる間に休みが終ってしまいそうな気
が・・・。そんなのイヤー!臭いと言われても、いっぱいニンニク食べてス
タミナをつけようと思います!みなさんも、季節の変わりめの風邪には気を
つけましょーね! by TI
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
登録・解除は以下のURLで行うことができます。
http://www.insight-tec.com/jp/em/mail_magazine.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
<おら!オラ!Oracle−どっぷり検証生活−>
発行/編集:株式会社インサイトテクノロジー
http://www.insight-tec.com/jp
マガジンID:0000030093
本メールマガジンに掲載された記事を許可なく転載することを禁じます。
Copyright (c) 1996-2001 , Insight Technology, Inc. All rights reserved.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━