実際にディスク領域を解放するOracle9iDBMSからデータを通常どのように削除するかを知りたいです。過去のシナリオでは、100万行のデータをクリアしても、ディスク領域の使用量が減少しない場合がありました。
シナリオ:
sqlplus > delete from audit_log where date_created between today and the day before;
sqlplus > 2 million records deleted.
bash$: du -sh (after issuing the delete above)
ディスクスペースの使用量に変更はありません。
これはまた私に質問をもたらします、Oracleが削除DMLによって削除されたと思われるすべてのデータを完全に削除するためにもうテーブルをフラッシュする必要がありますか?
Oracleでは、テーブルから行を削除しても、ディスク領域は自動的に解放されません。ディスクスペースを解放することは可能ですが、これを実現するには、テーブルがデータファイルに物理的にどのように配置されているかを確認する必要があります。データファイルの最後に空のブロックがあるとすぐに、データファイルのサイズを小さくすることができます。この(成功した)操作の後でのみ、実際のディスク容量を取り戻すことができます。データファイルに空のブロックがたくさんあるが、最後にはない場合は、データファイルが属するテーブルスペースからテーブルを新しいテーブルスペースに移動し、古いテーブルスペースを削除するのが最も簡単な場合があります。これはSYSTEM表領域では機能しません。SYSオブジェクトを他の表領域に移動することは許可されていません。
データファイルの最後に配置されたためにスペースの解放をブロックしたテーブルを1つだけ(小さな)移動できると、幸運な場合があります。その場合、単純なalter table thesmalltable move;
はそのテーブルを再配置し、データファイルの最後に再利用可能なスペースを作成します。その後、 alter database datafile '/your/df/name.dbf' resize the_new_size;
ディスクスペースを解放します。
テーブルは論理的にテーブルスペースに配置されます。表領域は、最小限の1つのデータファイル、多くの場合、複数のデータファイルで構成されます。
他の回答を完了するには、診断ログのパージを使用すると、かなりのディスク領域(最大数GB)を解放できます。
基本的に、adrci
Oracleコマンドラインユーティリティを実行してから、次の手順を実行します。
adrci> set homepath diag/rdbms/yourinstance/yourinstance
adrci> purge -age 10080
上記の例では、1週間より古い診断トレースが削除されます。
同様に、ローカル管理テーブルスペース(LMT)またはディレクトリ管理テーブルスペース(DMT)があるかどうかを確認します。前者は断片化をより適切に処理することになっています(ただし、完璧にはほど遠いです)。チェック: http://www.orafaq.com/node/
_EPADMRT > @resizea
CURRENT_MEG SAVINGS ID TABLESPACE_NAME RESIZE_COMMAND
----------- ---------- ----- --------------- ---------------------------------------------------------------------------------------
30000 -1 3 UNDO_TS alter database datafile '/var/oradata03/PADMRT/PADMRT_UNDO_01.dbf' resize 30001m;
30000 -1 19 UNDO_TS alter database datafile '/var/oradata04/PADMRT/PADMRT_UNDO_02.dbf' resize 30001m;
20000 -1 11 OPLA_DATA alter database datafile '/var/oradata01/PADMRT/OPLA_DATA01.dbf' resize 20001m;
15360 -1 8 AGILEODM_INDX alter database datafile '/var/oradata01/PADMRT/AGILEODM_INDX_DATA02.dbf' resize 15361m;
20480 -1 13 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA04.dbf' resize 20481m;
5120 -1 7 AGILEODM_INDX alter database datafile '/var/oradata01/PADMRT/AGILEODM_INDX_DATA01.dbf' resize 5121m;
20480 -1 14 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA05.dbf' resize 20481m;
32767.1875 -.8125 6 AGILEODM alter database datafile '/var/oradata01/PADMRT/AGILEODM_DATA01.dbf' resize 32768m;
13236 0 5 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA01.dbf' resize 13236m;
22784 6 9 AGILEODI alter database datafile '/var/oradata02/PADMRT/AGILEODI_DATA02.dbf' resize 22778m;
32767 30 10 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA02.dbf' resize 32737m;
10240 42 20 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA03.dbf' resize 10198m;
3000 51 16 VQA_DATA alter database datafile '/var/oradata03/PADMRT/VQA_DATA02.dbf' resize 2949m;
3000 72 15 VQA_DATA alter database datafile '/var/oradata01/PADMRT/VQA_DATA01.dbf' resize 2928m;
3000 79 18 VQA_DATA alter database datafile '/var/oradata04/PADMRT/VQA_DATA04.dbf' resize 2921m;
1335 151 4 USERS alter database datafile '/var/oradata01/PADMRT/users01.dbf' resize 1184m;
10240 202 21 AGILEODI alter database datafile '/var/oradata01/PADMRT/AGILEODI_DATA04.dbf' resize 10038m;
6144 938 2 SYSAUX alter database datafile '/var/oradata02/PADMRT/PLMDM_SYSAUX_DATA1_01.dbf' resize 5206m;
4096 1058 1 SYSTEM alter database datafile '/var/oradata02/PADMRT/PLMDM_SYS_DATA1_01.dbf' resize 3038m;
32767 1391 22 OPLA_DATA alter database datafile '/var/oradata01/PADMRT/OPLA_DATA02.dbf' resize 31376m;
10000 7053 17 VQA_DATA alter database datafile '/var/oradata03/PADMRT/VQA_DATA03.dbf' resize 2947m;
32767 7492 12 AGILEODM alter database datafile '/var/oradata02/PADMRT/AGILEODM_DATA03.dbf' resize 25275m;
32767 8749 23 AGILEODM alter database datafile '/var/oradata03/PADMRT/AGILEODM_DATA06.dbf' resize 24018m;
_
完全なresizea.sqlは次のとおりです。
set termout off drop table alan99; set pages 50 set wrap off col resize_command for a180 col id for 9999 create table alan99 as select max(block_id+blocks) block_id,file_id from dba_extents group by file_id; column tablespace_name format a15 column pct format 999.99 set wrap off set lines 320 set trunc off column file_id format 999 set termout on select b.bytes/1024/1024 CURRENT_meg,b.bytes/1024/1024-trunc(c.block_id*8192/1024/1024+1) savings, b.file_id id,b.tablespace_Name,'alter database datafile '''||b.file_name||''' resize ' ||trunc(c.block_id*8192/1024/1024+1)||'m;' resize_command from dba_data_files b, alan99 c where b.file_id=c.file_id order by 2; set termout off drop table alan99; set termout on
次のコマンドを試して、スペースを取り戻してください。
DUMP TRAN <database name> WITH NO_LOG
ハードディスクの空き容量を取り戻す最善の方法は、使用されなくなった他のファイルをハードディスクから削除することだと思います。
データベースからデータを削除する通常の方法は、deleteコマンドを実行することですが、必ずしもディスク領域を解放するとは限りません。