Oracle 11g
を実行し、table (tbl1)
をあるtablespace (tblspc1)
から別の(tblspc2)
に移動する必要があります。それを行う最も簡単な方法は何ですか?
これを試して:-
ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
IVAN からのとてもいい提案がコメントに追加されたので、私の答えに追加することを考えました
注:これにより、すべてのテーブルのインデックスが無効になります。したがって、このコマンドの後には通常
alter index <owner>."<index_name>" rebuild;
sql
のsql
を使用します。
これの出力をファイルにスプールします:
select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
スプールファイルには次のようなものがあります。
alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
テーブルの移動:
ファーストラン:
SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';
-またはコメントで提案された(自分でテストしなかった)
SELECT 'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE '||' TABLESPACE_NAME>; '
FROM dba_tables
WHERE OWNER = '<SCHEMA>'
AND TABLESPACE_NAME <> '<TABLESPACE_NAME>
ここで、<schema_name>
はユーザーの名前です。そして、<tablespace_name>
は宛先テーブルスペースです。
その結果、次のような行が表示されます。
ALTER TABLE SCOT.PARTS MOVE TABLESPACE USERS;
結果をスクリプトまたはアプリケーションのようなOracle SQL開発者に貼り付けて実行します。
インデックスの移動:
ファーストラン:
SELECT 'ALTER INDEX <schema_name>.'||INDEX_NAME||' REBUILD TABLESPACE <tablespace_name>;'
FROM ALL_INDEXES
WHERE OWNER = '<schema_name>'
AND TABLESPACE_NAME NOT LIKE '<tablespace_name>';
このコードの最後の行は、すでに正しいテーブルスペースにあるインデックスを除外するため、時間を大幅に節約できます。
その結果、次のようになります。
ALTER INDEX SCOT.PARTS_NO_PK REBUILD TABLESPACE USERS;
結果をスクリプトまたはアプリケーションのようなOracle SQL開発者に貼り付けて実行します。
最後になりましたが、LOBの移動:
ファーストラン:
SELECT 'ALTER TABLE <schema_name>.'||LOWER(TABLE_NAME)||' MOVE LOB('||LOWER(COLUMN_NAME)||') STORE AS (TABLESPACE <table_space>);'
FROM DBA_TAB_COLS
WHERE OWNER = '<schema_name>' AND DATA_TYPE like '%LOB%';
これにより、LOBオブジェクトが他のテーブルスペースに移動します。
その結果、次のようになります。
ALTER TABLE SCOT.bin $ 6t926o3phqjgqkjabaetqg == $ 0 MOVE LOB(calendar)STORE AS(TABLESPACE USERS);
結果をスクリプトまたはアプリケーションのようなOracle SQL開発者に貼り付けて実行します。
Oそしてもう一つあります:
何らかの理由で、「ドメイン」タイプのインデックスを移動できませんでした。回避策として、インデックスを削除しました。ユーザーのデフォルトの表領域を望ましい表領域に変更しました。その後、インデックスを再作成します。おそらくより良い方法がありますが、私にとってはうまくいきました。
これを試して、テーブル(tbl1)をテーブルスペース(tblspc2)に移動します。
alter table tb11 move tablespace tblspc2;