Para melhor visualização, recomendo resolução de no mínimo 1024 x 768 e navegador Mozilla Firefox

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 <<>
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 <<>
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 <<>
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 <<>
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 <<>
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 <<>
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.

terça-feira, 15 de setembro de 2009

Gerando backups lógicos de banco de dados no Linux através de um script Perl ...

Olá,

Antes de mostrar o script em "perl" para geração de backups lógicos do Oracle no Linux, através dos utilitários de exportação fornecidos junto com o banco de dados Oracle, irei repetir o que já foi comentado nos artigos de Outubro/2008 e Dezembro/2008: O desenvolvimento de um plano de backup e recuperação é extremamente importante para um servidor de banco de dados. É lógico que, dependendo do caso, um plano adequado de backup e recuperação não tem que ser necessariamente o mais elaborado e complexo ... na verdade, ele precisa ser aquele que irá servir melhor às necessidades de cada negócio. Em geral os tipos de backups dos bancos de dados Oracle se classificam em três categorias simples:

* Backup do sistem operacional (OS)
* Backups gerenciados pelo RMAN (Recovery Manager)
* Backups lógicos

Em resumo, cada tipo de método de backup tem suas próprias vantagens e desvantagens. O processo de criação de uma boa estratégia de backup e recuperação envolve a avaliação dos méritos e problemas desses diferentes tipos de backups, e sua combinação conforme a necessidade para criar um nível aceitável de proteção efetivo.

Vale a pena salientar que o utilitário de exportação não pode ser considerado como uma ferramenta para criação de um método efetivo de backup. Eu diria que ele possibilita um backup lógico, pelo fato de que não é possível aplicar um histórico de redo log nos objetos importados provenientes de um arquivo de exportação. Um backup lógico de um banco de dados envolve a leitura de um conjunto de registros do banco de dados e a gravação destes em um arquivo. Esses registros são lidos independentes das suas localizações físicas. Acredito que uma estratégia robusta de backup possa incluir tanto backups físicos como lógicos. Em geral, bancos de dados de produção contam com backups físicos como seu principal método de backup e backups lógicos servem como um método secundário. Por outro lado, para bancos de dados de desenvolvimento e para pequenos processamentos de movimentação de dados, os backups lógicos podem ser uma solução aceitável e viável.

Portanto, os arquivos dumps gerados pelo utilitário de exportação podem ser utilizados como um recurso complementar ao backup físico de banco de dados para proteção contra erros de usuário. Por exemplo, um backup lógico pode ser útil quando um usuário elimina ou trunca uma tabela acidentalmente ou quando o DBA precisa restaurar uma tabela que apresente erros lógicos, ou uma operação qualquer que tenha afetado somente um subconjunto do banco de dados. Neste caso, um dump de exportação atualizado seria uma alternativa mais rápida e menos traumática do que realizar uma recuperação incompleta de banco de dados, seja ela gerenciada pelo usuário ou através do recovery manager (RMAN). Em todo caso, e dependendo do cenário, isso dependerá muito da versão Oracle utilizada pelo fato de a partir do Oracle 10g, nós já termos a proteção da lixeira (recyclebin) para segmentos que foram dropados e inclusive recursos da tecnologia flashback.

No mais, abaixo existem dois scripts escritos em "perl" que realizam o backup lógico (FULL export) do banco de dados. Eu digo dois porque, o primeiro, faz uso do utilitário de exportação tradicional (exp) para uso no caso de versões Oracle anteriores ao Oracle 10g e, o segundo, faz uso do utilitário Export Data Pump (expdp) para uso nas versões à partir do Oracle 10g.

Em resumo, o script irá gerar o arquivo dump de exportação, compactá-lo através de um utilitário fornecido pelo sistema operacional, renomeá-lo com informações de data, hora e minuto de criação e, por fim, realizar a exclusão de arquivos dump de exportação (compactados) antigos, ou seja, somente os 20 últimos arquivos gerados serão mantidos. Utilizarei o "cron" do linux para agendar a execução diária do script, como demonstrarei mais abaixo:

-- Verificando se o pacote perl está instalado
[root@linux ~]# rpm -q perl
perl-5.8.8-10.el5_0.2

Afim de não expor a senha do usuário DBA de banco de dados SYSTEM no script, irei criar como demonstrado abaixo, um usuário de banco de dados com os privilégios necessários para a realização da exportação FULL.

