Vivendo e Aprendendo

Experiência prática na administração de Banco de Dados

Duplicar um banco oracle na mesma máquina

by Gilberto C. Andrade on 01 dezembro 2008

Tagged as: Database, Oracle,

Atualmente aqui na Secretaria estamos em um processo de implantação de um sistema de recursos humanos, para ser mais exato, praticamente toda parte de infraestrutura (hardware e software) já está pronta para uso. Mas por questões que foge ao meu conhecimento (penso ser licitação), a fase mais densa (treinamento e uso pelo usuário final) está em fase de planejamento/reestruturação. Bom, apesar dessa, vamos dizer morosidade, tem uma fase desse processo que não pára: a migração. Nesse processo participam duas equipes: parametrização e a própria migração, o qual nessa última pertenço.

A migração é um ciclo constante onde a partir de modificações(parametrização) importantes no banco de produção, é acionado uma requisição de atualização do banco de migração (utilizado para validar a parametrização com a ativação de funções do sistema de recursos humanos, por exemplo, calculo de folha). Para esse ciclo funcionar tive que realizar uma das tarefas mais comuns para quem administra um que é cópia/duplicação/clonagem de um banco em produção para outro banco (até mesmo em outro servidor) a ser utilizado como teste. O procedimento descrito aqui, nada mais é do que sequência descrita na própria documentação:

  1. Create an Oracle Password File for the Auxiliary Instance [task1]

  2. Establish Oracle Net Connectivity to the Auxiliary Instance [task2]

  3. Create an Initialization Parameter File for the Auxiliary Instance [task3]

  4. Start the Auxiliary Instance [task4]

  5. Mount or Open the Target Database [task5]

  6. Make Sure You Have the Necessary Backups and Archived Redo Logs(Essencial - você precisa de um backup [task6]

  7. Allocate Auxiliary Channels if Automatic Channels Are Not Configured [task7]

  8. Recrie a tablespace temporária (extra) [task8]

Task 1: Create an Oracle Password File for the Auxiliary Instance

cd $ORACLE_HOME/dbs/
orapwd file=$ORACLE_HOME/dbs/orapwbeta password=senha entries=5

Task 2: Establish Oracle Net Connectivity to the Auxiliary Instance

vi $ORACLE_HOME/network/admin/tnsnames.ora
BETA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracleibm.secad)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = beta.secad.to.gov.br)
    )
  )
Note
a criação estática de um listener é importantíssima, caso contrário vc encontrá problemas de conexão, como o erro:
ORA-12528: TNS:listener: all appropriate instances are blocking new connections
Shell
vi $ORACLE_HOME/network/admin/listener.ora
# listener.ora Network Configuration File:
/opt/oracle/db/10.2.0.1.0/server/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = producao.secad.to.gov.br)
      (ORACLE_HOME = /opt/oracle/db/10.2.0.1.0/server)
      (SID_NAME = producao)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = alfa.secad.to.gov.br)
      (ORACLE_HOME = /opt/oracle/db/10.2.0.1.0/server)
      (SID_NAME = alfa)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = beta.secad.to.gov.br)
      (ORACLE_HOME = /opt/oracle/db/10.2.0.1.0/server)
      (SID_NAME = beta)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracleibm)(PORT = 1521))
  )

Task 3: Create an Initialization Parameter File for the Auxiliary Instance

Vamos criar primeiro a estrutura de diretorios onde ficarão os arquivos do banco

cd /dm0/oracle/admin/beta
mkdir adump
mkdir arch
mkdir bdump
mkdir cdump
mkdir data
mkdir exp
mkdir pfile
mkdir scripts
mkdir udump
mkdir utlfile

Agora o arquivo de inicialização, para isso vou fazer uma copia do banco original e fazer a mudanças necessárias

cd /dm0/oracle/admin/beta/pfile/
cp ../../producao/pfile/init.ora.292007145712 initbeta.ora
vi initbeta.ora

Se estiver usando spfile no banco original, crie um arquivo de inicialização (pfile) a partir dele

export ORACLE_SID=producao
sqlplus /as sysdba
CREATE PFILE='/dm0/oracle/admin/beta/pfile/initbeta.ora' FROM SPFILE;

Substitua todas as ocorrências do banco anterior

:g/producao/s//beta/g

#Acrescente mais uma seção neste arquivo
###########################################
#  Filename Conversion Initialization Parameters
#  Renaming Datafiles in RMAN DUPLICATE DATABASE
#  Renaming Online Logs in RMAN DUPLICATE DATABASE
###########################################
DB_FILE_NAME_CONVERT=(/dm0/oracle/admin/producao/data/,/dm0/oracle/admin/beta/data/)
LOG_FILE_NAME_CONVERT=(/dm0/oracle/admin/producao/data,/dm0/oracle/admin/beta/data)

