Olá amigos,
Migrar bases de dados entre Sistemas Operacionais de diferentes plataformas é uma tarefa muito complexa quando se trata de bancos grandes (entenda como banco grande > que 1TB).
Atualmente as janelas curtas de manutenção onde o export/import/expdp/impdp/insert as select talvez não seriam tão eficientes inviabilizariam algumas migrações.
O transportable tablespace foi introduzido no Oracle 8i e o convert database está disponível à partir do 10g, porém, o convert database é depentende do ENDIAN FORMAT, para ver o ENDIAN FORMAT de sua plataforma consulte a visão V$TRANSPORTABLE_PLATFORM.
Não podemos usar o convert nesse caso, só podemos usar o convert database de Little para Little e de Big para Big, então isso inviabilizaria a minha tarefa, que é migrar uma base
de “Solaris[tm] OE (64-bit) –> Big” para “Linux IA (64-bit) –> Little”, porém podemos usar o transportable tablespace convertendo na base de origem para essa tarefa.
Obs.: Nada de PL/SQL com excessão de triggers será levado para a base destino, então terá de carregar esses objetos depois da carga.
Mãos à obra:
1) Checar se as tbs do usuário são autocontidas, ou seja, não tem segmentos dependentes em outras tablespaces
SQL> exec sys.dbms_tts.transport_set_check(‘TD_MYTBS_01,TI_MYTBS_01′, true);
2) Verifica se existe violação para transportable tablespace
SELECT * FROM transport_set_violations;
3) Coloca a tbs na Origem em read_only
ALTER TABLESPACE TD_MYTBS_01 READ ONLY;
ALTER TABLESPACE TI_MYTBS_01 READ ONLY;
4) Gera o export com as definições do dicionário de dados que serão carregadas no banco destino.
exp userid=’/ as sysdba’ transport_tablespace=y tablespaces=(TD_mytbs_01,TI_mytbs_01) file=/export/orcl/tts.dmp log=/export/orcl/exp_tts.log statistics=none
5) Conversão na origem (Solaris 64 bits) para a plataforma (Linux 64 bits)
run
{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
allocate channel c5 device type disk;
convert tablespace ‘TI_mytbs_01′
to platform=”Linux IA (64-bit)”
db_file_name_convert=’/orcl/u10/oradata/i_mytbs_01_01.dbf’,’/export/orcl/i_mytbs_01_01.dbf’
‘/orcl/u10/oradata/i_mytbs_01_02.dbf’,’/export/orcl/i_mytbs_01_02.dbf’
‘/orcl/u10/oradata/i_mytbs_01_03.dbf’,’/export/orcl/i_mytbs_01_03.dbf’
‘/orcl/u10/oradata/i_mytbs_01_04.dbf’,’/export/orcl/i_mytbs_01_04.dbf’
‘/orcl/u10/oradata/i_mytbs_01_05.dbf’,’/export/orcl/i_mytbs_01_05.dbf’
‘/orcl/u10/oradata/i_mytbs_01_06.dbf’,’/export/orcl/i_mytbs_01_06.dbf’;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}
run
{
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
convert tablespace ‘TD_mytbs_01′
to platform=”Linux IA (64-bit)”
db_file_name_convert=’/orcl/u09/oradata/d_mytbs_01_01.dbf’,’/export/orcl/d_mytbs_01_01.dbf’
‘/orcl/u09/oradata/d_mytbs_01_02.dbf’,’/export/orcl/d_mytbs_01_02.dbf’
‘/orcl/u09/oradata/d_mytbs_01_03.dbf’,’/export/orcl/d_mytbs_01_03.dbf’;
release channel c1;
release channel c2;
release channel c3;
}
Exemplo de saída do comando de conversão de uma das tablespaces
Recovery Manager: Release 10.2.0.4.0 – Production on Fri Jan 7 11:43:24 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: orcl (DBID=1284179606)
RMAN> run
2> {
3>
4> allocate channel c1 device type disk;
allocate channel c2 device type disk;
5> allocate channel c3 device type disk;
6>
7> 8> convert tablespace ‘TD_mytbs_01′
to platform=”Linux IA (64-bit)”
9> 10> db_file_name_convert=’/orcl/u09/oradata/d_mytbs_01_01.dbf’,’/export/orcl/d_mytbs_01_01.dbf’
‘/orcl/u09/oradata/d_mytbs_01_02.dbf’,’/export/orcl/d_mytbs_01_02.dbf’
11> ‘/orcl/u09/oradata/d_mytbs_01_03.dbf’,’/export/orcl/d_mytbs_01_03.dbf’;
12> release channel c1;
13> 14> release channel c2;
15> 16> release channel c3;
}
17> 18>
using target database control file instead of recovery catalog
allocated channel: c1
channel c1: sid=230 devtype=DISK
allocated channel: c2
channel c2: sid=303 devtype=DISK
allocated channel: c3
channel c3: sid=240 devtype=DISK
Starting backup at 07-JAN-11
channel c1: starting datafile conversion
input datafile fno=00330 name=/orcl/u09/oradata/d_mytbs_01_01.dbf
channel c2: starting datafile conversion
input datafile fno=00331 name=/orcl/u09/oradata/d_mytbs_01_02.dbf
channel c3: starting datafile conversion
input datafile fno=00332 name=/orcl/u09/oradata/d_mytbs_01_03.dbf
converted datafile=/export/orcl/d_mytbs_01_01.dbf
channel c1: datafile conversion complete, elapsed time: 00:09:19
converted datafile=/export/orcl/d_mytbs_01_02.dbf
channel c2: datafile conversion complete, elapsed time: 00:09:19
converted datafile=/export/orcl/d_mytbs_01_03.dbf
channel c3: datafile conversion complete, elapsed time: 00:09:18
Finished backup at 07-JAN-11
released channel: c1
released channel: c2
released channel: c3
RMAN>
RMAN>
6) Copiar os datafiles para o host destino usando SCP, FTP ou qualquer utilitário de seu gosto.
7) Criar todos usuários que possuem objetos nessa tablespace, no nosso caso de teste só um
SQL> create user mytbs identified by mytbs;
8 ) Importar as tablespaces na base destino já convertidas
imp userid=’/ as sysdba’ parfile=param.mufalani
— conteudo do arquivo param.mufalani
transport_tablespace=y
tablespaces=(TD_mytbs_01,TI_mytbs_01)
file=/export/tts.dmp
log=/export/imp_tts.log
datafiles=(‘/export/orcl/d_mytbs_01_01.dbf’,
‘/export/orcl/d_mytbs_01_02.dbf’,
‘/export/orcl/d_mytbs_01_03.dbf’,
‘/export/orcl/i_mytbs_01_01.dbf’,
‘/export/orcl/i_mytbs_01_02.dbf’,
‘/export/orcl/i_mytbs_01_03.dbf’,
‘/export/orcl/i_mytbs_01_04.dbf’,
‘/export/orcl/i_mytbs_01_05.dbf’,
‘/export/orcl/i_mytbs_01_06.dbf’)
9) Verificando as tablespaces plugadas no banco
SQL> select TABLESPACE_NAME,STATUS,PLUGGED_IN
2 from dba_tablespaces
3 where tablespace_name like ‘%MYTBS%’;
TABLESPACE_NAME STATUS PLU
—————————— ——— —
TD_MYTBS_01 ONLINE YES
TI_MYTBS_01 ONLINE YES
10) Checando os datafiles importados
SQL> select file_name
2 from dba_data_files
3 where tablespace_name like ‘%MYTBS%’;
FILE_NAME
——————————————————————————–
/export/orcl/d_mytbs_01_03.dbf
/export/orcl/d_mytbs_01_02.dbf
/export/orcl/d_mytbs_01_01.dbf
/export/orcl/i_mytbs_01_06.dbf
/export/orcl/i_mytbs_01_05.dbf
/export/orcl/i_mytbs_01_04.dbf
/export/orcl/i_mytbs_01_03.dbf
/export/orcl/i_mytbs_01_02.dbf
/export/orcl/i_mytbs_01_01.dbf
9 rows selected.
11) Colocar a tablespace em READ WRITE;
ALTER TABLESPACE TD_MYTBS_01 READ WRITE;
ALTER TABLESPACE TI_MYTBS_01 READ WRITE;
12) Carregar todos os objetos pl/sql do usuário.
Para isso, gere um script, ou faça um imp com ignore=n, pois as tabelas e índices já estão carregadas.
Depois de todos os passos acima, o tablespace está transferido de banco de uma plataforma para a outra, independente de ENDIAN format e
a janela de manutenção será reduzida em várias horas. Podendo ser feito aos poucos, um sistema por vez, aí é ao gosto do cliente.
Você pode usar o transportable tablespace para levar dados de uma base de dados para outra na mesma versão, para isso, basta seguir este post sem os passos do convert.
Para maiores referências:
http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/dbxptrn.htm
Att,
Rodrigo Mufalani
Ps.: Deixe seu comentário, ele é muito importante para melhorar a qualidade do blog