Como exportar um dump de uma base Oracle com o Data Pump

Um dump de um banco de dados Oracle é simplesmente uma cópia “lógica” do banco de dados, ou seja, da estrutura de objetos do banco e de comandos para a criação dessas estruturas e do insert dos dados.

Um dump não é, por si mesmo, a melhor e mais segura estratégia de backup mas é um importante complemento para suas rotinas de backup.

Para usar o Oracle Data Pump para exportar um dump do banco de dados, inicialmente é preciso definir um diretório onde o dump será salvo. Esse diretório é criado por um usuário com privilégias de SYSDBA. Posteriormente damos permissão de acesso ao diretório para que outru usuário, por exemplo o SYSTEM, possa gerar o dump.

Vamos criar o diretório, nomeando-o de diretorio_datapump, e vamos dar permissões para o usuário SYSTEM. Acesse o SQL*Plus e execute os seguintes comandos:

usuario@servidor:~> sqlplus / as sysdba

SQL> create or replace directory diretorio_datapump
  2  as '/u05/dpump';

Directory created.

SQL> grant read, write
  2  on directory diretorio_datapump
  3  to system;

Grant succeeded.

Para realizar o dump full do banco de dados, basta usar o comando expdb (export usando data pump). A sintaxe é um pouco esquisita (principalmente o flashback_time) e você deve digitar exatamente como está abaixo, incluindo as contra-barras, as aspas simples e aspas duplas:

usuario@servidor:~> expdp userid=system full=y directory=diretorio_datapump dumpfile=backup.dpump logfile=backup.dpump.log flashback_time=\"to_timestamp\(to_char\(sysdate,\'yyyy-mm-dd hh24:mi:ss\'\),\'yyyy-mm-dd hh24:mi:ss\'\)\"

A senha do usuário SYSTEM será solicitada e o processo se iniciará. O dump será gravado no diretório “diretorio_datapump” que configuramos anteriormente, juntamente com o arquivo de log.

Se tudo correu bem você verá uma mensagem parecida com a seguinte:

Dump file set for SYSTEM.SYS_EXPORT_FULL_01 is:
 /u05/dpump/backup.dpump
Job "SYSTEM"."SYS_EXPORT_FULL_01" successfully completed at Tue Dec 8 17:26:26 2015 elapsed 0 00:02:46

Se quiser, use esse comando em um script e automatize o dump diariamente. Tenha em mente que dependendo do tamanho do banco de dados, como um banco de muitos terabytes, um dump não é prático. Mas se seu banco for de tamanho razoável, o dump é um ótimo acompanhante para sua rotina de backup.

Script de backup para o MySQL ou MariaDB

Segue um script simples de backup para o MySQL ou o MariaDB. O script tem como pré-requisito a criação de um usuário específico para backup, com privilégios restritos (altere o que está em vermelho e itálico):

#!/bin/bash

# backup_mysql.sh
# Script para backup simples de um ou mais bancos de dados MySQL/MariaDB

# Dados de conexão:
#------------------
host="localhost"
bancos="nome_do_banco" # Se mais de um, separar por espaços
usuario="nome_do_usuario"
senha="senha_do_usuario"
data=`date +"%Y-%m-%d_%H-%M-%S"`
arquivo="/path/do/diretorio/de/backup/${data}"

# Configura opções:
#------------------
opcoes="--add-drop-database --add-drop-table --add-locks --comments --complete-insert --create-options --disable-keys --default-character-set=utf8 --extended-insert --dump-date --lock-tables --order-by-primary --quick --routines --set-charset --triggers"

# Faz backup:
#------------
for i in `echo $bancos`
do
  mysqldump -h $host -u $usuario --password=$senha --databases $i -r ${arquivo}_${i}.sql
done

O script acima fará um backup de todos os bancos listados, gerando arquivos com o nome de: YYYY-MM-DD_HH-MI-SS_nome_do_banco.sql.

Obviamente o usuário que faz o backup deve ter permissão em todos os bancos de dados.

