Documente noi - cercetari, esee, comentariu, compunere, document
Documente categorii

Serverul de baze de date Oracle

Serverul de baze de date Oracle


1. Structurile de organizare a elementelor unei baze de date oferite de serverul Oracle


In cazul Oracle, structurile de memorie interna si procesele care asigura functionalitatea clasica a SGBD-ului iau forma "concentratea' a unei instante Oracle. La nivelul sistemului de operare, aceasta structura se materializeaza sub forma unui serviciu distinct cu numele OradeService, unde SID reprezinta numele personalizat al instantei.

Din punct de vedere logic, serverul Oracle pune la dispozitia utilizatorilor urmatoarele structuri de organizare logica a datelor:




Tabele, coloane, restrictii

Tabelele constituie mecanismul de stocare a datelor specific unei baze de date Oracle si contin un set fix de coloane ce descriu atribute ale relatiilor (in cazul modelului relational) sau ale obiectelor (in cazul modelului orientat obiect) din schema logica.

Caracteristicile unei coloane se refera la: tipul de date si lungime (plus precizia si scala in cazul in care tipul de date este NUMBER). Tipurile de date de baza suportate in sistemul Oracle sunt:

pentru siruri de caractere: CHAR, de lungime fixa, si VARCHAR2, de lungime variabila;

pentru numere: NUMBER;

pentru data calendaristica: DATE;

pentru date binare: RAW;

pentru obiecte de mari dimensiuni: LONG, LONG RAW, BLOB, CLOB, BFILE.

Odata cu crearea unei tabele se pot specifica, printr-o serie de clauze, diferite restrictii, cum ar fi:

chei primare - PRIMARY KEY;

restrictii pentru valorile nenule - NOT NULL;

valori implicite - DEFAULT;

restrictii de unicitate, diferite de cheia primara - UNIQUE;

restrictii de cheie straina-FOREIGN KEY.

Restrictiile implementate prin clauzele comenzii SQL CREATE TABLE mai sunt numite si restrictii neprocedurale, pentru ca se refera la restrictii formalizate prin expresii foarte exacte. Implementarea restrictiilor de integritate se poate face si sub forma de reguli active cunoscute de obicei sub numele de declansatoare (triggere). Aceste restrictii sunt considerate procedurale.

Declansatoarele sunt proceduri ce se executa atunci cand are loc un eveniment specific bazei de date ce afecteaza inregistrarile unei anumite tabele. Ele pot fi folosite pentru a implementa reguli sau restrictii referentiale mai complexe care nu pot fi formalizate prin clauzele comenzii CREATE TABLE. De asemenea, mai pot fi folosite si pentru a aplica anumite caracteristici de securitate sau anumite optiuni de auditare. In versiunile Oracle exista, de regula, doua categorii principale de declansatoare la nivel de tabela:

la nivel de fraza SQL - se declanseaza o singura data la nivel de fraza SQL;

la nivel de linie - se declanseaza pentru fiecare linie din tabela afectata de fraza SQL executata.

Pentru implementarea logicii aplicatiei, intr-un sistem Oracle sunt disponibile urmatoarele structuri procedurale: proceduri stocate, functii si pachete (package-uri).

Procedurile stocate reprezinta blocuri ce cuprind cod sursa (PL/SQL in cazul Oracle) pastrate in dictionarul bazei de date, apelabile din declansatoare sau de catre eventualele aplicatii implementate.

Functiile se aseamana cu procedurile, insa, spre deosebire de acestea din urma, sunt obligate sa returneze anumite valori programelor care le apeleaza.

Pachetele sunt structuri mai complexe fiindca sunt folosite pentru a organiza sau reuni procedurile si functiile in grupuri logice. Anumite elemente dintr-un pachet (variabile, proceduri, functii) pot fi declarate publice sau private. Elementele publice sunt accesibile din afara package-ului, in timp ce cele private sunt accesibile numai procedurilor sau functiilor din interiorul package-ului.


Tipuri abstracte de date

Tipurile abstracte de date sunt tipuri de date definite de utilizatori. Ele se bazeaza pe tipurile scalare definite mai sus si pot fi folosite la definirea coloanelor din tabelele de date relationale sau la definirea atributelor obiectelor stocate in tabelele de obiecte. O tabela de obiecte reprezinta o tabela in care toate liniile reprezinta obiecte ce poseda un identificator unic (OID), generat independent de valorile atributelor. In acest context se pot crea referinte intre liniile din tabelele relationale si obiectele din tabelele de obiecte, sau intre obiectele stocate in tabelele de obiecte.

