Comment déplacer une table d'une tablespace à une autre dans oracle 11g

I run oracle 11g et la nécessité de déplacer table (tbl1) d'un tablespace (tblspc1) à un autre (tblspc2). Quelle est la meilleure façon de le faire?

24
demandé sur Brian Tompsett - 汤莱恩 2013-08-20 09:38:09

5 réponses

Essayez ceci:-

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

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

Remarque:: ceci invalidera tous les index de table. Si cette commande est généralement suivie par

alter index <owner>."<index_name>" rebuild;
41
répondu Rahul Tripathi 2017-05-23 12:25:05

Utiliser sqlsql:

renvoie ce résultat 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 ceci:

alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
10
répondu user3025076 2013-11-23 14:51:36

tables mobiles:

la 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 (n'a pas le tester 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 la destination tablespace.

en conséquence, vous obtenez des lignes comme:

MODIFIER LA TABLE SCOT.PARTS MOVE TABLESPACE USERS;

collez les résultats dans un script ou dans un développeur sql oracle comme application et lancez-le.

Déménagement index:

la 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 pourrait vous faire gagner beaucoup de temps car elle filtre les index qui sont déjà dans le bon espace de tablature.

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

ALTER INDEX SCOT.PARTS_NO_PK REBUILD TABLESPACE USERS;

collez les résultats dans un script ou dans un développeur sql oracle comme application et lancez-le.

Dernier point mais non le moindre, se déplaçant Lob:

la 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 tablespace.

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

MODIFIER LA TABLE SCOT.bin$6t926o3phqjgqkjabaetqg== $ 0 MOVE LOB (calendar) STORE AS (TABLESPACE USERS);

collez les résultats dans un script ou dans un développeur sql oracle comme application et lancez-le.

O et il y a encore une chose:

pour une raison quelconque, je n'ai pas pu bouger Index de type "domaine". Comme je l'ai abandonné l'index. change le tablespace par défaut de l'utilisateur en tablespace désirée. et puis recréer l'index à nouveau. Il y a sans doute un meilleur moyen, mais ça a marché pour moi.

7
répondu Rooie3000 2018-05-14 11:40:28

essayez ceci pour déplacer votre table (tbl1) vers tablespace (tblspc2).

alter table tb11 move tablespace tblspc2;
2
répondu Dba 2013-08-20 06:47:49

j'ai essayé de nombreux scripts mais ils ne fonctionnaient pas pour tous les objets. Vous ne pouvez pas déplacer les objets groupés d'un seul tablespace à l'autre. Pour cela, vous devrez utiliser expdp, je vais donc suggérer expdp est la meilleure option pour déplacer tous les objets d'un autre tablespace.

ci-dessous la commande:

nohup expdp \"/ as sysdba\" DIRECTORY=test_dir DUMPFILE=users.dmp LOGFILE=users.log TABLESPACES=USERS &

Vous pouvez vérifier l' ce lien pour plus de détails.

-1
répondu santosh tiwary 2018-07-07 17:18:22