web-dev-qa-db-ja.com

割り当てられた名前空間からディスク領域を解放するにはどうすればよいですか? / ORA-03297

ディスク領域が不足しています。

サーバーには420 GBのHDDがあり、Microsoft SQL ServerとOracle Server(10g)を実行します。

Oracleサーバーは、最大315 GBのスペースを使用します。 100GBのMicrosoft SQL Serverデータベースをロードしました。これで約5GBの空きがあり、SQL Serverデータベースのバックアップを作成する必要があります。

最初にバックアップを別のドライブに移動しようとしましたが、これは機能しませんでした。

次に、Oracle Serverの割り当てられたスペースのサイズを変更しようとしました。これは、各ファイルで約4GBが使用される20GBの6つのファイルで構成されています。このファイルのサイズを10GBに変更しようとすると、OracleエラーORA-03297が発生しましたが、4GBが使用されています。何度か試した後、一部のファイルを16/17/18GBに短縮できましたが、それでもまだスペースが必要です。

Oracleファイルのサイズをそれぞれ10 GBに変更できるソリューションはありますか?

Coalesceを使用して未使用の領域の割り当てを解除しましたが、それも機能しませんでした。

3
domiSchenk

テーブルのHWM(ハイウォータマーク)がデータファイルを圧縮しようとしたサイズを超えているため、Oracle ORA-03297エラーが表示されます。

最初に、影響を受ける各テーブルの「スペースを縮小」してみてください。

alter table fragmentedtable enable row movement;

alter table fragmentedtable shrink space;

次に、現在のデータベースオブジェクトを移動せずに、既存の各テーブルスペースファイルからどれだけのスペースを解放できるかを確認します。

次の( Ask Tom &ブロックサイズを8kと想定)から取得すると、メガバイト単位で、各データファイルから現在解放できるスペースの量がわかります。

select file_name,
       ceil( (nvl(hwm,1)*8192)/1024/1024 ) SHRINK_TO,
       ceil( blocks*8192/1024/1024) CURRENT_SIZE,
       ceil( blocks*8192/1024/1024) -
       ceil( (nvl(hwm,1)*8192)/1024/1024 ) SAVINGS
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(+)

例えば:

FILE_NAME                                           SHRINK_TO CURRENT_SIZE    SAVINGS
-------------------------------------------------- ---------- ------------ ----------
/u01/app/Oracle/oradata/PHIL112/system01.dbf              696          700          4
/u01/app/Oracle/oradata/PHIL112/sysaux01.dbf              579          610         31
/u01/app/Oracle/oradata/PHIL112/users01.dbf                85           93          8
/u01/app/Oracle/oradata/PHIL112/undotbs01.dbf              65          120         55

SQL>

サイズを変更するには、以下を使用します。

alter database datafile '/path/to/data/file.dbf' resize 100m; 

次に使用できるオプションは、新しいテーブルスペース(および関連するデータファイル)を作成し、現在のデータベースオブジェクトを新しいテーブルスペースに移動することです。これは、datapumpを使用するか、手動で実行できます。 Tim Hallがこれを実行する方法についての優れた記事 here を公開しています。

6
Philᵀᴹ