Criando pontos de restauração para o banco de dados Oracle utilizando snapshots do Oracle Solaris ZFS

Por Yenugula Venkata Ravikumar Oracle ACE, Adrian Neagu (OCM) e Alex Zaballa Oracle ACE Director
Postado em Setembro 2016

Revisado por Marcelo Pivovar - Solution Architect

Snapshots ZFS constituem uma tecnologia muito útil que pode ser utilizada para restores do tipo point in time.

Preparação do Ambiente:

Banco de Dados de Origem:
Sistema Operacional:    Oracle Virtual Box com Solaris 11.3 x86-64
Banco de dados:           Oracle Database 12c v12.1.0.2.0
Hostname:                     orcl1
Endereço IP:                192.168.1.11

Banco de Dados de Destino:
Sistema Operacional:    Oracle Virtual Box com Solaris 11.3 x86-64
Banco de dados:           Oracle Database 12c v12.1.0.2.0
Hostname:                     orcl2
Endereço IP:                 192.168.1.12

Configuração da Máquina Virtual:

Você pode optar por importar a imagem da máquina virtual conforme este link ou instalar o Oracle Solaris 11.2/11.3 ISO do zero conforme este link. O hostname deve ser orcl1.

Após instalar e configurar a primeira máquina virtual; clone a mesma, a fim de obtermos duas máquinas virtuais idênticas.

Adicione um adaptador de rede do tipo Bridged Adapter nas duas máquinas virtuais.

E adicione dois ou mais discos nas duas máquinas virtuais. Estes discos serão utilizados na criação do ZFS pool, onde um será utilizado para os binários da instalação do banco de dados Oracle e o outro para os arquivos da instância do banco de dados Oracle.


Configuração da Rede:

Primeiro será necessário alterar o hostname da máquina virtual clonada de orcl1 para orcl2:

root@orcl2:~# svccfg -s system/identity:node setprop config/nodename="orcl2"
root@orcl2:~# svccfg -s system/identity:node refresh
root@orcl2:~# svcadm restart system/identity:node

 

Defina o endereço IP para as duas máquinas virtuais:

root@orcl1:~# netadm enable -p ncp DefaultFixed
root@orcl1:~# ipadm create-ip net1
root@orcl1:~# ipadm create-addr -T static -a local=192.168.1.11/24 net1/addr
root@orcl2:~# netadm enable -p ncp DefaultFixed
root@orcl2:~# ipadm create-ip net1
root@orcl2:~# ipadm create-addr -T static -a local=192.168.1.12/24 net1/addr

 

Adicione no arquivo /etc/hosts de ambas as máquinas o ip e o hostname:

192.168.1.12 orcl2
192.168.1.11 orcl1

 

Para testar a configuração de rede, podemos utilizar o comando ping:

root@orcl2:~# ping orcl1
orcl1 is alive
root@orcl1:~# ping orcl2
orcl2 is alive

 

Mais informações sobre a configuração de rede no Solaris podem ser vistas aqui.

Instalação do Oracle:

Crie os grupos oinstall, dba e o usuário oracle nas duas máquinas virtuais:

root@orcl1:~# groupadd -g 1001 oinstall
root@orcl1:~# groupadd -g 1002 dba
root@orcl1:~# useradd -d /export/home/oracle -m -s /bin/bash -u 1003 -g oinstall -G dba oracle

 

Defina os parâmetros de kernel:

root@orcl1:~# projadd user.oracle
root@orcl1:~# projmod -U oracle -sK "process.max-file-descriptor=(basic,65536,deny)"  user.oracle
root@orcl1:~# projmod -U oracle -sK "project.max-shm-memory=(priv,6G,deny)"  user.oracle

 

Instale os pacotes obrigatórios:

root@orcl1:~# pkg install oracle-rdbms-server-12cR1-preinstall
           Packages to install:  1
       Create boot environment: No
Create backup boot environment: No
DOWNLOAD                                PKGS   FILES   XFER(MB)  SPEED
Completed                                1/1   3/3    0.0/0.0  6.1k/s
PHASE                                          ITEMS
Installing new actions                        14/14
Updating package state database                Done 
Updating package cache                          0/0 
Updating image state                           Done 
Creating fast lookup database                  Done 
Updating package cache                         1/1

 

