トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Oracle 表領域の縮小

概要

  • 表領域を縮小したい。
  • 通常はエクスポート・インポートする。
  • パーティション表の場合は...
    • インポート前にパーティション表を作成する??
  • Oracle Enterprise Manager では測定値のテーブル MGMT_METRICS_* がパーティション表
  • OEM がデータが肥大してしまう。パッチを当てた。データファイルは増えなくなった。
  • パーティション数が異常に多い。
  • SYSMAN.MGMT_METRICS_RAW: 11839
  • 今回はエキスポート・インポートできない。

手順

  • 最終に近いエクステントに含まれるデータを別領域に移動
  • 表領域を縮小
  • 別領域に移動したデータを元の表領域に戻す

作業

移動するオブジェクトを把握

  • 最終エクステントに近いテーブル・インデックス・パーティションを把握
  • 今回は最終1000ブロック
select e.owner, e.segment_name, e.partition_name, 
e.segment_type, e.block_id, e.blocks
from dba_extents e
inner join dba_data_files f
  on e.file_id = f.file_id
where file_name = '/opt/oracle/oradata/emrep/emrep.dbf'
and e.block_id > (
  select max( e.block_id) -1000
  from dba_extents e, dba_data_files f
  where e.file_id = f.file_id
    and file_name = '/opt/oracle/oradata/emrep/emrep.dbf'
)
order by e.block_id desc
;

データの移動

  • テーブルの場合
alter table sysman.mgmt_task_qtable move tablespace MGMT_TABLESPACE2;
  • インデックスの場合
alter index sysman.MGMT_ECM_GEN_SNAP_IDX3 rebuild tablespace mgmt_tablespace2;
  • パーティション化されたテーブルの場合
alter table sysman.mgmt_metrics_raw move partition "2009-09-06 07:00" tablespace mgmt_tablespace2;

サイズの把握

select max( e.block_id)
from dba_extents e, dba_data_files f
where e.file_id = f.file_id
and file_name = '/opt/oracle/oradata/emrep/emrep.dbf'
  • 543809
  • 543809*8192/1024/1024=4248.507
  • 切り上げて 4249M

データファイルの縮小

alter database datafile '/opt/oracle/oradata/emrep/emrep.dbf' resize 4249M
  • 縮小できた