segunda-feira, 25 de outubro de 2010

Como importar tabelas para uma tablespace diferente no Oracle

No nosso exemplo iremos mover as tabelas do usuario01 para o usuario02

Usuários
usuario01/senha00
usuario02/senha00
system/senha01

Tablespaces
tsd_usuario02.dbf: tablespace de dados para o usuário02
tsi_usuario02.dbf: tablespace de indíces para o usuário02


O modo mais comum para mover as tablespace é utilizar o comando "move tablespace" após utilizar os campos "exp" e "imp"
Exemplo: select 'alter table usuario02.' || table_name || ' move tablespace tsd_usuario02;' from user_tables

Quando há campos do tipo blob nas tabelas, também é necessário utilizado o comando "move lob".
Exemplo: select 'alter table usuario02.' || table_name || ' move lob (' || column_name || ') store as (tablespace tsd_usuario02);' from dba_lobs where owner = 'USUARIO02'

No nosso caso, temos na mesma tabela campos do tipo "blob" e "long raw" que impossilita o uso do comando "move lob".
Para esse caso fixemos os seguintes passos:
1. Exportamos o script de criação das tabelas do usuario01
2. Alteramos o script para comportar as tablespaces do usuario02
3. Criamos o usuario02
4. Desabilitamos as constraints do usuario02
5. Importarmos os dados do usuario01 para o usuario02
6. Habilitamos as constraints do usuario02
7. Atualizamos os indíces
8. Atualizamos as estatísticas


Abaixo temos os passos realizados
exp userid=usuario01/senha00 full=y file=usuario01.dmp grants=y
imp fromuser=usuario01 file=usuario01.dmp indexfile=qtiusuario02.sql touser=qtiusuario02 (system/senha01)
. retirar os marcardos REM
. alterar as tablespaces para usuario02 (tsi_qti)
. retirar comentarios "... x rows"

sqlplus (system/senha01)
create tablespace tsdqtiusuario02 datafile 'd:\oraclexe\oradata\tsd_usuario02.dbf' size 100m autoextend on next 50m;

create tablespace tsiqtiusuario02 datafile 'd:\oraclexe\oradata\tsi_usuario02.dbf' size 50m autoextend on next 50m;

create user qtiusuario02 identified by senha00 default tablespace tsdqtiusuario02 temporary tablespace temp;

grant connect, resource to qtiusuario02;

@qtiusuario02.sql; (senha00)

select 'alter table ' || owner || '.' || table_name || ' disable constraint ' || constraint_name || ';' from user_constraints
--> executar o resultado do comando (qtiusuario02.disableconstraints.sql): @qtiusuario02.disableconstraints.sql;
exit

imp fromuser=usuario01 file=usuario01.dmp touser=qtiusuario02 ignore=y (system/senha01)

sqlplus (system/senha01)
select 'alter table ' || owner || '.' || table_name || ' enable constraint ' || constraint_name || ';' from user_constraints
--> executar o resultado do comando (qtiusuario02.enableconstraints.sql): @qtiusuario02.enableconstraints.sql;

select 'alter index qtiusuario02.' || index_name || ' rebuild tablespace tsiqtiusuario02;' from user_indexes where index_type = 'NORMAL'
--> executar o resultado desse comando

select 'analyze table qtiusuario02.' || table_name || ' compute statistics;' from user_tables
--> executar o resultado desse comando

Nenhum comentário:

Postar um comentário