sexta-feira, 8 de agosto de 2014

Instalação do Oracle Linux para Banco de dados Oracle

É unânime nos Benchmark de comparativos entre Windows e Linux como S.O para Banco de Dados Oracle, que o Linux é melhor em desempenho. Apesar do ambiente Windows simplificar as tarefas de administração e atender muito bem vários clientes, fatalmente quando for administrar um grande banco de dados é o ambiente Linux que teremos que administrar.

Este é o primeiro artigo de uma série que pretendo escrever de Oracle em ambiente Linux, neste primeiro momento será mostrado como instalar e deixar preparado o S.O "Oracle Linux. No próximo será mostrado a instalação do Oracle em ambiente Linux.

A instalação será em um ambiente virtualizado, e sem mais delongas, vamos ao passo a passo para instalar o Oracle Linux 6.5 64 Bits.

1 - Ao iniciar o instalador, escolha a 1º opção para instalar e o iniciar a instalação do S.O, click  em "SKIP" para pular a validação do disco.




2 - Selecione o idioma, por padrão escolha inglês, vá em “Basic Storage Devices" para usar os discos locais da maquina,





3-Click em NEXT e escolha a opção “Fresh Installation”



4 - Depois seleciona o local – neste exemplo Cuiabá-MT; Brasil – click em “Create Custom Layout” para customizar as partições de discos.


5-Na área de customização, exclua todas as partições sugeridas, então click em “Create” para customizar o layout

6-Crie crie as partições, “/Boot” com 512 mega, este apenas para iniciar a maquina. A área de Swap com o mesmo tamanho da memória principal, neste exemplo 2Gb.
Como o disco é de 40Gb (em ambiente real isso é muito pouco), o “/” que é o Raiz é criado com 10Gb e os demais - cerca de 28GB - é a partição “/u01” para os binários e o Banco de dados Oracle.


7-Depois de configurar, escolha a opção de escrever no disco e feito isso, aceite as opções de inicialização do S.O

8 - Na configuração do S.O, seleciona o BASIC SERVER e marque a opção “Customize Now” para instalar os pacotes necessários para a versão do Oracle DataBase

9-Instale os pacotes conforme as imagens posteriores:






10-Depois basta instalar o S.O.


11-Configure as informações de Rede inserindo o IP, Gateway e DNS.  Abaixo tem um exemplo, mas estas informações deve atender a Rede onde Oracle está operando.


12-Desabilite o FireWall, recomendado pela Oracle - O Firewall deve estar a nivel de Rede e não do Host.

13- Agora é possivel acessar remotamente o Linux usando o PUTTY, sendo também a maneira mais acessada a partir de uma maquina windows. Use Xming na maquina Windows, isso irar permitir que a parte gráfica seja enviada para a maquina Windows no PUTTY de comando Linux.

14-Configure SELINUX :

[root@LXAGNUS ~]# vi /etc/selinux/config

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#       enforcing – SELinux security policy is enforced.
#       permissive – SELinux prints warnings instead of enforcing.
#       disabled – SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted – Only targeted network daemons are protected.
#       strict – Full SELinux protection.
SELINUXTYPE=targeted

15- Desabilitar os serviços desnecessários. Deve-se ativar o xMing (Windows)

[root@LXAGNUS ~]# system-config-services
AVAHI-DAEMON, BLUETOOTH, IP6TABLES, IPTABLES, MULTIPATHD, RHNSD,


16-Monte o disco de instalação do Oracle Linux 6.5

[root@LXAGNUS ~]# mount /dev/cdrom /mnt

17- Crie um diretório de repositório dos pacotes locais Linux, isso para não precisar pegar da NET, uma vez que foi realizada a cópia a partir da imagem do DVD. Copie os pacotes que estão no Disco do S.O para o diretório criado.

[root@LXAGNUS ~]# mkdir -p /root/stage/rpms
[root@LXAGNUS ~]# cd /mnt/Packages/
[root@LXAGNUS Packages]# cp * /root/stage/rpms/
[root@LXAGNUS Packages]# cd ..
[root@LXAGNUS mnt]# cp RPM-GPG-KEY-oracle /root/stage/rpms/
[root@LXAGNUS mnt]#  cd /mnt/Packages/
[root@LXAGNUS Packages]# cp oracle-rdbms-server-11gR2-preinstall-1.0-7.el6.x86_64.rpm /root/stage/rpms/