Salve o arquivo. Para facilitar a duplicação recomenda-se criar um spfile no local padrao da instalação. Isso irá lhe poupar o trabalho quando o rman fizer o shutdwon e startup, ele não solicitará o arquivo de inicialização pfile.

export ORACLE_SID=beta
sqlplus /as sysdba
CREATE SPFILE FROM PFILE='/dm0/oracle/admin/beta/pfile/initbeta.ora';

Task 4: Start the Auxiliary Instance

export ORACLE_SID=beta
sqlplus /as sysdba
STARTUP FORCE NOMOUNT

Task 5: Mount or Open the Target Database (Opcional - provavelmente o banco original já esteja aberto!)

Conecte-se ao banco de origem

SQL> CONNECT SYS/oracle@producao AS SYSDBA;

STARTUP MOUNT;#mount or open database origem

Task 6: Make Sure You Have the Necessary Backups and Archived Redo Logs (Essencial - você precisa de um backup recente, caso

contrário, a clonagem criará um banco antigo)

export ORACLE_SID=producao
rman target /
Recovery Manager: Release 10.2.0.2.0 - Production on Wed Mar 14 18:12:58 2007
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
connected to target database: PRODUCAO (DBID=2991538920)
RMAN> list backup;
using target database control file instead of recovery catalog
List of Backup Sets
===================

Task 7: Allocate Auxiliary Channels if Automatic Channels Are Not Configured

Start RMAN with a connection to the target database, the auxiliary instance, and, if applicable, the recovery catalog database Nesta conexão pode ocorrer um error comum na versao 10g:

ORA-12528: TNS:listener: all appropriate instances are blocking new connections

Este é um erro conhecido do Oracle 10g onde um SHUTDOWN IMMEDIATE é seguido por um STARTUP MOUNT ou STARTUP FORCE MOUNT. Execute um novo SHUTDOWN no banco e então um STARTUP. Você será capaz de conectar novamente. Se ainda sim você não conseguir conectar, inverta as opções do rman:

#Forma alternativa
oracle@oracleibm:/dm0/oracle/admin/beta/pfile> export ORACLE_SID=beta
oracle@oracleibm:/dm0/oracle/admin/beta/pfile>rman target sys@producao auxiliary /
oracle@oracleibm:/dm0/oracle/admin/beta/pfile> export ORACLE_SID=producao
oracle@oracleibm:/dm0/oracle/admin/beta/pfile> rman TARGET /  AUXILIARY SYS@beta

Recovery Manager: Release 10.2.0.2.0 - Production on Thu Mar 15 09:03:41 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

connected to target database: PRODUCAO (DBID=2991538920)
auxiliary database Password:
connected to auxiliary database: BETA (not mounted)

RMAN>
RUN
{
  # to manually allocate a channel of type sbt issue:
  #ALLOCATE AUXILIARY CHANNEL ch1 DEVICE TYPE sbt;

  # to manually allocate two auxiliary channels for disk issue (specifying whatever channel id that you want):
  ALLOCATE AUXILIARY CHANNEL aux1 DEVICE TYPE DISK;
  ALLOCATE AUXILIARY CHANNEL aux2 DEVICE TYPE DISK;
  DUPLICATE TARGET DATABASE TO beta;
}
.
.
.
contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 15/03/2007 09:55:47

RMAN> quit

Task 8: Recrie a tablespace temporária (extra)

#(versão 9i e acima)
ALTER DATABASE TEMPFILE '/dm0/oracle/admin/beta/data/temp01.dbf' DROP INCLUDING
DATAFILES;
ALTER TABLESPACE TEMP ADD TEMPFILE '/dm0/oracle/admin/beta/data/temp01.dbf'
SIZE 200M REUSE AUTOEXTEND ON NEXT 5M MAXSIZE 2000M;

Outra coisa, como este banco é para teste, devemos desabilitar o modo archive do mesmo

oracle@oracleibm:/dm0/oracle/admin/beta/pfile> export ORACLE_SID=beta
oracle@oracleibm:/dm0/oracle/admin/beta/pfile> sqlplus / as sysdba
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /opt/oracle/db/10.2.0.1.0/server/dbs/arch
Oldest online log sequence     0
Next log sequence to archive   1
Current log sequence           1

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.

SQL> startup mount
ORACLE instance started.
Total System Global Area 1811939328 bytes
Fixed Size                  2071896 bytes
Variable Size             419431080 bytes
Database Buffers         1375731712 bytes
Redo Buffers               14704640 bytes
Database mounted.

SQL> alter database noarchivelog;
Database altered.

SQL> alter database open;
Database altered.

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
Archive destination            /opt/oracle/db/10.2.0.1.0/server/dbs/arch
Oldest online log sequence     0
Current log sequence           1
SQL>

[NOTE] Não esquecer de coletar estatísticas

begin
dbms_stats.gather_database_stats(options=> 'GATHER AUTO');
end;
comments powered by Disqus