そうだ 検証、しよう。

32
そそそ そそ そそそそ 、。 JPOUG in 15 minutes #1 そそ そ

Upload: -

Post on 16-Apr-2017

105 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: そうだ 検証、しよう。

そうだ 検証、しよう。JPOUG in 15 minutes #1三原 健一

Page 2: そうだ 検証、しよう。

私の考える検証

Page 3: そうだ 検証、しよう。

問題、障害の原因探求仕様の確認

Page 4: そうだ 検証、しよう。

マニュアルの行間を探るこれがけっこう楽しい!

Page 5: そうだ 検証、しよう。

検証をする際に役立つ情報をいくつか紹介します。

Page 6: そうだ 検証、しよう。

準備フェーズデータ作成

Page 7: そうだ 検証、しよう。

別スキーマにテーブル作成ALTER SESSION SET CURRENT_SCHEMA ~

Page 8: そうだ 検証、しよう。

ALTER SESSION SET CURRENT_SCHEMA ~• デフォルトは ログインユーザ=スキーマ• アプリケーション・コンテキストのセッション情報を変更できる

例: SYS ユーザでログインしてSCOTT スキーマに TEST 表を作成

Page 9: そうだ 検証、しよう。

SQL> conn / as sysdba接続されました。SQL> select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA 2 from dual;

CURRENT_SCHEMA--------------SYS

SQL> alter session set CURRENT_SCHEMA = SCOTT;

セッションが変更されました。SQL> select SYS_CONTEXT('USERENV','CURRENT_SCHEMA') CURRENT_SCHEMA 2 from dual;

CURRENT_SCHEMA--------------SCOTT

SQL> show userユーザーは "SYS"です。

Page 10: そうだ 検証、しよう。

SQL> create table TEST ( 2 ID number 3 );

表が作成されました。SQL> select OWNER,TABLE_NAME from DBA_TABLES 2 where TABLE_NAME = 'TEST';

OWNER TABLE_NAME------ -----------SCOTT TEST

Page 11: そうだ 検証、しよう。

バルクインサート

Page 12: そうだ 検証、しよう。

SQL> DECLARE 2 TYPE tbl_ins IS TABLE OF TEST%ROWTYPE INDEX BY PLS_INTEGER; 3 w_ins tbl_ins; 4 BEGIN 5 FOR i IN 1..100000 LOOP 6 w_ins(i).ID := i; 7 END LOOP; 8 9 FORALL i IN 1..100000 insert into TEST values w_ins(i); 10 commit; 11 END; 12 / PL/SQLプロシージャが正常に完了しました。 SQL> select count(*) from TEST; COUNT(*)---------- 100000

例: 10 万件を一括インサート

Page 13: そうだ 検証、しよう。

実行フェーズトレース

Page 14: そうだ 検証、しよう。

SQL> select name, value from v$diag_info;

NAME VALUE--------------------- ------------------------------------------------------------Diag Enabled TRUEADR Base /u01/app/oracleADR Home /u01/app/oracle/diag/rdbms/orcl/orclDiag Trace /u01/app/oracle/diag/rdbms/orcl/orcl/traceDiag Alert /u01/app/oracle/diag/rdbms/orcl/orcl/alertDiag Incident /u01/app/oracle/diag/rdbms/orcl/orcl/incidentDiag Cdump /u01/app/oracle/diag/rdbms/orcl/orcl/cdumpHealth Monitor /u01/app/oracle/diag/rdbms/orcl/orcl/hmDefault Trace File /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2231.trcActive Problem Count 3Active Incident Count 5

11行が選択されました。SQL> alter session set tracefile_identifier = 'SQLTRC';

セッションが変更されました。SQL> select name, value from v$diag_info 2 where NAME = 'Default Trace File';

NAME VALUE--------------------- -------------------------------------------------------------------Default Trace File /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2231_SQLTRC.trc

トレースファイル出力場所・名称

Page 15: そうだ 検証、しよう。

SQL> alter system set events '10046 trace name context forever,level 12';

システムが変更されました。SQL> alter system set events '10046 trace name context off';

システムが変更されました。

トレース有効化・無効化

SQL> alter session set events '10046 trace name context forever,level 12';

システムが変更されました。SQL> alter session set events '10046 trace name context off';

システムが変更されました。

インスタンス単位

セッション単位

c.f. DBMS_SESSION or DBMS_MONITOR(SQL トレース )

Page 16: そうだ 検証、しよう。

SQL トレース( 10046 )レベル 説明

0 無効1 alter session set SQL_TRACE = TRUE と同じ4 バインド変数値を含む8 待機イベント情報を含む

12 バインド変数値+待機イベント情報

Page 17: そうだ 検証、しよう。

CBO トレース( 10053 )レベル 説明

1 レベル指定なしと同じ。統計情報、 CBO 関連パラメータ一覧および計算結果を含む

2 計算結果のみ

Page 18: そうだ 検証、しよう。

