sábado, 5 de dezembro de 2009

Um pouco do pacote UTL_FILE, DBMS_LOB e objeto DIRECTORY. Gerando e carregando conteúdo de arquivos externos ao Oracle ...

Olá,

Neste artigo irei demonstrar através de exemplos práticos como gerar arquivos externos ao banco de dados, bem como ler o conteúdo dos mesmos através da package UTL_FILE disponível desde a versão 7.3 do banco de dados Oracle. Em resumo, a package UTL_FILE permite que programas escritos em PL/SQL acessem arquivos do sistema operacional para leitura e escrita. Irei também demonstrar como carregar arquivos binários para dentro de tabelas de banco dados fazendo uso da package DBMS_LOB. Por falar em arquivos binários, o SQL*Plus da versão 11g já nos permite visualizar dados de colunas do tipo BLOB o que, nas versões anteriores, não era possível fazendo com que o SQL*Plus emitisse a mensagem "SP2-0678: Coluna ou tipo de atributo não pode ser exibido pelo SQL*Plus". Com isso, não precisaremos mais ficar removendo as colunas do tipo de dado BLOB em uma consulta SQL.

Enfim, será abordado tanto o uso do já obsoleto parâmetro UTL_FILE_DIR, quanto a criação do objeto DIRECTORY responsável por armazenar o caminho (diretório) de sistema operacional onde reside o banco de dados Oracle, de forma a permitir a escrita e leitura de arquivos.

No caso de se utilizar o parâmetro UTL_FILE_DIR, o comando abaixo deverá ser emitido pelo DBA (se estiver usando spfile) ou o arquivo de inicialização alterado manualmente init[SID].ora. Após a alteração, o banco de dados precisará ser reiniciado.

alter system set utl_file_dir = '[caminho_diretorio]' scope=spfile;

Vamos então aos exemplos práticos. Como demonstrado abaixo, o banco de dados está com o parâmetro UTL_FILE_DIR setado com o caminho "/tmp" que é um diretório na qual o usuário de sistema operacional "oracle" possui permissões de leitura/escrita. Para essas demonstrações, estou utilizando o sistema operacional Linux CentOS release 5.2 e o banco de dados Oracle 11g (11.1.0.7.0).