Configuração do Storage:

Utilize o comando format para verificar os nomes dos discos virtuais:

root@orcl2:~# format 
Searching for disks...done
AVAILABLE DISK SELECTIONS:
       0. c2t0d0 <ATA-VBOX HARDDISK-1.0-109.31GB>
          /pci@0,0/pci8086,2829@1f,2/disk@0,0
       1. c3t0d0 <VBOX-HARDDISK-1.0 cyl 26696 alt 2 hd 255 sec 63>
          /pci@0,0/pci1000,8000@14/sd@0,0
       2. c3t1d0 <VBOX-HARDDISK-1.0 cyl 37467 alt 2 hd 255 sec 63>
          /pci@0,0/pci1000,8000@14/sd@1,0

 

O primeiro disco é atribuído ao root pool ou rpool, criado na instalação do Solaris:

root@orcl2:~# zpool status 
  pool: rpool
 state: ONLINE
  scan: none requested
config:
         NAME      STATE     READ WRITE CKSUM
         rpool     ONLINE       0     0     0
         c2t0d0    ONLINE       0     0     0
errors: No known data errors

 

Defina dois pools ZFS nas duas máquinas virtuais, utilizando os dispositivos virtuais c3t0d0 e c3t1d1:

root@orcl1:~# zpool create orapool1 c3t0d0
root@orcl1:~# zpool create orapool2 c3t1d0
root@orcl2:~# zpool create orapool1 c3t0d0
root@orcl2:~# zpool create orapool2 c3t1d0



Crie em ambas as máquinas virtuais o sistema de arquivos e o ponto de montagem para os binários do banco de dados Oracle:

root@orcl1:~# zfs create -o mountpoint=/u01 orapool1/u01
root@orcl2:~# zfs create -o mountpoint=/u01 orapool1/u01

 

Crie o sistema de arquivos e os pontos de montagem para os datafiles do banco de dados Oracle e para a fast recovery area na primeira máquina virtual (orcl1):

root@orcl1:~# zfs create -o recordsize=8k -o mountpoint=/u02/oradata orapool2/oradata
root@orcl1:~# zfs create -o mountpoint=/u02/fast_recovery_area
orapool2/fast_recovery_area
root@orcl1:~# zfs set logbias=throughput orapool2/oradata

 

Defina como dono do diretório o usuário oracle e o grupo oinstall:

root@orcl1:~# chown -R oracle:oinstall /u01
root@orcl1:~# chown -R oracle:oinstall /u02
 

Instale os binários do banco de dados Oracle em ambas as máquinas virtuais.

Utilize /u01/app/oracle/product/12.2.0/dbhome_1 como ORACLE_HOME.

Após a instalação, crie o banco de dados ORCL na primeira máquina virtual (orcl1).

Crie os datafiles em /u02/oradata e aponte a fast recovery area para /u02/fast_recovery_area.

Após isso, replique os arquivos abaixo para a segunda máquina virtual:

/u01/app/oracle/product/12.1.0/dbhome_1/dbs$ scp *ORCL* orcl2:/u01/app/oracle/product/12.1.0/dbhome_1/dbs
The authenticity of host 'orcl2 (192.168.1.12)' can't be established.
RSA key fingerprint is 3a:88:72:f6:6f:3b:da:84:2f:18:04:21:a5:7e:5d:ca.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'orcl2,192.168.1.12' (RSA) to the list of known hosts.
Password: 
Password: 
orapwORCL            100% |*****************************|  7680       00:00    
spfileORCL.ora       100% |*****************************|  2560       00:00

 

Restore do tipo In-place point in time

Como o modo de consistência do Oracle é diferente do modo de consistência do ZFS, antes de realizar a criação de um snapshot, faça shutdown do banco de dados ou suspenda a escrita através do comando ALTER SYSTEM SUSPEND.

Para nosso exemplo, faça shutdown do banco de dados e com o usuário root crie um snapshot:

