ATELIER
ORACLE
Oracle backup & recovery
A
rhivarea ºi recuperarea (Backup and Recovery) reprezeintã unul dintre cele mai importante aspecte ale administrãrii bazei de date. Chiar dacã companiile opereazã cu o singurã bazã de date sau cu baze de date multiple stocând sute de gigabytes sau chiar terabytes de date, au în comun un factor – necesitatea de arhivare ºi protejare a datelor împotriva evenimentelor nedorite (cãderi hardware sau software, erori umane etc), prin dezvoltarea unei strategii de arhivare/recuperare. Singura cale de a asigura recuperarea bazei de date în timp util, fãrã pierderi de date, este stabilirea unui plan ºi utilizarea acestuia. Acest plan trebuie sã acopere cât mai multe scenarii obiºnuite ºi neobiºnuite de recuperare. Succesul recuperãrii unei baze de date începe cu ... apar numai în cazul în care baza de date ruleazã în modul ARCHIVELOG. • Fiºierul de control (control file) – conþine informaþiile necesare pentru pornirea ºi funcþionarea bazei de date. La montarea bazei de date se citesc informaþiile din fiºierele de control referitoare la numãrul ºi localizarea fiºierelor de date ºi a fiºierelor jurnal. Pentru siguranþã, Oracle recomandã multiplexarea fiºierului de control pe discuri diferite. • Fiºierul de parole (password file) – conþine informaþiile privind autentificarea utilizatorilor privilegiaþi. • Fiºierele de date (data files) – conþin informaþiile din baza de date (obiectele si dicþionarul bazei de date). Nu sunt administrate în mod direct ci prin intermediul tabelelor de spaþiu. • Tablespace-urile sunt formate dintr-un set de segmente ºi sunt utilizate pentru a grupa logic obiectele din baza de date ºi pentru a defini modelul de alocare a spaþiului pe disc. Tablespace-ul System este cel mai important pentru baza de date Oracle, conþinând dicþionarul bazei de date ºi segmentele de revenire sistem (system rollback segment). Pentru re-crearea segmentelor de index trebuie sã avem instrucþiunea de creare iniþialã (create index). Segmentele de revenire (roolback segment) care nu conþin tranzacþii pot fi refãcute în acelaºi mod (create rollback segment). Tablespace-urile asigurã corespondenþa între obiectele bazei de date la nivel logic ºi structura fizicã a bazei de date. Un tablespace poate avea unul sau mai multe fiºiere de date iar pentru a-l arhiva trebuie, de fapt, sã arhivãm fiºierele de date asociate acestuia. Numele ºi locaþia fiºierelor de date pot fi regãsite utilizând coloana name din vederea V$DATAFILE executând interogarea:
SELECT name FROM v$datafile;
Opþiuni de arhivare în vederea recuperãrii BD Oracle – Claudiu Ariton
Rezultatul interogãrii este:
C:\ORANT\DATABASE\LOG1ORCL.ORA C:\ORANT\DATABASE\LOG2ORCL.ORA
Locaþia fiºierului de control poate fi regãsitã utilizând coloana name din view-ul V$CONTROLFILE cu interogarea
SELECT name FROM v$controlfile;
Rezultatul interogãrii este:
C:\ORANT\DATABASE\CTL1ORCL.ORA C:\ORANT\DATABASE\CTL2ORCL.ORA D:\BACKUP\CTL3ORCL.ORA
Arhivarea bazei de date
Existã trei tipuri diferite de arhivare a bazei de date Oracle (offline, online ºi logic). Fiecare tip arhiveazã datele în diferite moduri cu diferite cerinþe din partea sistemului de gestiune al bazei de date. Arhivarea unei baze de date include toate fiºierele externe ale unei instanþe (din directorul %ORACLE_HOME%/Database) ºi câteodatã chiar întreg directorul în care a fost instalat produsul Oracle (%ORACLE_HOME%). Ce trebuie sã arhivãm ? Pentru început sã vedem care sunt tipurile de fiºiere externe cu care lucreazã Oracle: • Fiºierul de parametri (init<SID>.ora) – conþine parametrii de iniþalizare ºi configurare a instanþei Oracle; • Fiºierele jurnal (redo log)- conþin informaþii privind tranzacþiile sau modificãrile operate în baza de date. Aceste informaþii sunt utilizate la recuperarea conþinutului bazei de date. Dupã producerea unui incident la repornirea bazei de date toate tranzacþiile „comise” în baza de date dar care nu au fost operate fizic pe disc vor fi derulate înainte, în timp ce tranzacþiile ce nu au fost comise vor fi derulate înapoi. Oracle impune existenþa a minim douã grupuri de fiºiere jurnal, dar recomandã menþinerea a cât mai multor fiºiere jurnal (pânã la 50 de grupuri pentru bazele de date mari). În plus, se recomandã multiplexarea membrilor tuturor grupurilor pe discuri diferite pentru a evita pierderea accidentalã a fiºierelor jurnal. • Fiºiere jurnal arhivate (archive logs) – conþin copii ale fiºierelor jurnal necesare pentru recuperarea bazei de date. Aceste fiºiere 56 NET REPORT • martie 2001
Modurile ARCHIVELOG ºi NOARCHIVELOG
Fiºierele jurnal înregistreazã toate tranzacþiile active din baza de date. Pentru a conserva spaþiul pe disc Oracle reutilizeazã fiºierele jurnal prin scrierea lor în mod circular. Astfel, când toate fiºierele jurnal ale bazei de date sunt pline, procesul de background LGWR va începe sã rescrie primul fiºier jurnal. Dacã baza de date ruleazã în modul NOARCHIVELOG, tranzacþiile din fiºierele jurnal se vor pierde datoritã rescrierii acestor fiºiere. În modul NOARCHIVELOG doar arhivarea offline este posibilã. Dacã baza de date ruleazã în modul ARCHIVELOG, procesul de background ARCH va copia fiºierele jurnal de pe disc în spaþiul de arhivare al bazei de date, care este indicat sã fie pe alt disc. Procesul ARCH copiazã fiºierul jurnal în momentul în care acesta a fost scris în întregime de cãtre LGWR, dupã care îl marcheazã ca disponibil. Pentru a comuta între modul NOARCHIVELOG – ARCHIVELOG se parcurg urmãtorii paºi: (1) Oprirea bazei de date în modul NORMAL sau IMMEDIATE. (2) Se editeazã fiºierul init<sid>.ora ºi se adaugã trei noi parametri: log_archive_start=true – pornirea arhivãrii automate
log_archive_dest=/disk_device/archive_s id log_archive_format=%s.log
Rezultatul interogãrii este:
C:\ORANT\DATABASE\SYS1ORCL.ORA C:\ORANT\DATABASE\USR1ORCL.ORA C:\ORANT\DATABASE\RBS1ORCL.ORA C:\ORANT\DATABASE\TMP1ORCL.ORA C:\ORANT\DATABASE\USERS.DAT
Membrii fiºierelor jurnal pot fi obþinuþi din view-ul V$LOGFILE cu interogarea:
SELECT member FROM v$logfile;
– destinaþia fiºierelor jurnal arhivate - formatul numelui fiºierului jurnal arhivat (3) Pornirea bazei de date cu comanda START-
UP MOUNT
(4) Pornirea modului ARCHIVELOG:
ATELIER
ORACLE
alter database archivelog;
(5) Deschiderea bazei de date
alter database open;
Arhivare on-line
rem Descriere: Acest script realizeaza arhivarea online a tuturor fisierelor rem rem rem rem Fisier de iesire: rem arhivareonline.sql de date (corespunzatoare tabelelor de spatiu) si a fisierului de control
În modul ARCHIVELOG se poate opta între arhivarea automatã sau manualã a fiºierelor jurnal (controlatã de parametrul log_archive_start). alter system archive log start; - pornirea arhivãrii automate fãrã a opri instanþa alter system archive log stop; - oprirea arhivãrii automate fãrã a opri instanþa Pentru a determina modul de arhivare a fiºierelor jurnal se utilizeazã comanda: archive log list;
create or replace procedure arhivare(unde_sa_arhivez in varchar2) is fname tname tname1 varchar2(80); varchar2(80); varchar2(80);
Arhivarea offline („la rece”)
Arhivarea offline este consideratã o arhivare consistentã, deoarece toate blocurile bazei de date corespund unui anumit moment în timp. Arhivarea offline presupune oprirea instanþei (cu o comandã de oprire ce forþeazã un punct de verificare – NORMAL sau IMMEDIATE) ºi apoi copierea fiºierelor externe. Opþiunea ABORT va solicita ca procesul SMON (system monitory) sã execute recuperarea automatã la repornirea bazei de date. Deoarece recuperarea automatã nu garanteazã refacerea bazei de date, nu se recomandã arhivarea offline dupã oprirea cu SHUTDOWN ABORT. Este indicat ca fiºierul de control, care este un fiºier binar, sã fie generat într-un fiºier text cu comanda:
alter database backup controlfile to ‘C:/ORANT/DATABASE/control.txt’;
cursor cur1 is select tablespace_name,file_name from v$datafile,sys.dba_data_files where enabled like '%WRITE%' and file# = file_id order by 1; begin dbms_output.enable(32000); dbms_output.put_line ('rem Arhivarea online a tuturor fisierelor de date in directorul '||unde_sa_arhivez); dbms_output.put_line('******************'); if cur1%ISOPEN then close cur1; end if; open cur1; fetch cur1 into tname,fname; tname1 := tname; dbms_output.put_line('alter tablespace '||tname||' begin backup;'); while cur1%FOUND loop if tname1 != tname then dbms_output.put_line('alter tablespace '||tname1||' end backup;'); dbms_output.put_line('******************'); dbms_output.put_line('alter tablespace '||tname||' begin backup;'); tname1 := tname; end if; dbms_output.put_line('!copy '||fname||' '||unde_sa_arhivez); fetch cur1 into tname,fname; end loop; dbms_output.put_line('alter tablespace '||tname1||' end backup;'); close cur1; dbms_output.put_line('******************'); dbms_output.put_line('rem Arhivarea fisierului de control'); dbms_output.put_line('******************'); dbms_output.put_line('alter database backup controlfile to trace;'); ➾
Aceastã comandã va produce un fiºier text folosit pentru re-crearea fiºierului de control.
Arhivarea online („la cald”)
Arhivarea online este consideratã o arhivare inconsistentã. Arhivarea online presupune modul ARCHIVELOG ºi copierea fiºierelor de date, fiºierului de control ºi a fiºierelor jurnal arhivate. Nu trebuie niciodatã sã se arhiveze ºi fiºierele jurnal. Baza de date trebuie sã fie deschisã ºi chiar se pot executa tranzacþii pe parcursul acestui tip de arhivare. Arhivarea online începe cu comanda ARCHIVE LOG LIST. Aceastã comandã aratã care este fiºierul jurnal curent la începerea arhivãrii. Procesul de arhivare online presupune arhivarea fiºierelor de date asociate fiecãrei tabele de spaþiu. Paºii pentru arhivarea unui tablespace: (1) Comanda Oracle pentru a porni arhivarea unei tabele de spaþiu
alter tablespace tablespace_name begin backup;
(2) Comanda de copiere a sistemului de operare pentru salvarea fiºierelor de date asociate tabelei de spaþiu respective (3) Comanda Oracle pentru a opri arhivarea unei tabele de spaþiu
alter tablespace tablespace_name end backup;
martie 2001 • NET REPORT 57
ATELIER
ORACLE
Arhivare on-line (continuare)
dbms_output.put_line('alter database backup controlfile to '||''''|| unde_sa_arhivez||'/control.'|| to_char(sysdate,'DDMMYYYYHH24MISS')||''''||';'); end; /
Arhivarea logicã (EXPORT)
Arhivarea logicã se utilizeazã numai pe o bazã de date online micã, cu puþine tranzacþii. În cazul în care se ruleazã aplicaþii ce necesitã mii de tranzacþii sau chiar mai multe pe orã acest tip de arhivare nu mai face parte din strategia de recuperare a datelor. În acest caz vom folosi utilitarul EXPORT(EXP80 în cazul Oracle8) doar pentru a reorganiza baza de date, de a muta scheme de la o bazã de date la alta, sau pentru a redenumi anumite scheme. Arhivarea logicã se poate realiza pe 3 nivele: toatã baza de date, toate obiectele unui utilizator sau la nivel de tabelã. Acest tip de arhivare permite recuperarea chiar ºi a unei tabele, în timp ce celelalte tipuri de arhivare permit doar recuperarea la nivel de întreaga bazã de date, de tabelã de spaþiu sau de fiºier de date. Claudiu Ariton este junior Oracle DBA la Advantage Software Factory din Bucuresti. Poate fi contactat pe email la:
[email protected]. n 99
rem Executarea procedurii va produce un fisier text cu comenzi - online.sql set serveroutput on set heading off set feedback off spool online.sql execute arhivare('c:/backup'); spool off set heading on set feedback on set serveroutput off rem Se editeaza apoi fisierul online.sql din directorul %ORACLE_HOME%/bin rem si se executa comenzile generate in el.
Bibliografie
Willard Baird, Intermedia communications – „How to create a complete Backup and Recovery plan” Tammy Bednar, Oracle Corporation – „Protecting your e-Business’s Life Blood: Oracle Backup and Recovery” James Lopatosky – „Solid Backup Policies: Insurance for Your Business” Stephen Rea, Oracle Certified Professional in Database Administration – „Bulletproofing, Backups, and Disaster Recovery Scenarios” Rama Velpuri – „Oracle Backup & Recovery Handbook”, Oracle Press, 1997
Cei trei paºi trebuie repetaþi pentru fiecare tabelã de spaþiu a unei instanþe. Dupã arhivarea tuturor tabelelor de spaþiu se va utiliza iar comanda ARCHIVE LOG LIST pentru a vedea care este fiºierul jurnal curent la terminarea arhivãrii. Urmãtorul pas este forþarea arhivãrii fiºierului jurnal curent utilizând comanda: alter system switch logfile; toate fiºierele jurnal arhivate vor fi copiate pe discul de backup. Ultimul pas este arhivarea fiºierului de control:
alter database backup controlfile to ‘C:/ORANT/DATABASE/control.txt’;
Arhivarea online trebuie fãcutã când asupra bazei de date opereazã un numãr minim de utilizatori ºi tranzacþii (de ex noaptea) ºi trebuie realizatã în cel mai scurt timp posibil. Un model script pentru arhivare la cald gãsiþi în caseta Arhivare online.
58 NET REPORT • martie 2001