ORACLE: Como criar um Standby Database
- Siltech Consult
- 7 de out. de 2019
- 6 min de leitura
Dúvida: Como fazer a criação de um banco de Standby com Oracle Standard Edition ?
Existem duas formas de criarmos um base de Standby para o Oracle. A melhor e mais prática é usando o DataGuard. A sua replicação da produção para a base de Standby é automática, inclusive pode-se configurar vários níveis de replicação. Como por exemplo, posso GARANTIR que CASO o standby não esteja atualizado a própria produção aguarde até esta atualização, ou então posso deixar o DataGuard livre para que não ofereça problemas de performance para a produção e continue sua atualização de forma `assincrona`. A forma como iremos configurar a base de DataGuard depende das necessidades e da disponibilidade de recursos da empresa.
O único problema do DataGuard é o preço. Ele exige que o licenciamento do Banco seja ENTERPRISE e além disso o cliente tem que adquirir uma option chamada DataGuard.
Existe uma outra forma de implementarmos a idéia do Standby porém, em ambiente com licença Standard. É o Basic Standby. A única desvantagem é que tudo tem que ser feito manualmente. É claro que podemos otimizar a cópia dos archives e a aplicação dos mesmos através de script. Mas, deve-se acompanhar se o mesmo está sendo atualizado de forma correta rotineiramente.
Como criar então este Basic Standby ?
1) Em primeiro lugar, deve-se usar um backup recente. Gosto do uso do RMAN pois facilita e muito no backup e no restore. (para verificar como fazer um backup consulte o link ‘Backup Básico com RMAN‘.
2) O servidor onde será criado o standby tem que ter o Oracle Instalado na mesma versão da base de produção e espaço disponível suficiente.
3) Crie um arquivo de inicialização para o banco de standby. Pode-se usar como modelo o arquivo de inicialização da própria base de produção alterando os seguintes parametros:
*.cluster_database=false ## o banco anterior era em cluster
*.control_files='+DGDATA01','DGDATA02' ## deixo apenas o DiskGroup
*.db_create_file_dest='+DGDATA01' ## Local default para criação
*.db_create_online_log_dest_1='+DGDATA01' ## idem anterior
*.db_name='orcl' ## Preferencialmente manter o MESMO da produção
*.db_recovery_file_dest='+DGDATA02' ## pode ser qualquer caminho
*.db_recovery_file_dest_size=83886080000
*.instance_name='stdby' ## Coloco nome diferente na Instance
stdby.instance_number=1
*.log_archive_dest_1='LOCATION=/u02/app/oracle/oradata/orcl/archive'
*.pga_aggregate_target=512m ## deixo valor bem menor
*.processes=200 ## deixo menor que a produção
*.sessions=235 ## deixo menor que a produção
*.sga_target=1g ## deixo menor que a produção
*.standby_file_management='AUTO'
stdby=1
stdby='UNDOTBS1'
4) Crio os diretórios necessários, no caso (/u02/app/oracle/oradata/orcl/archive e bdump, cdump, udump, adump do /opt/app/oracle/admin/orcl)
5) Subo a base de Stanbdy no modo nomount, crio um spfile à partir do init gerado e restart na base:
[oracle@node1 dbs]$ export ORACLE_SID=stdby
[oracle@node1 dbs]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Wed Dec 14 11:52:20 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> connect sys as sysdba
Enter password:
Connected to an idle instance.
SQL> startup pfile=initstdby.ora nomount
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size 2163176 bytes
Variable Size 264306200 bytes
Database Buffers 801112064 bytes
Redo Buffers 6160384 bytes
SQL> create spfile from pfile='$ORACLE_HOME/dbs/initstdby.ora';
File created.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size 2163176 bytes
Variable Size 264306200 bytes
Database Buffers 801112064 bytes
Redo Buffers 6160384 bytes
SQL>
6) Configure o tnsnames.ora para pode se conectar na base de produção corretamente à partir do servidor de standby;
7) Crie um controlfile de Standby na produção e copie o mesmo para o mesmo caminho no servidor de standby:
[oracle@node3 ~]$ rm stdby.ctl
[oracle@node3 ~]$ rman target / catalog rman/rman@rmandb
Recovery Manager: Release 10.2.0.5.0 - Production on Wed Dec 14 12:02:26 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
connected to target database: ORCL (DBID=634009186)
connected to recovery catalog database
RMAN> backup current controlfile for standby format '/home/oracle/stdby.ctl';
Starting backup at 14-DEC-11
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=492 instance=ORCL1 devtype=DISK
channel ORA_DISK_1: starting full datafile backupset
channel ORA_DISK_1: specifying datafile(s) in backupset
including standby control file in backupset
channel ORA_DISK_1: starting piece 1 at 14-DEC-11
channel ORA_DISK_1: finished piece 1 at 14-DEC-11
piece handle=/home/oracle/stdby.ctl tag=TAG20111214T120234 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:02
Finished backup at 14-DEC-11
RMAN>
[oracle@node3 ~]$ scp stdby.ctl node1:/home/oracle/.
stdby.ctl 100% 18MB 18.2MB/s 00:01
[oracle@node3 ~]$
8) Faça a conexão no servidor de Standby com target = produção e auxiliary = standby e execute o duplicate:
[oracle@node1 admin]$ rman
Recovery Manager: Release 10.2.0.5.0 - Production on Wed Dec 14 12:01:03 2011
Copyright (c) 1982, 2007, Oracle. All rights reserved.
RMAN> connect target sys/senha@orcl1
connected to target database: ORCL (DBID=634009186)
RMAN> connect auxiliary /
connected to auxiliary database: ORCL (not mounted)
RMAN> connect catalog rman/rman@rmandb
connected to recovery catalog database
RMAN> duplicate target database for standby;
Starting Duplicate Db at 14-DEC-11
allocated channel: ORA_AUX_SBT_TAPE_1
channel ORA_AUX_SBT_TAPE_1: sid=218 devtype=SBT_TAPE
channel ORA_AUX_SBT_TAPE_1: Data Protection for Oracle: version 5.5.1.0
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=217 devtype=DISK
contents of Memory Script:
{
restore clone standby controlfile;
sql clone 'alter database mount standby database';
}
executing Memory Script
Starting restore at 14-DEC-11
using channel ORA_AUX_SBT_TAPE_1
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backupset restore
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: reading from backup piece /home/oracle/stdby.ctl
channel ORA_AUX_DISK_1: restored backup piece 1
piece handle=/home/oracle/stdby.ctl tag=TAG20111214T120234
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
output filename=+DGDATA01/orcl/controlfile/current.393.769867567
output filename=+DGDATA02/orcl/controlfile/current.256.769867573
Finished restore at 14-DEC-11
sql statement: alter database mount standby database
contents of Memory Script:
{
set newname for clone tempfile 1 to new;
switch clone tempfile all;
(...)
restore
check readonly
clone database
;
}
executing Memory Script
executing command: SET NEWNAME
renamed temporary file 1 to +DGDATA01 in control file
(...)
Starting restore at 14-DEC-11
using channel ORA_AUX_SBT_TAPE_1
using channel ORA_AUX_DISK_1
channel ORA_AUX_SBT_TAPE_1: starting datafile backupset restore
channel ORA_AUX_SBT_TAPE_1: specifying datafile(s) to restore from backup set
restoring datafile 00003 to +DGDATA01
restoring datafile 00006 to +DGDATA01
restoring datafile 00008 to +DGDATA01
(...)
channel ORA_AUX_SBT_TAPE_1: reading from backup piece ORCL2_DIA_FULL_5pmu5ebi_1_1_ORCLxxxxx
(...)
restoring datafile 00001 to +DGDATA01
Finished restore at 14-DEC-11
RMAN>
9) Copio todos os archives desde a realização do Backup usado até o momento atual (neste ponto deve-se colocar um script para copiar automaticamente, de preferência a cada 15 minutos);
10) Executo os comandos necessários para aplicação dos archives no ambiente de standby:
SQL*Plus: Release 10.2.0.5.0 - Production on Wed Dec 14 16:41:33 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> connect sys as sysdba
Enter password:
Connected to an idle instance.
SQL> startup nomount
ORACLE instance started.
Total System Global Area 1073741824 bytes
Fixed Size 2163176 bytes
Variable Size 264306200 bytes
Database Buffers 801112064 bytes
Redo Buffers 6160384 bytes
SQL> alter database mount standby database;
Database altered.
SQL> recover automatic standby database;
ORA-00279: change 5440678211 generated at 12/14/2011 02:35:31 needed for thread
2
ORA-00289: suggestion :
/u02/app/oracle/oradata/orcl/archive/2_5460_754175650.dbf
ORA-00280: change 5440678211 for thread 2 is in sequence #5460
ORA-00278: log file '/u02/app/oracle/oradata/orcl/archive/2_5460_754175650.dbf'
no longer needed for this recovery
(...)
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log
'/u02/app/oracle/oradata/rte/archive/2_5475_754175650.dbf'
ORA-27037: unable to obtain file status
LINUX_PPC64 Error: 2: No such file or directory
Additional information: 3
O último erro ocorrido (falta do archive 5475) é esperado pois o mesmo ainda não havia sido gerado na produção.
11) A atividade acima, também deve ser automatizada através de scripts;
12) Por último, caso queira, pode-se fazer um teste de leitura. No caso, vou criar um tabela, inserir dados nela na produção, forçar a geração de archives e ativar os scripts que usei para atualização do standby.
[oracle@orasrv04rterao ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.5.0 - Production on Wed Dec 14 16:55:13 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> connect sys as sysdba
Enter password:
Connected.
SQL>
SQL> create table silverio (codigo number, nome varchar2(30));
Table created.
SQL> insert into silverio values (1, 'Ronaldo');
1 row created.
SQL> insert into silverio values (2, 'Danilo');
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL>
[oracle@node1 archive]$ /home/oracle/bin/archive.sh
receiving file list ... done
1_5705_754175650.dbf
1_5706_754175650.dbf
1_5707_754175650.dbf
1_5708_754175650.dbf
2_5476_754175650.dbf
2_5477_754175650.dbf
2_5478_754175650.dbf
2_5479_754175650.dbf
2_5480_754175650.dbf
2_5481_754175650.dbf
2_5482_754175650.dbf
2_5483_754175650.dbf
2_5484_754175650.dbf
2_5485_754175650.dbf
2_5486_754175650.dbf
sent 350 bytes received 288929042 bytes 12841306.31 bytes/sec
total size is 2500591616 speedup is 8.65
[oracle@node1 archive]$ /home/oracle/bin/recover.sh
SQL*Plus: Release 10.2.0.5.0 - Production on Wed Dec 14 16:59:49 2011
Copyright (c) 1982, 2010, Oracle. All Rights Reserved.
SQL> Connected.
SQL>
SYSDATE
-------------------
14/12/2011 16:59:49
SQL>
ORA-00279: change 5445990628 generated at 12/14/2011 16:59:23 needed for thread
1
ORA-00289: suggestion :
/u02/app/oracle/oradata/orcl/archive/1_5710_754175650.dbf
ORA-00280: change 5445990628 for thread 1 is in sequence #5710
ORA-00278: log file '/u02/app/oracle/oradata/orcl/archive/1_5710_754175650.dbf'
no longer needed for this recovery
ORA-00308: cannot open archived log
'/u02/app/oracle/oradata/orcl/archive/1_5710_754175650.dbf'
ORA-27037: unable to obtain file status
LINUX_PPC64 Error: 2: No such file or directory
Additional information: 3
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log
'/u02/app/oracle/oradata/orcl/archive/1_5710_754175650.dbf'
ORA-27037: unable to obtain file status
LINUX_PPC64 Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log
'/u02/app/oracle/oradata/orcl/archive/1_5710_754175650.dbf'
ORA-27037: unable to obtain file status
LINUX_PPC64 Error: 2: No such file or directory
Additional information: 3
SQL> alter database open read only;
Database altered.
SQL> select * from silverio;
CODIGO NOME
---------- ------------------------------
1 Ronaldo
2 Danilo
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> quit
Pronto.
Dúvidas? silverio@siltechconsult.com.br
Comentarios