SQL> create user adm identified by adm
2 default tablespace users
3 quota unlimited on users;

Usuário criado.

SQL> grant create session,create table,exp_full_database to adm;

Concessão bem-sucedida.

Vale a pena salientar que o privilégio de sistema "create table" concedido ao usuário ADM se faz necessário para uso do utilitário Export Data Pump. A única configuração necessária para se realizar no script será o de informar, através da variável $destinoBackup, o local onde deverão ser gerados os backups lógicos do banco de dados. Para quem for utilizar o Export Data Pump (expdp), esta variável deverá ter o mesmo caminho que foi definido no objeto "directory".

-- Script para uso do utilitário exp
#!/usr/bin/perl -w
$destinoBackup = '/backup/oracle/exp';
opendir($destinoBackup,'.') || die "O diretorio de backup($destinoBackup) não existe";
print "Iniciando backup lógico...\n";
system("su - oracle -c \"exp adm/adm file=$destinoBackup/bkpfull.dmp full=y\"");
print "Compactando backup...\n";
system("gzip $destinoBackup/bkpfull.dmp");
@time = localtime(time);
$dataHora = (1900+$time[5])."\-".($time[4]+1)."\-$time[3]_$time[2]-$time[1]h";
system("mv $destinoBackup/bkpfull.dmp.gz $destinoBackup/bkpfull_$dataHora.dmp.gz");
system("find $destinoBackup -mtime +20 -name \"*.dmp.gz\" -exec rm {} ".'\;');

Para uso do Export Data Pump, irei criar o objeto "directory" como demonstrado abaixo:

SQL> create directory exp_dir as '/backup/oracle/expdp';

Diretório criado.

SQL> grant read,write on directory exp_dir to adm;

Concessão bem-sucedida.

-- Script para uso do utilitário expdp
#!/usr/bin/perl -w
$destinoBackup = '/backup/oracle/expdp';
opendir($destinoBackup,'.') || die "O diretorio de backup($destinoBackup) não existe";
print "Iniciando backup lógico...\n";
system("su - oracle -c \"expdp adm/adm directory=exp_dir dumpfile=bkpfull.dmp full=y\"");
print "Compactando backup...\n";
system("gzip $destinoBackup/bkpfull.dmp");
@time = localtime(time);
$dataHora = (1900+$time[5])."\-".($time[4]+1)."\-$time[3]_$time[2]-$time[1]h";
system("mv $destinoBackup/bkpfull.dmp.gz $destinoBackup/bkpfull_$dataHora.dmp.gz");
system("find $destinoBackup -mtime +20 -name \"*.dmp.gz\" -exec rm {} ".'\;');

Independente do utilitário de exportação escolhido, irei mover o script de backup para o diretório /usr/bin e criar uma entrada no "crontab" de forma a agendar a execução do mesmo como, por exemplo, todos os dias às 22:00. Se porventura ocorrer de algum usuário vir a utilizar o banco de dados durante o horário de realização do backup, então seria prudente adicionar a cláusula CONSISTENT=Y ao comando do utilitário de exportação tradicional (exp).

[root@linux ~]# cd /usr/bin
[root@linux ~]# ls -l bkpora
-rwxr-xr-x 1 oracle dba 651 Set 15 08:20 bkpora

[root@linux ~]# crontab -l
00 22 * * * bkpora

Abaixo está um exemplo de execução do script na qual utilizei o Export Data Pump como utilitário de exportação:

[root@linux ~]# ./bkpora
Iniciando backup lógico...

Export: Release 10.2.0.1.0 - Production on Terça-Feira, 15 Setembro, 2009 08:25:57

Copyright (c) 2003, 2005, Oracle. All rights reserved.