18-Vá para pasta onde tem os pacotes copiados

[root@LXAGNUS Packages]# cd /root/stage/rpms/

19-Instalar o pacote CreateRepo, com suas dependências.

[root@LXAGNUS rpms]# rpm -ivh createrepo-0.9.9-18.0.1.el6.noarch.rpm python-deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm deltarpm-3.5-0.5.20090913git.el6.x86_64.rpm
warning: createrepo-0.9.9-18.0.1.el6.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Preparing...                ########################################### [100%]
   1:deltarpm               ########################################### [ 33%]
   2:python-deltarpm        ########################################### [ 67%]
   3:createrepo             ########################################### [100%]
[root@LXAGNUS rpms]#

[root@LXAGNUS rpms]# createrepo -v /root/stage/rpms

20-Crie uma nova entrada no arquivo de repositório YUM e marque como 0 os gpgcheck e enabled as outras entradas.

[root@LXAGNUS rpms]# cd /etc/yum.repos.d/
[root@LXAGNUS yum.repos.d]# cd /etc/yum.repos.d/
[root@LXAGNUS yum.repos.d]# vi public-yum-ol6.repo

[local_ol65_UEK]
name=Unbreakable Enterprise Kernel for Oracle Linux 65
baseurl=file:///root/stage/rpms
gpgkey=file:///root/stage/rpms/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

21 - Atualize o catalogo do YUM

[root@LXAGNUS yum.repos.d]# yum clean all
[root@LXAGNUS yum.repos.d]# yum repolist

22-Adicionar os comandos abaixo no arquivo  /etc/profile

if [ $USER = "oracle" ]; then
if [ $SHELL = "bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi

23-Adicione o nome da maquina no arquivo de hosts do Linux

[root@OLXAGNUS yum.repos.d]# vi /etc/hosts
[root@OLXAGNUS yum.repos.d]# more /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.91.131 OLXAGNUS

24-INSTALAR O PACOTE DE PRÉ-CONFIGURAÇÃO DO ORACLE 11GR2

[root@OLXAGNUS yum.repos.d]# yum install oracle-rdbms-server-11gR2-preinstall


Pronto, seu Linux já esta pronto para instalar o Oracle, pois todo o processo de criar usuario Oracle e grupo e ainda já temos os parametros do kernel já configurado. 

No próximo artigo vamos instalar o Oracle no Linux.

segunda-feira, 28 de julho de 2014

Criando um Banco de Teste D-1


Quantas vezes um DBA precisou criar um mais um Banco de Dados de teste ou atualizar os dados deste a partir de produção, pois os desenvolvedores não consegue realizar seus testes no Banco de Dados de teste, porque este encontra-se muito defasado com de Produção.

E comum em muitos sistemas, tem periodos onde é realizada várias atividade que identifica que mudou o periodo. E infelizmente para os desenvolvedores o banco de dados de teste encontra-se com os dados do periodo anterior. Pode acontecer algum erro na base de produção e a equipe de desenvovimento/suporte não conseguir reproduzir o mesmo justamente por falta de dados.

Este artigo, visa justamente atender essa situação, é a criação de um banco de dados que terá os dados de apenas um dia de atraso, Por isso o nome D -1.

A idéia e ter um banco de todos os dias ele realizar um DROP no Banco de Dados e faz um Restore a partir do Backup de Produção.

Os passos são praticamente os mesmos da segunda parte do artigo "Backup & Recovery Parte 3 - Recuperação Incompleta" que é o tópico "Restaurando o Banco de Dados em Outro Servidor". Contudo naquele artigo foi apresentado passos que precisava da intervesão manual do DBA, neste artigo, no final dele, é resultar em um script que o processo será totalmente automático. E ainda neste exemplo para ilustração os diretorios de restauração será diferente, pois em um ambiente real isto pode perfeitamente acontecer.

Vale lembrar que para realizar este processo é preciso que o Banco de Produção esteja configurado para fazer Backup em Rede, como demostrado em "Backup & Recovery Parte 1 - Configurando o Banco Recuperação" e é interessante tem lidos os três artigos de Backup e Recovery.

Além disso é preciso realizar a configuração de AutoBackup do ControlFile em um diretorio da Rede, passo este que não apresentei nos artigos anteriores.

O resumo da operá consite basicamente :

   * DROPAR o Banco PROD D-1
   * Resturar o ControlFile
   * Resturar os DataFiles
   * Recuperar os DataFiles
   * Abrir o Banco de Dados com ResetLog's

Configurar o Banco de Produção Para AutoBackup do ControlFile

Logue no Rman, confirme os parametros, altere os parametros necessários e obtenha o DBID do banco de dados.

C:\>set oracle_sid=bdprod

C:\>rman target sys nocatalog

Gerenciador de Recuperação: Release 11.2.0.1.0 - Production on Seg Jul 28 16:30: 05 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

Senha do banco de dados de destino:
conectado ao banco de dados de destino: BDPROD (DBID=3924117592)
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação



RMAN> show all;
Os parâmetros de configuração de RMAN para o banco de dados com db_unique_name BDPROD são:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F';
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default
CONFIGURE MAXSETSIZE TO UNLIMITED; # default
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'D:\APP\C8757887\PRODUCT\11.2.0\DBHOME_1\DATABASE\SNCFBDAGNUS.ORA'; # default


RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '\\172.16.1.21\BCK_ORACLE\AUTOBACKUP\CF_%F';

Agora toda vez que o Banco de dados realizar o Backup, uma cópia do controlfile é feito no diretório de Rede compartilhado.

            Criandos os Script de Recriação do Banco de Teste.


Serão criados 5 arquivos, sendo 1 script CMD que pode ser chamado via agendador de tarefa e os demais contem tarefas especificas para cada passo da atualização.

1) Cria o arquivo CMD
Crie um arquivo com o nome "AtualizaBancoTESTE.cmd" (sugestão) e digite os comandos para invocar os arquivos/scripts que serão criados.

