Corro oracle 11g
e devo spostare table (tbl1)
da un tablespace (tblspc1)
a un altro (tblspc2)
. Qual è il modo più semplice per farlo?Come spostare la tabella da un tablespace a un altro in oracle 11g
risposta
Prova questa: -
ALTER TABLE <TABLE NAME to be moved> MOVE TABLESPACE <destination TABLESPACE NAME>
Bellissimo suggerimento di IVAN nei commenti così pensato di aggiungere nella mia risposta
Nota: si rischierebbe di invalidare gli indici tutti di tabella. Di solito questo comando è seguito da
alter index <owner>."<index_name>" rebuild;
[Dalla documentazione] (http://docs.oracle.com/cd/E11882_01/server.112/e25494/tables006.htm#i1106606); e [altro qui] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_3001.htm#i2081902) –
Nota: questo invaliderà tutti gli indici della tabella. Quindi questo comando è solitamente seguito da "alter indice
@ Ivan: - Grazie Ivan. Bel punto. Aggiunto questo nella risposta pure !! +1 :) –
Prova a spostare la tabella (tbl1) in tablespace (tblspc2).
alter table tb11 move tablespace tblspc2;
Usa sql
da sql
: uscita
rocchetto di questo in un file:
select 'alter index '||owner||'.'||index_name||' rebuild tablespace TO_TABLESPACE_NAME;' from all_indexes where owner='OWNERNAME';
SpoolFile avrà qualcosa di simile:
alter index OWNER.PK_INDEX rebuild tablespace CORRECT_TS_NAME;
Devi usare "..." attorno al nome_indice altrimenti otterrai un errore "ORA-01418: l'indice specificato non esiste". Quindi il comando dovrebbe essere: selezionare 'alter index' || owner || '."'|| index_name ||'" ricompilare tablespace TO_TABLESPACE_NAME; ' da all_indexes dove owner = 'OWNERNAME'; – Jan
tavoli in movimento:
.210Prima esecuzione:
SELECT 'ALTER TABLE <schema_name>.' || OBJECT_NAME ||' MOVE TABLESPACE '||' <tablespace_name>; '
FROM ALL_OBJECTS
WHERE OWNER = '<schema_name>'
AND OBJECT_TYPE = 'TABLE'
<> '<TABLESPACE_NAME>';
Dove <schema_name>
è il nome dell'utente. E <tablespace_name>
è lo spazio tabelle di destinazione.
Come risultato si ottiene linee come:
ALTER TABLE SCOT.PARTS gli utenti si spostano TABLESPACE;
Incollare i risultati in uno script o in uno sviluppatore sql di Oracle come l'applicazione ed eseguirlo.
indici in movimento:
prima esecuzione:
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>';
L'ultima riga in questo codice potrebbe risparmiare un sacco di tempo, perché filtra gli indici che sono già in tablespace corretta.
Come risultato si dovrebbe ottenere qualcosa di simile a:
ALTER INDEX REBUILD SCOT.PARTS_NO_PK UTENTI TABLESPACE;
Incollare i risultati in uno script o in uno sviluppatore sql di Oracle come l'applicazione ed eseguirlo.
Ultimo ma non meno importante, i LOB in movimento:
prima esecuzione:
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%';
Questo sposta il LOB oggetti verso l'altro spazio tabelle.
Come risultato si dovrebbe ottenere qualcosa di simile a:
ALTER TABLE SCOT.bin $ 6t926o3phqjgqkjabaetqg == $ 0 per passare LOB (calendario) STORE AS (UTENTI TABLESPACE);
Incollare i risultati in uno script o in uno sviluppatore sql di Oracle come l'applicazione ed eseguirlo.
O e non v'è ancora una cosa:
Per qualche ragione non ero in grado di muoversi 'DOMINIO' indici di tipo. Come un aggeggio ho lasciato cadere l'indice. cambiato lo spazio tabella predefinito dell'utente nel tablespace desiderato. e quindi ricreare nuovamente l'indice. Esiste probabilmente un modo migliore ma ha funzionato per me.
Puoi postare almeno quello che hai provato fino ad ora ?. –