C:\>sqlplus system/*****

SQL*Plus: Release 11.1.0.6.0 - Production on Sab Dez 5 13:15:32 2009

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

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter utl_file_dir

NAME TYPE VALUE
----------------------------- ----------- ----------------------------
utl_file_dir string /tmp

No exempo abaixo irei gerar um arquivo simples que irei chamar de arq_teste.txt contendo algumas linhas de texto. Para isso, usarei a procedure PUT_LINE da package UTL_FILE.

-- Gerando o arquivo de texto externo ao banco de dados
SQL> declare
2 v_arquivo utl_file.file_type;
3 begin
4 v_arquivo := utl_file.fopen('/tmp', 'arq_teste.txt', 'W');
5 utl_file.put_line(v_arquivo, 'linha 1');
6 utl_file.put_line(v_arquivo, 'linha 2');
7 utl_file.put_line(v_arquivo, 'linha 3');
8 utl_file.put_line(v_arquivo, 'linha 4');
9 utl_file.put_line(v_arquivo, 'linha 5');
10 utl_file.fclose(v_arquivo);
11 exception
12 when utl_file.invalid_path then
13 raise_application_error(-20000, 'Atenção! O caminho informado não existe.');
14 end;
15 /

Procedimento PL/SQL concluído com sucesso.

Acessando o sistema operacional, podemos ver que o arquivo arq_teste.txt foi criado e seu conteúdo populado conforme o script PL/SQL acima.

[oracle@linux tmp]$ ls -l
total 8
-rw-r--r-- 1 oracle oinstall 40 Dez 5 13:16 arq_teste.txt

[oracle@linux tmp]$ cat arq_teste.txt
linha 1
linha 2
linha 3
linha 4
linha 5

Para que possamos ler o conteúdo do arquivo que foi gerado no sistema operacional através de PL/SQL, farei uso da procedure GET_LINE da package UTL_FILE.

-- Lendo o conteúdo do arquivo de texto gerado
SQL> set serveroutput on
SQL> declare
2 v_linha varchar2(2000) := '';
3 v_arquivo utl_file.file_type;
4 begin
5 v_arquivo := utl_file.fopen('/tmp', 'arq_teste.txt', 'R');
6 loop begin
7 utl_file.get_line(v_arquivo, v_linha);
8 dbms_output.put_line('linha lida=' || v_linha);
9 exception
10 when no_data_found then
11 utl_file.fclose(v_arquivo);
12 exit;
13 end;
14 end loop;
15 end;
16 /
linha lida=linha 1
linha lida=linha 2
linha lida=linha 3
linha lida=linha 4
linha lida=linha 5

Procedimento PL/SQL concluído com sucesso.

Da mesma forma que utilizamos o parâmetro UTL_FILE_DIR, poderíamos ter utilizado o objeto de banco de dados DIRECTORY. O objetivo do objeto directory (diretório) é armazenar o caminho de um diretório de sistema operacional, assim como o parâmetro UTL_FILE_DIR. A grande vantagem é que podemos criar vários objetos que apontam para diferentes diretórios do sistema operacional, além de não termos que ter de efetuar o shutdown/startup da instância após a sua criação como acontece com parâmetro UTL_FILE_DIR. Vale a pena salientar que podemos também configurar múltiplos caminhos com o parâmetro UTL_FILE_DIR bastando, para isso, definirmos mais de uma entrada no arquivo de inicialização da instância como demonstrado no exemplo abaixo:

utl_file_dir="/u01/oradata/prod/utl_dir/"
utl_file_dir="/u02/oradata/prod/utl_dir/"
utl_file_dir="/u03/oradata/prod/utl_dir/"

No mais, o objeto DIRECTORY é global no banco de dados, ou seja, não é de propriedade de nenhum usuário de banco de dados específico (a não ser do próprio SYS). Para que os usuário de banco de dados possam utilizá-lo, será necessário conceder os privilégios READ (leitura) e/ou WRITE (escrita) dependendo de cada uso.

Como já demonstrado nos exemplos acima, irei realizar a mesma operação de escrita e leitura em arquivos do sistema operacional mas, agora, irei fazer uso do objeto DIRECTORY (diretório).

SQL> create or replace directory arquivo_dir as '/tmp';

Diretório criado.

Vale a pena salientar que os demais usuários de banco de dados deverão ter os privilégios apropriados, como demonstrado pelo comando abaixo, afim de terem acesso ao objeto DIRECTORY.

grant read, write on directory [nome_diretorio] to [usuarios...];

Continuando com a demonstração, irei realizar os mesmos procedimentos, mas agora utilizando o objeto directory ARQUIVO_DIR em vez do caminho fixo definido no parâmetro UTL_FILE_DIR.

-- Gerando o arquivo de texto externo ao banco de dados
SQL> declare
2 v_arquivo utl_file.file_type;
3 begin
4 v_arquivo := utl_file.fopen('ARQUIVO_DIR', 'arq_teste.txt', 'W');
5 utl_file.put_line(v_arquivo, 'linha 1');
6 utl_file.put_line(v_arquivo, 'linha 2');
7 utl_file.put_line(v_arquivo, 'linha 3');
8 utl_file.put_line(v_arquivo, 'linha 4');
9 utl_file.put_line(v_arquivo, 'linha 5');
10 utl_file.fclose(v_arquivo);
11 exception
12 when utl_file.invalid_path then
13 raise_application_error(-20000, 'Atenção! O diretório informado não existe.');
14 end;
15 /

Procedimento PL/SQL concluído com sucesso.

-- Lendo o conteúdo do arquivo de texto gerado
SQL> set serveroutput on
SQL> declare
2 v_linha varchar2(2000) := '';
3 v_arquivo utl_file.file_type;
4 begin
5 v_arquivo := utl_file.fopen('ARQUIVO_DIR', 'arq_teste.txt', 'R');
6 loop begin
7 utl_file.get_line(v_arquivo, v_linha);
8 dbms_output.put_line('linha lida=' || v_linha);
9 exception
10 when no_data_found then
11 utl_file.fclose(v_arquivo);
12 exit;
13 end;
14 end loop;
15 end;
16 /
linha lida=linha 1
linha lida=linha 2
linha lida=linha 3
linha lida=linha 4
linha lida=linha 5

Procedimento PL/SQL concluído com sucesso.

Caso seja informado um objeto DIRECTORY que não exista, a mensagem de erro abaixo será emitida:

SQL> declare
2 v_arquivo utl_file.file_type;
3 begin
4 v_arquivo := utl_file.fopen('ARQUIVO_DIR_ERRO', 'arq_teste.txt', 'W');
5 utl_file.put_line(v_arquivo, 'linha 1');
6 utl_file.put_line(v_arquivo, 'linha 2');
7 utl_file.put_line(v_arquivo, 'linha 3');
8 utl_file.put_line(v_arquivo, 'linha 4');
9 utl_file.put_line(v_arquivo, 'linha 5');
10 utl_file.fclose(v_arquivo);
11 exception
12 when utl_file.invalid_path then
13 raise_application_error(-20000, 'Atenção! O diretório informado não existe.');
14 end;
15 /
declare
*
ERRO na linha 1:
ORA-20000: Atenção! O diretório informado não existe.
ORA-06512: em line 13

Como parte de outra demonstração, irei agora criar uma stored procedure de banco de dados que carregará um arquivo binário (imagem.jpg) para dentro de uma tabela de teste. Para isso, vou criar uma coluna do tipo de dado BLOB e fazer uso de alguns sub-programas disponíveis na package DBMS_LOB. No mais, irei executar os procedimentos abaixo:

-- Criando o usuário de teste
SQL> create user scott identified by tiger
2 default tablespace users
3 quota unlimited on users;

Usuário criado.

-- Concedendo privilégios básicos
SQL> grant create session,create table, create procedure to scott;

Concessão bem-sucedida.

-- Concedendo privilégios para uso do diretório
SQL> grant read, write on directory ARQUIVO_DIR to scott;

Concessão bem-sucedida.

Na saída do SQL abaixo, podemos ver que o usuário SCOTT possui os privilégio READ (leitura) e WRITE (escrita) para o objeto directory ARQUIVO_DIR:

SQL> select grantor,grantee,table_name,privilege
2 from
3 all_tab_privs
4 where table_name = 'ARQUIVO_DIR';

GRANTOR GRANTEE TABLE_NAME PRIVILEGE
------------------- -------------------- ---------------------- ----------------------
SYS SYSTEM ARQUIVO_DIR EXECUTE
SYS SYSTEM ARQUIVO_DIR READ
SYS SYSTEM ARQUIVO_DIR WRITE
SYSTEM SCOTT ARQUIVO_DIR READ
SYSTEM SCOTT ARQUIVO_DIR WRITE

-- Conectando com o usuário SCOTT
SQL> connect scott/tiger
Conectado.

-- Criando a tabela de teste
SQL> create table tab_imagem (
2 id number primary key,
3 nome varchar2(20),
4 imagem blob
5 );

Tabela criada.

-- Listando o arquivo que será carregado para a tabela tab_imagem
[oracle@linux tmp]$ ls -l
total 4
-rw-r--r-- 1 oracle oinstall 809 Dez 5 13:25 imagem.jpg

-- Criando a stored procedure carrega_imagem
SQL> create or replace procedure carrega_imagem (p_nome_arquivo in tab_imagem.nome%type) as
2 v_bfile bfile;
3 v_blob blob;
4 begin
5 insert into tab_imagem (id,nome,imagem)
6 values (1,p_nome_arquivo,empty_blob())
7 return imagem into v_blob;
8 v_bfile := bfilename('ARQUIVO_DIR',p_nome_arquivo);
9 dbms_lob.fileopen(v_bfile, dbms_lob.file_readonly);
10 dbms_lob.loadfromfile(v_blob,v_bfile,dbms_lob.getlength(v_bfile));
11 dbms_lob.fileclose(v_bfile);
12 commit;
13 end;
14 /

Procedimento criado.

-- Carregando o arquivo para a tabela tab_imagem
SQL> execute carrega_imagem('imagem.jpg');

Procedimento PL/SQL concluído com sucesso.

-- Verificando o tamanho (em bytes) do arquivo carregado
SQL> select dbms_lob.getlength(imagem) from tab_imagem;

DBMS_LOB.GETLENGTH(IMAGEM)
--------------------------
809

SQL> exit
Desconectado de Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Aproveitando que utilizei função DBMS_LOB.GETLENGTH acima, tem muita gente que acha que o valor retornado é a quantidade de caracteres, o que não é verdade. O valor retornado nada mais é do que o tamanho do arquivo em bytes que foi carregado do sistema operacional, conforme mostrado abaixo:

[oracle@linux tmp]$ ls -l
total 4
-rw-r--r-- 1 oracle oinstall 809 Dez 5 13:25 imagem.jpg

Para finalizar, como mencionado no início do artigo, o SQL*Plus das versões anteriores ao Oracle 11g, não permitiam que o usuário visualizasse o conteúdo de um campo do tipo de dado BLOB:

-- Utilizando o SQL*Plus da versão 10g
C:\>sqlplus scott/tiger

SQL*Plus: Release 10.2.0.4.0 - Production on Sab Dez 5 13:28:19 2009

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

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from tab_imagem;
SP2-0678: Coluna ou tipo de atributo não pode ser exibido pelo SQL*Plus

Na versão 11g do SQL*Plus, agora é possível visualizarmos o conteúdo de um campo do tipo de dados BLOB como demonstrado abaixo. Contudo, a única vantagem que eu vejo em relação ao SQL*Plus das versões anteriores é de que não precisaremos mais remover as colunas do tipo de dado BLOB na hora de emitirmos um comando SELECT, embora que, visualizar dados binários não faz lá muito sentido ...

-- Utilizando o SQL*Plus da versão 11g
C:\>sqlplus scott/tiger

SQL*Plus: Release 11.1.0.6.0 - Production on Sab Dez 5 13:32:06 2009

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

Conectado a:
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> select * from tab_imagem;

ID NOME IMAGEM
---------- ---------------- ------------------------------------------------------------
1 imagem.jpg 47494638396109000600F70000000000B1B1B1AFAFAFA3A3A39999997777
777171716B6B6B5555554B4B4B3F3F3F3D3D3DEEEEEE3B3B3B3333332727
27CCCCCC191919171717111111C0C0C00D0D0D090909070707AAAAAAA4A4
A49696968A8A8A8888887070706868686666666060605E5E5E5C5C5C5858
58FFFFFF4848484444444040403838383232322E2E2EDDDDDD2828282626
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
B30000000000000000000000000000000000000000000000000000000000
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
000000000000000000000000000000000000000000000000000000000000
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
777171716B6B6B5555554B4B4B3F3F3F3D3D3DEEEEEE3B3B3B3333332727
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
000000000000000000000000000000000000000000000000000000000000
A49696968A8A8A8888887070706868686666666060605E5E5E5C5C5C5858
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
777171716B6B6B5555554B4B4B3F3F3F3D3D3DEEEEEE3B3B3B3333332727
A49696968A8A8A8888887070706868686666666060605E5E5E5C5C5C5858
000000000000000000000000000000000000000000000000000000000000
262424242222221E1E1E181818141414121212101010BBBBBB080808B3B3
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
A49696968A8A8A8888887070706868686666666060605E5E5E5C5C5C5858
777171716B6B6B5555554B4B4B3F3F3F3D3D3DEEEEEE3B3B3B3333332727
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
000000000000000000000000000000000000000000000000000000000000
002C000000000900060000080E0049081C48B0A0C1830813260C08003B00


sábado, 7 de novembro de 2009

Realizando downloads do site da Oracle com o WGET ...

Olá,

Recentemente, a Oracle colocou uma mensagem em seu servidor FTP (updates.oracle.com) informando que não será mais possível baixar atualizações (Patches & Updates) através do mesmo e que, as atualizações, só poderão ser baixadas diretamente do site My Oracle Support (antigo Metalink) como mostrado abaixo:


Connected to updates.oraclegha.com.
220 FTP server ready.
Name (updates.oracle.com:legatti): legatti
331 Username OK, please send password.
Password: *********
230-
230- Welcome to the Oracle Patch Download FTP Server
230-
230-*************************************************************************
230- This service will be retired on November 06, 2009 and "My Oracle Support"
230- will be the only interface for downloading the patches and updates. To
230- search and download patches from "My Oracle Support" users are required
230- to login to https://metalink.oracle.com and then go to "Patches & Updates"
230- tab.
230-
230- Alternatively users can download patches using command line download
230- manager utilities like "wget".
230-
230- Examples on how to use wget:
230-
230- - Check "wget" command is available OR install it
230- - Login to "My Oracle Support" on any browser
230- - Search for the patch
230- - Go to the download page
230- - Right Mouse Click on the Download Button
230- - Click on the properties
230- - Copy the address from the properties
230- - Run the following command using your metalink login and password
230-
230- wget --http-user= --http-password=
230- --output-document=
230- "Paste the above copied address here in quotes"
230-
230- For example, the wget command for patch# 6880880, for Linux Platform
230-
230- wget -http-user=john.doe@oracle.com -http-password=xxxxxxxx --output-document=p6880880_102000_LINUX.zip "http://updates.oracle.com/ARULink/Download/process_form/p6880880_102000_LINUX.zip?aru=11447016&file_id=23740960&patch_file=p6880880_102000_LINUX.zip&email=john.doe@oracle.com&userid=04394&"
230-
230-*************************************************************************
230-
230- For detailed help, use command "quote site help".
230
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

De acordo com a mensagem, uma outra alternativa será a de usar o utilitário wget que é um programa livre que propicia o download de dados da web muito utilizado em sistemas Linux/Unix, e que já foi portado para diversos ambientes como Mac OS X, Microsoft Windows e OpenVMS.

Mas, e quanto aos softwares disponíveis na seção de downloads do site Oracle? Bom, também poderemos utilizar o wget para baixá-los sem que tenhamos que utilizar o navegador para isso. Já que precisamos informar o nosso login e senha para baixar-mos o software em questão, isso não será um problema pois, com o wget, poderemos informar também os dados de login.

Abaixo está uma pequena demonstração da utilização do wget do qual farei uso para baixar o Oracle Database 11g do site da Oracle. No mais, para ambientes Windows, será necessário baixar o utilitário que poderá ser encontrado aqui.


C:\>wget --no-check-certificate -vv --post-data="globalId=&redirectUrl=http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_1of2.zip&username=[seu_usuario]&password=[sua_senha]&submit=Continue" https://profile.oracle.com/jsp/reg/loginHandler.jsp

--2009-11-07 17:30:08-- https://profile.oracle.com/jsp/reg/loginHandler.jsp
Resolving profile.oracle.com... 141.146.8.116
Connecting to profile.oracle.com|141.146.8.116|:443... connected.
WARNING: cannot verify profile.oracle.com's certificate, issued by '/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)05/CN=VeriSign Class 3 Secure Server CA':
Unable to locally verify the issuer's authority.
HTTP request sent, awaiting response... 302 Moved Temporarily
Location: http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_1of2.zip [following]
--2009-11-07 17:30:16-- http://download.oracle.com/otn/linux/oracle11g/R2/linux.x64_11gR2_database_1of2.zip
Resolving download.oracle.com... 208.111.133.53, 208.111.133.54
Connecting to download.oracle.com|208.111.133.53|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1239269270 (1.2G) [application/zip]
Saving to: 'linux.x64_11gR2_database_1of2.zip'

9% [====> ] 75,519,546 110K/s eta 3h 12m

quarta-feira, 28 de outubro de 2009

Programa de Certificação da Oracle lança o portal CertView

Olá,

No início deste mês (Outubro/2009), a equipe do programa de certificação da Oracle lançou um sistema, ou melhor, um portal para todos aqueles profissionais, detentores ou não, de alguma certificação da Oracle. O nome deste portal é o CertView e pode ser acessado através do endereço http://certview.oracle.com.

Bom, só agora estou abordando este assunto pelo fato de apenas recentemente, eu ter conseguido logar com sucesso no portal. Enfim, foram algumas semanas enviando e-mails para a equipe do programa de certificação da Oracle através do e-mail ocpexam_ww@oracle.com, até receber uma resposta informando que o meu acesso havia sido autorizado.

No mais, o CertView nos dará de forma online a capacidade de:
  • Visualizarmos nosso histórico de exames de certificação realizados
  • Visualizarmos nossas informações demográficas (endereço, cidade, país, etc...)
  • Baixar os logos autorizados e oficiais referentes aos nossos certificados
  • Visualizarmos nosso histórico de certificações
  • Obtermos informações sobre o status do nosso kit certificação que é enviado pela Oracle
  • Enviarmos informações sobre a nossa certificação à terceiros

Em relação a esta última, o interessante é que poderemos enviar por e-mail para qualquer pessoa, uma autorização para que a mesma visualize informações sobre a nossa certificação. Ao receber o e-mail, o destinatário poderá clicar em um link privado e fornecer uma chave (código) contendo a autorização para visualização das informações dos certificados. Esta autorização é enviada pelo próprio portal CertView ao e-mail do destinatário em questão. Vale a pena salientar que o link e a chave de autorização possuem uma data de validade, ou seja, ambas expiram em 5 dias à partir do recebimento do e-mail pelo destinatário.


Vale a pena salientar que o CertView está disponível gratuitamente a todos os candidatos certificados ou não, e poderá ser acessado usando uma conta Oracle Single Sign On (SSO) cadastrada previamente.

Para tal, o candidato precisará fornecer suas informações demográficas à Pearson VUE, a nova empresa parceira da Oracle e provedora dos exames de certificação. Como todos já sabem, a Prometric não é mais a provedora dos exames da Oracle.

Para finalizar, abaixo está um vídeo de boas vindas com mais informações sobre o novo portal CertView.




terça-feira, 6 de outubro de 2009

Gerando backups físicos de banco de dados com o RMAN através de um shell script no Linux ...

Olá,

No artigo anterior eu disponibilizei um script feito em "perl" para geração de backup lógico (FULL export) do banco de dados através dos utilitários de exportação (exp/expdp). Neste artigo irei disponibilizar um shell script para geração de backup físico através do utilitário RMAN (Recovery Manager). Para quem já conhece o RMAN, não precisa nem dizer que o mesmo é um utilitário usado no gerenciamento de operações de backup e na restauração e recuperação de bancos de dados Oracle.

Apesar do OEM Database Console (10g/11g) disponibilizar de forma simples e fácil uma interface para gerenciamento, configuração e agendamento de backups físicos do banco de dados, um script para geração de backups, em alguns casos, poderá ser bem útil.

No mais, o shell script (ou script em shell) demonstrado logo mais abaixo, tem como base o mesmo script fornecido pela instalação do Oracle Express Edition para Linux, mas com algumas alterações realizadas por mim de forma que sejam realizadas algumas operações tais como, backup completo do banco de dados juntamente com os arquivos de redo log arquivados (caso o banco esteja no modo ARCHIVELOG), deleção destes mesmos arquivos de redo log arquivados (após a realização do backup, deleção de backups obsoletos (dependendo da política de retenção utilizada), remoção de arquivos de backup expirados, geração do arquivo de inicialização em modo texto (pfile), geração de arquivo de log com o resultado dos comandos realizados pelo RMAN, entre outros.

Vale a pena salientar que este script foi testado nas versões do Oracle 10g e 11g e funcionará supondo que apenas uma instância de banco de dados esteja em execução tendo o arquivo de controle (control file) como repositório do RMAN, e que a Flash Recovery Area (FRA) esteja habilitada. O script também detecta o modo de operação do banco de dados alvo (ARCHIVELOG ou NOARCHIVELOG), pois para bancos de dados operando no modo NOARCHIVELOG, é necessário que seja realizado o shutdown do mesmo antes da realização do backup. Após a realização do backup, o banco de dados será reaberto. Para bancos de dados operando no modo ARCHIVELOG, o backup será realizado de forma online.


Dependendo da política de retenção utilizada, os backups dos arquivos de banco de dados serão armazenados na Flash Recovery Area e dois arquivos textos de log serão criados para armazenar os procedimentos realizados. Os arquivos de log serão criados em $HOME/log_rman_ultimo.log e $HOME/log_rman_anterior.log conforme demonstração logo mais abaixo. O script deverá ser executado com algum usuário de sistema operacional membro do grupo "dba", de preferência o usuário "oracle" e, poderá também quando necessário, ser agendado a sua execução através do utilitário de sistema operacional "cron".

-- Script de backup para uso do utilitário RMAN
#!/bin/sh
#
# Este script assume que o usuário pode se conectar no banco de dados usando a sintaxe
# "/ as sysdba" e que a Flash Recovery Area esteja habilitada.
#
# =============================
# Procedimento de Backup - RMAN
# =============================
#
# Para bancos de dados operando no modo NOARCHIVELOG, será realizado o shutdown do banco
# de dados antes da realização do backup. Após a realização do backup, o banco de dados
# será reaberto.
#
# Para bancos de dados operando no modo ARCHIVELOG, o backup será realizado de forma
# online. Dependendo da política de retenção utilizada, os backups serão armazenados na
# Flash Recovery Area e dois arquivos textos de log serão criados para armazenar os
# procedimentos realizados. Os arquivos de log serão criados em
# $HOME/log_rman_ultimo.log e $HOME/log_rman_anterior.log

user=`/usr/bin/whoami`
group=`/usr/bin/groups $user | grep dba`
if test -z "$group"; then
echo A operação falhou. $user não é membro do grupo \'dba\'.
exit 0
fi

TMPDIR=/tmp

rman_backup_current=$HOME/log_rman_ultimo.log
rman_backup_prev=$HOME/log_rman_anterior.log

#Criando um log temporário para a execução
rman_backup=${TMPDIR}/rman_backup$$.log
echo 'Log de Backup do RMAN' > $rman_backup

#Verificando se a flash recovery area está habilitada
rman_fra=${TMPDIR}/rman_fra$$.log
sqlplus /nolog > $rman_fra << EOF
connect / as sysdba;
set head off;
set echo off;
set trimspool on;
set linesize 512;
select '$' || count(*) || '$' from v\$parameter
where upper(name)='DB_RECOVERY_FILE_DEST'
and value is not null;
EOF
fra=`grep "^$.*$" $rman_fra`
rm -f $rman_fra

if [ X$fra = X\$1\$ ]; then
failed=false;
else
failed=true
errstr="A área de recuperação flash não está habilitada"
fi;

#Verificando a localização da flash recovery area
rman_fralocation=${TMPDIR}/rman_fralocation$$.log
sqlplus /nolog > $rman_fralocation << EOF
connect / as sysdba;
set head off;
set echo off;
set trimspool on;
set linesize 512;
select '$' || value || '$' from v\$parameter
where upper(name)='DB_RECOVERY_FILE_DEST'
and value is not null;
EOF
fralocation=`grep "^$.*$" $rman_fralocation`
fralocation=${fralocation#*$}
fralocation=${fralocation%"$"*}
rm -f $rman_fralocation

#Verificando o nome da instância do banco de dados
rman_instancename=${TMPDIR}/rman_instancename$$.log
sqlplus /nolog > $rman_instancename << EOF
connect / as sysdba;
set head off;
set echo off;
set trimspool on;
set linesize 512;
select '$' || instance_name || '$' from v\$instance;
EOF
instancename=`grep "^$.*$" $rman_instancename`
instancename=${instancename#*$}
instancename=${instancename%"$"*}
rm -f $rman_instancename

if [ $failed = 'false' ] ; then
#Verificando o modo de operação do banco de dados
rman_log_mode=${TMPDIR}/rman_log_mode$$.log
sqlplus /nolog > $rman_log_mode << EOF
connect / as sysdba;
set head off;
set echo off;
set trimspool on;
set linesize 512;
select '$' || log_mode || '$' from v\$database;
EOF
mode=`grep "^$.*$" $rman_log_mode`
rm -f $rman_log_mode

case $mode in
\$ARCHIVELOG\$)
echo "Realizando Backup Online (ARCHIVELOG) do Banco de Dados..."
rman target / >> $rman_backup << EOF
set echo on;
show all;
report schema;
sql "create pfile=''$fralocation/init$instancename.ora'' from spfile";
crosscheck archivelog all;
sql 'alter system archive log current';
backup full database plus archivelog delete all input;
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;
EOF
if [ $? = 0 ]; then
failed=false;
else
failed=true
errstr="RMAN error: Veja o arquivo de log para mais detalhes"
fi;
;;

\$NOARCHIVELOG\$)
echo "Realizando Backup Offline (NOARCHIVELOG) do Banco de Dados..."

rman target / >> $rman_backup << EOF
set echo on;
show all;
report schema;
sql "create pfile=''$fralocation/init$instancename.ora'' from spfile";
shutdown immediate;
startup mount;
backup as backupset device type disk database;
alter database open;
crosscheck backup;
delete noprompt expired backup;
delete noprompt obsolete;
EOF
if [ $? = 0 ]; then
failed=false;
else
failed=true
errstr="RMAN error: Veja o arquivo de log para mais detalhes"
fi;
;;

*)
errstr="Modo de Banco de dados desconhecido: $mode"
failed=true;
;;
esac;
fi;

#Gravando o erro no arquivo de log
if [ $failed = 'true' ]; then
echo ${errstr}. >> $rman_backup
fi;

#Renomeando o último arquivo de log como anterior
if [ -f $rman_backup_current ]; then
mv -f $rman_backup_current $rman_backup_prev
fi;

#Gravando o arquivo de log
mv -f $rman_backup $rman_backup_current

#Mostrando o resultado para o usuário em caso de erro
if [ $failed = 'true' ] ; then
echo '===================== ERRO ========================='
echo ' Falha de backup de banco de dados '
echo '===================== ERRO ========================='
echo ${errstr}.
echo O arquivo de log está em $rman_backup_current
else
echo Backup do banco de dados realizado com sucesso.
echo O arquivo de log está em $rman_backup_current
fi

O arquivo bkpora_rman criado abaixo contém o shell script acima que realizará o backup físico do banco de dados.

[oracle@linux u01]$ ls -l
total 44
drwxrwx--- 3 oracle dba 4096 Set 30 15:14 app
drwxr-xr-x 2 oracle dba 20480 Set 30 15:46 archive
drwxr-xr-x 2 oracle dba 4096 Out 3 14:14 export
drwxr-xr-x 3 oracle dba 4096 Out 5 14:22 flash
-rwxr--r-- 1 oracle dba 5406 Out 6 08:12 bkpora_rman

Como já dito anteriormente, caso o usuário que esteja executando o script não for membro do grupo "dba", então o erro abaixo será emitido:

[oracle@linux u01]$ su -
Senha: ******
[root@linux ~]# cd /u01
[root@linux u01]# ./bkpora_rman
A operação falhou. root não é membro do grupo 'dba'.

Bom, voltando ao usário "oracle", irei realizar a execução do script shell como demonstrado abaixo. A propósito, caso a Flash Recovery Area não esteja habilitada, então o erro abaixo será emitido:

[oracle@linux u01]$ ./bkpora_rman
===================== ERRO =========================
Falha de backup de banco de dados
===================== ERRO =========================
A área de recuperação flash não está habilitada
O arquivo de log está em /home/oracle/log_rman_ultimo.log

No mais, irei checar algumas informações do banco de dados alvo antes de executar o script de backup:

[oracle@linux ~]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Ter Out 6 08:29:12 2009

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

Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

-- Verificando se a FRA está habilitada
SQL> show parameter db_recovery

NAME TYPE VALUE
------------------------------ ----------- -------------------
db_recovery_file_dest string /u01/flash
db_recovery_file_dest_size big integer 30G

-- Verificando o modo de operação do banco de dados
SQL> archive log list
Modo log de banco de dados Modo de Arquivamento
Arquivamento automático Ativado
Destino de arquivamento /u01/archive/
A seqüência de log on-line mais antiga 7
Próxima seqüência de log a arquivar 9
Seqüência de log atual 9

Após finalizada a verificação de algumas das informações acima, irei executar o script de backup como demonstrado abaixo:

[oracle@linux u01]$ ./bkpora_rman
Realizando Backup Online (ARCHIVELOG) do Banco de Dados...
Backup do banco de dados realizado com sucesso.
O arquivo de log está em /home/oracle/log_rman_ultimo.log

Após a execução do backup, irei checar as informações do arquivo de log criado.

[oracle@linux ~]$ ls -l $HOME/*.log
-rw-r--r-- 1 oracle oinstall 6755 Out 6 08:32 /home/oracle/log_rman_ultimo.log


[oracle@linux u01]$ cat /home/oracle/log_rman_ultimo.log
Log de Backup do RMAN

Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 08:36:59 2009

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

conectado ao banco de dados de destino: BD01 (DBID=2949935972)

RMAN>
eco ativado

RMAN> show all;
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
os parâmetros de configuração RMAN são:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
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 ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ORACLE_HOME/dbs/snapcf_BD01.f'; # default

RMAN> report schema;
Relatório do esquema do banco de dados

Lista de Arquivos de Dados Permanentes
======================================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------------------------
1 300 SYSTEM *** /u01/app/oracle/oradata/BD01/system01.dbf
2 200 UNDOTBS1 *** /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 120 SYSAUX *** /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 21 USERS *** /u01/app/oracle/oradata/BD01/users01.dbf

Lista de Arquivos Temporários
=============================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- ---------------------------------------
1 20 TEMP 32767 /u01/app/oracle/oradata/BD01/temp01.dbf

RMAN> sql "create pfile=''/u01/flash/initBD01.ora'' from spfile";
instrução sql: create pfile=''/u01/flash/initBD01.ora'' from spfile

RMAN> crosscheck archivelog all;
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=147 devtype=DISK
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_4_686230057.dbf id reg.=111 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_5_686230057.dbf id reg.=112 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_6_686230057.dbf id reg.=113 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_7_686230057.dbf id reg.=114 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_8_686230057.dbf id reg.=115 marc...
validação bem-sucedida no log arquivado
nome do arquivo de log de arquivamento=/u01/archive/1_9_686230057.dbf id reg.=116 marc...
Fez a verificação cruzada de 6 objetos

RMAN> sql 'alter system archive log current';
instrução sql: alter system archive log current

RMAN> backup full database plus archivelog delete all input;

Iniciando backup em 06/10/2009
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
log de arquivamento thread de entrada=1 seqüência=4 id reg.=111 marcação=698859945
log de arquivamento thread de entrada=1 seqüência=5 id reg.=112 marcação=698859947
log de arquivamento thread de entrada=1 seqüência=6 id reg.=113 marcação=698859951
log de arquivamento thread de entrada=1 seqüência=7 id reg.=114 marcação=698859957
log de arquivamento thread de entrada=1 seqüência=8 id reg.=115 marcação=698859963
log de arquivamento thread de entrada=1 seqüência=9 id reg.=116 marcação=698927352
log de arquivamento thread de entrada=1 seqüência=10 id reg.=117 marcação=698929025
log de arquivamento thread de entrada=1 seqüência=11 id reg.=118 marcação=698929025
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG20091006T1057...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:16
canal ORA_DISK_1: deletando log(s) de arquivamento
nome do arquivo de log de arquivamento=/u01/archive/1_4_686230057.dbf id reg.=111 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_5_686230057.dbf id reg.=112 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_6_686230057.dbf id reg.=113 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_7_686230057.dbf id reg.=114 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_8_686230057.dbf id reg.=115 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_9_686230057.dbf id reg.=116 marc...
nome do arquivo de log de arquivamento=/u01/archive/1_10_686230057.dbf id reg.=117 mar...
nome do arquivo de log de arquivamento=/u01/archive/1_11_686230057.dbf id reg.=118 mar...
Finalizado backup em 06/10/2009

Iniciando backup em 06/10/2009
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
fno=00001 name=/u01/app/oracle/oradata/BD01/system01.dbf do arquivo de dados de entrada
fno=00002 name=/u01/app/oracle/oradata/BD01/undotbs01.dbf do arquivo de dados de entrada
fno=00003 name=/u01/app/oracle/oradata/BD01/sysaux01.dbf do arquivo de dados de entrada
fno=00004 name=/u01/app/oracle/oradata/BD01/users01.dbf do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG20091006T1057...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:04:05
Finalizado backup em 06/10/2009

Iniciando backup em 06/10/2009
log atual arquivado
utilizando o canal ORA_DISK_1
canal ORA_DISK_1: iniciando conjunto de backups de log de arquivamento
canal ORA_DISK_1: especificando log(s) de arquivamento no conjunto de backups
log de arquivamento thread de entrada=1 seqüência=12 id reg.=119 marcação=698929289
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG20091006T1101...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:00:05
canal ORA_DISK_1: deletando log(s) de arquivamento
nome do arquivo de log de arquivamento=/u01/archive/1_12_686230057.dbf id reg.=119 mar...
Finalizado backup em 06/10/2009

Iniciando Control File and SPFILE Autobackup em 06/10/2009
handle de componente=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294_5d6s61ws_...
Finalizado Control File and SPFILE Autobackup em 06/10/2009

RMAN> crosscheck backup;
utilizando o canal ORA_DISK_1
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
Fez a verificação cruzada de 4 objetos

RMAN> delete noprompt expired backup;
utilizando o canal ORA_DISK_1

RMAN> delete noprompt obsolete;
a política de retenção RMAN será aplicada ao comando
a política de retenção RMAN está definida para a redundância 1
utilizando o canal ORA_DISK_1
Deletando os seguintes backups e cópias obsoletas:
Type Key Completion Time Filename/Handle
-------------------- ------ ------------------ ------------------------------------------
Conjunto de Backups 61 06/10/2009
Parte de Backup 61 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
Deletou 1 objetos

RMAN>

Recovery Manager completo.

Irei realizar outro teste só que, agora, alterando o modo de operação do banco de dados para NOARCHIVELOG.

[oracle@linux u01]$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Ter Out 6 08:45:12 2009

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

Conectado a:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> shutdown immediate
Banco de dados fechado.
Banco de dados desmontado.
Instância ORACLE desativada.

SQL> startup mount
Instância ORACLE iniciada.

Total System Global Area 155189248 bytes
Fixed Size 1266320 bytes
Variable Size 113249648 bytes
Database Buffers 37748736 bytes
Redo Buffers 2924544 bytes
Banco de dados montado.

SQL> alter database noarchivelog;

Banco de dados alterado.

SQL> alter database open;

Banco de dados alterado.

SQL> archive log list
Modo log de banco de dados Modo Sem Arquivamento
Arquivamento automático Desativado
Destino de arquivamento /u01/archive/
A seqüência de log on-line mais antiga 11
Seqüência de log atual 13

SQL> exit
Desconectado de Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Apenas para fins de demonstração, caso eu tente realizar o backup do banco de dados sem antes realizar o shutdown do mesmo, o RMAN irá emitir um erro como demonstrado abaixo:

[oracle@linux ~]$ rman target /

Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:10:49 2009

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

conectado ao banco de dados de destino: BD01 (DBID=2949935972)

RMAN> backup database;

Iniciando backup em 06/10/2009
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=147 devtype=DISK
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: falha do comando backup no canal de ORA_DISK_1 em 06/10/2009 09:11:12
ORA-19602: não pode copiar ou fazer backup de arquivo ativo no modo NOARCHIVELOG

RMAN> exit

Recovery Manager completo.

Como mencionado anteriormente, o script de backup irá detectar o modo de operação do banco de dados, então o mesmo automaticamente irá realizar o shutdown da instância caso o banco de dados esteja configurado para operar no modo NOARCHIVELOG e, após a realização do backup, o script irá realizar o startup da instância e abertura do banco de dados.

[oracle@linux u01]$ ./bkpora_rman
Realizando Backup Offline (NOARCHIVELOG) do Banco de Dados...
Backup do banco de dados realizado com sucesso.
O arquivo de log está em /home/oracle/log_rman_ultimo.log

-- Verificando o arquivo de log gerado
[oracle@linux u01]$ cat /home/oracle/log_rman_ultimo.log
Log de Backup do RMAN

Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:23:56 2009

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

conectado ao banco de dados de destino: BD01 (DBID=2949935972)

RMAN>
eco ativado

RMAN> show all;
usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação
os parâmetros de configuração RMAN são:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
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 ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '$ORACLE_HOME/dbs/snapcf_BD01.f'; # default

RMAN> report schema;
Relatório do esquema do banco de dados

Lista de Arquivos de Dados Permanentes
======================================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------------------------
1 300 SYSTEM *** /u01/app/oracle/oradata/BD01/system01.dbf
2 200 UNDOTBS1 *** /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 120 SYSAUX *** /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 21 USERS *** /u01/app/oracle/oradata/BD01/users01.dbf

Lista de Arquivos Temporários
=============================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- ---------------------------------------
1 20 TEMP 32767 /u01/app/oracle/oradata/BD01/temp01.dbf

RMAN> sql "create pfile=''/u01/flash/initBD01.ora'' from spfile";
instrução sql: create pfile=''/u01/flash/initBD01.ora'' from spfile

RMAN> shutdown immediate;
banco de dados fechado
banco de dados desmontado
encerramento de instância Oracle

RMAN> startup mount;
conectado ao banco de dados de destino (não iniciado)
instância Oracle iniciada
banco de dados montado

Total da Área Global do Sistema 155189248 bytes

Fixed Size 1266320 bytes
Variable Size 113249648 bytes
Database Buffers 37748736 bytes
Redo Buffers 2924544 bytes

RMAN> backup as backupset device type disk database;
Iniciando backup em 06/10/2009
canal alocado: ORA_DISK_1
canal ORA_DISK_1: sid=157 devtype=DISK
canal ORA_DISK_1: iniciando conjunto de backup completo de arquivo de dados
canal ORA_DISK_1: especificando arquivo(s) de dados no conjunto de backups
fno=00001 name=/u01/app/oracle/oradata/BD01/system01.dbf do arquivo de dados de entrada
fno=00002 name=/u01/app/oracle/oradata/BD01/undotbs01.dbf do arquivo de dados de entrada
fno=00003 name=/u01/app/oracle/oradata/BD01/sysaux01.dbf do arquivo de dados de entrada
fno=00004 name=/u01/app/oracle/oradata/BD01/users01.dbf do arquivo de dados de entrada
canal ORA_DISK_1: iniciando o componente 1 em 06/10/2009
canal ORA_DISK_1: componente 1 finalizado em 06/10/2009
handle de componente=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG20091006T1118...
canal ORA_DISK_1: conjunto de backups concluído, tempo decorrido: 00:04:29
Finalizado backup em 06/10/2009

Iniciando Control File and SPFILE Autobackup em 06/10/2009
handle de componente=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698930288_5d6tfssw_...
Finalizado Control File and SPFILE Autobackup em 06/10/2009

RMAN> alter database open;
banco de dados aberto

RMAN> crosscheck backup;
utilizando o canal ORA_DISK_1
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup submetido a verificação cruzada: localizado como 'AVAILABLE'
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698930288...
Fez a verificação cruzada de 5 objetos

RMAN> delete noprompt expired backup;
utilizando o canal ORA_DISK_1

RMAN> delete noprompt obsolete;
a política de retenção RMAN será aplicada ao comando
a política de retenção RMAN está definida para a redundância 1
utilizando o canal ORA_DISK_1
Deletando os seguintes backups e cópias obsoletas:
Type Key Completion Time Filename/Handle
-------------------- ------ ------------------ ------------------------------------------
Conjunto de Backups 62 06/10/2009
Parte de Backup 62 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
Conjunto de Backups 63 06/10/2009
Parte de Backup 63 06/10/2009 /u01/flash/BD01/backupset/2009_10_06/o1...
Conjunto de Backups 64 06/10/2009
Parte de Backup 64 06/10/2009 /u01/flash/BD01/autobackup/2009_10_06/o...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/backupset/2009_10_06/o1_mf_annnn_TAG200...
componente de backup deletado
handle de componente de backup=/u01/flash/BD01/autobackup/2009_10_06/o1_mf_s_698929294...
Deletou 3 objetos

RMAN>

Recovery Manager completo.

Após finalizado o backup físico, poderemos checar através do RMAN as informações sobre o backup que foi realizado.

[oracle@linux flash]$ rman target /

Gerenciador de Recuperação: Release 10.2.0.4.0 - Production on Ter Out 6 09:35:16 2009

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

conectado ao banco de dados de destino: BD01 (DBID=2949935972)

RMAN> list backup of database;

usar o arquivo de controle do banco de dados de destino em vez do catálogo de recuperação

Lista de Conjuntos de Backup
============================

BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ -------------------------------------
67 Full 289.28M DISK 00:03:01 06/10/2009
Chave BP: 67 Status: AVAILABLE Compactado: NO Tag: TAG20091006T112920
Nome do Componente: /u01/flash/BD01/backupset/2009_10_06/o1_mf_nnndf_TAG200910...
Lista de Arquivos de Dados no conjunto de backup 67
File LV Type Ckp SCN Tempo de Verif. Name
---- -- ---- ---------- --------------- ------------------------------------------
1 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/system01.dbf
2 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/undotbs01.dbf
3 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/sysaux01.dbf
4 Full 258379 06/10/2009 /u01/app/oracle/oradata/BD01/users01.dbf

RMAN> list backup summary;

Lista de Backups
================

Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
------- -- -- - ----------- --------------- ------- ------- ---------- ------------------
67 B F A DISK 06/10/2009 1 1 NO TAG20091006T112920
68 B F A DISK 06/10/2009 1 1 NO TAG20091006T113229


-- Verificando o conteúdo do diretório /u01/flash/
[oracle@linux /]$ cd /u01/flash/
[oracle@linux flash]$ ls -l
total 8
drwxr-x--- 4 oracle dba 4096 Out 6 08:37 BD01
-rw-r--r-- 1 oracle oinstall 1043 Out 6 08:38 initBD01.ora

Por fim, é altamente recomendável copiar os arquivos de backup para um local seguro, logo assim que o procedimento de backup for finalizado.