Para duplicar um banco oracle na mesma maquina
by Gilberto C. Andrade on 01 dezembro 2008
Tagged as: Database,
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 (http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/rcmdupdb. htm#i1006474):
- Create an Oracle Password File for the Auxiliary Instance
- Establish Oracle Net Connectivity to the Auxiliary Instance
- Create an Initialization Parameter File for the Auxiliary Instance
- Start the Auxiliary Instance
- Mount or Open the Target Database
- Make Sure You Have the Necessary Backups and Archived Redo Logs (Essencial - você precisa de um backup
- Allocate Auxiliary Channels if Automatic Channels Are Not Configured
- Recrie a tablespace temporária (extra)
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)
)
)
Atenção: 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
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.
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
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)
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>
**
Não esquecer de coletar estatísticas
**
begin
dbms_stats.gather_database_stats(options=> 'GATHER AUTO');
end;