web-dev-qa-db-ja.com

Oracle 11gでテーブルをあるテーブルスペースから別のテーブルスペースに移動する方法

Oracle 11gを実行し、table (tbl1)をあるtablespace (tblspc1)から別の(tblspc2)に移動する必要があります。それを行う最も簡単な方法は何ですか?

28
user2698625

これを試して:-

ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>

IVAN からのとてもいい提案がコメントに追加されたので、私の答えに追加することを考えました

:これにより、すべてのテーブルのインデックスが無効になります。したがって、このコマンドの後には通常

alter index <owner>."<index_name>" rebuild;
52
Rahul Tripathi

sqlsqlを使用します。

これの出力をファイルにスプールします:

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;
11
user3025076

テーブルの移動:

ファーストラン:

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そしてもう一つあります:

何らかの理由で、「ドメイン」タイプのインデックスを移動できませんでした。回避策として、インデックスを削除しました。ユーザーのデフォルトの表領域を望ましい表領域に変更しました。その後、インデックスを再作成します。おそらくより良い方法がありますが、私にとってはうまくいきました。

8
Rooie3000

これを試して、テーブル(tbl1)をテーブルスペース(tblspc2)に移動します。

alter table tb11 move tablespace tblspc2;
2
Dba