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.
v_backup_hold NUMBER;
v_size_fra NUMBER;
v_growth_rate NUMBER;
v_size_db NUMBER;
v_size_archive NUMBER;
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('Size FRA = ((DB Size * Number backups level 0 hold) + Archivelog Size 24h) * Growth rate');