web-dev-qa-db-ja.com

Oracleによる空きテーブルスペース領域の縮小/再利用

サイズが90GBのOracle 12cテーブルスペースがあります。ほぼ40GBは無料です。

TB1 54 %    90880   41383   49497   46  98304   50 %    ONLINE  PERMANENT

テーブルスペースには3つのデータファイルがあります。

E:\Oracle\ORADATA\xx\TB1.DBF    33554416    True    100 
F:\Oracle\ORADATA\xx\TB1_2.DBF  33554416    True    100 
G:\Oracle\ORADATA\xx\TB1_3.DBF  25344000    True    100

テーブルスペースを縮小して、空き40GB(ディスク上のデータファイル)を再利用するにはどうすればよいですか?ダウンタイムがありません。

7
r0tt

EdStevensのコメントに同意しますが、他にもいくつかのアイデアがあります。

AskTom Webサイト には、既存のデータファイルをどれだけ縮小できるかを正確にリストするスクリプトがあります。

それでも大きな節約が得られない場合は、そのテーブルスペースで最大のインデックスを見つけて再構築できます。これは一時的な解決策であり、インデックスは最終的に再び大きくなりますが、予算が今より多くのディスク領域を許可しない場合は、次のクエリを試してください。

select segment_name, sum(bytes)/1024/1024 as mb 
from dba_segments 
where tablespace_name='TB1' and segment_type like 'INDEX%'
group by segment_name
order by mb;

次に、ind_big_stuffという名前のインデックスが巨大である場合、

alter index ind_big_stuff rebuild;

また、アプリケーションが商用アプリケーションの場合、行がゼロのテーブルがいくつかある場合があります。または、パーティション化されたテーブルがある場合、行がゼロのパーティションがいくつかある可能性があります。それらに割り当てられたスペースをドロップすることができます

exec dbms_space_admin.drop_empty_segments(schema_name=>'HR');

パーティションテーブルや、行がないことがわかっているテーブルなどに対して、alter tableステートメントでsegment creation deferred句を使用できます。

6
Mark Stewart

このOracleのメンテナンスの問題に対処する方法は5つあると思います。

  • オンライン再編成-Oracleオンライン表再編成パッケージ(dbms_redefinition)を使用して、更新を受け入れながら表を再編成します。インデックスと制約の定義を保持します。 (Enterprise Editonのみ)。ダウンタイムはありません。
  • 表の縮小スペースの変更-表の縮小スペースの圧縮コマンドを使用すると、行が再パックされ、HWMを下に移動して、未使用のエクステントが解放されます。圧縮はデータを圧縮するだけです。ブロックがデータファイルの前に配置されることは保証されていないため、データファイルの最後にブロックを置くことができます。つまり、データファイルのサイズを小さくすることはできません。インデックスと制約の定義を保持します。ダウンタイムはありません。
  • データポンプ(expdp、impdp)–データを転送してテーブルを再編成するオフラインの方法。インデックスと制約の定義を保持します。ダウンタイムが必要です。
  • 表の移動の変更-表の移動の変更コマンドは、行を使用されていないスペースに移動し、HWMを調整しますが、セグメントの範囲は調整せず、表のサイズは変わりません。また、alter table move構文は、インデックスおよび制約定義を保持します。データファイルのサイズ変更が必要です。ダウンタイムが必要です。
  • 選択としてテーブルを作成(CTAS)-テーブルの行をクリーンエリアにコピーし、最高水位標を下げ、行を密にパックし(PCTFREEで指定)、空き領域を解放します。データファイルのサイズ変更が必要です。ダウンタイムが必要です。
2
r0tt

私はこれに対する答えを検索し、最終的にそれを見つけました:

  • (オプション)未使用の(ドロップされた)テーブルをテーブルスペースから削除します:PURGE TABLESPACE table_space_name;
  • テーブルスペースをクリーンアップ:ALTER TABLESPACE table_space_name COALESCE;
  • 最後に、データファイルのサイズを変更します:ALTER DATABASE DATAFILE '/u02/Oracle/rbdb1/file1.dbf' RESIZE 100M;

PS:ダウンタイムについては不明です。誰か確認してください。

PPS:TEMPテーブルスペースの場合:

  • ALTER TABLESPACE TEMP SHRINK SPACE ;(オプションでKEEP 512Mまたは同様のものを追加)
  • データ/一時ファイルのサイズを変更します:ALTER DATABASE TEMPFILE '/u02/Oracle/rbdb1/temp01.dbf' RESIZE 512M;
1
David Balažic

以下のスクリプトを実行すると、それぞれのテーブルスペースのデータファイルから未使用のスペースが解放されます。

column value new_val blksize
select value from v$parameter where name = 'db_block_size'
/

set pages 0
set lines 300
column cmd format a300 Word_wrapped

select 'alter database datafile '''||file_name||''' resize ' ||
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 )  || 'm;' cmd
from dba_data_files a, 
     ( select file_id, max(block_id+blocks-1) hwm
         from dba_extents
        group by file_id ) b
where a.file_id = b.file_id(+) 
  and ceil( blocks*&&blksize/1024/1024) -
      ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) > 0
/

https://orahow.com/reclaiming-unused-space-in-datafiles/ で詳細を確認してください

0
Santosh Tiwary