Nas atividades desempenhadas no "mundo real " dos administradores de Banco de Dados, onde encontramos Base de Dados em versões descontinuadas pelos fornecedores e como não é objetivo dos negocios das empresas acompanhar tecnologias ou efetuar investimentos em novas licenças, somente porque a versão de Banco de Dados foi evoluída, sempre se deparamos com os lemas o “que esta funcionando não se muda” ou “time que esta vencendo não se altera”.

Assim muitas das Bases de Dados em operação estão em versões 7, 8 e atendendo perfeitamente as necessidades do cliente.

As necessidades de migração dessas Bases de Dados na maioria das vezes sempre é resultado da degradação do Hardware que não comporta crescimento ou a manutenção não pode ser mais contratada ou prestada pelo fornecedor.

Com este cenário temos o dilema de efetuar uma migração tecnológica de um ERP da empresa que não pode ficar indisponível devido a perda de produção.

Nas reuniões de projeto é definida a migração da Base de Dados atual Oracle 8.1 para a nova versão Oracle 11g, com todas as novidades disponíveis e desempenho para o novo ambiente tecnológico adquirido pela empresa, mas a janela de migração não pode ultrapassar 12hs de um final de semana, para migração de 2Tb de Dados.

O desafio do Administrador de Banco de Dados no cenário proposto é a migração de uma plataforma Oracle 8.1 file system, sistema operacional Sun5 para Oracle 11g RAC Sistema Operacional AIX 6 com Storage em ASM, em uma janela de 12hs de indisponibilidade.

Métodos de migração disponíveis:

·         Export and import ou Data Pump

·         DataBase Links

·         Data Copying

·         Upgrade com DBUA

Export /Import para migrar um banco de dados é possível desfragmentar e reorganizar dados, efetuar a mudança do nome do banco de dados, servidor, plataforma, tamanho do bloco, conjunto de caracteres, excluir tabelas que não seja mais necessária e é de fácil retomada em caso de queda do processo, deve se criar o novo banco de dados manualmente e o tempo necessário é proporcional ao volume de dados, Data Pump disponível para Oracle 10g;

DataBase Links – Atualização do Banco de Dados Manualmente pelo DBA através de scripts, sendo possível efetuar a migração do banco de dados, desfragmentar e reorganizar dados, mudança de nome do banco de dados, servidor, plataforma, tamanho do bloco, conjunto de caracteres, excluir tabelas que não seja mais necessária fácil retomada em caso de queda do processo, deve se criar o novo banco de dados manualmente;

Data Copying copia de dados através do comando COPY do SQLPLUS migrar um banco de dados é possível efetuar a migração inteira de lugar devendo cria os arquivos de controle e atualizações cabeçalhos dados dos arquivos para alterá-los para o formato do Oracle 11g, deve executar scripts catálogo para recriar views de dicionário e PL / SQL built-ins, Tempo necessário é independente do volume de dados, mas depende do controle absoluto das alterações no processo de migração;

Upgrade com DBUA para migrar um banco de dados o Aplicativo Java com interface gráfica para o usuário, com funcionalidade semelhante ao de linhas de comandos e utilitários que o DBA nunca gosta, devido não ter o controle sobre os processos em execução na cama de aplicação gráfica JAVA.

Mas qual método considerar? Para o cenário de migração proposto na empresa...

Lembrando que estamos apenas verificando o melhor método de migração  para o cenário, para garantir a indisponibilidade de 12hs no serviço da empresa, todos os requisitos de uma migração já foram efetuados, atividades que antecedem uma migração de Base de Dados executados pelo administrador de Banco de Dados foram contempladas. Também esta sendo considerado um novo ambiente tecnológico, com uma nova infraestrutura de rede, nova infraestrutura de storage e novos processadores e memoria no novo servidor de Base de Dados.

Para este cenário a solução aplicada para atender a janela de indisponibilidade aproveitando todos os recursos do novo ambiente tecnológico disponível foi o método “DataBase Links – Atualização do Banco de Dados Manualmente pelo DBA através de scripts”:

Passos executados para a migração através de scripts:

1.       Gerar o export estrutural do ambiente de produção;

 

2.       Criar o usuário migra com grant de DBA no ambiente origem;

 

3.       Criar o usuário migra com grant de DBA no ambiente destino;

 

4.       Fazer o import estrutural full;

 

5.       Desabilitar triggers, constraints e dropar os índices usando script abaixo:

 

 

set recsep off trims on echo off feed off head off timing off

set term off sqln off ver off sqlp '' lin 300 pages 200

set serveroutput on size 1000000

spool exe_disable

select 'alter trigger '||owner||'.'||trigger_name||' disable;' from dba_triggers where owner not in ('SYS','SYSTEM');

select 'alter table   '||owner||'.'||table_name||' disable constraint '||constraint_name||';' from dba_constraints where owner not in ('SYS','SYSTEM') and constraint_type in ('P','R','U');

select 'drop  index   '||owner||'.'||INDEX_name||';' from dba_indexes where owner not in ('SYS','SYSTEM');

spool off

spool out_disable

@exe_disable.lst

spool off



6.       Executar o script para começar a cópia dos dados, sempre com o usuário MIGRA:

Criar a tabela auxiliar chamada objects.

drop table objects;

create table objects as