sqlplus sys/senhasecreta as sysdba @DropDataBase.txt
sqlplus sys/senhasecreta as sysdba @inicia_nomount.txt
rman target sys/senhasecreta nocatalog @ScriptRecover.txt
sqlplus sys/senhasecreta as sysdba @AbreBanco.txt

2)Criar o Arquivo DropDataBase.txt;

create pfile=C:\initBDPROD.ora' from spfile;
Shutdown immediate;
startup mount restrict pfile='C:\initBDPROD.ora';
drop database;

exit;

3)Criar o inicia_nomount.txt

startup nomount pfile='C:\initBDPROD.ora';

exit;

4) Criar o script ScriptRecover.txt.

Neste script deve ser informado o DBID do banco de dados de Produção e também o local onde está sendo feito o backup do controlfile.

Não será possivel realizar um restore completo, pois não temos o RedoLog, por isso setamos um restore incompleto, neste exemplo de 4 horas atras da atual.

Use o parametro DB_CREATE_FILE_DEST para indicar o diretorio onde deseja restaurar o banco de dados e comando " switch datafile all" para que o Oracle edite o controlfile com a nova localização.  

O script ficará assim:
run {
  set dbid=3924117592; 
  set controlfile autobackup format for device type disk to '\\172.16.1.21\BCK_ORACLE\AUTOBACKUP\CF_%F';';
  restore controlfile from autobackup;
  alter database mount;
  crosscheck backup;
  delete expired backup;
  set until time 'SYSDATE - 4/24';
  sql 'ALTER SYSTEM SET DB_CREATE_FILE_DEST="C:\app\ADMINISTRADOR\oradata"';
  set newname for database to NEW;
  restore database;
  switch datafile all;
  recover database;

   }

5)O ultimo passo é criar o AbreBanco.txt;
Neste arquivo você deve renomear os RedoLog para um diretorio válido do servidor de teste, recriar-los com Resetlogs e então para o modo Archivelog (o Banco de Teste não deve faze-lo).


alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\BDPROD\REDO01.LOG' to 'C:\app\ADMINISTRADOR\oradata\BDPROD\ONLINELOG\REDO01.LOG';
alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\BDPROD\REDO02.LOG' to 'C:\app\ADMINISTRADOR\oradata\BDPROD\ONLINELOG\REDO02.LOG';
alter database rename file 'D:\APP\ADMINISTRATOR\ORADATA\BDPROD\REDO03.LOG' to 'C:\app\ADMINISTRADOR\oradata\BDPROD\ONLINELOG\REDO03.LOG';
alter database open resetlogs;
shutdown immediate;
startup mount;
alter database noarchivelog;
alter database open;
create spfile from pfile='C:\initBDPROD.ora'';
alter system set log_archive_dest_1='' scope=spfile;
alter system set log_archive_dest_2='' scope=spfile;
shutdown immediate;
startup;
exit;

