Oracle 10G でデータファイルを圧縮するにはどうすればよいですか?
5 に答える
警告: 私は、個人的なインストールを除き、Oracle システム管理者ではありません。私が言うことはすべて大雑把に受け止めてください。
自動拡張を使用してデータファイルを作成し、含まれるべきと思われる範囲を超えて拡張されたと仮定しています。ファイルのサイズを変更する ALTER DATABASE の句があります。Oracle SQL リファレンスの例を次に示します。
ALTER DATABASE
DATAFILE 'diskb:tbs_f5.dat' RESIZE 10 M;
ただし、これをやみくもにやりたいとは思いません.IMOのより良いアプローチは、エクスポートコマンドを使用してそのデータファイルにあるテーブルをダンプしてから、テーブルスペースを再作成することです.
Tom Kyte の厚意により、データベースのブロック サイズを取得し、再利用できるスペースの量をリストし、alter... コマンドを作成して実際にデータベースの縮小を実行する方法を次に示します。お役に立てれば、
http://cglendenningoracle.blogspot.com/2009/08/how-do-i-shrink-datafiles-to-reclaim.html
クレイグ・グレンデニング
エクスポートとインポートに関する@Daveの回答は正しく、スペースを解放するための最良の選択です。また、Oracleには縮小コマンドはありません。@Daveは正しいですが、@ Davidが「データファイルは最後に使用されたブロックまでサイズを変更できます」と言ったようにサイズ変更コマンドが存在しますが、言及すべきことが1つあります。そのように割り当てられた
0101000001111000000000000000000001110000000000
|---------
ここで: 0 - 空きブロック 1 - 使用済みブロック
最後に使用されたブロックまでデータファイルのサイズを変更すると、次のようになります。
010100000111100000000000000000000111
|---------
しかし、データファイル内の他の空きブロックはどうですか?? 他のデータファイルまたはシステム自体では使用できません。
データファイルがそのようなものだった場合:
1111111111111100000000000000000
サイズ変更は便利ですが、以前のバリアントではありません。
とにかく、データファイルのサイズを変更できるサイズを特定するために、スクリプトは次のとおりです。
select 'alter database '||a.name||' datafile '''||b.file_name||'''' ||
' resize '||greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free))||chr(10)||
'--tablespace was '||trunc(bytes_full*100/bytes_total)||
'% full now '||
trunc(bytes_full*100/greatest(trunc(bytes_full/.7)
,(bytes_total-bytes_free)))||'%'
from v$database a
,dba_data_files b
,(Select tablespace_name,sum(bytes) bytes_full
From dba_extents
Group by tablespace_name) c
,(Select tablespace_name,sum(bytes) bytes_total
From dba_data_files
Group by tablespace_name) d
,(Select a.tablespace_name,a.file_id,b.bytes bytes_free
From (select tablespace_name,file_id
,max(block_id) max_data_block_id
from dba_extents
group by tablespace_name,file_id) a
,dba_free_space b
where a.tablespace_name = b.tablespace_name
and a.file_id = b.file_id
and b.block_id > a.max_data_block_id) e
Where b.tablespace_name = c.tablespace_name
And b.tablespace_name = d.tablespace_name
And bytes_full/bytes_total < .7
And b.tablespace_name = e.tablespace_name
And b.file_id = e.file_id
このスクリプトは、使用済みブロックをデータファイルから切り取らないので心配しないでください。
ALTER TABLESPACE....RESIZE は、HWM を超えてのみ許可されます。そのため、その下に未使用のセグメントが多数ある可能性があります。この操作の前に、次を発行します。
データファイルの内容を再編成するために、そのテーブルスペース/データファイルの一部のテーブルで ALTER TABLE .. .SHRINK SPACE を実行します。
長い作業になるかもしれませんが、SQL を使用してコマンドを生成できます。
Oracle の標準データファイルの場合、それらを圧縮することはできません。あなたは次のようなことをしなければならないでしょう:
- セグメントを別の表領域に移動するか、エクスポートして削除します
- データファイルをドロップ
- 新しい小さいデータファイルを作成する
- セグメントを最初のテーブルに戻すか、ダンプ ファイルからインポートします。
「bigfile」テーブルスペースの場合 - CREATE BIGFILE TABLESPACE を使用して作成したことを意味します - ALTER TABLESPACE .. RESIZE ... を使用できます。