select owner,table_name from

(select owner,segment_name table_name,sum(blocks) blocks from dba_segments@prod

 where segment_type like '%TABLE%' and owner not in ('SYS','SYSTEM', 'CTXSYS', 'MDSYS', 'OLAPSYS', 'ODM', 'DMSYS', 'ODM_MTR', 'ORDPLUGINS', 'LBACSYS', 'EXFSYS', 'MDDATA', 'WKSYS','WKPROXY' 'WMSYS', 'XDB', 'DBSNMP', 'SYSMAN')

   and (owner,segment_name)

 not in (select distinct owner,table_name from dba_tab_columns@prod where data_type like '%LONG%')

 group by owner,segment_name

 order by 3 desc);

 

7.       Criar o shell para gerar as filas dos objetos que serão inseridos:

 

puxa.sh

sqlplus migra/migra @puxa $1

test -s $1.sh

 

while [ $? = 0 ]

do

 chmod 755 $1.sh

 $1.sh

 sqlplus migra/migra @puxa $1

 test -s $1.sh

done

 

8.       Criar o script que fará a inserção dos dados de uma base para outra.



puxa.sql

---

set recsep off trims on echo off feed off head off timing off

set term off sqln off ver off sqlp '' lin 300 pages 200

set serveroutput on size 1000000

 

lock table objects in exclusive mode;

 

spool &1..sh

 

SELECT 'sqlplus migra/migra <

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'set timing on'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'spool '

       || REPLACE (owner, '$', '')

       || '_'

       || REPLACE (table_name, '$', '')

       || '_a'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'alter table '

       || owner

       || '.'

       || table_name

       || ' disable constraint '

       || constraint_name

       || ';'

  FROM dba_constraints

 WHERE constraint_type IN ('P', 'R', 'U')

   AND (owner, table_name) = (SELECT owner, table_name

                                FROM objects

                               WHERE ROWNUM <= 1);

SELECT 'drop index ' || owner || '.' || index_name || ';'

  FROM dba_indexes

 WHERE (table_owner, table_name) = (SELECT owner, table_name

                                      FROM objects

                                     WHERE ROWNUM <= 1);

SELECT    'truncate table '

       || REPLACE (owner, '$', '\$')

       || '.'

       || REPLACE (table_name, '$', '\$')

       || ';'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'insert /*+ append nologging */ into '

       || REPLACE (owner, '$', '\$')

       || '.'

       || REPLACE (table_name, '$', '\$')

       || ' select * from '

       || REPLACE (owner, '$', '\$')

       || '.'

       || REPLACE (table_name, '$', '\$')

       || '@prod ;'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'commit;'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'exit'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'EOF'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'exp migra/migra@prob compress=n direct=y buffer=1000000 rows=n triggers=n statistics=none file='

       || REPLACE (owner, '$', '\$')

       || '_'

       || REPLACE (table_name, '$', '\$')

       || '_c.dmp  log=/dev/null tables='

       || REPLACE (owner, '$', '\$')

       || '.'

       || REPLACE (table_name, '$', '\$')

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'imp migra/migra buffer=1000000 ignore=y file='

       || REPLACE (owner, '$', '\$')

       || '_'

       || REPLACE (table_name, '$', '\$')

       || '_c.dmp fromuser='

       || owner

       || ' touser='

       || owner

       || ' log=/dev/null'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'sqlplus migra/migra <

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'set timing on'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'spool '

       || REPLACE (owner, '$', '')

       || '_'

       || REPLACE (table_name, '$', '')

       || '_b'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT    'analyze table '

       || REPLACE (owner, '$', '\$')

       || '.'

       || REPLACE (table_name, '$', '\$')

       || ' estimate statistics;'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'exit'

  FROM objects

 WHERE ROWNUM <= 1;

SELECT 'EOF'

  FROM objects

 WHERE ROWNUM <= 1;

spool off

 

DELETE objects WHERE ROWNUM <= 1;

COMMIT ;

exit

 

9.       Para lançar os processos usar o seguinte comando:

 

nohup puxa.sh fila01 >> nohup_fila1.out &

nohup puxa.sh fila02 >> nohup_fila2.out &

 

10.    Após o fim do processo, habilitar sequences, constraints e triggers:

 

set recsep off trims on echo off feed off head off timing off

set term off sqln off ver off sqlp '' lin 300 pages 200

set serveroutput on size 1000000

spool enable

 

SELECT 'alter trigger ' || owner || '.' || trigger_name || ' enable;'

  FROM dba_triggers

 WHERE status <> 'ENABLED';

SELECT    'alter table '

       || owner

       || '.'

       || table_name

       || ' enable constraint '

       || constraint_name

       || ';'

  FROM dba_constraints

 WHERE status <> 'ENABLED';

 

spool off

@enable.lst

 

11.    Ajuste das sequences.

 

12.    Executar estatísticas do schema SYS:

 

SQL> execute dbms_stats.gather_schema_stats

     ('SYS',cascade=>TRUE,degree=>20);

            O método utilizado, executado em paralelismo pode efetuar a migração dos dados dentro da janela de indisponibilidade proposta. Devido o alto ganho em execuções em paralelo.

 

COnfira os cursos de Oracle da Devmedia

Administração do Oracle 10g no Linux

Curso PL SQL