ARCHIVELOG mode
Archivelog = Archived Redo log
Ogni volta che un redolog file è pieno il processo ARCn - Archiver process - lo copia in una altra location come un archivio di quel file che può essere mantenuto per un tempo definito dal periodo di retention.
I redolog file sono scritti in maniera circolare e quindi per evitare che si sovrascrivi una transazione non ancora scritta da DBW sui datafile, si abilita la modalità ARCHIVELOG che assicura la sovrascrittura dei redolog solo dopo che sono stati archiviati.
Verifica se è abilitata la modalità Archivelog
SQL> shutdown immediate;
SQL> startup mount;
SQL> archive log start;
SQL> alter database archivelog;
SQL> alter database open;
Il parametro log_archive_start è stato deprecato dalla versione 10g, infatti la seguente query restituisce i valori "false" e "true" rispettivamente.
Nome e directory dei file Archivelog
SQL> show parameter format;
NAME TYPE VALUE
------------------- ----------- --------------- --------------------------------------
log_archive_format string ARC%S_%R.%T
log_archive_dest_1 LOCATION=/u01/app/oracle/flash_recovery_area/SID1F/archivelog
E S E M P I O
Popoliamo i file archivelog eseguendo lo switch dei Redolog file.
SQL> select group#, status, sequence# from v$log;
GROUP# STATUS SEQUENCE#
---------- ---------------- ----------
1 CURRENT 346
2 INACTIVE 344
3 INACTIVE 345
Passiamo dal redolog1 a 2.
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> select group#, status, sequence# from v$log;
GROUP# STATUS SEQUENCE#
---------- ---------------- ----------
1 ACTIVE 346
2 CURRENT 347
3 INACTIVE 345
Il redolog 1 ha ancora modifiche di dati nel Database Buffer Cache e che non sono stati scritti nei Datafiles.
Il redolog 2 è il file in cui stiamo scrivendo.
Il redolog 3 contiene modifiche dei blocchi Database Buffer Cache già scritte nei Datafiles.
In modalità ARCHIVELOG , ogni volta che si verifica un log switch, si avvia il processo ARCn che effettua una copia dei file redolog inattivi perchè devono essere archiviati prima di essere sovrascritti.
In modalità NOARCHIVELOG il recovery è possibile fino all'ultimo backup.
USE_DB_RECOVERY_FILE_DEST è una variabile che indica al db di usare come path per gli archivelog il parametro DB_RECOVERY_FILE_DEST
Oracle in automatico svuota i file obsoleti dalla FRA quando non c'è più spazio. Se si usa invece il parametro USE_DB_RECOVERY_FILE_DEST i file di archivelog non vengono cancellati anche se non c'è spazio sufficiente nella FRA e il sistema si blocca.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 6954
Next log sequence to archive 6956
Current log sequence 6956
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string LOCATION=USE_DB_RECOVERY_FILE_DEST
Il parametro di prima è visibile dal comando seguente:
SQL> show parameter db_reco;
NAME TYPE VALUE
------------------------------------ ----------- ----------------------------------
db_recovery_file_dest string /home/oracle/rm_flashrecoveryarea
Come si imposta la variabile?
SQL> alter system set log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST';
Per cancellare la variabile
SQL> alter system set DB_RECOVERY_FILE_DEST='' ;
Per disabilitare la modalità Archivelog
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/archive/CDB12S06/
Oldest online log sequence 87
Current log sequence 89
Ogni volta che un redolog file è pieno il processo ARCn - Archiver process - lo copia in una altra location come un archivio di quel file che può essere mantenuto per un tempo definito dal periodo di retention.
I redolog file sono scritti in maniera circolare e quindi per evitare che si sovrascrivi una transazione non ancora scritta da DBW sui datafile, si abilita la modalità ARCHIVELOG che assicura la sovrascrittura dei redolog solo dopo che sono stati archiviati.
Verifica se è abilitata la modalità Archivelog
# sqlplus /nolog
SQL> conn sys/<pwd> as sysdba
SQL> select log_mode from SYS.V$DATABASE;
oppure
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive/S11TEST1/
Oldest online log sequence 77
Next log sequence to archive 79
Current log sequence 79
Directory contente gli archive log
La directory di destinazione degli archive di default è la flash recovery area che si individua con il comando
SQL> show parameter db_reco
NAME TYPE VALUE
---------------------------------------------------
db_recovery_file_dest string .../flash_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> conn sys/<pwd> as sysdba
SQL> select log_mode from SYS.V$DATABASE;
oppure
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive/S11TEST1/
Oldest online log sequence 77
Next log sequence to archive 79
Current log sequence 79
Directory contente gli archive log
La directory di destinazione degli archive di default è la flash recovery area che si individua con il comando
SQL> show parameter db_reco
NAME TYPE VALUE
---------------------------------------------------
db_recovery_file_dest string .../flash_recovery_area
db_recovery_file_dest_size big integer 2G
Oppure usare la query seguente.
select name, value
from v$parameter
where name like 'db_recovery_file_dest%';
>>>>>>>>>>> IMPORTANTE <<<<<<<<<<<<<<<<<<<<<<<<<
In questo modo non siamo più legati alla size della FRA ma alla size del file system.select name, value
from v$parameter
where name like 'db_recovery_file_dest%';
>>>>>>>>>>> IMPORTANTE <<<<<<<<<<<<<<<<<<<<<<<<<
Nell'esempio 2G è il limite di occupazione dell'area dopodiché il sistema si ferma, pertanto non conviene usare la FRA ma piuttosto impostarla altrove usando questo parametro log_archive_dest_1
1) Creare la directory
mkdir /u01/app/oracle/archive/<SID>
2) Inserirlo nel parameter file.
SQL> alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/<SID>' scope=both;
3) Verificare che sia abilitata la nuova destinazione.
SQL> show parameter log_archive_dest_state_1
NAME TYPE VALUE
--------------------------------------------
log_archive_dest_state_1 string enable
Altrimenti abilitarla con l'istruzione
alter system set log_archive_dest_state_1 = enable;
4) Verificare che gli archivelog vengono scritti nella suddetta direcorty
alter system switch logfile;
Se si vuole salvare i file su un altro database remoto STB2 impostare il parametro seguente:
alter system set log_archive_dest_2='SERVICE=STB2';
Come attivitare la modalità Archivelog
Per oracle 10g e 11g
SQL> shutdown immediate; (parte il checkpoint globale)
SQL> startup nomount;
SQL> alter database mount;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> alter database open;
Per Oracle 9i
SQL> ALTER SYSTEM SET log_archive_start=true SCOPE=spfile;2) Inserirlo nel parameter file.
SQL> alter system set log_archive_dest_1='LOCATION=/u01/app/oracle/archive/<SID>' scope=both;
3) Verificare che sia abilitata la nuova destinazione.
SQL> show parameter log_archive_dest_state_1
NAME TYPE VALUE
--------------------------------------------
log_archive_dest_state_1 string enable
Altrimenti abilitarla con l'istruzione
alter system set log_archive_dest_state_1 = enable;
4) Verificare che gli archivelog vengono scritti nella suddetta direcorty
alter system switch logfile;
Se si vuole salvare i file su un altro database remoto STB2 impostare il parametro seguente:
alter system set log_archive_dest_2='SERVICE=STB2';
Come attivitare la modalità Archivelog
SQL> shutdown immediate; (parte il checkpoint globale)
SQL> startup nomount;
SQL> alter database mount;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> alter database open;
Per Oracle 9i
SQL> shutdown immediate;
SQL> startup mount;
SQL> archive log start;
SQL> alter database archivelog;
SQL> alter database open;
SQL> select value ,isdeprecated
from v$system_parameter where name = 'log_archive_start'
VALUE ISDEP
----------------------------------
FALSE TRUE
Nome e directory dei file Archivelog
SQL> show parameter format;
NAME TYPE VALUE
------------------- ----------- --------------- --------------------------------------
log_archive_format string ARC%S_%R.%T
log_archive_dest_1 LOCATION=/u01/app/oracle/flash_recovery_area/SID1F/archivelog
E S E M P I O
Popoliamo i file archivelog eseguendo lo switch dei Redolog file.
SQL> select group#, status, sequence# from v$log;
GROUP# STATUS SEQUENCE#
---------- ---------------- ----------
1 CURRENT 346
2 INACTIVE 344
3 INACTIVE 345
Passiamo dal redolog1 a 2.
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> select group#, status, sequence# from v$log;
GROUP# STATUS SEQUENCE#
---------- ---------------- ----------
1 ACTIVE 346
2 CURRENT 347
3 INACTIVE 345
Il redolog 1 ha ancora modifiche di dati nel Database Buffer Cache e che non sono stati scritti nei Datafiles.
Il redolog 2 è il file in cui stiamo scrivendo.
Il redolog 3 contiene modifiche dei blocchi Database Buffer Cache già scritte nei Datafiles.
In modalità ARCHIVELOG , ogni volta che si verifica un log switch, si avvia il processo ARCn che effettua una copia dei file redolog inattivi perchè devono essere archiviati prima di essere sovrascritti.
In modalità NOARCHIVELOG il recovery è possibile fino all'ultimo backup.
Tutte le successive transizioni sono perse.
Invece con la modalità ARCHIVELOG il recovery è possibile fino all'ultimo commit e quindi permette il point-in-time Recovery.
Invece con la modalità ARCHIVELOG il recovery è possibile fino all'ultimo commit e quindi permette il point-in-time Recovery.
USE_DB_RECOVERY_FILE_DEST è una variabile che indica al db di usare come path per gli archivelog il parametro DB_RECOVERY_FILE_DEST
Oracle in automatico svuota i file obsoleti dalla FRA quando non c'è più spazio. Se si usa invece il parametro USE_DB_RECOVERY_FILE_DEST i file di archivelog non vengono cancellati anche se non c'è spazio sufficiente nella FRA e il sistema si blocca.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 6954
Next log sequence to archive 6956
Current log sequence 6956
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string LOCATION=USE_DB_RECOVERY_FILE_DEST
Il parametro di prima è visibile dal comando seguente:
SQL> show parameter db_reco;
NAME TYPE VALUE
------------------------------------ ----------- ----------------------------------
db_recovery_file_dest string /home/oracle/rm_flashrecoveryarea
Come si imposta la variabile?
SQL> alter system set log_archive_dest_1='location=USE_DB_RECOVERY_FILE_DEST';
Per cancellare la variabile
SQL> alter system set DB_RECOVERY_FILE_DEST='' ;
Per disabilitare la modalità Archivelog
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
Per Oracle 9i
SQL> ALTER SYSTEM SET log_archive_start=false SCOPE=spfile;SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
Verifica:
SQL> archive log list
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/archive/CDB12S06/
Oldest online log sequence 87
Current log sequence 89
Calcolare la dimensione dei redolog
SQL > select group#, sum(bytes)/1024/1024
from v$log
group by group#;
Esempio dimensione 100 MB.
Calcolare la dimensione degli archivelog
Quanti switch fa al giorno un redolog file (verificare anche su alert file)?
SQL > select count(*),to_char(FIRST_TIME,'DD-MM-YYYY'),thread#
from v$log_history
where FIRST_TIME > to_date('21-01-2021','DD-MM-YYYY')
group by to_char(FIRST_TIME,'DD-MM-YYYY'),THREAD#
ORDER BY THREAD#,to_char(FIRST_TIME,'DD-MM-YYYY');
Esempio count(*) = 3 cioè tre switch in un giorno.
Quindi 3 x 100 (dimensione dei redolog file) = 300 MB
300 sarebbe la dimensione massima al giorno di archive log.
Query per controallre la dimensione giornaliera degli Archive Log.
Attenzione che non tutti gli archive log sono presenti, alcuni potrebbero essere stati cancellati dalle politiche di backup.
Attenzione che non tutti gli archive log sono presenti, alcuni potrebbero essere stati cancellati dalle politiche di backup.
SQL> select trunc(COMPLETION_TIME) TIME,
SUM(BLOCKS * BLOCK_SIZE)/1024/1024 SIZE_MB
from V$ARCHIVED_LOG
group by trunc (COMPLETION_TIME)
order by 1;