Banco de Dados

21 set, 2010

Implementação da técnica duplicate através do RMAN em ASM

Publicidade

Saudações, pessoal! Veremos aqui como duplicar um banco no mesmo host, utilizando ASM.

Mas por que duplicar um banco? Bom, porque um bom DBA precisa conhecer previamente esse procedimento nas versões em que ele atua, e também quando ele precisa realizar algum teste de homologação ou migração e não quer causar nenhum impacto no ambiente de produção.

Aqui no nosso exemplo iremos duplicar o banco prod, que seria uma base de produção, o nome do novo banco será duplprod – a versão do banco utilizada nesse conceito é 10.2.0.3.0, e os arquivos que compõem o banco estão na ASM. Para concluirmos esse trabalho, mostrarei a técnica do duplicate utilizando o RMAN.

Vamos começar agora o step by step do nosso trabalho.

01. Pré requisitos: verificando o status da base e se ela está em archive mode

export ORACLE_SID=prod
$sqlplus

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Aug 24 06:38:24 2010

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Enter user-name: sys as sysdba
Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining Scoring Engine options

SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 31
Next log sequence to archive 33
Current log sequence 33

SQL> select instance_name,status from v$instance;

INSTANCE_NAME STATUS
---------------- ------------
prod OPEN

Nossa base está em archivelog e está aberta.

02- O RMAN deverá estar configurado corretamente

export ORACLE_SID=prod
$rman target / nocatalog

Recovery Manager: Release 10.2.0.3.0 - Production on Tue Aug 24 06:41:21 2010

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

connected to target database: PROD (DBID=139616651)
using target database control file instead of recovery catalog

RMAN> show all;

RMAN configuration parameters are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 DAYS;
CONFIGURE BACKUP OPTIMIZATION OFF;
CONFIGURE DEFAULT DEVICE TYPE TO DISK;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u03/backup/prod/%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u03/backup/prod/backup_db_%d_S_%s_P_%p_T_%t' MAXPIECESIZE 500 M;
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE ENCRYPTION FOR DATABASE OFF;
CONFIGURE ENCRYPTION ALGORITHM 'AES128';
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/10g/dbs/snapcf_prod.f'; # default

Nosso backup está configurado corretamente, as peças de backup serão gravadas no diretório /u03/backup/prod

03. Checando o parâmetro remote_login_password

export ORACLE_SID=prod
$sqlplus

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Aug 24 06:43:25 2010

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Enter user-name: sys as sysdba
Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining Scoring Engine options

SQL> show parameter remote_login_password

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE

04. Realizar o backup da base que será duplicada

$export ORACLE_SID=prod
$rman target / nocatalog

RMAN> delete noprompt force obsolete;
RMAN> crosscheck archivelog all;
RMAN> crosscheck backup;
RMAN> sql 'alter system archive log current';
RMAN> sql 'alter system checkpoint';
RMAN> backup as compressed backupset full database plus archivelog delete input;

05. Criar o arquivo de parametros para nosso novo banco

No nosso cenário, nossa nova base se chamará duplprod. O arquivo de parâmetros do nosso novo banco poderá ser uma cópia do nosso banco de origem (prod). Para efeito de termos técnicos, a Oracle denomina nosso banco de origem (prod) como target.

$export ORACLE_SID=prod
$sqlplus

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Aug 24 07:40:04 2010

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Enter user-name: sys as sysdba
Enter password:

Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production
With the Partitioning, OLAP and Data Mining Scoring Engine options

SQL> create pfile='$ORACLE_HOME/dbs/initduplprod.ora' from spfile;

File created.
SQL> exit

$cd $ORACLE_HOME/dbs
$ls -ltr *duplprod*
-rw-r--r-- 1 oracle oinstall 1165 Aug 24 07:40 initduplprod.ora

Bom, pessoal, o arquivo de parâmetros do novo banco (duplprod) está criado, porém precisamos realizar algumas alterações.

Basta editar o arquivo e adicionar alguns parâmetros. No meu caso, utilizarei o vi do Unix.

06. Alterando os parâmetros do novo arquivo initduplprod.ora

  • Alterar os respectivos parâmetros referentes aos diretórios *dest para o novo local.

Por exemplo:

Antes

*.audit_file_dest='/u01/app/oracle/base10g/admin/prod/adump'

Depois

*.audit_file_dest='/u01/app/oracle/base10g/admin/duplprod/adump'

Segue a lista dos parâmetros que deverão ser alterados:

audit_file_dest='/u01/app/oracle/base10g/admin/duplprod/adump'
background_dump_dest='/u01/app/oracle/base10g/admin/duplprod/bdump'
user_dump_dest='/u01/app/oracle/base10g/admin/prod/udump'
core_dump_dest='/u01/app/oracle/base10g/admin/duplprod/cdump'
control_files='+DADOS/duplprod/controlfile/control01.ctl'
dbname='duplprod'
instance_name='duplprod'

Segue o meu arquivo como exemplo.