Pronto, agora toda vez que precisar do banco de teste atualizado basta executar o script. Caso precise de D-1 basta somente colocar no agendador de tarefa.

Até a próxima.



















quarta-feira, 12 de fevereiro de 2014

Enviar e-mail usando Oracle com G-mail.


   Muitas empresas estão usando os servidores de e-mail externo como o G-mail para uso de correios eletrônicos ao invés de montarem servidores para esta finalidade, isto reduz o custo de T.I.

   Ocorre que ao realizar esta mudança, pode acontecer que o sistema que enviava e-mail normalmente com o servidor SMTP local possa não mais funcionar, a razão é que o gmail exige conexão autenticada segura (preferencialmente via protocolo TLS) .

   Este foi o caso em que uma aplicação de um cliente mandava e-mail usando os pacote PL/SQL de envio de e-mail, e depois de usarem o g-mail a aplicação - mais especificamente o Oracle - não consegui mais enviar e-mail.

  Para criar uma conexão segura é preciso esta usando no mínimo o Oracle na versão 11.2.0.2 e além disso não esta disponível na versão XE. Sendo preciso criar um Oracle Wallet, como discorrido em http://arkatec.wordpress.com/2011/08/15/sending-email-using-oracle-database-and-google-mail-service/ .

   Supondo que a versão do Oracle seja inferior ou que a edição seja Express Edition, neste caso ainda podemos enviar e-mail pelo g-mail, mas usando o emailrelay, e é isto que quero mostrar neste artigo, para referência que possa ajudar que passar pelo mesmo problema, além disso servir como documentação para mim, caso preciso fazer isso em mais servidores.  O cenário aqui apresentado é um servidor Windows Server 2008.

1 - Baixe o programa emailrelay e mande instalar o mesmo
1.1 - Na primeira Janela vem com as informações do programa, click em Next>
1.2 - Depois a licença, marque a opção de aceitar a licença e click em Next>
1.3 - A próxima janela mostra o diretório onde será instalado além do Spool e configuração. Aceite o padrão e click em Next>
1.4 - Em Tipo de Instalação marque o SMTP Server e depois escolha a opção "Check periodically" e
1.5 - Na próxima janela configure com a informação do seu G-mail. Em HostName digite smtp.gmail.com e na Port 587 e na parte "Account" coloque a informação do seu e-mail com Login no editor Name e a Senha no editor PassWord; Click em Next>
1.6 - Nas demais janelas aceite as opções padrões e click em Next> para terminar a instalação.

2 - Depois de instalado será preciso alterar o arquivo de configuração para o G-mail, o arquivo é o
emailrelay-star.bat e ele vai estar no caminho de instalação (passo 1.3), mas normalmente esta em c:\arquivos de programa\emailrelay;

2.1 Altere o arquivo como no exemplo abaixo;

 "C:\Arquivos de programas\emailrelay\emailrelay.exe" --as-proxy smtp.gmail.com:587 --client-tls --client-auth "C:\Arquivos de programas\emailrelay\emailrelay.auth" --log --pid-file "C:\Arquivos de programas\emailrelay\emailrelay.pid" --poll 60 --remote-clients --spool-dir C:\Windows\spool\emailrelay --syslog --verbose

2.2 Abre o arquivo emailrelay.auth e confirme que o Login e a Senha estão corretos.

3 -  Pelo CMD vá no diretório de instalação do E-mail relay e digite emailrelay-service.exe -install para criar o serviço no Windows.

3.1 Depois entre no serviço do Windows (Iniciar -> Executar -> Services.msc) e inicie o serviço caso ainda não esta inicializado.


Agora vamos no Oracle realizar alguns ajustes.

1 - Com usuário SYS altere o parâmetro SMTP_OUT_SERVER

     SQL>ALTER SYSTEM SET SMTP_OUT_SERVER='localhost' SCOPE=SPFILE;

2-Então Reinicie a instância Oracle.

3- Então pode usar diretamente o UTL_MAIL ou o UTL_SMPT;
3.1 Usando o UTL_MAIL, instale o pacote caso não exista;
SQL> @?/rdbms\admin\utlmail.sql;
SQL> @?/rdbms\admin\prvtmail.plb

