web-dev-qa-db-fra.com

Comment déplacer une table d'un espace de table à un autre dans Oracle 11g

Je lance Oracle 11g Et je dois déplacer table (tbl1) d'un tablespace (tblspc1) vers un autre (tblspc2). Quel est le moyen le plus simple de le faire?

28
user2698625

Essaye ça:-

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

Très bonne suggestion de IVAN dans les commentaires donc pensé pour ajouter dans ma réponse

Note : cela invalidera tous les index de la table. Donc, cette commande est généralement suivie de

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

Utilisez sql à partir de sql:

spool la sortie de ceci dans un fichier:

select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';

spoolfile aura quelque chose comme ça:

alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
11
user3025076

Tables de déménagement:

Première exécution:

SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE' <> '<TABLESPACE_NAME>';

- Ou suggéré dans les commentaires (je ne l'ai pas testé moi-même)

SELECT 'ALTER TABLE <SCHEMA>.' || TABLE_NAME ||' MOVE TABLESPACE '||' TABLESPACE_NAME>; ' 
FROM dba_tables 
WHERE OWNER = '<SCHEMA>' 
AND TABLESPACE_NAME <> '<TABLESPACE_NAME>

<schema_name> est le nom de l'utilisateur. Et <tablespace_name> est le tablespace de destination.

En conséquence, vous obtenez des lignes comme:

ALTER TABLE SCOT.PARTS DÉPLACEZ LES UTILISATEURS DE TABLESPACE;

Collez les résultats dans un script ou dans une application de développement Oracle sql et exécutez-le.

Index mobiles:

Première exécution:

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>';

La dernière ligne de ce code peut vous faire gagner beaucoup de temps, car elle filtre les index qui se trouvent déjà dans le tablespace correct.

En conséquence, vous devriez obtenir quelque chose comme:

ALTER INDEX SCOT.PARTS_NO_PK UTILISATEURS DE TABLESPACE DE RECONSTRUCTION;

Collez les résultats dans un script ou dans une application de développement Oracle sql et exécutez-le.

Dernier point mais non le moindre, les LOB en mouvement:

Première exécution:

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%';

Cela déplace les objets LOB vers l'autre espace de table.

En conséquence, vous devriez obtenir quelque chose comme:

ALTER TABLE SCOT.bin $ 6t926o3phqjgqkjabaetqg == $ 0 MOVE LOB (calendrier) STORE AS (UTILISATEUR TABLESPACE);

Collez les résultats dans un script ou dans une application de développement Oracle sql et exécutez-le.

O et il y a encore une chose:

Pour une raison quelconque, je n'ai pas pu déplacer les index de type 'DOMAIN'. En guise de travail, j'ai laissé tomber l'index. changé le tablespace par défaut de l'utilisateur en le tablespace désiré. puis recréez à nouveau l'index. Il y a probablement une meilleure façon mais cela a fonctionné pour moi.

8
Rooie3000

Essayez ceci pour déplacer votre table (tbl1) vers un espace table (tblspc2).

alter table tb11 move tablespace tblspc2;
2
Dba