私に相談してください - データベース (Oracle) の空き/使用済みテーブルスペースに関するレポートを取得する最良の方法は何ですか - (テーブルスペース名、空き MB、使用 MB)
オラクルには、私が望むレポートを提供するユーティリティがありますか?または、そうでない場合は、他の方法について相談/アドバイスしてください。
よろしく!
SQL*Plus で次のコードをsysdba
ユーザー (またはDBA
役割 またはを持つユーザー) として実行しますSELECT ANY DICTIONARY
。SQL ファイル (例: fs.sql
) として保存し、次のコマンドで実行することをお勧めします。@fs
サイズ、空き Mb %free など、各テーブルスペースの有用なものをレポートします。
COLUMN ts_name FORMAT A25 HEADING "Tablespace"
COLUMN ts_size FORMAT 999,999.9 HEADING "Size mb"
COLUMN ts_free FORMAT 999,999.9 HEADING "Free Mb"
COLUMN pct_free FORMAT 999.99 HEADING "% free"
COLUMN max_size FORMAT 999,999.9 HEADING "Max Mb"
COLUMN frags FORMAT 99,999 HEADING "Frags"
COLUMN largest FORMAT 9,999.99 HEADING "Largest"
COLUMN smallest FORMAT 9,999.99 HEADING "Smallest"
COLUMN average FORMAT 9,999.99 HEADING "Average"
COLUMN dfiles FORMAT 999 HEADING "DFs"
COLUMN ts_type FORMAT A4 HEADING "Type"
COLUMN ex FORMAT A2 HEADING "Ex"
COLUMN status FORMAT A7 HEADING "Status"
COLUMN big FORMAT A3 HEADING "Big"
SET PAGESIZE 9999
SET NULL 0
SELECT SUBSTR(t.tablespace_name, 1, 25) AS ts_name,
ts.ts_size,
CASE WHEN(t.contents = 'TEMPORARY') THEN
ts.ts_size - NVL(te.free_space, 0)
ELSE
NVL(te.free_space, 0)
END AS ts_free,
CASE WHEN(t.contents = 'TEMPORARY') THEN
100-(100*NVL(te.free_space, 0)/ts_size)
ELSE
100*NVL(te.free_space, 0)/ts_size
END AS pct_free,
ts.max_size,
NVL(te.fragments, 0) AS frags,
NVL(te.largest, 0) AS largest,
NVL(te.smallest, 0) AS smallest,
NVL(te.average, 0) AS average,
ts.dfiles,
SUBSTR(t.contents, 1, 4) AS ts_type,
SUBSTR(t.extent_management,1 ,1) AS ex,
t.status,
DECODE(t.bigfile, 'NO', 'No', 'Yes') AS big
FROM
dba_tablespaces t
LEFT
JOIN (SELECT tablespace_name,
SUM(bytes)/1024/1024 AS ts_size,
COUNT(bytes) AS dfiles,
SUM(DECODE(maxbytes, 0, bytes, maxbytes))/1024/1024 AS max_size
FROM
dba_data_files
GROUP
BY tablespace_name
UNION
SELECT tablespace_name,
SUM(bytes)/1024/1024 AS ts_size,
COUNT(bytes) AS dfiles,
SUM(DECODE(maxbytes, 0, bytes, maxbytes))/1024/1024 AS max_size
FROM
dba_temp_files
GROUP
BY tablespace_name
) ts ON t.tablespace_name = ts.tablespace_name
LEFT
JOIN (SELECT tablespace_name,
MAX(bytes)/1024/1024 AS largest,
MIN(bytes)/1024/1024 AS smallest,
COUNT(bytes) AS fragments,
SUM(bytes)/1024/1024 AS free_space,
ROUND(AVG(bytes))/1024/1024 AS average
FROM
dba_free_space
GROUP
BY tablespace_name
UNION
SELECT tu.tablespace,
0 AS largest,
0 AS smallest,
0 AS fragments,
SUM(tu.blocks * ts.block_size)/1048576 AS free_space,
0 AS average
FROM
v$tempseg_usage tu
LEFT
JOIN dba_tablespaces ts ON tu.tablespace = ts.tablespace_name
GROUP
BY tu.tablespace
) te ON t.tablespace_name = te.tablespace_name
ORDER
BY t.tablespace_name
/
10g と 11g の両方で機能します。