SQL> set serveroutput onSQL> DECLARE 2 err_msg LONG; 3 err_cod PLS_INTEGER; 4 i PLS_INTEGER; 5 BEGIN 6 FOR err_cod IN 10000..10999 LOOP 7 i := UTL_LMS.GET_MESSAGE (err_cod, 'rdbms', 'ora', 'japanese', err_msg); 8 IF err_msg not like 'Message%not found%' THEN 9 DBMS_OUTPUT.PUT_LINE (TO_CHAR (err_cod, 'FM00000') || ': ' || err_msg); 10 END IF; 11 END LOOP; 12 END; 13 /

イベント一覧取得要領

Page 19: そうだ 検証、しよう。

10000: control file debug event, name 'control_file' 10001: control file crash event1 10002: control file crash event2 10003: control file crash event3 10004: block recovery testing - internal error………………

10045: free list update operations - ktsrsp, ktsunl

10046: enable SQL statement timing

10047: trace switching of sessions………………10052: don't clean up obj$ 10053: CBO Enable optimizer trace 10054: CBO Enable optimizer trace for recursive statement (RPI)………………10995: general event for materialized views 10997: another startup/shutdown operation of this instance inprogress 10998: event to enable short stack dumps in system state dumps 10999: do not get database enqueue name

イベント一覧(抜粋)

Page 20: そうだ 検証、しよう。

ブロック・ダンプ取得

Page 21: そうだ 検証、しよう。

SQL> SELECT 2 ROWID 3 ,DBMS_ROWID.ROWID_TO_ABSOLUTE_FNO(ROWID,'RM','SMALL_TBL') "FILE#" 4 ,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) "BLOCK#" 5* FROM RM.SMALL_TBL; ROWID FILE# BLOCK# ------------------ ---------- ---------- AAADkVAAFAAAAAHAAA 5 7 AAADkVAAFAAAAAHAAB 5 7 AAADkVAAFAAAAAHAAC 5 7 AAADkVAAFAAAAAHAAD 5 7 AAADkVAAFAAAAAHAAE 5 7 AAADkVAAFAAAAAHAAF 5 7 AAADkVAAFAAAAAHAAG 5 7 AAADkVAAFAAAAAHAAH 5 7 AAADkVAAFAAAAAHAAI 5 7 AAADkVAAFAAAAAHAAJ 5 7 10 rows selected.

ファイル番号、ブロック番号を取得する

Page 22: そうだ 検証、しよう。

1. ALTER SYSTEM DUMP DATAFILE <データファイル No.> BLOCK <ブロックNo.>;

2. ALTER SYSTEM DUMP DATAFILE <FNO> BLOCK MIN <開始ブロック No.> BLOCK MAX <終了ブロック No.>;

結果は Diag Trace( 10g以前は USER_DUMP_DEST)に出力される。

(データ・)ブロック・ダンプ取得方法

Page 23: そうだ 検証、しよう。

/opt/app/oracle/admin/xxxxx/udump/xxxxxx_ora_8652.trcOracle Database 10g Release 10.2.0.4.0 - 64bit ProductionORACLE_HOME = /opt/app/oracle/product/10.2.0/dbSystem name: Linux............... (中略) ............................................*** SESSION ID:(446.1507) 2010-03-18 11:18:00.905Start dump data blocks tsn: 5 file#: 5 minblk 7 maxblk 7buffer tsn: 5 rdba: 0x01400007 (5/7)scn: 0x0000.0376e690 seq: 0x01 flg: 0x06 tail: 0xe6900601frmt: 0x02 chkval: 0x1f4b type: 0x06=trans dataHex dump of block: st=0, typ_found=1 ←しばらくバイナリ・ダンプが続くDump of memory from 0x00000000125CE400 to 0x00000000125CEC000125CE400 00006206 01400007 0376E690 06010000 [[email protected].....]0125CE410 00001F4B 00000001 00003915 0376E68F [K........9....v.]............... (中略) ............................................0125CE480 02660324 00EA01A8 0000002C 00000000 [$.f.....,.......]0125CE490 100B012C 30303052 30303030 30303030 [,...R00000000000] 10行目0125CE4A0 30313030 30303010 30303030 30303030 [0010.00000000000]0125CE4B0 30303030 31311030 31313131 31313131 [00000.1111111111]............... (中略) ............................................0125CEB40 3052100B 30303030 30303030 30303030 [..R0000000000000] 1行目0125CEB50 30103130 30303030 30303030 30303030 [01.0000000000000]0125CEB60 10303030 31313131 31313131 31313131 [000.111111111111]0125CEB70 31313131 32323210 32323232 32323232 [1111.22222222222]0125CEB80 32323232 33331032 33333333 33333333 [22222.3333333333]0125CEB90 33333333 34103333 34343434 34343434 [333333.444444444]0125CEBA0 34343434 10343434 35353535 35353535 [4444444.55555555]0125CEBB0 35353535 35353535 36363610 36363636 [55555555.6666666]0125CEBC0 36363636 36363636 37371036 37373737 [666666666.777777]0125CEBD0 37373737 37373737 38103737 38383838 [7777777777.88888]0125CEBE0 38383838 38383838 10383838 39393939 [88888888888.9999]0125CEBF0 39393939 39393939 39393939 E6900601 [999999999999....](行データはブロック内で下から順に格納されるイメージ)............... (中略) ............................................data_block_dump,data header at 0x125ce464