root@orcl1:~# zfs snapshot -r orapool2@ora1
root@orcl1:~# zfs list -t snapshot 
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
orapool2@ora1                                   0      -    31K  -
orapool2/controlfiles@ora1                      0      -    31K  -
orapool2/fast_recovery_area@ora1             155K      -   104M  -
orapool2/oradata@ora1                         46K      -  2.87G  -
rpool/ROOT/solaris@install                  55.0M      -  2.67G  -
rpool/ROOT/solaris@2016-05-14-13:51:30      65.5M      -  2.76G  -
rpool/ROOT/solaris/var@install               110M      -   219M  -
rpool/ROOT/solaris/var@2016-05-14-13:51:30   701M      -   896M  -

 

Em seguida, vamos abrir o banco de dados e fazer algumas mudanças. Vamos criar uma tabela, um índice e adicionar dados.

SQL> create table scott.test (id number,name varchar2(20);
Table created.
 SQL> create index scott.indx_test on scott.test(id);
ndex created.
 SQL> declare 
  2  i number;
  3  begin 
  4  for i in 1..2000000
  5  loop 
  6  execute immediate 'insert into scott.test values(:v,''X'')' using i;
  7  end loop;
  8  commit;
  9  end;
 10  /
 PL/SQL procedure successfully completed.

 

Faça shutdown do banco de dados e execute o restore/clone do snapshot ora1 para o file system conforme abaixo:

root@orcl1:~# zfs clone -o mountpoint=/u02/oradata1 orapool2/oradata@ora1 orapool2/oradata1
root@orcl1:~# zfs clone -o mountpoint=/u02/oradata1 orapool2/fast_recovery_area@ora1 orapool2/fast_recovery_area

 

Agora possuímos 2 bancos de dados no file system. Para utilizar o banco de dados clonado/restaurado, devemos redirecionar o u02/oradata para /u02/oradata1.

Coloque o banco de dados em nomount state e crie um arquivo de parâmetros baseado no spfile.

SQL> startup nomount;

SQL> create pfile from spfile;
 


Troque os caminhos conforme abaixo:

SQL> startup force mount pfile=$ORACLE_HOME/dbs/initORCL.ora

SQL> alter database rename file '/u02/oradata/ORCL/system01.dbf' to '/u02/oradata1/ORCL/system01.dbf';
Database altered.

SQL> alter database rename file '/u02/oradata/ORCL/sysaux01.dbf' to '/u02/oradata1/ORCL/sysaux01.dbf';
Database altered.

SQL> alter database rename file '/u02/oradata/ORCL/users01.dbf' to '/u02/oradata1/ORCL/users01.dbf';
Database altered.

SQL> alter database rename file '/u02/oradata/ORCL/users01.dbf' to '/u02/oradata1/ORCL/users01.dbf';
Database altered.

SQL> alter database rename file '/u02/oradata/ORCL/undotbs01.dbf' to '/u02/oradata1/ORCL/undotbs01.dbf'
Database altered.

SQL> alter database rename file '/u02/oradata/ORCL/example01.dbf' to '/u02/oradata1/ORCL/example01.dbf'
Database altered.

SQL> select name from v$datafile;
NAME ------------------------------------ /u02/oradata1/ORCL/system01.dbf /u02/oradata1/ORCL/sysaux01.dbf /u02/oradata1/ORCL/undotbs01.dbf /u02/oradata1/ORCL/example01.dbf /u02/oradata1/ORCL/users01.dbf

 

Inicialize a instância ORCL e verifique a inexistência da tabela de testes:

SQL> alter database open;
Database altered.

SQL> select count(*) from scott.test;
     select count(*) from scott.test
 *
ERROR at line 1:
ORA-00942: table or view does not exist
SQL>

Replicação e restore de um ZFS snapshot

Um ZFS snapshot pode ser enviado para um local remoto para termos uma cópia de segurança em caso de algum desastre.

Para enviar o snapshot para a outra máquina virtual:

root@orcl1:~#  zfs send –r orapool@ora1 | ssh orcl2 zfs recv orapool2/ora
 

Para verificar o snapshot enviado:

root@orcl2:~# zfs list -t snapshot 
NAME                                         USED  AVAIL  REFER  MOUNTPOINT
orapool2@ora1                                   0      -    31K  -
orapool2/ora/fast_recovery_area@ora1            0      -   104M  -
orapool2/ora/oradata@ora1                       0      -  2.87G  -
rpool/ROOT/solaris@install                  55.0M      -  2.67G  -
rpool/ROOT/solaris@2016-05-14-13:51:30      65.5M      -  2.76G  -
rpool/ROOT/solaris/var@install               110M      -   219M  -
rpool/ROOT/solaris/var@2016-05-14-13:51:30   701M      -   896M  -
root@orcl2:~#

 

Restaure o snapshot utilizando a opção clone:

root@orcl2:/u02/oradata# zfs clone -o recordsize=8k   
-o mountpoint=/u02/oradata orapool2/ora/oradata@ora1 orapool2/oradata
root@orcl2:/u02/oradata# zfs clone -o recordsize=1M
-o mountpoint=/u02/fast_recovery_area orapool2/ora1/fast_recovery_area@ora1 orapool2/fast_recovery_area

 

No host orcl1, crie outro snapshot. Este snapshot irá conter a tabela de testes:

root@orcl1:~# zfs snapshot -r orapool2@snap1

Envie o snapshot incremental para a outra máquina virtual:

root@orcl1:~# zfs send -i –r orapool2@ora1 orapool2@snap1 | ssh orcl2 zfs recv -F orapool2/ora

 

Restaure o snapshot replicado na outra máquina virtual:

root@orcl2:~# zfs destroy –f orapool2/oradata
root@orcl2:~# zfs destroy –f orapool2/fast_recovery_area
root@orcl2:/u02/oradata# zfs clone -o recordsize=8k   
-o mountpoint=/u02/oradata orapool2/snap1/oradata@ora1 orapool2/oradata
root@orcl2:/u02/oradata# zfs clone -o recordsize=1M
-o mountpoint=/u02/fast_recovery_area orapool2/snap1/fast_recovery_area@ora1 orapool2/fast_recovery_area
root@orcl2:/u02/oradata# zfs set logbias=throughput orapool2/fast_recovery_area

 

Inicialize a instância ORCL e verifique a existência da tabela de testes:

SQL> startup 
ORACLE instance started.
Total System Global Area            734003200 bytes
Fixed Size                          3007984 bytes
Variable Size                       301992464 bytes
Database Buffers                    423624704 bytes
Redo Buffers                        5378048 bytes
Database mounted.
Database opened.

SQL> select count(*) from scott.test;

COUNT(*)
----------------
2000002



Yenugula Venkata Ravikumar é um DBA com mais de 15 anos de experiencia com Oracle e em ambientes de alta disponibilidade (RAC, Data Guard, dentre outros), tuning e desempenho, migrações, backup e recover, Oracle Exadata X2 e X3, é Expert em sistemas operacionais tais como como AIX, HP-UX e Linux. Já participou como conferencista de Oracle pela India, onde mora atualmente. Obteve o título de "Oracle Certified Master (OCM 10g)" em 2009.

Adrian Neagu é um DBA com mais de 15 anos de experiência em diversas tecnologias de banco de dados. Ele é Oracle Certified Master 10g e 11g, Oracle Certified Professional 9i, 10g, e 11g, Cloudera Certified Administrator for Apache Hadoop, IBM DB2 Certified Administrator version 8.1.2 e 9, IBM DB2 9 Advanced Certified Administrator 9, e Sun Certified System Administrator Solaris 10.

Alex Zaballa, formado em Análise de Sistemas, é especialista em Banco de Dados Oracle com sólidos conhecimentos em Servidores de Aplicação e Sistemas Operacionais; trabalha com Oracle há 15 anos, é Oracle ACE Director, certificado OCM Database 12c/11G/Cloud e conta com mais de 200 outras certificações em produtos da Oracle. Alex também é membro do Groupo de Usuários Oracle do Brasil (GUOB), fundador do Grupo de Usuários Oracle de Angola (GUOA) e membro do time OraWorld.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.