このブログを検索

2011年3月3日木曜日

データベースファイルのサイズを縮小する

NOMOUNT状態で作業します。
ただし、ASMはOPEN状態でできます。
縮小できるのは連続領域のみで、最後のBLOCK_ID以降が縮小可能領域です。
まずはデータファイル名を調べます。
$ sqlplus sys as sysdba
SQL> set pages 10000
set lines 120
col tablespace_name for a20
col file_name for a50
col bytes for 999,999,999,999
select tablespace_name,file_name,bytes,status from DBA_DATA_FILES
where tablespace_name='SSS01_I_DATA'
order by tablespace_name,file_name;

TABLESPACE_NAME  FILE_NAME                            BYTES          STATUS
---------------- ------------------------------------ -------------- ---------
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_01.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_02.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_03.DBF    2,147,483,648 AVAILABLE
SSS01_I_DATA     /DATA/DATABASE/SSS01_I_DATA_04.DBF    2,147,483,648 AVAILABLE
データファイルの最終ブロックを検索します。
col TABLESPACE_NAME for a20
select * from dba_free_space where tablespace_name = 'SSS01_I_DATA'
order by file_id,block_id;

TABLESPACE_NAME         FILE_ID   BLOCK_ID      BYTES     BLOCKS RELATIVE_FNO
-------------------- ---------- ---------- ---------- ---------- ------------
SSS01_I_DATA                  4          9    8388608       1024            4
SSS01_I_DATA                  4      24201    1048576        128            4
SSS01_I_DATA                  4      25353 1938817024     236672            4
SSS01_I_DATA                  5       3465 2118123520     258560            5
SSS01_I_DATA                  6       1929   65011712       7936            6
SSS01_I_DATA                  6      33801 1869611008     228224            6 
SSS01_I_DATA                  7        137    1048576        128            7
SSS01_I_DATA                  7       1417 2134900736     260608            7
これは、BLOCK_IDから始まる空き連続領域を意味します。
FILE_ID = 4のデータファイルを例にとると、25353 - 1 = 25352ブロックまでは最低限必要なデータファイルのサイズです。
この例では1ブロック = 4KBの環境なので、25353 x 4KB = 約100MBまで縮小ができます。
縮小手順は次の通り。
alter database datafile '/DATA/DATABASE/SSS01_I_DATA_01.DBF' resize 100M

追記:2011/04/28
ASMでなくても、nomountではなくOPEN状態で実行できました。
10gとかからそうなったんでしょうか・・・。

0 件のコメント:

コメントを投稿