java_pool_size=16777216
large_pool_size=16777216
shared_pool_size=352321536
streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/base10g/admin/duplprod/adump'
*.background_dump_dest='/u01/app/oracle/base10g/admin/duplprod/bdump'
*.compatible='10.2.0.3.0'
*.control_files='+DADOS/duplprod/controlfile/control01.ctl'
*.core_dump_dest='/u01/app/oracle/base10g/admin/duplprod/cdump'
*.db_block_size=8192
*.db_create_file_dest='+DADOS'
*.db_create_online_log_dest_1='+DADOS'
*.db_create_online_log_dest_2='+FLASH'
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='duplprod'
*.instance_name='duplprod'
*.db_recovery_file_dest='+FLASH'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=prodXDB)'
*.job_queue_processes=10
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST'
*.log_archive_format='%t_%s_%r.dbf'
*.open_cursors=300
*.pga_aggregate_target=848297984
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=1610612736
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/base10g/admin/prod/udump'

07. Criar os diretórios referentes aos parâmetros do banco *dest para o novo banco (duplprod)

mkdir -p /u01/app/oracle/base10g/admin/duplprod/cdump
mkdir -p /u01/app/oracle/base10g/admin/duplprod/dpdump
mkdir -p /u01/app/oracle/base10g/admin/duplprod/pfile
mkdir -p /u01/app/oracle/base10g/admin/duplprod/bdump
mkdir -p /u01/app/oracle/base10g/admin/duplprod/udump
mkdir -p /u01/app/oracle/base10g/admin/duplprod/adump

08. Criar o arquivo de senhas para o novo banco

$export NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
$export ORACLE_SID=duplprod
$orapwd file=$ORACLE_HOME/dbs/orapwduplprod password=oracle entries=10

Obs: Lembrando que isso é um teste de conceito, por isso eu coloquei senha oracle.

09. Fazendo o startup da instância do novo banco

$sqlplus

SQL*Plus: Release 10.2.0.3.0 - Production on Tue Aug 24 14:09:20 2010

Copyright (c) 1982, 2006, Oracle. All Rights Reserved.

Enter user-name: sys as sysdba
Enter password:
Connected to an idle instance.
SQL> startup nomount pfile='$ORACLE_HOME/dbs/initduplprod.ora'
ORACLE instance started.

Total System Global Area 1610612736 bytes
Fixed Size 2073088 bytes
Variable Size 385879552 bytes
Database Buffers 1207959552 bytes
Redo Buffers 14700544 bytes

Obs: Depois que o startup nomount for feito, dar um exit dessa sessão, senão o Oracle não irá iniciar o duplicate.

10. Criem uma entrada no tnsnames do banco target (origem), que será duplicado, no nosso caso será prod

11. Escolhendo o ponto de duplicação do banco

$export ORACLE_SID=prod
$rman target / nocatalog

Recovery Manager: Release 10.2.0.3.0 - Production on Tue Aug 24 14:14:36 2010

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

connected to target database: PROD (DBID=139616651)
using target database control file instead of recovery catalog

RMAN> list backup of database;


List of Backup Sets
===================

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
2 Full 162.57M DISK 00:00:26 23-AUG-10
BP Key: 2 Status: AVAILABLE Compressed: YES Tag: TAG20100823T090039
Piece Name: /u03/backup/prod/backup_db_PROD_S_2_P_1_T_727779639
List of Datafiles in backup set 2
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 501993 23-AUG-10 +DADOS/prod/datafile/system.278.727778321
2 Full 501993 23-AUG-10 +DADOS/prod/datafile/undotbs1.283.727778325
3 Full 501993 23-AUG-10 +DADOS/prod/datafile/sysaux.282.727778327
4 Full 501993 23-AUG-10 +DADOS/prod/datafile/users.289.727778329

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
6 Full 80.63M DISK 00:00:14 24-AUG-10
BP Key: 6 Status: AVAILABLE Compressed: YES Tag: TAG20100824T073250
Piece Name: /u03/backup/prod/backup_db_PROD_S_6_P_1_T_727860770
List of Datafiles in backup set 6
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 541554 24-AUG-10 +DADOS/prod/datafile/system.278.727778321
2 Full 541554 24-AUG-10 +DADOS/prod/datafile/undotbs1.283.727778325
3 Full 541554 24-AUG-10 +DADOS/prod/datafile/sysaux.282.727778327
4 Full 541554 24-AUG-10 +DADOS/prod/datafile/users.289.727778329

Eu escolhi o último checkpoint, que é 541554, o de vocês será diferente do meu; guardem essa informação.

12. Conectando no rman da base target (prod)

$export ORACLE_SID=duplprod
$rman target sys/oracle@prod nocatalog

Recovery Manager: Release 10.2.0.3.0 - Production on Tue Aug 24 14:38:52 2010

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

connected to target database: PROD (DBID=139616651)
using target database control file instead of recovery catalog

RMAN> connect auxiliary /

connected to auxiliary database: DUPLPROD (not mounted)

13. Iniciando o duplicate

Nesse momento, iremos definir o checkpoint anotado no step 10,

run {
set until scn 541554;
allocate channel ch1 type disk;
allocate auxiliary channel ch2 type disk;
duplicate target database to duplprod;
}


Modified 30-JUN-2010 Type BULLETIN Status PUBLISHED

Daqui para frente, várias mensagens referentes ao status da duplicação vão aparecer.

Bom, pessoal, é isso aí, espero que você tenham gostado e que aproveitem bastante esse recurso!

Um forte abraço e até a próxima.