web-dev-qa-db-ja.com

データベースの断片化を排除(テーブルのエクスポート、ドロップ、再インポート)

非常に断片化された1つのデータファイルがあります。現在のサイズは10GBで、使用される実際のサイズは2.5GBなので、7.5は無料です。

データをエクスポートし、そのデータファイルをドロップし、再作成してインポートすることにしました。

何を言ったらいいですか?一部のオブジェクトを失う可能性はありますか?データファイルを削除した後?

テーブルスペースが1つあり、データファイルが1つあります。スクリプトのエクスポートに関する提案を教えてください。

オプションがあります:

TABLESPACES          list of tablespaces to export

そのようなスクリプトを書くと

exp username/aaa file=a.dmp tablespaces=my_tb_name log=a.log grants=y indexes=y constraints=y triggers=y

そのテーブルスペースからすべてをインポートし、それを含むオブジェクトに関連するすべてのものをインポートするだけで十分ですか(つまり、付与、制約、トリガー...)

また、エクスポートを実行するには、クライアントではなくデータベースサーバー上にある必要がありますか?

賢い提案を待って、本当にありがとう

2
kupa

エクスポート/インポートの代わりに、使用する必要があります

alter table t shrink space;

これははるかに危険が少なく、再編成中にもテーブルにアクセスできるようにします。圧縮後、以下のスクリプト(元はTom Kyte)を使用して、データファイルのサイズを変更(小さくする)できるサイズを確認できます。

set verify off
column file_name format a50 Word_wrapped
column smallest format 999,990 heading "Smallest|Size|Poss."
column currsize format 999,990 heading "Current|Size"
column savings  format 999,990 heading "Poss.|Savings"
break on report
compute sum of savings on report

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

select file_name,
       ceil( (nvl(hwm,1)*&&blksize)/1024/1024 ) smallest,
       ceil( blocks*&&blksize/1024/1024) currsize,
       ceil( blocks*&&blksize/1024/1024) -
       ceil( (nvl(hwm,1)*&&blksize)/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(+)
/

column cmd format a75 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
/
9
Uwe Hesse