tryb archiwizacji -archivelog mode

Co to jest tryb archiwizacji (archivelog mode)

Żeby opisać na czym polega tryb ARCHIVELOG trzeba najpierw wyjaśnić kilka innych kwestii. W momencie dokonywania modyfikacji danych odpowiednie bloki bazy danych są ładowane do podobszaru SGA, tzw. database buffer cache. W momencie zainstnienia puktu kontrolnego (checkpoint) dane są zrzucane do logów REDO. Logi te są cyklicznie nadpisywane. W trybie archiwizacji proces archiwizacyjny (archiver) zapisuje pliki redo do innej lokalizaji zanim zostaną nadpisane. W ten sposób nie tracimy informacji o operacjach które były dokonywane na bazie.

Czy tryb archiwizacji w naszej bazie jest włączony?

Możemy to stwierdzić zapuszczając poniższe zapytanko:

SQL> select log_mode from v$database;

LOG_MODE
------------
ARCHIVELOG

O czym trzeba pamiętać przed włączeniem trybu archiwizacji?

Najważniejszą sprawą jest poprawne określenie ścieżki do katalogu archiwizacyjnego i zadbanie by było w nim wolne miejsce.

Jak oszacowac ile miejsca jest nam potrzebne na logi?

Najpierw musimy zastanowić się z jakiego okresu czasu chcemy zbierać logi. Przypuśćmy że wystarczy nam pół roku. Korzystamy z widoku V$LOG_HISTORY, w którym zapisana jest cała historia logowania. Mimo że logi są cyklicznie nadpisywane w trybie noarchivelog, to informacja o nadpisanych logach jest przechowywana.

SQL> desc  v$log_history
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 RECID                                              NUMBER
 STAMP                                              NUMBER
 THREAD#                                            NUMBER
 SEQUENCE#                                          NUMBER
 FIRST_CHANGE#                                      NUMBER
 FIRST_TIME                                         DATE
 NEXT_CHANGE#                                       NUMBER

SEQUENCE# oznacza numer loga, first_time to data począwszy od której proces log writera zaczął zapis. Chcemy zobaczyć jak kształtowało się dzienne zużycie logów:


SQL>select count(*)ile_logow ,dzien 
from 
(
   select to_char(first_time,'yy-mm-dd') dzien 
   from v$log_history
)
group by dzien order by dzien;

...
  COUNT(*) DZIEN
---------- --------
        16 09-02-03
        14 09-02-04
        15 09-02-05
        13 09-02-06
         5 09-02-07
         3 09-02-08
        12 09-02-09
        21 09-02-10
        13 09-02-11
        53 09-02-12
        24 09-02-13
...

Jak włączyć tryb archiwizacji?

Najpierw musimy wyłaczyć bazę. Następnie uruchomić ją w trybie mount. W trybie mount mamy dostęp do pliku kontrolnego (controlfile). Jednocześnie pliki bazy danych nie są otwarte.

SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog
SQL>alter database open

Chielibyśmy zobaczyć czy nasze działania przyniosły jakiś efekt. W tym celu wymusimy przełączenie między logami. Następnie zapuścimy zapytanie do V$ARCHIVED_LOG.

SQL>alter system switch logfile;
system altered
SQL>select * from V$ARCHIVED_LOG;
SQL> alter system set  log_archive_dest="/home/oracle/product/10.2.0/db_1/dbs/log";
alter system set  log_archive_dest="/home/oracle/product/10.2.0/db_1/dbs/log"
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-16018: cannot use LOG_ARCHIVE_DEST with LOG_ARCHIVE_DEST_n or
DB_RECOVERY_FILE_DEST

SQL> alter system set DB_RECOVERY_FILE_DEST='';

System altered.

SQL>  alter system set  log_archive_dest="/home/oracle/product/10.2.0/db_1/dbs/log";

System altered.