E chame o pacote de enviar e-mail como no exemplo abaixo:
 
UTL_MAIL.send(sender     => 'My Name "<ale.lucio.cordeiro@gmail.com>"',
              recipients => 'destino@gmail.com',

              subject    => 'Teste',
              message    => 'Bom trabalho!');


3.2 Caso esteja usando o pacote UTL_SMPT, basta informar localhost  na conexão e retirar a parte de autenticação

Parte que precisa ser retirado

utl_smtp.command(mail_conn, 'AUTH LOGIN');
utl_smtp.command(mail_conn,
utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(v_usuario))));
utl_smtp.command(mail_conn,
utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(p_senha))));
 
 
OBS; Caso ocorra o erro SMTP permanent error: 553 verifique se você respeitou o uso das aspas simples e dupla além dos <> entre o endereço de e-mail, coloque como no exemplo supracitado.
 
Pronto, o Oracle já consegue enviar e-mail pelo G-mail;
 
Espero ter ajudado.


quarta-feira, 21 de novembro de 2012

Backup & Recovery Parte 3 - Recuperação Incompleta

Quando um Banco de Dados se encontrar danificado, em quase toda as circunstâncias o DBA deve fazer uma recuperação completa, ou seja voltar a base sem perdas de transações "commitadas". Contudo em algumas situações extremas não será possível faze-lo.

Pode acontecer também que o DBA deliberadamente decida perdes transações, o que não quer dizer necessariamente perdas de dados. Pois se um usuário executar um comando delete com um commit na tabela inteira de funcionário, no que consiste em uma transação de banco de dados está tudo correto, mas a nível de negocio não.

Será mostrado como realizar uma recuperação incompleta do banco de dados, primeiramente restaurando o banco a uma tempo qualquer no passado para recuperar uma antiga informação e depois será apresentado um caso extremo como devido a falto do Log de Redo On-line, será feito um recover incompleto do banco de dados.

Para poder realizar as operações neste artigo é necessário que o banco de dados esteja configurado para realizar backup, conforme os artigos anteriores. Nestes testes serão usados duas maquinas virtuais com Windows 7, uma maquina virtual simulará o banco de produção, e a outra será um banco restaurado a partir dos backup de produção. A maquina real será um servidor de backup, onde guardará os backup feito pelo banco de produção.

 E evidente que este ambiente é somente para estudo e demostração neste artigo, em um ambiente real de produção, casa servidor seria uma maquina separada e fisicamente protegida contra acidentes e eventuais roubos.

Recuperando o Banco a partir de uma perda lógica 

Em um cenário de uma T.I, por volta das 08h50min da manhã do dia 21/11/2012 um desenvolver exclui um SCHEMA importante do sistema de produção, achando que estava logado em uma base de teste. Então depois de cerca de 10 minutos depois ele de forma desesperada decide acionar o DBA para solucionar o problema. Os demais SCHEMAS estão funcionando normalmente recebendo milhares de inserções e cada segundo que o banco esteja fora do ar representa prejuízo para a empresa.
Em cenários como estes, é importante que o banco de dados esteja com o recurso flashback, pois o “Recover Incompleto” inspecionará os arquivos de dados restaurados, e neste caso seria necessário restaurar todos os datafiles o que demandaria uma janela de tempo de recuperação maior.
Por isto, ative o flashback database do banco de dados conforme os passos abaixo:

SQL> alter system set db_recovery_file_dest=' C:\bck_oracle\flash_recovery_area;
SQL> alter system set db_recovery_file_dest_size=8G;
SQL> alter system set db_flashback_retention_target=240;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database flashback on;
SQL> alter database open;
Feito esta devida configuração, segue a simulação da recuperação do schema dropado.
O DBA entra com usuário SYS e verifica que realmente as tabelas daquele schema não existem;

SQL> connect sys/senha as sysdba
Conectado.
SQL> select count(*) from schema_importante.aca_aluno;
select count(*) from schema_importante.aca_aluno
ERRO na linha 1: ORA-00942: a tabela ou view não existe
Então o próximo passo é desligar o banco de dados.
SQL> shutdown immediate;
Banco de dados fechado.
Banco de dados desmontado.
InstÔncia ORACLE desativada.

