Como fazer backup em RMAN com Paralelismo em Oracle Standard

Não é bonito, não é simples, mas funciona.

Crie um script que vai chamar vários outros scripts, com a opção “&” ao final, que significa que eles serão executados em background. Cada um destes vários outros scripts fará o BACKUP de um único DATAFILE.

No script principal, entre a execução dos scripts (ou seja, entre cada backup de DATAFILE) coloque um “sleep”. Quanto menor o tempo do “sleep”, maior será o paralelismo. Para 100 DATAFILEs, um sleep de 0 significa utilizar 100 processos paralelos. Adeque de acordo com a capacidade de seu ambiente. O mais comum é que você vá testando com tempos maiores ou menores, até encontrar o ponto ideal – como normalmente acontece com o próprio uso do paralelismo real.

No final deste script principal de backup, eu executo um DELETE NOPROMPT OBSOLETE (apaga os backups que estão além da RETENTION configurada) e logo depois um REPORT NEED BACKUP. Este último é fundamental para saber se há algum DATAFILE novo que eu ainda não faço BACKUP. Portanto, é fundamental que a saída do script seja monitorada (bem, você já faz isso, certo?).

Além do “REPORT NEED BACKUP”, se adicionar o comando “BACKUP NOT BACKED UP SINCE TIME ‘SYSDATE-1’ DATABASE” serão feitos backups de todos os DATAFILEs que não tiveram backup nas últimas 24 horas, para não arriscar ficar sem BACKUP de algum DATAFILE.

Este abaixo é o script principal.

[oracle@localhost ~]$ cat /home/oracle/RADM-Oracle-Diario.sh
#!/bin/bash

/home/oracle/RADM-Oracle-Diario-ORCL-Datafile001.sh &
sleep 60
/home/oracle/RADM-Oracle-Diario-ORCL-Datafile002.sh &
sleep 60
...
...
...
/home/oracle/RADM-Oracle-Diario-ORCL-Datafile097.sh &
sleep 60
/home/oracle/RADM-Oracle-Diario-ORCL-Datafile098.sh &
sleep 60
/home/oracle/RADM-Oracle-Diario-ORCL-Datafile099.sh &

[oracle@localhost ~]$

E abaixo está um dos N scrpts mencionados no script principal, que executa o backup de um único DATAFILE.

[oracle@localhost ~]$ cat /home/oracle/RADM-Oracle-Diario-ORCL-Datafile001.sh
#!/bin/bash

source /home/oracle/.bash_profile
export ORACLE_SID=ORCL1
$ORACLE_HOME/bin/rman TARGET / EOF
BACKUP DATAFILE 1 FORMAT '/backup/ORCL/Database/Database-%d___DBID-%I___Date-%T___Set-%s___Piece-%p.BKP';
EXIT;
EOF

[oracle@localhost ~]$

12 comments

      1. Boa noite Ricardo, fiz o teste com o restore e ele ficou fazendo datafile por datafile, não fez o restore com o paralelismo na versão 11.2.0.3.0.

        SQL> /

        SID | INICIO | TOTAL | FALTANDO | CONCLUIDO | FIM
        ———- | —————– | ———- | ———- | ———- | —————–
        2835 | 12/01/20 20:02:02 | 6272 | 0 | 0 |
        1704 | 12/01/20 20:02:12 | 3407872 | 0 | 0 |
        568 | 12/01/20 20:01:42 | 979072 | 0 | 0 |
        3400 | 12/01/20 20:01:52 | 3161600 | 0 | 0 |
        5 | 12/01/20 20:02:07 | 4194302 | 51007 | 1.21610223 | 12/01/20 21:03:47
        1702 | 12/01/20 20:01:47 | 4194176 | 0 | 0 |
        2833 | 12/01/20 20:01:37 | 3776000 | 0 | 0 |
        569 | 12/01/20 20:01:57 | 12800 | 0 | 0 |
        3402 | 12/01/20 20:02:18 | 1946624 | 0 | 0 |

        1. Oi.
          Desculpe, minha bola de cristal foi pro conserto e ainda não tem previsão de voltar. 🙂
          Só colocando esta saída, sem nem o SQL fonte, não tenho a mínima ideia do que você fez ou o que deu errado.

          Coloque TUDO o que você fez, e na parte de código, coloque entre as TAGS “code” par ficar mais legível, como abaixo:
          RMAN> BACKUP DATABASE;

    1. Sim, também funciona.
      Com o Catálogo não muda nada, mas lembre-se que para o TSM, o grau de paralelismo utilizado vai depender da quantidade de canais liberados pelo administrador do TSM.

  1. Esse é o tipo de informação que salva a janela de backup.
    Estou usando esse recurso a algum tempo em uma base de 3TB na Standard.
    Fica a dica, segue um exemplo que uso para o controle de threads em shell script no linux:

    #!/bin/bash
    IFS=”

    for line in $(cat datafiles.txt); do
    v_datafile=$(echo $line | awk {‘print $1’})
    THREADS=8
    FLAG_PROCESSADO=0
    while [ $FLAG_PROCESSADO = 0 ]
    do
    jobs > /dev/null
    if [ $(jobs | wc -l) -lt $THREADS ]; then
    ./core.sh $v_datafile &
    FLAG_PROCESSADO=1
    else
    sleep 1
    fi
    done
    done

  2. Amigo, como fica a questão dos SCNs de cada datafile, levando em consideração que o banco continua sendo atualizado durante o backup? Pergunto isso, visto que os processos são independentes.

    1. Nada muda a respeito do comportamento dos SCNs.
      Mesmo se o backup for feito por um único processo, eles podem ser copiados para o backup em diferentes pontos do tempo (especialmente se o banco é grande, o DATAFILE 1 será copiado para o backup em um momento, e o DATAFILE 200 em outro momento), portanto terão diferentes SCNs em seus blocos. Por isso que é necessário o RECOVER após um RESTORE, para que os REDO LOGs coloquem todos os DATAFILEs com o mesmo SCN, ou seja, no mesmo ponto do tempo.

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.