Agora configure o cron para rodar automaticamente o script e apagar os backups mais velhos que 5 dias. Coloque isso em seu crontab (altere o que está em vermelho itálico):

# Faz o backup do MySQL, todo dia as 19:00h:
00 19 * * * /path/ate/o/script/backup_mysql.sh


# Apaga os backups antigos do MySQL (backups com mais de 5 dias),
# todo dia as 19:30h:
30 19 * * * find /path/do/diretorio/de/backup -name "*.sql" -mtime +5 -exec rm -f {} \;

Agora você já tem um script simples para o backup de seus bancos de dados. Obviamente você deverá copiar esse backup para algum outro host ou mídia de backup.

Usuário específico para backup no MySQL (MariaDB)

Muitas vezes precisamos escrever scripts de backup para o MySQL (ou o MariaDB) que armazenam a senha de acesso ao banco de dados. Obviamente se seu servidor for comprometido e o hacker tiver acesso ao script de backup, ele pegará a senha do banco de dados de presente.

Um jeito mais seguro de usar scripts com senhas de usuários para backup é criar um usuário específico para backup, com dois privilégios: SELECT e de LOCK TABLES. Um hacker que conseguisse essa senha específica do usuário de backup ainda conseguiria fazer algum estrago (dar um lock me alguma tabela), mas não conseguiria apagar um banco de dados ou alterar os dados.

Para aumentar um pouco a segurança de seus scripts de backup, crie o usuário específico, dê os grants e use esse usuário/senha em seus scripts. Entre no MySQL (ou MariaDB) como usuário root e faça o seguinte (substitua os nomes em itálico sublinhado de acordo com seu sistema):

CREATE USER usuario@localhost
IDENTIFIED BY 'senha';

GRANT SELECT, LOCK TABLES
ON nome_do_banco_de_dados.*
TO usuario;

FLUSH PRIVILEGES;

Agora você tem um usuário que só pode dar SELECT e LOCK TABLES, e apenas para o banco de dados que você especificou.

Use esse usuário/senha menos privilegiado em seus scripts de backup.

Script de backup online do Oracle com RMAN

Para configurar o backup online de um banco Oracle através do uso do RMAN, eu uso o script abaixo:

#!/bin/bash
#
# Script de backup incremental do banco de dados Oracle, conforme indicado em:
#    "Oracle Database 2 Day DBA"
#    "Oracle Database Backup and Recovery User's Guide"
# Acrescentei o backup do init.ora e o backup trace do controlfile.
#
# Por Abrantes Araújo Silva Filho
#
# ANTES DE EXECUTAR A ROTINA DE BACKUP, configure o RMAN com os seguintes
# parâmetros (dependentes da versão do database e se enterprise ou standard):
# (atenção com os PATHs também!):
#
# Oracle 12c (12.1.0.1.0) Standard Edition One:
#   - CONFIGURE RETENTION POLICY TO REDUNDANCY 1;
#   - CONFIGURE BACKUP OPTIMIZATION ON;
#   - CONFIGURE DEFAULT DEVICE TYPE TO DISK;
#   - CONFIGURE CONTROLFILE AUTOBACKUP ON;
#   - CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u09/fast_recovery_area/ORACLE1/controlfile_autobackup/%F';
#   - CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
#   - CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
#   - CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1;
#   - CONFIGURE MAXSETSIZE TO UNLIMITED;
#   - CONFIGURE ENCRYPTION FOR DATABASE OFF;
#   - CONFIGURE ENCRYPTION ALGORITHM 'AES128';
#   - CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE;
#   - CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS;
#   - CONFIGURE ARCHIVELOG DELETION POLICY TO BACKED UP 2 TIMES TO DISK;
#   - CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u09/fast_recovery_area/ORACLE1/controlfile_snapshot/snapcf_oracle.f'; 
#
# Depois de tudo pronto, crie um crontab para o usuário oracle:
#    # Endereço de e-mail do log do crontab:
#    MAILTO=abrantesasf@gmail.com
#
#    # Roda o backup incremental diário, 19:00h.
#    00 19 * * * /home/oracle/bin/backup_oracle.sh
#
#
# Não altere este script se não souber o que está fazendo!