Inicie o banco no Estado montado, o banco não ficará disponíveis para os usuários e estará pronto para aguardar a recuperação.

SQL> startup mount;
InstÔncia ORACLE iniciada.

Total System Global Area  612368384 bytes
Fixed Size                  1292060 bytes
Variable Size             436209892 bytes
Database Buffers          171966464 bytes
Redo Buffers                2899968 bytes
Banco de dados montado.

Execute o comando de flashback para voltar o banco de dados como estava as 8h50min.

SQL> flashback database to timestamp to_timestamp('21-11-2012 08:50:00','dd/mm/yyyy hh24:mi:ss');
 Flashback concluÝdo.

Depois abra o banco como comente leitura.

SQL> alter database open read only;

Verifique se os dados foram restaurados, caso não apareça, volte a executar o comando flashback voltando ainda mais o tempo.

SQL> select count(*) from schema_importante.aca_aluno;
  COUNT(*)
----------
       705

Após confirmado que o Schema foi restaurado no banco de dados, realize a exportação do schema.

C:\>exp system/senha file=c:\bck_oracle\schema_importante.dmp owner=schema_importante

Export: Release 10.2.0.3.0 - Production on Qua Nov 21 09:31:00 2012
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Conectado a: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Product
. sobre exportar tabelas de SCHEMA_IMPORTANTE ... via Caminho Convencional ...
. . exportando tabela                      ACA_ALUNO        705 linhas exportada
. . exportando tabela                      ACA_CURSO          8 linhas exportada
. . exportando tabela                    ACA_DIAAULA       1080 linhas exportada
.....
. exportando filhos e grupos de renovaþÒo
. exportando dimens§es
. exportando objetos e aþ§es procedurais posteriores ao esquema
. exportando estatÝstica
ExportaþÒo encerrada com sucesso, sem advertÛncias.

Depois de exportado o schema, faça o recover completo do banco de dados.

C:\>sqlplus /nolog

SQL> connect sys/senha as sysdba;
SQL> shutdown immediate;
SQL> startup mount;
SQL> recover database;
SQL> alter database open;

 O banco de dados irar restaurar todas as transações feita no banco de dados, e então logicamente o DROP do Schema, como confirmado no SQL abaixo:

SQL> connect sys/senha as sysdba
Conectado.
SQL> select count(*) from schema_importante.aca_aluno;
select count(*) from schema_importante.aca_aluno
ERRO na linha 1: ORA-00942: a tabela ou view não existe

Neste momento faça o importe banco a partir do arquivo dump gerado.

C:\>imp system/senha touser=schema_importante fromuser=schema_importante file=C:\bck_oracle\schema_importante.dmp
SQL> select count(*) from schema_importante.aca_aluno;
  COUNT(*)
----------
       705

Então seus dados foram recuperados sem nenhuma perda de dados, tanto as transações dos usuários feitas no intervalo de 08:50 e 09:00 bem o schema dropado foram restaurados.

Restaurando o Banco de Dados em Outro Servidor
 
O próximo cenário é uma situação mais complexa e não é uma tarefa trivial. Ocorre que o servidor sofreu uma pane geral, prejudicando todos os discos e todos os arquivos de banco de dados como os controlfiles, datafiles, online redo log files, além do spfile, foram perdidos.

Em uma instalação padrão este cenário seria terrível para o DBA, mas se o banco de dados foi ajustado conforme os artigos anteriores, o Backup do Oracle bem como os archives está protegido em outro servidor.

Neste artigo, o cenário é que já tem um banco de dados Oracle em outra maquina. Os passos será dropar o banco de dados e depois restaurar/recuperar o Banco de dados.  Se no caso o Oracle precisar ser instalado, instale somente o software e faça o restore/recover e para facilitar a restauração instale a mesma versão e a instância com o mesmo nome.

No cenário montado, o servidor Oracle é o IP 192.168.138.129 que sofreu a pane. Todos os backup’s e o archives encontra-se no IP 192.168.149.1. A restauração será realizada na maquina de IP 192.168.138.130.
Para dropar logue no banco de dados e inicie no modo restrito e execute o drop database como mostrado a seguir:


C:\>sqlplus /nolog
SQL> connect sys/senha as sysdba
SQL> shutdown immediate;
SQL> startup mount restrict;
SQL> drop database;
Banco de Dados eliminado.

