注意 : これは、私個人の覚え書きであり、何も保証するもではありません。自己責任でお読み下さい。
読み取り専用のユーザには下記の権限を与えます。
[USERS][PASSWORD]を表す。
[INTERNAL][ORACLE]
INTERNAL は、データベースの起動および停止を含むデータベース管理タスクの実行に使用される。
注意: INTERNAL は、正確にはユーザ名ではなく、SYS ユーザ名(下記参照)とSYSDBA 権限の別名。
注意: このパスワードは、Oracle8i データベースをインストールしていないユーザにのみ必要。
Oracle8i データベースをインストールしたユーザは、ORA_DBA と呼ばれる特別のWindows NT ローカル・グループにユーザ名が追加されているため、INTERNAL として接続する際はパスワードの入力を要求されない。
[SYS][CHANGE_ON_INSTALL]
SYS は、データベース管理タスクの実行に使用される。SYS には次のデータベース・ロールが含まれている。
AQ_ADMINISTRATOR_ROLE、AQ_USER_ROLE、CONNECT、CTXAPP、DBA、DELETE_CATALOG_ROLE、EXECUTE_CATALOG_ROLE、EXP_FULL_DATABASE、HS_ADMIN_ROLE、IMP_FULL_DATABASE、JAVA_ADMIN、JAVADEBUGPRIV、JAVAIDPRIV、JAVAUSERPRIV、OEM_MONITOR、RECOVERY_CATALOG_OWNER、RESOURCE、SELECT_CATALOG_ROLE、SNMPAGENT、TIMESERIES_DBA、TIMESERIES_DEVELOPER
[SYSTEM][MANAGER]
データベース管理タスクの実行に使用される。AQ_ADMINISTRATOR_ROLE およびDBA データベース・ロールが含まれている。
[OUTLN][OUTLN]
CONNECT およびRESOURCE データベース・ロールが含まれる。プラン・スタビリティをサポートしてる。プラン・スタビリティにより、同一のSQL 文に対して同じ実行プランを維持できる。OUTLN は、格納されたアウトラインに関連するメタデータを集中的に管理する場所として機能する。
[DBSNMP][DBSNMP]
Oracle Instelligent Agent を使用する場合に必要なユーザ。Oracle Enterprise Manager(OEM)より使用される。使用していない時は削除可能。
CONNECT、RESOURCE およびSNMPAGENT の各データベース・ロールが含まれている。このロールおよびユーザを削除する場合は、CATNSNMP.SQL を実行する。
[MTSSYS][MTSSYS]
Oracle Services for Microsoft Transaction Server のユーザ。使用していない時は削除可能。
[SCOTT/DEMO][TIGER]
データベースのデモ用のユーザ。削除可能。
CONNECT およびRESOURCE データベース・ロールが含まれている。
[CTXSYS][CTXSYS]
Oracle interMedia Text のユーザ。使用していない時は削除可能。
CONNECT、DBA およびRESOURCEの各データベース・ロールが含まれている。
[MDSYS][MDSYS]
Oracle Spatial and interMedia Audio、Video、Locator およびImage の管理者ユーザ。使用していない時は削除可能。
[ORDSYS][ORDSYS]
Oracle interMedia Audio、Video、Locator および Image のユーザであり、Oracle Time Series および Oracle Visual Information Retrieval の管理者ユーザ。
Oracle interMedia Audio、Video、Locator および Image を使用していない時は削除可能。
CONNECT、JAVAUSERPRIV およびRESOURCE の各データベース・ロールが含まれている。
* Oracle Time Series および Oracle Visual Information Retrieval は日本においてはサポートされていない。
[ORDPLUGINS][ORDPLUGINS]
Oracle interMedia Audio、Video のユーザ。使用していない時は削除可能。
CONNECT およびRESOURCEロールが含まれている。
1 つのセッションでシステム固有でないプラグイン形式が複数使用できます。
[COMDEMO][COMDEMO]
Oracle COM Automation のユーザ。使用していない時は削除可能。
DBA およびRESOURCE データベース・ロールが含まれている。
[SYSMAN][OEM_TEMP]
Oracle Enterprise Manager のユーザ。使用していない時は削除可能。
通常、Oracle は統計情報が存在する場合、デフォルトでオプティマイザがコストベース最適化(CBO:コスト・ベース・オプティマイザ)を採用し、スループットを最大にするようにします。
テーブル、インデックスに関する統計情報を基に「コスト(読み込んだデータブロック数)」をはじき出し、コストがもっともかからないアクセスパスで実行する様になっています。
その際、オプティマイザが誤ったインデックスを採用する場合があります。データベース管理者がオプティマイザに対してどのインデックスを使用するかヒントを与えるとパフォーマンスの向上を得る場合があります。
ヒントは SQL(SELECT,DELETE,INSERT,UPDATRE)文中にコメント(/* */,-- --)として記述します。コメントは、SELECT,DELETE,INSERT,UPDATREのいずれかのキーワードの直後に指定した場合のみ有効です。
但し、ヒントを与えても必ずしも使用されるとは限りません。また、インデックス名等を間違えている場合も使用されません。
例) テーブル名に設定してあるインデックス名1,インデックス名2を使用してみてはどうかと、オプティマイザにヒントを与えています。
SELECT /*+ INDEX (テーブル名 インデックス名1,インデックス名2) An
INDEX is decided compulsorily. */
FROM テーブル名
WHERE 条件文
※An INDEX is decided compulsorily. と記述はコメントとして扱われています。後から SQL文を見たときにわかりやすいように私が入れました。
私はメーカーSEが「メモリを増設するしか手がないが、Oracleが使用できるメモリの上限値(32bit OSの場合、SGAが約1.7GBまで)なので、手の打ちようがない。」と言われていたシステムのレスポンス、ディスクIOの負荷を、この方法で20%程度になるまで削減できました。
実際にどのインデックスがどのように使用されているかは、Oracle の 「EXPLAIN PLAN (実行計画)」を見て判断するしかありません。「EXPLAIN PLAN (実行計画)」の使い方は Oracle のマニュアルを参照して下さい。私は、SQL文を組めないので、株式会社システムインテグレータ の「SI Object Browser」と言うツールを使用しました。このツールは非常に使い勝手がよく、SQLをろくに知らない私でも Oracle を見た目で管理させてくれます。
2003年5月26日 追記
インデックス使用時の注意
- TABLE_NAMEは必須です。
- 表名にエイリアス(別名)が使用されている場合は、エイリアスの方を指定する必要があります。
- 表名もしくはそのエイリアスにスペル・ミスがあると、ヒントは無視されます。
- INDEX_NAMEは必須では有りません。(INDEX_NAMEを指定しないと、全ての索引が指定されたのと同じとみなされます)
- INDEX_NAMEは指定されているがTABLE_NAMEが指定されていない場合、ヒントは無視されます。
- TABLE_NAMEが正しく指定されているが、INDEX_NAMEの指定が間違っている場合、ヒントは無視されます。
- INDEX_NAMEが複数指定されている場合、オプティマイザが統計に基づき、最もコストが低い索引を選択します。もしくは、複数の索引にアクセスし、その結果をマージするようなアクセス・パスが選択されます。
2004年1月7日 追記
WHERE文に含まれていないヒントを与えると、オプティマイザが使用してしまいます。
コストベース最適化を行うためには、テーブル、インデックスの統計情報が必要になります。統計情報を取るには2つの方法があります。
1.Analyze コマンド2.DBMS_STATS コマンドの GATHER_SCHEMA_STATS プロシージャ(これは Oracle8i からの機能です。)
テーブル、インデックスが非常に多い場合に有効的な手段です。これはスキーマ内の全てのオブジェクトに関する統計情報を収集します。
構文
DBMS_STATS.GATHER_SCHEMA_STATS('ownname',estimate_percent,CASCADE => statab)例)SCOTT と言うスキーマを10%のサンプルで統計情報を採取し、GATHER と言うユーザ統計表の識別子に保存する場合
DBMS_STATS.GATHER_SCHEMA_STATS('SCOTT',10,CASCADE => 'GATHER')
私は2の方法でバッチファイルを作成し、Windows のタスク・スケジューラで、毎日、深夜に実行しています。
バッチ・ファイルのサンプル
ECHO EXECUTE DBMS_STATS.GATHER_SCHEMA_STATS^('SCOTT',20,CASCADE =^> GATHER^) > gather_schema.sql
ECHO EXIT >> gather_schema.sql
sqlplus ユーザ名/パスワード@ホスト文字列 @gather_schema.sql※ ^ は特殊文字のエスケープです。
統計情報を取るときの注意
OPTIMIZER_MODE=CHOOSE、RULE の場合
索引の統計情報は使用されず、RBO(ルール・ベース・オプティマイザ)が実行計画を選択します。OPTIMIZER_MODE=FIRST_ROWS、ALL_ROWS の場合
CBO が索引の統計情報を使用して実行計画を選択しますが、元表に関してはハード・コードされた統計情報を使用するため、結果として正確なコストを算出できません。従って、索引のみ ANALYZE しても結果として最適な実行計画が選択されない可能性があるため、元表も ANALYZE する必要があります。
RULE
ルールベース最適化で実行
CHOOSE 統計情報の有無を調べ、あればコストベースを実行。なければルールベースを実行
ALL_ROWS リソースの最小化、スループットの最大化
FIRST_ROWS 応答時間の最短化
※ REBUILD と COALESCE は同時に指定することは出来ません。
※ RBO をサポートするのは Oracle9i Database Release2 が最後となる予定です。M
Oracle でインポート、エクスポート等を行った時に
Invalid format of (ユーティリティ名) utility name
Verify that ORACLE_HOME is properly set
(ユーティリティ名) terminated unsuccessfullyXXX-00000 : Message 0 not found; No message file for
product=RDBMS, facility=XXX"
のエラーが出る場合があります。
その時には、メッセージファイルが消えている場合があります。
必要なメッセージファイルは、
%ORACLE_HOME%\RDBMS\mesg
(ORACLE_HOME は レジストリの\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE に
"ORACLE_HOME"として設定されています。 )
に存在します。このディレクトリに、上記、エラーメッセージの
” facility で指定されている機能面のポインタ”+”ロケール名(ja:日本、us:アメリカ)”+”.msb”
と言うファイルを置けば、エラーはなくなります。
".msb"のファイルが見つからない場合は、lmsgen と言うユーティリティを使用して、テキスト・ベースのメッセージ・ファイル(.msg)をバイナリ形式(.msb)に変換します。詳細はOracleの「NLS ガイド」を参照して下さい。
Access
2000 から Oracle 8(8.0.5) のデータを削除する時に
上記メッセージはODBCドライバのバージョンによって発生します。
私の環境
(WinNT 4.0 SP6 + Access 2000 SP3) では、ODBCドライバが8.0.5.1b、8.0.5.5
については問題がありませんでしたが、8.0.5.8、8.0.5.9、8.0.5.10では上記メッセージが発生しました。
原因はよく分かりませんが、このメッセージが発生したデータを確認すると、2バイト文字(No.、(株)など)が入っているデータがばかりでした。なので、ODBCドライバのUNICODEへの対応の不具合だと思われます。
パッチを当てようとして、リリースノートを読むと、
となっています。パッチはOracle社より有償サポートを受けているユーザ向けにPatch Set Release としてWindows NT for Intel (8.0.5.2.6) を提供されています。なので、パッチを当てての確認はしておりません。
なお、Microsoft Office 2000 で利用可能な Oracle ODBC Driver の Version は 8.0.5.5 以降です。「Oracle8 Server R8.0.5」には、8.0.5.1b が入っていますので、8.0.5.5 を使用すれば、回避できます。
8.0.5.5 は「ORACLE Technology NETWORK (OTN) (要ユーザ登録)」からダウンロードできます。
SELECT BANNER FROM V$VERSION
ORDER BY BANNER
;
SELECT NUM, NAME,
VALUE,
ISSYS_MODIFIABLE,
TYPE
FROM V$PARAMETER
;
Fixed、共有プール、DBバッファ、REDOバッファ
SELECT NAME,
VALUE
FROM V$SGA
;
総SGAサイズがメモリの1/2になるようにする。
COLUMN USERNAME HEADING "USER_NAME" FORMAT a15
COLUMN DEFAULT_TABLESPACE HEADING "DEFAULT" FORMAT a15
COLUMN TEMPORARY_TABLESPACE HEADING "TEMPORARY" FORMAT a10
COLUMN PROFILE HEADING "PROFILE" FORMAT a10
COLUMN ACCOUNT_STATUS HEADING "ACCOUNT_STATUS" FORMAT a15
SELECT USERNAME,
DEFAULT_TABLESPACE,
TEMPORARY_TABLESPACE,
PROFILE,
CREATED,
ACCOUNT_STATUS
FROM DBA_USERS
;
SELECT T.TABLESPACE_NAME,
TRUNC(T.BYTES/(1024*1024),0) TOTAL_M,
ROUND((T.BYTES - SUM(F.BYTES)) / (1024*1024),0) USED_M,
ROUND(SUM(F.BYTES) / (1024*1024),0) FREE_M,
ROUND((1-SUM(F.BYTES) / T.BYTES)*100,2) RATE
FROM SYS.DBA_FREE_SPACE F,
(SELECT TABLESPACE_NAME,
SUM(BYTES) BYTES
FROM SYS.DBA_DATA_FILES
GROUP BY TABLESPACE_NAME) T
WHERE T.TABLESPACE_NAME = F.TABLESPACE_NAME(+)
GROUP BY T.TABLESPACE_NAME,
T.BYTES
;
COLUMN TABLESPACE_NAME HEADING "TABLE_SPACE" FORMAT a15
SELECT TABLESPACE_NAME,
INITIAL_EXTENT,
NEXT_EXTENT,
MIN_EXTENTS,
MAX_EXTENTS,
PCT_INCREASE,
MIN_EXTLEN,
STATUS,
EXTENT_MANAGEMENT,
ALLOCATION_TYPE
FROM DBA_TABLESPACES
;
COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
COLUMN OWNER HEADING "OWNER" FORMAT a10
COLUMN SEGMENT_TYPE HEADING "SEGMENT_TYPE" FORMAT a12
COLUMN AREA_M HEADING "AREA_SIZE(M)" FORMAT 999,990
SELECT SEGMENT_NAME,
OWNER,
SEGMENT_TYPE,
TRUNC(BYTES/(1024*1024),0) AREA_M
FROM DBA_SEGMENTS
WHERE TABLESPACE_NAME = 'テーブルスペース名'
ORDER BY SEGMENT_TYPE,
SEGMENT_NAME
;
SELECT B.FILE_NAME,
A.BYTES
FROM DBA_FREE_SPACE A,
DBA_DATA_FILES B
WHERE A.TABLESPACE_NAME = 'テーブルスペース名'
AND A.FILE_ID = B.FILE_ID
;
ALTER TABLESPACE テーブルスペース名 COALESCE
;※ COALESCE と REBUILD は同時に指定することは出来ません。
SELECT SUM(PINS) "Executions",
SUM(RELOADS) "Misses",
ROUND(100*(1-(SUM(RELOADS) / SUM(PINS))),3) "Hit Rate"
FROM V$LIBRARYCACHE
;
ヒット率が99%未満の場合、shared_pool_size を拡大する。
SELECT SUM(GETS) "Gets",
SUM(GETMISSES) "Misses",
ROUND(100*(1-(SUM(GETMISSES) / SUM(GETS))),3) "Hit Rate"
FROM V$ROWCACHE
WHERE GETS <> 0
;
ヒット率が90%未満の場合、shared_pool_size を拡大する。
SELECT (A.VALUE + B.VALUE) "Logical Read",
C.VALUE "Physical Read",
ROUND(((1-(C.VALUE / (A.VALUE + B.VALUE)))*100),3) "Buffer Hit Rate"
FROM V$SYSSTAT A,
V$SYSSTAT B,
V$SYSSTAT C
WHERE A.NAME = 'db block GETS'
AND B.NAME = 'consistent GETS'
AND C.NAME = 'physical reads'
;
ヒット率が90%未満の場合、db_block_buffers を拡大する。
注)Oracle9から db_block_buffer は使用されなくなり、動的パラメータとして db_cache_size になりました。
SELECT S.NAME,
S.BYTES "Free Bytes",
ROUND((S.BYTES / P.VALUE)*100,3) "Free %",
P.VALUE / (1024*1024) "Shared Poll MB"
FROM V$PARAMETER P,
V$SGASTAT S
WHERE S.NAME = 'free memory'
AND P.NAME = 'shared_pool_size'
;
メモリが無駄に割り当てられていないか、空き領域が30%を超える場合、shared_pool_size を小さくしてもよい。
SELECT A.VALUE MEM_SORT,
B.VALUE DISK_SORT,
A.VALUE * 100 / (A.VALUE+B.VALUE) MEM_SORT_RATE
FROM V$SYSSTAT A,
V$SYSSTAT B
WHERE A.NAME = 'sorts (memory)'
and B.NAME = 'sorts (disk)'
;
SELECT VALUE
FROM V$SYSSTAT
WHERE NAME = 'redo log space requests'
;
回数が多い、定期的に増える場合、log_buffer を拡大する。
SELECT R.NAME NAME,
S.GETS GETS,
S.WAITS WAITS,
(S.GETS - S.WAITS) * 100 / GETS HIT_RATE,
S.SHRINKS SHR,
S.EXTENDS EXDS,
S.EXTENTS EXTS,
S.HWMSIZE HWM
FROM V$ROLLSTAT S,
V$ROLLNAME R
WHERE S.USN = R.USN
;
SELECT * FROM V$WAITSTAT WHERE CLASS = 'undo header'
;インスタンス起動時からの SQL 文発行時までのロールバック・セグメントの競合を調べる事が出来る。
実行結果、COUNT、TIME 共に 0 より大きく、特に TIME の値が大きい場合には競合が発生している。
ロールバック・セグメントを増やす事を検討する。
COMMIT された回数の差分とロールバックされた回数の差分を取る事で採取する。
COMMIT(暗黙も含む)された回数
SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'user commits'
;ロールバックされた回数
SELECT VALUE FROM V$SYSSTAT WHERE NAME = 'user rollbacks'
;この2つの SQL 文を時間を置いて実行し、その差分がトランザクションの発生回数となる。
SELECT SUM(XACTS) FROM V$ROLLSTAT
;
SET RECSEP EACH
COLUMN SQLTYPE HEADING "Type" FORMAT a4
COLUMN LONG_TEXT HEADING "SQL Text" FORMAT a40
COLUMN FIRST_LOAD_TIME HEADING "FirstLoad Time" FORMAT a19
COLUMN EXECUTIONS HEADING "Exe |cute" FORMAT 999,999
COLUMN DISK_READS HEADING "Disk Read" FORMAT 99,999,990
COLUMN BUFFER_GETS HEADING "Buffer|Get" FORMAT 9,999,990
SELECT DECODE(COMMAND_TYPE, 2,'INS',
3,'SEL',
6,'UPD',
7,'DEL','?') SQLTYPE,
SUBSTR(SQL_TEXT,1,1024) LONG_TEXT,
FIRST_LOAD_TIME,
EXECUTIONS,
DISK_READS,
BUFFER_GETS
FROM V$SQLAREA
WHERE DISK_READS >
(SELECT AVG(DISK_READS)
FROM
(SELECT DISK_READS
FROM V$SQLAREA
WHERE DISK_READS >
(SELECT AVG(DISK_READS)
FROM V$SQLAREA)
)
)
ORDER BY DISK_READS DESC,
BUFFER_GETS
;
Windows 2000 Windows XP Windows Server 2003 8.1.6.1.0
8.1.7.X
9.0.1.X
9.2.0.X8.1.7.6.0
9.0.1.X
9.2.0.X9.2.0.3.0 以上
Microsoft .NET 8.1.7.7.0
9.0.1.4.0
9.2.0.1.0
Office 2000 Office XP 8.0.5.5 8.0.6.6.0
8.1.6.6.0
8.1.7.5.0
9.0.1.2.0
ODBC Driver Version 接続先DB Version
7.3.4 8.0.6 8.1.7 9.0.1 9.2.0 ODBC R8.0.6 ○ ○ ○ ○ × ODBC R8.1.7 ○ ○ ◎ ◎ ◎ ODBC R9.0.1 × ○ ◎ ◎ ◎ ODBC R9.2.0 × ○ ◎ ◎ ◎
Oracle Fail Safe(OFS)で共有ディスクに配置する必要があるファイル
下記の SQL にて表示されるファイルが該当するものです。
SELECT NAME FROM V$CONTROLFILE
UNION SELECT NAME FROM V$DATAFILE
UNION SELECT MEMBER FROM V$LOGFILE
UNION SELECT DESTINATION FROM V$ARCHIVE_DEST (最後の1行はArchivelog Modeの場合のみ)
;
Oracle Fail Safe(OFS) のフェイルバック
優先ノードとして設定されたノードが障害状態から復旧した場合に、該当のグループを非優先ノードから優先ノードに移動する動作の事。
OFS は、フェイルバックなどの動作に関して、Microsoft Cluster Server(MSCS) の機能を使用している。
フェイルバックは「優先ノードが障害状態から復旧した際に、優先ノードに戻る」動作の事を指す。これに当てはまらない場合は、フェイルバックは行われない。
手動でフェイルオーバーさせた場合や、Oracleの障害によってフェイルオーバーした場合は、ノードが異常な状態の為にフェイルオーバーしたわけではないので、そこからから復旧するという事もないので、フェイルバックは行われない。あくまで、ノードの異常によるフェイルオーバーした時のみに限られる。
Oracle Fail Safe(OFS) のVersion
Windows 2000 環境
OFSのVersion OracleのVersion 3.3.2 8.1.7 , 9.0.1 , 9.2.0(PSR 9.2.0.2以上) 3.2.1 8.1.7 , 9.0.1 3.1.2 , 3.1.1 8.1.6 , 8.1.7 3.0.4 8.1.6 Windows Server 2003 環境では OFS 3.3.2以降
RESIZEによってファイルサイズを縮小する場合は最後尾のFREE BLOCK分のみ縮小することが可能。
DATAFILE内に不連続なFREE BLOCKが存在している場合は、現在使用中のエクステントのサイズの合計までしか縮小することはできない。
1. データファイルのサイズ、ファイル ID を確認する。SELECT FILE#,
BYTES,
NAME
FROM V$DATAFILE
WHERE NAME LIKE '%test%'
;
FILE# BYTES NAME
---------- ---------- ------------------------------
19 10485760 /tmp/test.dbf2. FREE SPACE を確認する。
SELECT * FROM DBA_FREE_SPACE
WHERE TABLESPACE_NAME = 'TEST'
ORDER BY BLOCK_ID
;
TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
---------------- ------- -------- -------- ------ ------------
TEST 19 2 81920 10 19
TEST 19 22 81920 10 19
TEST 19 42 10149888 1239 19
**
<FREE SPACE の最後の開始位置(**)> -1> * DB_BLOCK_SIZE までの大きさとなる。
例の場合、(42-1) * 8 K = 328 K になる。(DB_BLOCK_SIZE を 8K とした場合。)3. RESIZE する。
ALTER DATABASE DATAFILE '/tmp/test.dbf' RESIZE 328 K;
※ RESIZE が DB_BLOCK_SIZE の倍数出ない場合は、値で RESIZE される。
テーブルを異なる表領域に移動する。
ALTER TABLE テーブルスペース名 MOVE TABLESPACE 表領域
;この場合、インデックス再作成が必要となります。インデックスの再作成の方法は「統計情報の取り方」を参照。
インデックスを異なる表領域に移動するには、インデックスの再作成時にテーブルスペース名をすれば可能。
SELECT TABLESPACE_NAME TABLESPACE,
TABLE_NAME TABLE_NAME,
NEXT_EXTENT NEXT
FROM USER_TABLES OUTER
WHERE NOT EXISTS
(SELECT 'X' FROM SYS.DBA_FREE_SPACE INNER
WHERE OUTER.TABLESPACE_NAME = INNER.TABLESPACE_NAME
AND BYTES >= NEXT_EXTENT)
;
または、COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
SELECT SEGMENT_NAME,
SEGMENT_TYPE,
COUNT(*)
FROM USER_EXTENTS
GROUP BY SEGMENT_TYPE,
SEGMENT_NAME
;
COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
SELECT SEGMENT_NAME,
SEGMENT_TYPE,
EXTENTS
FROM USER_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE','INDEX')
ORDER BY SEGMENT_TYPE,
SEGMENT_NAME
;
エクステントの詳細を調べるには
COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME"
FORMAT a30
COLUMN SEGMENT_TYPE HEADING "SEGMENT_TYPE"
FORMAT a12
COLUMN TABLESPACE_NAME HEADING "TABLESPACE_NAME" FORMAT a15
COLUMN BYTES HEADING
"BYTES(M)" FORMAT 999,990
SELECT SEGMENT_NAME,
SEGMENT_TYPE,
TABLESPACE_NAME,
EXTENT_ID,
BYTES /1024/1024 BYTES,
BLOCKS
FROM USER_EXTENTS
ORDER BY TABLESPACE_NAME,
SEGMENT_TYPE,
SEGMENT_NAME,
EXTENT_ID
;
COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
COLUMN OWNER HEADING "OWNER" FORMAT a10
COLUMN SEGMENT_TYPE HEADING "TYPE" FORMAT a5
COLUMN AREA_M HEADING "AREA_SIZE(K)" FORMAT 999,999,990
COLUMN USED_M HEADING "USED_SIZE(K)" FORMAT 999,999,990
SELECT DBAS.SEGMENT_NAME,
DBAS.OWNER,
DBAS.SEGMENT_TYPE,
TRUNC(DBAS.BYTES/1024,0) AREA_M,
TRUNC(DBAT.BLOCKS*PARA.VALUE/1024,0) USED_M
FROM DBA_SEGMENTS DBAS,
DBA_TABLES DBAT,
V$PARAMETER PARA
WHERE DBAS.TABLESPACE_NAME = 'テーブルスペース名'
AND DBAS.SEGMENT_NAME = DBAT.TABLE_NAME
AND PARA.NAME = 'db_block_size'
ORDER BY DBAS.SEGMENT_NAME,
DBAS.SEGMENT_TYPE
;
COLUMN SEGMENT_NAME HEADING "SEGMENT_NAME" FORMAT a30
COLUMN SEGMENT_TYPE HEADING "SEGMENT_TYPE" FORMAT a12
COLUMN TABLESPACE_NAME HEADING "TABLESPACE_NAME" FORMAT a15
COLUMN BYTES HEADING "BYTES(M)" FORMAT 999,990
COLUMN BLOCKS HEADING "BLOCKS" FORMAT 999,990
COLUMN EXTENTS HEADING "EXTENTS" FORMAT 999,990
COLUMN INITIAL_EXTENT HEADING "INITIAL(M)" FORMAT 999,990
COLUMN NEXT_EXTENT HEADING "NEXT(M)" FORMAT 999,990
COLUMN MAX_EXTENTS HEADING "MAX_EXTENTS" FORMAT 999,999,999,990
SELECT SEGMENT_NAME,
SEGMENT_TYPE,
TABLESPACE_NAME,
BYTES /1024/1024 BYTES,
BLOCKS,
EXTENTS,
INITIAL_EXTENT /1024/1024 INITIAL_EXTENT,
NEXT_EXTENT /1024/1024 NEXT_EXTENT,
MIN_EXTENTS,
MAX_EXTENTS MAX_EXTENTS,
PCT_INCREASE
FROM USER_SEGMENTS
WHERE SEGMENT_TYPE IN ('TABLE','INDEX')
ORDER BY SEGMENT_TYPE,
SEGMENT_NAME
;
これは、Oracle9.0.1.4.0以上、Oracle9.2以上とWindowsとで、SJISとUnicode間の変換を行う時の、Unicodeの対応が異なる為に発生します。Windows上のUnicodeに対応するように、Oracleには”JA16SJISTILDE”、”JA16EUCTILDE”があります。
oo4o(Oracle Objects for OLE)の場合、INSERTの場合は問題が発生しませんが、SELECTなどの時には問題が発生します。
クライアント側ではレジストリキー名 HKEY_LOCAL_MACHIN\SOFTWARE\ORACLE\HOMEx、値の名前 NLS_LANG の値を”JAPANESE_JAPAN.JA16SJISTILDE”などにすると解消されます。
その他のミドルウエアでは、クライアントを修正すると共に、データベースのCHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”にする必要があります。
データベース作成後にCHARACTER SETを変更するには、変換後のキャラクタ・セットがスーパーセットでなくてはなりませんが、CHARACTER SETを”JA16SJISTILDE”、”JA16EUCTILDE”はスーパーセットではないため、データベースの作成し直しが発生します。スーパーセットについてはマニュアルを参照してください。
結果として、Windows環境の場合、CHARACTER SETを”JA16SJISTILDE”、NLS_LANGはサーバもクライアントも”JAPANESE_JAPAN.JA16SJISTILDE”にしないと文字化けは防げないようです。
また、データベースのキャラクタ・セットとクライアントのキャラクタ・セットが同一の場合、文字コード変換は行われません。
CHARACTER SETの移行方法
- CHARACTER SETがJA16SJIS環境にてExportする。
- CHARACTER SETがJA16SJISTILDEのデータベースを作成する。
- 1.で作成したExportファイルをNLS_LANGをJA16SJISとしてImportする。
- Import完了後、NLS_LANGをJA16SJISTILDEとする。
NLS_LANGはWindowsの環境変数でも設定可能。
コマンドプロンプトから
set NLS_LANG=JAPANESE_JAPAN.JA16SJISTILDE
と入力する。
CHARACTER SET Oracle内部に格納する時に使用される文字コード体系。WindowsではJA16SJISかJA16SJISTILDEとなる。(OSに合わせる)
NLS_LANG データベースから取り出した文字データをどのような文字コードで変換するかを設定する。
データベースのキャラクタ・セットを確認するには、
- ディクショナリ・ビューNLS_DATABASE_PARAMETERSを確認する。
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';- 動的パフォーマンス・ビューV$NLS_PARAMETERSを確認する。
最大同時接続数は、V$LICENSE ビュー の SESSIONS_HIGHWATER 列 にて確認することができます。
SELECT sessions_highwater FROM v$license;
この列にて確認できるのは、インスタンス起動時から現時点までの期間における最大同時接続数です。
前回起動時以前のデータについても確認する場合は、データベースshutdown時にalertログに記録されている"License high water mark" の値がその起動〜停止の期間に発生した最大同時接続数となります。
MTS接続でアクセスを行なう際にクライアント側にORA-3113が発生する場合があります。
その際、初期化パラメータbackground_dump_dest配下にディスパッチャのトレースが以下のように出力されます。
【ディスパッチャのトレース】
*** 2004-07-15 15:30:07.000
error 18 creating virtual circuit
SESSIONSに設定された数よりも多くバーチャル・サーキットが作成されたことが原因です。
バーチャル・サーキットはMTSで接続された場合にカウントされる。また、別のデータベースに対してMTS接続でDBLINK経由のアクセスを行なうとセッション数が増加せずにバーチャル・サーキット数だけが増加します。
セッション数よりもバーチャル・サーキット数が先にSESSIONSよりも大きくなる場合に発生する。
バーチャル・サーキットは、マルチスレッド・サーバー(MTS)構成時に使用されます。
MTS構成の場合、ユーザーからの処理要求は、ディスパッチャ・プロセスを通して、共有サーバー・プロセスに伝えられ、共有サーバー・プロセスが処理を行い、ディスパッチャ・プロセスに応答を返す。この際に共有プール上に存在するバーチャル・サーキットを通じて、ディスパッチャ・プロセスと共有サーバー・プロセスの処理要求のやり取りが行われます。バーチャル・サーキットは、基本的にデータベースへの接続の時に作成され、切断時に解放されます。
select status , count(*) from v$circuit group by status;
STATUS COUNT(*)
---------------- ----------
NORMAL 98 <-- データベースへの接続分
OUTBOUND 0 <-- DBLINKを利用したMTS接続でのアクセス分
初期化パラメータSESSIONSの値を大きく設定して回避します。