バイナリ( 16 進)・ダンプ

Page 24: そうだ 検証、しよう。

data_block_dump,data header at 0x125ce464===============tsiz: 0x798hsiz: 0x26pbl: 0x125ce464bdba: 0x01400007 76543210flag=--------ntab=1 ←ブロックに格納されている表数nrow=10 ←ブロックに格納されている行数frre=-1fsbo=0x26fseo=0x2cavsp=0x6tosp=0x60xe:pti[0] nrow=10 offs=00x12:pri[0] offs=0x6da ←行情報(ブロック内の行位置)0x14:pri[1] offs=0x61c pri:pointer record index?0x16:pri[2] offs=0x55e 1行目 (pri[0])~ 10行目 (pri[9])0x18:pri[3] offs=0x4a0 行内の相対位置(オフセット)を表示0x1a:pri[4] offs=0x3e20x1c:pri[5] offs=0x3240x1e:pri[6] offs=0x2660x20:pri[7] offs=0x1a80x22:pri[8] offs=0xea0x24:pri[9] offs=0x2cblock_row_dump: ←論理ダンプの始まりtab 0, row 0, @0x6datl: 190 fb: --H-FL-- lb: 0x1 cc: 11 ←1行目 (長さ 190byte)col 0: [16] 52 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 ←RNO列col 1: [16] 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 ←COL0列col 2: [16] 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31col 3: [16] 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32col 4: [16] 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33 33col 5: [16] 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34 34col 6: [16] 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35 35col 7: [16] 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36 36col 8: [16] 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37col 9: [16] 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38 38col 10: [16] 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39 39............... (後略) ............................................

論理ブロック・ダンプ

Page 25: そうだ 検証、しよう。

評価フェーズ

Page 26: そうだ 検証、しよう。

tkprof コマンド・オプションオプション 説明

sort 指定したソート・オプションに基づいて降順にソート例: EXEELA - 実行に費やされた経過時間

print 最初に整数でソートされた SQL 文のみのリストを作成

explain 指定されたユーザーとパスワードを使用してデータベースに接続した後、 EXPLAIN PLAN 文を発行して実行計画を判断

sys sys=yes (デフォルト)SYS が発行した SQL 文のリストを作成

aggregate aggregate=yes (デフォルト)同じ文の実行は1つのサマリー表に集計

Page 27: そうだ 検証、しよう。

AWR レポートをまとめて出力する Tips

SQL> @awr_output.sql

Page 28: そうだ 検証、しよう。

SQL> SELECT TEXT FROM DBA_VIEWS WHERE VIEW_NAME = 'USER_TAB_IDENTITY_COLS'; TEXT----------------------------------------------------------------------------select o.name, c.name, decode(bitand(c.property, 137438953472 + 274877906944), 137438953472, 'ALWAYS', 274877906944, 'BY DEFAULT'), so.name, 'START WITH: ' || i.startwith || ', INCREMENT BY: ' || s.increment$ || ', MAX_VALUE: ' || s.maxvalue || ', MIN_VALUE: ' || s.minvalue || ', CYCLE_FLAG: ' || decode (s.cycle#, 0, 'N', 1, 'Y') || ', CACHE_SIZE: ' || s.cache || ', ORDER_FLAG: ' || decode (s.order$, 0, 'N', 1, 'Y')from sys.idnseq$ i, sys.obj$ o, sys.col$ c, sys.seq$ s, sys.obj$ sowhere o.owner# = userenv('SCHEMAID')and o.obj# = i.obj#and c.intcol# = i.intcol#and c.obj# = i.obj#and s.obj# = i.seqobj#and so.obj# = i.seqobj#;

データ・ディクショナリ定義確認

Page 29: そうだ 検証、しよう。

参考情報

Page 30: そうだ 検証、しよう。

お役立ちサイト• juliandyke.com

http://www.juliandyke.com/Presentations/Presentations.php

• Oracle Data Dictionary

http://www.morganslibrary.org/reference/data_dict.html

Page 31: そうだ 検証、しよう。

今まで検証したテーマ• オプティマイザ統計の保留• Oracle12c 新機能:「 Identity Column 」• TNS_ADMIN 環境変数• インスタンスのリスナーへの登録• Oracle12c 新機能: APPROX_COUNT_DISTINCT 関数• Flashback Drop• USE_INVISIBLE_INDEXES ヒント• インターバル・パーティション• ADR• 行移行・行連鎖etc.詳しくは「サイクル&オラクル」http://onefact.jp/wp/

Page 32: そうだ 検証、しよう。

おわり