Cross Platform – Solaris para Linux

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *