Duplicar um banco oracle na mesma máquina
by Gilberto C. Andrade on 01 dezembro 2008
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:
-
Create an Oracle Password File for the Auxiliary Instance [task1]
-
Establish Oracle Net Connectivity to the Auxiliary Instance [task2]
-
Create an Initialization Parameter File for the Auxiliary Instance [task3]
-
Start the Auxiliary Instance [task4]
-
Mount or Open the Target Database [task5]
-
Make Sure You Have the Necessary Backups and Archived Redo Logs(Essencial - você precisa de um backup [task6]
-
Allocate Auxiliary Channels if Automatic Channels Are Not Configured [task7]
-
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;