Inicie o banco de dados com o backup do ini.ora

SQL> connect sys/senha as sysdba
Conectado a uma instância inativa.
SQL> startup nomount pfile=\\192.168.149.1\bck_oracle\INIT.ORA
Instância ORACLE iniciada.

Total System Global Area  612368384 bytes
Fixed Size                  1292060 bytes
Variable Size             306186468 bytes
Database Buffers          301989888 bytes
Redo Buffers                2899968 bytes
SQL>

Todos os scripts de backup’s realizado nesta série de artigos tem a inclusão do controlfile, por isso sempre terá dois arquivos de backup, um com o tamanho próximo do banco, que é o backup dos datafiles, e um pequeno (neste exemplo tem 6 mega) que é do ControlFile. No Rman execute o Restore do ControlFile a partir do backup mais novo do controlfile.

C:\>rman target sys/senha nocatalog
conectado ao banco de dados de destino: PROD (not mounted)
usar o arquivo de controle do banco de dados de destino em vez do catálogo de re
cuperação
RMAN> restore controlfile from '\\192.168.149.1\bck_oracle\Level0\LEV0DAT02NQPNL5.BKP';

Iniciando restore em 21/11/12
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=156 devtype=DISK

canal ORA_DISK_1: restaurando arquivo de controle
canal ORA_DISK_1: restauraþÒo concluÝda, tempo decorrido: 00:00:11
nome do arquivo de saÝda=C:\ORACLE\PRODUCT\10.2.0\ORADATA\PROD\CONTROL01.CTL
nome do arquivo de saÝda=C:\ORACLE\PRODUCT\10.2.0\ORADATA\PROD\CONTROL02.CTL
nome do arquivo de saÝda=C:\ORACLE\PRODUCT\10.2.0\ORADATA\PROD\CONTROL03.CTL
Finalizado restore em 21/11/12


Com o ControlFile restaurado monte o banco de dados.
RMAN>alter database mount;
Execute o comando List backup e veja todos os backups que estão catalogados no controlfile.

RMAN>list backup;
....
    Lista de Itens de Backup do conjunto de backup 1 No. da C¾pia1....
    BP Key  Pc# Status      Piece Name
    ------- --- ----------- ----------
    1       1   AVAILABLE   C:\BCK_ORACLE\LEVEL0\LEV0DAT01NQPNFV.BKP

  C¾pia do Conjunto de Backup n·m. 2 do conjunto de backup 1
  Tipo de Dispositivo Tempo Decorrido Horßrio de ConclusÒo Tag Compactada
  ----------- ------------ -------------------- ---------- ---
  DISK        00:02:42     20/11/12             NO         TAG20121120T144935

    Lista de Itens de Backup do conjunto de backup 1 No. da C¾pia2
    BP Key  Pc# Status      Piece Name
    ------- --- ----------- ----------
    2       1   AVAILABLE   \\192.168.149.1\BCK_ORACLE\LEVEL0\LEV0DAT01NQPNFV.BKP

Observe que como os backup’s eram multiplexados tanto no servidor local como na maquina remota, o Oracle tem em seu catalogo todos os backup’s, mas como servidor de produção deu pane, não temos os backup’s na unidade C:\. É preciso informar isso para o Oracle através do comando CROSSCHECK para ele verificar se existe realmente o backup. Como não encontrará da unidade C:\ mande apaguar com o comando delete do Rman.

RMAN> crosscheck backup;

Iniciando implicit crosscheck backup em 21/11/12
.......
componente de backup submetido a verificaþÒo cruzada: localizado como 'EXPIRED'
handle de componente de backup=C:\BCK_ORACLE\LEVEL0\LEV0DAT01NQPNFV.BKP id reg.=
1 marcaþÒo=799858176

componente de backup submetido a verificaþÒo cruzada: localizado como 'AVAILABLE'
handle de componente de backup=\\192.168.149.1\BCK_ORACLE\LEVEL0\LEV0DAT01NQPNFV
.BKP id reg.=2 marcaþÒo=799858176
Fez a verificaþÒo cruzada de 2 objetos

O backup que encontra-se na Unidade C:\ foi marcado como EXPIRED, ou seja o Oracle não encontrou o backup. Isto é obvio, pois este backup esta na unidade C:\ do servidor de produção. Exclua do catalogo este backup.

