De acordo com as boas práticas, o que é ensinado na documentação da Oracle e até mesmo em treinamentos, em um banco de dados temos que configurar uma área de storage chamada de “Fast Recovery Area”. Esta área vai armazenar seus arquivos de backup, archivelogs e uma cópia de seu controlfile além de alguns membros de seus grupos de redolog.

Normalmente essa área será um ASM diskgroup chamado +FRA (mas pode ser qualquer outro tipo de filesystem, caso você não esteja trabalhando com ASM) e nós a definimos no banco de dados através de dois parâmetros do SPFILE DB_RECOVERY_FILE_DEST (Que define a localização) e DB_RECOVERY_FILE_DEST_SIZE (Que define o volume de dados que pode ser armazenado), o local de armazenamento é definido passando um caminho absoluto, no caso de trabalharmos com ASM seria um ASM Diskgroup por exemplo: +FRA. 

Mas e o tamanho? Como se define?

Bem o tamanho obviamente passaremos um valor do tipo inteiro seguido de uma unidade de medida como M ou G (Mega e Giga), porém precisamos saber qual tamanho e esse é o objetivo deste artigo.

Para se definir o tamanho de sua FRA não existe uma métrica exata, porém podemos fazer uma estimativa de quanto de espaço precisaremos dentro de um determinado período de tempo e lógico que em intervalos regulares você deve rever essa estimativa. 

Mas como se faz essa estimativa?

Para fazermos essa estimativa, precisamos de alguns valores base para tal, então precisamos de:

  • O tamanho atual de nosso banco de dados SIZE_DB.
  • O volume de archivelogs que é gerado entre dois backups (full ou level 0) SIZE_ARC.
  • Quantos backups (full ou level 0) eu quero manter no disco (no mímino 2) QT_BKP.
  • Uma estimativa de crescimento do banco de dados entre 2 backups GROWTH_RATE.

De posse dessas informações, agora podemos usar a seguinte fórmula para calcular o valor aproximado de sua Fast Recovery Area.

Fast Recovery Area = ((SIZE_DB * QT_BKP) + SIZE_ARC ) * GROWTH_RATE

Complexo não? Calma, relaxa vamos desvendar essa formula!

Imagine o seguinte cenário, seu banco de dados tem aproximadamente 100GB SIZE_DB, e você quer manter no disco os 2 últimos backups level 0 QT_BKP (que sempre são feitos as 0:00), e a cada 24 horas você gera 10GB SIZE_ARC de archivelog, e complementando esses valores vamos considerar que entre um backup level 0 e outro, considerando archivelogs e eventuais backups incrementais, você tem um crescimento de 20% GROWTH_RATE, então façamos o cálculo.

Fast Recovery Area = ((100GB * 2) + 10GB ) * 1.2

Imaginando que temos um banco de dados 100GB vezes 2 (que é a quantidade de backups level 0 ou full) que vamos manter no disco 200GB, mais 10GB de archivelogs que é gerado a cada 24 horas, 210GB, multiplicado por 1.2 (que corresponde a 20%) teremos então a necessidade de uma Fast Recovery Area de 252GB. Abaixo um exemplo de um banco de dados de produção como amostra.

Para facilitar o entendimento deste cálculo, abaixo deixo um pequeno script PL/SQL que vai executar as operações que discutimos aqui e já exibirá o resultado para sua base de dados (como no script acima). Vale lembrar que esse cálculo trata-se somente de uma estimativa de valor, não é nenhuma métrica exata, ou que tenha recomendação oficial da Oracle ou alguma empresa afiliada.

DECLARE
    v_backup_hold NUMBER;
    v_size_fra NUMBER;
    v_growth_rate NUMBER;
    v_size_db NUMBER;
    v_size_archive NUMBER;
BEGIN
    v_backup_hold := 2;
    v_growth_rate := 1.2;
    v_size_fra := 0;
— Tamanho atual do DB em GB
    SELECT ROUND(SUM(bytes)/1024/1024/1024,2) INTO v_size_db FROM v$datafile;
— Tamanho de 24 horas de archivelog em GB
    SELECT ROUND(SUM(blocks*block_size)/1024/1024/1024,2) INTO v_size_archive FROM V$ARCHIVED_LOG WHERE completion_time > sysdate-1;
— Tamanho da FRA
    SELECT ROUND(((v_size_db*v_backup_hold)+v_size_archive)*v_growth_rate,2) INTO v_size_fra FROM dual;
    SYS.DBMS_OUTPUT.PUT_LINE(”);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Size Database (GB): ‘||v_size_db);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Size Archives 24h (GB): ‘||v_size_archive);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Number backups level 0 hold: ‘||v_backup_hold||’ Backups.’);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Growth rate (%): ‘||v_growth_rate);
    SYS.DBMS_OUTPUT.PUT_LINE(”);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Size FRA = ((DB Size * Number backups level 0 hold) + Archivelog Size 24h) * Growth rate’);
    SYS.DBMS_OUTPUT.PUT_LINE(”);
    SYS.DBMS_OUTPUT.PUT_LINE(‘Size FRA (GB): ‘||v_size_fra);
END;
/

É isso aí, espero ter lhe ajudado. Forte abraço e até a próxima.

Douglas Paiva de Sousa

Deixe uma resposta

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

Deixe uma resposta

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