Conectado a: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
Iniciando "ADM"."SYS_EXPORT_FULL_01": adm/******** directory=exp_dir
dumpfile=bkpfull.dmp full=y
Estimativa em andamento com o método BLOCKS...
Processando o tipo de objeto DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATA
Estimativa total usando o método de BLOCKS: 29.93 MB
Processando o tipo de objeto DATABASE_EXPORT/TABLESPACE
Processando o tipo de objeto DATABASE_EXPORT/SYS_USER/USER
Processando o tipo de objeto DATABASE_EXPORT/SCHEMA/USER
Processando o tipo de objeto DATABASE_EXPORT/ROLE
.
.
.
Conjunto de arquivos de dump para ADM.SYS_EXPORT_FULL_01 é:
/backup/oracle/expdp/bkpfull.dmp
O job "ADM"."SYS_EXPORT_FULL_01" foi concluído com sucesso em 08:28:16

Compactando backup...
[root@linux ~]#

prod-web:~ # cd /backup/oracle/expdp
prod-web:/backup/oracle/expdp # ls -lh
total 13M
drwxr-xr-x 2 oracle oinstall 4,0K 2009-09-15 08:10 .
drwxr-xr-x 9 oracle oinstall 4,0K 2009-09-15 08:09 ..
-rw-r----- 1 oracle dba 13M 2009-09-15 08:28 bkpfull_2009-9-15_08-28h.dmp.gz
-rw-r--r-- 1 oracle dba 23K 2009-08-26 08:28 export.log

No mais, ao longo dos dias, será possível visualizar os arquivos gerados como demonstrado no exemplo abaixo, mas, sempre que for possível eu recomendaria movê-los para um local seguro.

[root@linux ~]# ls -lhatr
total 3,8G
drwxr-xr-x 4 root root 4,0K Mai 27 22:05 ..
-rw-r--r-- 1 oracle dba 182M Jul 31 22:05 bkpfull_2009-7-31_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 1 22:05 bkpfull_2009-8-1_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 2 22:05 bkpfull_2009-8-2_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 3 22:04 bkpfull_2009-8-3_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 4 22:05 bkpfull_2009-8-4_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 5 22:05 bkpfull_2009-8-5_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 6 22:04 bkpfull_2009-8-6_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 7 22:05 bkpfull_2009-8-7_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 8 22:05 bkpfull_2009-8-8_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 9 22:05 bkpfull_2009-8-9_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 10 22:05 bkpfull_2009-8-10_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 11 22:05 bkpfull_2009-8-11_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 12 22:05 bkpfull_2009-8-12_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 13 22:05 bkpfull_2009-8-13_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 14 22:05 bkpfull_2009-8-14_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 15 22:05 bkpfull_2009-8-15_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 16 22:05 bkpfull_2009-8-16_22-7h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 17 22:05 bkpfull_2009-8-17_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 18 22:05 bkpfull_2009-8-18_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 182M Ago 19 22:05 bkpfull_2009-8-19_22-6h.dmp.gz
-rw-r--r-- 1 oracle dba 183M Ago 20 22:05 bkpfull_2009-8-20_22-6h.dmp.gz

terça-feira, 1 de setembro de 2009

Seja bem-vindo Pearson VUE .... Adeus Prometric ....

Olá,

De acordo com a nota de Paul Sorensen, à partir de 25 de setembro de 2009, os exames para certificação não serão mais oferecidos pela Prometric. A Oracle e a equipe do programa de certificação está em discussão com um novo parceiro que substituirá a atual provedora dos exames da Oracle, a Prometric. Segundo outras fontes, esta empresa seria a Pearson VUE. No mais, os candidatos serão capazes de se registrarem na Prometric até o dia 13 de setembro de 2009, embora os exames ainda possam ser realizados até o dia 25.

Os candidatos poderão ser registrar através do site da Pearson VUE à partir de do dia 14. Assim que for disponibilizado, convém acessar o link www.pearsonvue.com/oracle e, quanto a questões e dúvidas em geral, recomendo acessar a nota do blog do Programa de certificação da Oracle.

Em meio a este anúncio e, aproveitando este post, foi disponibilizado para download no site da Oracle, o tão aguardado Oracle Database 11g Release 2 para as plataformas Linux x86/Linux x86-64.

terça-feira, 25 de agosto de 2009

Anunciado a aposentadoria dos exames de certificação OCP Oracle 8 e 8i

Olá,

Estava lendo o Oracle Certification blog de Paul Sorensen, e resolvi compartilhar a informação aqui. Segundo o post, à partir de 25 setembro de 2009, os exames (1Z0-010) Oracle8: New Features for Administrators e (1Z0-020) Oracle8i: New Features for Administrators serão descontinuados (aposentados), ou seja, não estarão mais disponíveis como opções de exames para a obtenção de certificação OCP.

O exame 1Z0-010 foi criado para aquele profissional que é OCP Oracle 7.3 e que deseja atualizar sua certificação para a versão do Oracle 8. Já o exame 1Z0-020, foi criado aquele profissional que é OCP Oracle 8 e que deseja fazer a atualização da sua certificação para a versão Oracle 8i. Portanto, para quem ainda tem interesse em realizar esses dois exames, os mesmos ainda poderão ser realizados até o dia 25 de setembro de 2009.

No mais, para os profissionais que detém a certificação OCP Oracle 7.3 e/ou OCP Oracle 8, os mesmos ainda terão a opção de atualização de suas certificações para a versão OCP Oracle 9i através do exame 1Z0-035 DBA Oracle 9i New Features for Oracle7.3 e OCPs Oracle8.

segunda-feira, 17 de agosto de 2009

Introdução ao tipo de dado TIMESTAMP e suas variações ...

Olá,

Sabemos que o tipo de dado DATE do Oracle é um tipo especial capaz de armazenar datas que vão de 4712 a.C. a 9999 d.C, mas além de armazenar informações de século, ano, mês e dia, o mesmo também é capaz de armazenar informações de hora, minuto e segundo. Mas aí você poderia perguntar: Se o tipo de dado DATE é capaz de manter essas informações temporais, isso não poderia ser considerado um TIMESTAMP? Não necessariamente. O tipo de dados TIMESTAMP introduzido à partir do Oracle 9i, vai muito mais além do que simplesmente armazenar de forma "crua" informações de data e horários. Podemos dizer que o tipo de dado TIMESTAMP é uma extensão do tipo de dados DATE, capaz de manter informações de tempo com maior precisão. No mais, neste artigo farei uma breve introdução a este tipo de dado e suas variações (WITH TIME ZONE e WITH LOCAL TIME ZONE) que, muitas vezes, é fonte de dúvida entre desenvolvedores e administradores de banco de dados quanto à sua aplicação e uso.

Antes de começar a descrever sobre o tipo de dados TIMESTAMP, irei iniciar através do exemplo abaixo, como poderíamos verificar informações de século, data e horários atuais, selecionando-as direto do banco de dados através do uso da função SYSDATE:

SQL> select to_char(to_date(0,'J'), 'dd/mm/yyyy ad') from dual;
select to_char(to_date(0,'J'), 'dd/mm/yyyy ad') from dual
*
ERRO na linha 1:
ORA-01854: data juliana deve estar entre 1 e 5373484

SQL> select
2 to_char(to_date(1,'J'), 'dd/mm/yyyy ad') de,
3 to_char(to_date(5373484,'J'), 'dd/mm/yyyy ad') ate
4 from dual;

DE ATE
--------------- ---------------
01/01/4712 a.C. 31/12/9999 d.C.

SQL> select to_char(sysdate,'cc dd/mm/yyyy hh24:mi:ss') data from dual;

DATA
----------------------
21 17/08/2009 08:10:25

Talvez você também já tenha ouvido falar da função CURRENT_DATE. A diferença entre ela e o SYSDATE é que a função SYSDATE retorna a data e horário do servidor, enquanto que a função CURRENT_DATE retorna a data e horário de acordo com o fuso horário da sessão do usuário. Para comprovar tal explicação, no exemplo abaixo irei alterar o fuso horário da minha sessão para o fuso horário de Nova York nos EUA que é '-5:00'. No servidor Oracle, o fuso horário está definido em '-3:00', ou seja, três horas de atraso em relação à hora de Greenwich.

SQL> alter session set nls_date_format='dd/mm/yyyy hh24:mi:ss';

Sessão alterada.

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
----------------
-03:00

SQL> alter session set time_zone='-5:00';

Sessão alterada.

SQL> select sessiontimezone from dual;

SESSIONTIMEZONE
----------------
-05:00

SQL> select sysdate,current_date from dual;

SYSDATE CURRENT_DATE
------------------- -------------------
17/08/2009 08:15:45 17/08/2009 06:15:45

Podemos perceber acima que SYSDATE retornou o horário do servidor, e CURRENT_DATE o horário de acordo com o fuso horário definido na minha sessão.

Bom, voltando ao assunto que originou este artigo e, como já dito anteriormente, o tipo de dados TIMESTAMP introduzido à partir do Oracle 9i é uma extensão do tipo de dados DATE. Além de armazenar o ano, mês, dia, horas, minutos e segundos do tipo de dados DATE, o mesmo é capaz também de armazenar o valor das frações de segundo. A precisão dessas frações, como o próprio nome já diz, nada mais é do que o número de dígitos da parte fracionária dos "segundos". Esta precisão pode ser um número de 0 a 9, mas quando não especificado, o seu valor padrão é 6.

SQL> create table t1 (ts_data timestamp);

Tabela criada.

SQL> desc t1
Nome Nulo? Tipo
---------------------------- -------- ------------------------
TS_DATA TIMESTAMP(6)


SQL> insert into t1 values (localtimestamp);

1 linha criada.

SQL> alter session set nls_timestamp_format = 'dd/mm/yyyy hh24:mi:ss.ff';

Sessão alterada.

SQL> select * from t1;

TS_DATA
--------------------------
05/08/2009 08:20:32.627869

Além do exemplo demonstrado acima, existem ainda duas variações do tipo de dados TIMESTAMP:


O tipo TIMESTAMP WITH TIME ZONE é uma variante de TIMESTAMP que inclui um deslocamento de fuso horário (TIME ZONE) em seu valor. Podemos dizer que o deslocamento de fuso horário em questão é a diferença em horas e minutos entre o horário local e o UTC. UTC é um acrônimo do Inglês para "Coordinated Universal Time" ou "Tempo Universal Coordenado" que corresponde ao fuso horário de referência a partir do qual se calculam todas as outras zonas horárias do mundo. Segundo algumas bibliografias, o UTC é o sucessor do Tempo Médio de Greenwich (Greenwich Mean Time), abreviadamente mais conhecido como GMT. Esta nova denominação foi cunhada para basear a medida do tempo nos padrões atômicos, mais do que nos celestes. Em resumo, dois valores TIMESTAMP WITH TIME ZONE serão considerados idênticos se representarem o mesmo instante em UTC, independente dos deslocamentos de fusos horários (TIME ZONE) armazenados nos dados. Confuso? Bom, para que não haja dúvidas, poderemos ver abaixo um exemplo que demonstra uma informação de data e horário que deverá ser reunida ou coordenada entre diferentes regiões geográficas com fusos horários distintos:

Por exemplo:

TIMESTAMP '17/08/2009 08:00:00 -3:00'

é o mesmo que

TIMESTAMP '17/08/2009 06:00:00 -5:00'

Isto é, 08:00 horas da manhã no horário de Brasília é o mesmo que 06:00 horas da manhã no horário de Nova York nos EUA.


O outro tipo, TIMESTAMP WITH LOCAL TIME ZONE é outra variante de TIMESTAMP que inclui um deslocamento de fuso horário em seu valor. A diferença é que este deslocamento não é armazenado como parte dos dados da coluna, mas sim, normalizado para o fuso horário do banco de dados (DBTIMEZONE). O verbo "normalizar", neste caso, eu entendo como um cálculo que é realizado tendo como base o fuso horário definido no banco de dados afim de se mostrar o horário local do usuário. Portanto, o Oracle retornará a informação de data, hora, minuto e segundo no fuso horário local da sessão que está acessando o dado. Vale a pena salientar que o uso desta variante é apropriado para aplicações onde se deseja exibir as datas e os horários usando o fuso horário do sistema cliente. Para quem já acessou algum tipo fórum ou lista de discussão de nível global, notará que ao postar algum tópico no fórum, a data e horário mostrada será convertida para o fuso horário local. Caso um leitor que esteja no Japão acessar o tópico, verá a data e horário de acordo com o fuso horário do Japão. Então, utilizando como base o exemplo anterior:

Supondo que eu esteja no Brasil (fuso horário -3:00) e insira a data e horário abaixo:

TIMESTAMP '17/08/2009 08:00:00'

e um usuário que esteja em Nova York (fuso horário -5:00) acessar o mesmo dado, a data apresentada para este usuário será

TIMESTAMP '17/08/2009 06:00:00'

No mais, para demonstrar o uso do tipo TIMESTAMP e suas duas variações, irei realizar algumas operações abaixo. Vale a pena salientar que o Oracle possui além das funções SYSDATE e CURENT_DATE, outras funções embutidas para capturar informações de data e horários atuais como, LOCALTIMESTAMP, CURRENT_TIMESTAMP e SYSTIMESTAMP onde:
  • LOCALTIMESTAMP: retorna um valor do tipo TIMESTAMP como data e horário corrente (incluindo frações de segundos), de acordo com o fuso horário definido na sessão do usuário.
  • CURRENT_TIMESTAMP: retorna um valor do tipo TIMESTAMP WITH TIME ZONE como data e horário corrente (incluindo frações de segundos), de acordo com o fuso horário definido na sessão do usuário.
  • SYSTIMESTAMP: retorna um valor do tipo TIMESTAMP WITH TIME ZONE como data e horário corrente (incluindo frações de segundos), de acordo com o fuso horário definido no sistema onde o servidor de banco de dados reside.
Para demonstrar o resultado das funções acima, executarei os comandos SQL abaixo:

SQL> alter session set time_zone='-5:00';

Sessão alterada.

SQL> select localtimestamp,current_timestamp,systimestamp from dual;

LOCALTIMESTAMP CURRENT_TIMESTAMP SYSTIMESTAMP
------------------------ ------------------------------- -------------------------------
17/08/09 06:20:54,656000 17/08/09 06:20:54,656000 -05:00 17/08/09 08:20:54,656000 -03:00

Podemos perceber pelo resultado acima que LOCALTIMESTAMP e CURRENT_TIMESTAMP apresentaram o mesmo horário, a diferença é que CURRENT_TIMESTAMP trouxe a informação do fuso horário (-5:00). Já a função SYSTIMESTAMP, diferente de CURRENT_TIMESTAMP, trouxe o horário de acordo com o fuso horário definido no sistema do servidor de banco de dados.

Irei agora criar uma tabela de teste conforme abaixo:

SQL> create table t2 (
2 a timestamp,
3 b timestamp with time zone,
4 c timestamp with local time zone
5 );

Tabela criada.

SQL> desc t2
Nome Nulo? Tipo
------------------------- -------- ---------------------------------
A TIMESTAMP(6)
B TIMESTAMP(6) WITH TIME ZONE
C TIMESTAMP(6) WITH LOCAL TIME ZONE

SQL> insert into t2 values (localtimestamp,localtimestamp,localtimestamp);

1 linha criada.

SQL> select * from t2;

A B C
------------------------ ------------------------------- ------------------------
17/08/09 08:30:10,250000 17/08/09 08:30:10,250000 -03:00 17/08/09 08:30:10,250000

Independente da função utilizada, as informações de data e horários foram inseridas nas devidas colunas e mostram o mesmo horário. Agora irei realizar através de uma aplicação (no meu caso o SQL*Plus), a simulação do acesso remoto ao banco de dados na qual o usuário está localizado em uma região geográfica onde fuso horário desta região seja diferente como, por exemplo, Nova York nos EUA:

SQL> alter session set time_zone='-5:00';

Sessão alterada.

SQL> select dbtimezone,sessiontimezone from dual;

DBTIMEZONE SESSIONTIMEZONE
---------- ---------------
-03:00 -05:00

SQL> select * from t2;

A B C
------------------------ ------------------------------- ------------------------
17/08/09 08:30:10,250000 17/08/09 08:30:10,250000 -03:00 17/08/09 06:30:10,250000

De acordo com o resultado acima, podemos notar que os resultados das colunas A e B não se alteraram, ou seja, como o usuário Nova Yorkino não tem conhecimento do fuso horário da região de onde está localizado o banco de dados, o valor da coluna A seria um tanto impreciso. Já o valor da coluna B faria mais sentido pelo fato de apresentar a informação do fuso horário, ou seja, o usuário saberia de forma precisa, o horário em que o dado foi gravado. Por último, podemos perceber que o valor da coluna C foi automaticamente "convertido" para o fuso horário da sessão do usuário que, neste caso é '-5:00'.

Concluindo, o tipo de dado TIMESTAMP WITH LOCAL TIME ZONE é ideal e apropriado para aplicações onde se deseja exibir informações de data e horários usando o fuso horário do sistema cliente.

Creative Commons License
Oracle Blog by Eduardo Legatti is licensed under a Creative Commons Atribuição-Uso Não-Comercial 2.5 Brasil License.
Oracle Blog não se responsabiliza pelo uso dos códigos e informações aqui fornecidas.

Outros Artigos

 
BlogBlogs.Com.Br