RMAN> delete expired backup;
utilizando o canal ORA_DISK_1
Lista de Componentes de Backup
BP Key  BS Key  Pc# Cp# Status      Device Type Piece Name
------- ------- --- --- ----------- ----------- ----------
1       1       1   1   EXPIRED     DISK        C:\BCK_ORACLE\LEVEL0\LEV0DAT01NQ
PNFV.BKP
Deseja realmente deletar os objetos acima (informe YES ou NO)? yes
componente de backup deletado
handle de componente de backup=C:\BCK_ORACLE\LEVEL0\LEV0DAT01NQPNFV.BKP id reg.=
1 marcaþÒo=799858176
Deletou 1 objetos EXPIRADOS

RMAN>

O backup de rede foi marcado como ‘AVAILABLE' e o Oracle sabe que este backup está disponível e pode contar com este para recuperação. Então execute o Restore.

RMAN> restore database;
Iniciando restore em 21/11/12
restaurando arquivo de dados 00001 para C:\ORACLE\PRODUCT\10.2.0\ORADATA\PROD\SYSTEM01.DBF
.....Finalizado restore em 21/11/12

Antes de executar o backup, instrua o Oracle para usar os archives que estão na Rede e depois limpe o segundo parâmetro para não usar os archives locais, como foi configurado o banco de produção nos artigos anteriores.
SQL> alter system set log_archive_dest_1='location=\\192.168.149.1\bck_oracle\Archives\';
SQL> alter system set log_archive_dest_2='';

Depois realize um recover do banco de dados a partir do Backup de Controlfile. O Oracle irar sincronizar todos os datafiles usando todos os archives disponíveis na rede. Todas as transações que estava somente no Log de Redo Online não serão restauradas, pois os mesmo se perderam no servidor de produção.

Vale lembrar que Log de Redo Online contem todas as alterações feitas no banco, mas confirmadas e as que não, então pode acontecer que dentro do Log de Redo OnLine tenham somente transações incompleta, se isto ocorrer a recuperação incompleta será na verdade completa, pois estas transações seria desfeitas (RollBack), mas não temos garantia quanto a isso, todavia se houver perdas de transações confirmadas estas serão mínimas.

SQL> recover database until cancel using backup controlfile;
ORA-00279: alterar 607324 gerado em 11/20/2012 14:49:36 necessario para o
thread 1
ORA-00289: sugest?o :
\\192.168.149.1\BCK_ORACLE\ARCHIVES\ARC00008_0799846584.001
ORA-00280: alterar 607324 para o thread 1 esta na sequencia  #8
Especificar log: {=nome de arquivo | sugerido | AUTO | CANCEL}

Aceite a sugestão do Oracle digitando Auto, o Oracle irar aplicar todos os archives que ele encontrar no diretório sinalizado, em um determinado momento ele irar tentar aplicar o archive que ainda não existe retornando o erro abaixo.

'\\192.168.149.1\BCK_ORACLE\ARCHIVES\ARC00010_0799846584.001 arquivado'
ORA-27041: n?o e possivel abrir arquivo
OSD-04002: n┐o ┐ poss┐vel abrir arquivo
O/S-Error: (OS 2) O sistema n┐o pode encontrar o arquivo especificado.

Agora abra o banco de dados com ResetLogs

SQL> alter database open resetlogs;
Banco de dados alterado.
SQL>

Pronto, seu banco de dados foi recuperado em outro servidor, basta fazer os sistemas logarem no novo servidor.

Conciderações

Neste artigo foi mostrado como restaurar o Banco de Dados, quando ocorre uma catástrofe tanto logica como física.

Na primeira situação, foi usado o recurso de FlashBack DataBase (em materiais oficiais da Oracle, recuperação incompleta e FlashBack DataBase são tratados em tópicos diferentes.) para agilizar a restauração. Na segunda situação apresentamos uma restauração incompleta aplicando todos os archivelogs disponíveis na rede.

Com a recuperação feita neste artigo, é possível criar um Banco de Homologação/Teste em outro servidor a partir do Backup Rman. Criando scripts que execute em lote todos os passos apresentados neste artigo, caso o servidor de Homologação/Teste não tenha os mesmos diretórios de produção será preciso executar uns passos a mais como mostrados nos artigos de backup anteriores para renomear os arquivos de banco de dados.