Por Yenugula Venkata Ravikumar , Adrian Neagu (OCM) e Alex Zaballa
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.
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
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.
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.
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
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
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>
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.