# Variáveis de ambiente
#######################
export ORACLE_HOME=/u01/app/oracle/product/12.1.0.1.0/db
export ORACLE_SID=oracle1
export PATH=$ORACLE_HOME/bin:$PATH


# Roda RMAN
###########
rman <<EOF
connect target /
RUN {
 ALLOCATE CHANNEL disco_de_backup DEVICE TYPE DISK;
 RECOVER COPY OF DATABASE WITH TAG backup_incremental_diario UNTIL TIME "SYSDATE-3";
 BACKUP INCREMENTAL LEVEL 1 FOR RECOVER OF COPY WITH TAG backup_incremental_diario DATABASE PLUS ARCHIVELOG;
 CROSSCHECK BACKUP;
 DELETE NOPROMPT OBSOLETE;
}
exit
EOF


# Cria backup do init.ora e backup trace do controlfile:
########################################################
# Backup do init.ora antigo:
if [ -a /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora.bak ] ; then
 rm /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora.bak
 mv /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora.bak
else
 if [ -a /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora ] ; then
 mv /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora /u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora.bak
 fi
fi

# Backup do controlfile antigo:
if [ -a /u09/fast_recovery_area/ORACLE1/outros/control_file.txt.bak ] ; then
 rm /u09/fast_recovery_area/ORACLE1/outros/control_file.txt.bak
 mv /u09/fast_recovery_area/ORACLE1/outros/control_file.txt /u09/fast_recovery_area/ORACLE1/outros/control_file.txt.bak
else
 if [ -a /u09/fast_recovery_area/ORACLE1/outros/control_file.txt ] ; then
 mv /u09/fast_recovery_area/ORACLE1/outros/control_file.txt /u09/fast_recovery_area/ORACLE1/outros/control_file.txt.bak
 fi
fi

# Backup do init.ora novo e do controlfile novo:
sqlplus /nolog << EOF
connect / as sysdba
create pfile='/u09/fast_recovery_area/ORACLE1/outros/initoracle1.ora'
from spfile='/u01/app/oracle/product/12.1.0.1.0/db/dbs/spfileoracle1.ora';
alter database backup controlfile to trace as '/u09/fast_recovery_area/ORACLE1/outros/control_file.txt';
exit
EOF

OK, a listagem acima está MUITO CONFUSA pois a apresentação em tela é horrível. Baixe o script neste link então!

Salve o script em um diretório que possa ser encontrado pelo PATH e agende um crontab.

SIGA AS INSTRUÇÕES NO COMEÇO DO ARQUIVO para configurar o RMAN!!!!

Ferramentas para Bare Metal Backup and Recovery

Como parte da política de backup do SM Saúde, periodicamente os servidores são desligados e uma imagem de seus HDs é feita através de uma ferramenta de Bare Metal Backup and Recovery. Três ferramentas são utilizadas:

  • Clonezilla (www.clonezilla.org): é um programa de “disk imaging/cloning”, completamente free, que faz cópias/imagens de um HD. É excelente mas possui uma limitação: se o HD de origem for maior do que o de destino, pode não ser possível restaurar a imagem (existem outras saídas para isso, como não copiar o HD inteiro mas somente uma partição).
  • Parted Magic (www.partedmagic.com): é uma distribuição linux live completa, com inúmeros utilitários administrativos e de backup/restore. Excelente e muitas vezes utilizada em conjunto com o Clonezilla, para diminuir uma partição de um HD para que a cópia a ser feita possa caber em um HD menor. Não é grátis mas é quase: somente US$ 9,00!
  • Tuxboot (www.tuxboot.org): é um programinha utilitário free para gerar CDs e USBs inicializáveis. Excelente para criar um pen-drive inicializável com o Clonezilla ou o Parted Magic para fazer o backup/restore de hosts que não têm drive de CD/DVD.

Esses três utilitários são ferramentas indispensáveis na política de backup e restore do SM Saúde, sendo usados rotineiramente.