Alte structuri interne specifice Oracle sunt tabelele incapsulate (nested table) si tablourile de marime variabila (varying arrays). O tabela incapsulata poate reprezenta o coloana dintr-o tabela relationala care contine mai multe valori pentru o singura linie. Un tablou variabil este asemanator cu o tabela incapsulata, insa este limitat sub aspectul numarului de linii pe care le poate contine. Aceste tipuri de structuri reprezinta de fapt constructori colectori putand implementa entitati aflate in relatie una-la-mai-multe ce se regasesc, de obicei, prin normalizare, in doua tabele relationale distincte.



In ce priveste implementarea schemei logice a bazei de date in locatii distribute, solutia in sistemele Oracle se bazeaza pe partitii. Astfel, schema de fragmentare a unei baze de date distribuite poate fi implementata in Oracle folosind partitiile. Acestea portioneaza tabelele de date dupa anumite criterii precizate si le pozitioneaza in locatiile stabilite prin schema de alocare.


Clustere

Tabelele care sunt accesate frecvent impreuna, in general cele aflate intr-o relatie una-la-mai-multe, pot fi stocate fizic impreuna. Pentru a le stoca in acest mod este creata o structura speciala numita cluster (sau daca vreti ,,ciorchine'), care va pastra in aceleasi locatii liniile legate intre ele ale ambelor tabele. Scopul consta in minimizarea fluxului de I/E generat de interogarile si actualizarile datelor. Coloanele prin care este facuta legatura dintre cele doua tabele formeaza cheia cluster-ului. Aceasta cheie este folosita la generarea index-ului clusterului, valorile acesteia fiind stocate o singura data pentru multiplele tabele ale caror linii sunt stocate impreuna in cluster.


Tabele virtuale - view-uri

Ca structura o tabela virtuala este in mare parte similara cu o tabela obisnuita: este formata din linii si coloane. In schimb, desi se pot interoga sau actualiza date, un view nu stocheaza fizic date. Acestea se gasesc in tabelele pe baza carora s-a creat respectivul view. Conceptual, un view poate fi inteles ca o "masca" suprapusa peste tabelele de baza prin mecanismul unei fraze SELECT. Ceea ce se se stocheaza in baza este definitia view-ului, adica interogarea pe care se bazeaza, formatul coloanelor, privilegiile acordate. Spre deosebire de tabele, view-urile nu pot fi indexate.

Din punctul de vedere al proiectarii, tabelele virtuale pot fi invocate ca mecanisme pentru maparea schemei externe pe schema conceptuala implementata prin structura interna a bazei de date. In acest context, view-urile pot fi folosite si pentru aplicarea anumitor politici de securitate la nivelul liniilor sau coloanelor din tabele.


Indecsi

Un index reprezinta o structura utilizata de server-ul bazei de date pentru a regasi rapid inregistrarile din tabelele bazei de date. Exista trei tipuri de indecsi: indecsi pentru tabele, indecsi pentru clustere si indecsi bitmap.

Indecsii contin o lista de valori de intrare, fiecare cuprinzand o valoare a cheii dupa care au fost definiti si un RowID. Un RowID reprezinta un tip de date special ale carui valori sunt astfel construite incat sa se poata deduce locatia fizica a fiecarei inregistrari: fiecare linie dintr-o tabela are un unic RowID. Intrarile unui index de tabela sau cluster sunt definite intr-o baza de date Oracle utilizand mecanismul B*-trece ce garanteaza eel mai rapid acces (cea mai scurta cale) la o valoare cheie. Fluxul de intrare-iesire (I/E) cerut pentru a gasi o valoare cheie este minim, iar o data gasita, este citit RowID-ul pereche cu care se va avea acces direct la inregistrarea corespunzatoare din tabela de baza.

Indecsii sunt creati automat implicit, la crearea unei tabele prin clauze de tip UNIQUE, PRIMARY KEY care implementeaza anumite restrictii de integritate. Crearea explicita a indecsilor, in special din ratiuni de optimizare a anumitor interogari, se realizeaza printr-o comanda CREATE INDEX.


2. Structurile logice de stocare a datelor


O baza de date este impartita, in general, in mai multe unitati logice de stocare numite tablespace-uri. Ratiunea acestei divizari poate fi legata, de exemplu, de gruparea informatiilor stocate in baza de date in functie de compartimentele organizatiei sau de ariile de actiune ale sistemelor de aplicatii. Spatiul de stocare administrat de aceste tablespace-uri provine din fisierele de date care fac parte din baza de date. Regula este ca un fisier de date sa furnizeze spatiu de stocare unui singur tablespace.

Spatiul utilizat de o baza de date Oracle este controlat prin urmatoarele structuri logice:

blocul de date - unitatea de stocare Oracle cea mai mica (unitatea de baza). Dimensiunea acestuia reprezinta un multiplu al dimensiunii blocului sistemului de operare (parametrul DB_BLOCK_SIZE din fisierul de para- metri);

extent-ul, care consta. din mai multe blocuri de date continue pe disc.  Poate fi considerat unitatea de alocare a spatiului pentru segmentele de date;

segmentul, care consta dintr-un set de extenturi utilizate pentru a stoca un anumit tip specific de date.

Segmentele pot fi socotite corespondentul fizic al obiectelor din baza de date. Segmentele stocheaza date (tabele, indecsi etc.), spatiul de stocare necesar fiind preluat din tablespace-urile bazei de date. Alocarea spatiului de stocare pentru un segment de date se face prin intermediul extent-urilor, care sunt formate din seturi de blocuri de date adiacente - continue pe disc. Atunci cand este creat un segment, acesta consta din eel putin un extent. O data cu cresterea dimensiunii segmentelor, noi extent-uri le sunt alocate din tablespace-urile respective.




Tipuri de segmente de date

Am mentionat ca segmentele reprezinta de fapt obiectele ce ocupa spatiul din baza de date. Din acest punct de vedere, se intalnesc urmatoarele tipuri de segmente:

Tabelele neclusterizate si nepartitionate sunt cele mai cunoscute structuri de stocare a datelor intr-o baza de date. Datele dintr-o tabela sunt stocate fara o ordine precis determinata, astfel ca administratorul bazei de date nu are prea mult control asupra locatiei fizice a liniilor din blocurile de date.

Partitiile din tabele. Din motive de scalabilitate si disponibilitate, o tabela relationala poate fi stocata in mai multe partitii, fiecare dintre ele putandu-se afla intr-un alt tablespace si, astfel, chiar intr-o alta locatie. Daca o tabela este partitionata, fiecare partitie este un segment separat cu parametri de stocare specifici.

Cluster-e. Un cluster (un ,,ciorchine') contine una sau mai multe tabele (grupate dupa o coloana comuna - key-column). Tabelele dintr-un cluster apartin aceluiasi segment si deci au parametri de stocare comuni.

Indecsi. Fiecare index are un segment de date separat, astfel ca daca pentru o tabela sunt definiti trei indecsi, atunci sunt necesare trei segmente diferite. Pentru un index partitionat, fiecare partitie corespunde unui segment separat.

Segmentele rollback. Segmentele rollback sunt utilizate de tranzactiile care modifica datele din baza de date. Inainte de a face o modificare asupra datelor, procesul server salveaza vechea valoare in segmentul de rollback. Aceasta imagine este utilizata pentru:

anularea (Undo) modificarilor daca tranzactia este abandonata (sau roll-back-uita, cum se mai spune adeseori);

impiedicarea celorlalte tranzactii sa ,,vada' modificarile necomise determinate de o fraza DML (asigurarea consistentei la citire);

refacerea bazei de date intr-o stare consistenta in cazul caderilor.

Segmente temporare. Pentru comenzi SQL cum sunt CREATE INDEX, SELECT DISTINCT si SELECT GROUP BY, serverul Oracle va trebui sa efectueze sortari suplimentare in memorie, sortari care sunt, de regula, mari consumatoare de spajiu. Cand apare o astfel de sortare (cum ar fi in cazul in care este construit un index pe o tabela de dimensiuni mari) sunt stocate pe disc rezultatele intermediare. In asemenea cazuri sunt create segmente temporare.


3. Structurile fizice de stocare a datelor


O baza de date Oracle reprezinta, de fapt, structuri fizice, fiind compusa din fisiere ale sistemului de operare de urmatoarele tipuri:

Fisiere de date: stocheaza dictionarul bazei de date, obiectele utilizatorilor, imaginile initiate ale datelor schimbate de tranzactiile curente (segmentele rollback). Exista eel putin un astfel de fisier rezervat, bineinteles, catalogului bazei de date.

Fisierele de jurnalizare sau redo log: contin inregistrari ale schimbarilor facute in baza de date pentru a o putea reconstrui in cazul unor caderi. Sunt necesare eel putin doua astfel de fisiere.

Fisierele de control: contin informatiile necesare mentinerii si verificarii integritatii bazei de date. Acestea, de fapt, dau informatiile concrete asupra localizarii celorlalte fisiere din baza de date si asupra starii lor. Este necesar eel putin un astfel de fisier.

In momentul crearii bazei de date, automat se aloca si formateaza spatiul pe disc, care insa nu contine inca datele utilizatorilor. Cu alte cuvinte, serverul Oracle rezerva pe disc spatiu pentru viitoarele segmente alocate in respectivele tablespace-uri. Un tablespace poate fi format din unul sau mai multe fisiere de date. Cum segmentele de date sunt alocate intr-un anumit tablespace, atunci se poate presupune ca schema unui utilizator se poate intinde in mai multe fisiere de date. Dimensiunea fisierelor de date poate fi modificata ulterior, in functie de necesitatile bazei de date.

Fisierele de jurnalizare (redo log) sunt utilizate pentru minimizarea pierderilor de date intr-o baza de date. Ele sunt valorificate in momentul in care o instanta cade (,,colapseaza'), iar modificarile tranzactiilor declarate comise nu sunt scrise inca pe disc. La repornirea instantei aceste fisiere sunt citite pentru refacerea bazei de date in stare consistenta, recuperand toate tranzactiile comise si anuland toate tranzactiiie necomise.



Un fisier de jurnalizare face parte dintr-un grup redo log. Membrii unui grup redo log sunt identici din punctul de vedere al dimensiunii, al numarului secventei log si al informatiei stocate, procesul LGWR scriind simultan in toate fisierele unui astfel de grup. Aceste grupuri sunt utilizate intr-o maniera circulara: dupa ce ultimul grup este plin se trece la suprascrierea primului.

Alte fisiere esentiale in functionarea serverului Oracle, dar in afara bazei de date, sunt:

fisierul de parametri: defineste caracteristicile instantei Oracle.

fisierul de parole: autentifica utilizatorii privilegiati ai bazei de date.

fisierele redo log arhivate: copii offline ale fisierelor redo log care ar putea fi necesare in procesul de restaurare in cazul unor caderi ale bazei de date.


4. Structura interna a instantei

Cand un utilizator cere o conexiune la baza de date printr-un proces utilizator (sau proces client, de exemplu SQL*PLUS), cererea acestuia va fi preluata in prima faza de un serviciu numit listener. Sarcina acestuia este sa interpreteze string-ul de conectare (numele bazei de date furnizat de utilizator) si sa verifice daca exista un serviciu-instanta corespunzator. Daca instanta indicata exists si este activa, se creeaza cate un proces server pentru fiecare conexiune (intr-o arhitectura dedicate) care va prelua sarcina admirtistrarii acesteia si va satisface cererile exprirnate prin comenzi SQL ale utilizatorului. In cazul unei arhitecturi MTS (Multi-Threaded-Server), un singur proces server (shared server-process) poate deservi mai multe conexiuni simultane.

Instanta Oracle reprezinta elementul esential care asigura functionalitatea specifica SGBD-ului. La nivelul sistemului de operare se materializeaza sub forma unui serviciu specific care asigura practic functionalitatea atribuita serverului de baze de date. Concret, aceasta este formata dintr-o zona de memorie interna - numita system global area - si o serie de procese background care functioneaza intr-o maniera colaborativia.


System Global Area contine date si inforrnatii de control pentru serverul Oracle. SGA este formata din urmatoarele structuri:

Shared SQL Pool - stocheaza informatii curn ar fi, pe de o parte, cele mai recente fraze SQL executate (Library Cache), adicft textul SQL, arborele de analiza si planul de executie, si, pe de alts parte, datele din dictionarul de date cele mai recent utilizate (Data dictionary cache), adica definitii de tabele sicoloane,numedeutilizatori, parolesiprivilegii.

Database Buffer Cache (DB Cache), bufferele pentru date - este zona in care sunt stocate blocurile de date provenind din segmentele de date eel mai recent utilizate

Redo Log Buffer, bufferele pentru inregistrarile redo log - memoreaza
modificarile facute asupra datelor din BD de catre instanta.


Procesele de background execute functiile obisnuite necesare satisfacerii cererilor utilizatorilor concurenti, asigurand integritatea datelor si mentinand performance sistemului. Cele mai importante sunt:

Database Writer (DBWR): responsabil de scrierea datelor modificate din buffer cache pe disc, in fisierele bazei de date.

Log Writer (LGWR): are sarcina de a scrie in fisierele redo log inregistrarile redo din bufferul redo log.

System Monitor (SMON): are, in primul rand, functia sa verifice consistenta bazei de date si sa initieze restaurarea acesteia in momentul cand este pornita instanta si este deschisa BD. De asemenea, mai are rolul si de a ,,curata' baza de date prin eliminarea obiectelor tranzactionale care nu mai sunt necesare.

Process Monitor (PMON): elibereaza resursele blocate cand "cade' unul dintre procesele utilizator (pentru ca procesele de pe server care le deservesc sa nu blocheze inutil resurse.

Procesul Checkpoint (CKPT): este responsabil de actualizarea informatiilor despre starea bazei de date de fiecare data cand schimbarile din DB cache sunt inregistrate definitiv in baza de date.

Procesul ARCH. Procesul LGWR scrie in fisierele redo log active (on line) intr-o maniera circulara, astfel ca in momentul in care un astfel de fisier este plin scrierea se face in eel de-al doilea s.a.m.d.