777


Materiały szkoleniowe

Administracja serwerem Oracle

0x08 graphic
Prowadzący

Anna Pijanowska - Kuśnierz

Spis treści

Konwencje typograficzne

Konwencje typograficzne

Aby ułatwić wyszukiwanie w materiałach szkoleniowych ważniejszych informacji oraz poszczególnych elementów, zastosowano ikony o następującym znaczeniu:

0x01 graphic
— ikona „Wskazówka”; sygnalizuje fragment opisujący ułatwienia wykonania czynności lub „skrót” pozwalający wykonać ją szybciej i sprawniej;

0x01 graphic
— ikona „Uwaga”; sygnalizuje informacje ważne dla prawidłowego wykonania czynności;

0x01 graphic
— ikona „Ćwiczenia”; rozpoczyna zestaw ćwiczeń;

Wprowadzenie

Cele Kursu

Po zakończeniu tego kursu powinieneś potrafić:

Obowiązki Administratora Bazy Danych

System baz danych Oracle może być całkiem duży i obsługiwać wielu użytkowników.

Często więc niezbędne jest aby jedna osoba lub grupa ludzi była odpowiedzialna za zarządzanie systemem bazy danych. Tą osobą jest administrator bazy danych (DBA).

Obowiązki DBA

W niektórych systemach baz danych może być wielu różnych DBA o różnych zadaniach.

Na przykład inni DBA mogą być odpowiedzialni za tworzenie użytkowników, monitorowanie użytkowników, monitorowanie zasobów systemu i zapewnienie bezpieczeństwa bazy danych.

W przeciwieństwie do obowiązków DBA, projektant aplikacji w bazie danych może być odpowiedzialny za projektowanie i implementację aplikacji bazodanowych, projektowanie obiektów bazy danych oraz strojenie aplikacji.

I. Przegląd architektury Oracle

Cele

W tej lekcji przedstawiamy architekturę serwera Oracle, w szczególności struktury fizyczne, struktury pamięci i procesy tła.

Po zakończeniu tej lekcji powinieneś potrafić:

Przegląd

Aby efektywnie zarządzać bazą danych, administrator bazy danych (DBA od. ang. DataBase Administrator) powinien dokładnie znać i rozumieć architekturę serwera ORACLE.

DBA musi rozumieć następujące elementy:

Globalny Obszar Systemowy (SGA)

Przy każdym starcie serwera w części pamięci operacyjnej rezerwowana jest na Globalny Obszar Systemowy (SGA od ang. System Global Area). Jest to grupa dzielonych struktur pamięci zawierająca informacje kontrolne pojedynczego systemu bazy danych Oracle.

SGA powinien być alokowany w pamięci rezydentnej (nie stronicowej, nie wirtualnej).

Jeśli podłączonych do bazy jest wielu użytkowników, dane w SGA są „dzielone” przez wszystkich użytkowników.

SGA można także tłumaczyć jako „Shared Global Area” - dzielony obszar globalny.

SGA nie powinien zajmować więcej niż 50% dostępnej pamięci operacyjnej.

0x01 graphic

Obszar Dzielony

Obszar dzielony jest fragmentem SGA zawierającym między innymi takie konstrukcje jak dzielone obszary SQL i bufor słownika danych.

Obszary Dzielone SQL

Każdy z obszarów dzielonych AQL (shared SQL area) zawiera informacje używane przy wykonaniu pojedynczego polecenia SQL. Procesy wykonujące identyczne polecenia SQL używają tej samej informacji.

Polecenie SQL umiejscawiane jest w dzielonym obszarze SQL za pomocą algorytmu haszowania zastosowanego do tego polecenia. Stąd też tylko absolutnie identyczne polecenia mogą być skierowane w ten sam obszar pamięci.

Obszary dzielone SQL bywają też nazywane buforem bibliotecznym (library cache).

Bufor Słownika Danych

Słownik danych (data dictionary) jest zbiorem tabel i perspektyw bazy danych zawierających informacje o bazie danych, jej strukturach i użytkownikach. Wśród danych przechowywanych w słowniku danych znajdują się:

Bufor słownika bazy danych nazywany jest czasem buforem wierszowym (row cache).

Zawartość Obszaru Dzielonego

0x01 graphic

Bufor Bazy Danych

Bufor bazy danych zawiera kopie bloków danych odczytanych z dysku. Wszyscy użytkownicy podłączeni aktualnie do systemu korzystają ze wspólnego bufora bazy danych.

Dostęp do Danych

Przy pierwszym dostępie procesu użytkownika do wskazanego fragmentu danych, proces ten, zanim uzyska do niego dostęp, musi przepisać dane z dysku do bufora.

Jeśli proces żąda dostępu do danych, które już znajdują się w buforze, może odczytywać dane bezpośrednio z pamięci operacyjnej.

Dostęp do danych przy trafieniach w bufor jest szybszy niż przy sytuacji braków w buforze. Ponieważ rozmiar bufora jest ograniczony, nie wszystkie dane z dysku mieszczą się w buforze. Kiedy bufor jest pełen, kolejne braki w buforze powodują, że Oracle zapisują dane z bufora na dysk w celu zwolnienia miejsca dla nowych danych. Wtedy kolejne odwołania do przeniesionych na dysk danych powodują sytuację braku w buforze.

Bufor Dziennika Powtórzeń

Bufor dziennika powtórzeń (redo log buffer) to bufor cykliczny zawierający informacje o zmianach dokonanych w bazie danych. Dziennik powtórzeń:

Procesy Tła

W celu maksymalizacji efektywności wykonania i umożliwienia pracy wielu użytkownikom, system Oracle używa specjalnych procesów Oracle zwanych procesami drugoplanowymi lub procesami tła.

System Oracle, w zależności od konfiguracji, może składać się z wielu procesów tła. Oto ich nazwy:

Procesy PMON i SMON

Procesy PMON i SMON zwalniają zasoby bazy danych nie używane już przez użytkownika.

PMON

SMON

Cztery Obowiązkowe Procesy

0x01 graphic

Jeśli którykolwiek z tych czterech procesów zostanie przerwany, następuje awaria instancji i trzeba uruchomić ją ponownie.

Procesy użytkownika

Proces użytkownika jest tworzony kiedy użytkownik uruchamia program aplikacji.

Proces użytkownika

Procesy Serwerów

Przed uzyskaniem dostępu do danych, dane muszą być umieszczone w buforze danych.

Dokonuje tego proces serwera. W celu wykonania polecenia SQL proces serwera używa pamięci dzielonej w SGA.

Zadania Procesu Serwera

Proces serwera analizuje, wykonuje i sprowadza dane dla każdej aplikacji użytkownika.

Zadanie

Opis

Analiza (parse)

Sprawdzanie poprawności składni, uprawnień, identyfikacja obiektów i optymalizacja (budowa drzewa analizy). Podczas analizy używane są obszary dzielone SQL, stąd też procesy mogą używać wspólnych drzew analizy.

Wykonanie (execute)

Realizacja działań z drzewa analizy na danych, fizyczny odczyt i zmiana danych, według potrzeb.

Sprowadzanie (fetch)

Przekazuje dane wynikowe polecenia SELECT

0x01 graphic

Uwaga: Istnieją też inne możliwe konfiguracje dotyczące serwerów, jednak nie będą one omawiane podczas lekcji.

0x01 graphic

Instancja Oracle

Instancję Oracle stanowi kombinacja SGA i procesów tła bazy danych. Kiedy instancja jest uruchamiana, przydzielane są bufory pamięci SGA i startują procesy tła.

Należy odróżnić pojęcia „baza danych Oracle” i „instancja Oracle”. Mówimy, że „instancja jest uruchomiona” (pamięć jest przydzielona, procesy tła uruchomione), zaś baza danych (plik danych) „jest zamontowana” w instalacji.

Procesy serwera i procesy użytkownika nie zawierają się w definicji instancji Oracle.

0x01 graphic

Baza Danych Oracle

Baza danych Oracle składa się z jednego lub wielu plików kontrolnych (control file), plików danych (datafile) i plików dziennika powtórzeń (redo log files) wyspecyfikowanych w pliku kontrolnym.

Struktura fizyczna

Definicja

Plik danych (datafile)

Zawiera wszystkie dane bazy danych. Struktury logiczne, takie jak tabele, indeksy, przechowywane są fizycznie w plikach danych.

Pliki dziennika powtórzeń

(redo log files)

Przechowują zapis wszystkich zmian dokonanych w bazie danych w celu ewentualnego odtwarzania.

Pliki kontrolne

(control files)

Każdy z nich zawiera opis struktury fizycznej i statusu bazy danych.

Pliki Dziennika Powtórzeń

Pliki dziennika powtórzeń (redo log files) zawierają zapis wszystkich zmian dokonanych w bazie danych używany podczas odtwarzania danych. Jeśli pliki dziennika powtórzeń są zwielokrotnione, ta sama informacja dziennika powtórzeń zapisywana jest jednocześnie do plików dziennika powtórzeń.

Pliki Dziennika Powtórzeń

0x01 graphic

Zwielokrotnione Pliki Dziennika Powtórzeń

0x01 graphic

Dysk A i B reprezentują różne dyski na tej samej maszynie. Każdy element grupy musi być tego samego rozmiaru. Każdy element grupy powinien być przechowywany na innym dysku aby lepiej zabezpieczyć się przed awarią. Każdy element grupy zapisywany jest w tym samym czasie.

Domyślna instalacja tworzy dwie grupy dzienników powtórzeń z jednym elementem w każdej grupie i domyślnym rozmiarem 500 KB. Często warto dodać więcej elementów na innych dyskach, a także zwiększyć rozmiar plików dziennika.

Pliki Kontrolne

Plik kontrolny (control file) to niewielki plik binarny opisujący strukturę bazy danych.

Własności Pliku Kontrolnego

Plik kontrolny musi być dostępny do zapisu dla serwera Oracle podczas otwierania bazy danych.

Domyślna nazwa pliku kontrolnego jest zależna od systemu operacyjnego.

Plik Parametrów

Plik parametrów definiuje instancję. Aby uruchomić instancję, Oracle musi odczytać plik parametrów init<SID>ora. Plik parametrów jest plikiem tekstowym zawierającym listę parametrów konfiguracyjnych instancji. Ustawiając te parametry na określone wartości zarządzamy przydziałem pamięci i ustawieniem procesów instancji Oracle. Plik parametrów decyduje między innymi:

Rozmiar SGA

Parametr

Definicja

SHARED_POOL_SIZE

Rozmiar pamięci (w bajtach) przeznaczonej na obszar dzielony poleceń SQL i PL/SQL.

DB_BLOCK_SIZE

Rozmiar pojedynczego bloku (w bajtach), a tym samym bufora bloku w bazie danych.

DB_BLOCK_BUFFERS

Liczba utworzonych w SGA buforów bazy danych, z których każdy ma rozmiar DB_BLOCK_SIZE. (Całkowita wielkość buforów bazy danych w SGA to iloczyn DB_BLOCK_SIZE i DB_BLOCK_BUFFERS)

LOG_BUFFER

Liczba bajtów przeznaczonych na bufor dziennika powtórzeń

Pliki Śladu i Plik Ostrzeżeń

Po wystąpieniu błędu w czasie działania instancji Oracle do pliku ostrzeżeń (alert file) zapisywany jest komunikat . Jeżeli błąd został wykryty przez serwer lub proces tła, ta informacja zapisywana jest w odpowiednim pliku śladu (trace file).

Plik Ostrzeżeń

Plik ostrzeżeń (alert file) bazy danych to chronologiczny zapis komunikatów i błędów, wśród których znajdować się mogą:

Oracle stosuje plik ostrzeżeń zamiast wyświetlania takich komunikatów na konsoli operatora.

Plik ostrzeżeń jest umieszczany w miejscu określonym przez parametr BACKGROUND_DUMP_DEST.

Ważne jest, aby regularnie (codziennie) sprawdzać plik ostrzeżeń, aby wykryć problem, zanim sytuacja stanie się poważna, dopóki dysponujemy poprawną kopią zapasową bazy (akcja będzie zależna od natury problemu)

Pliki Śladu

Po wykryciu przez serwer lub proces tła błędu wewnętrznego, informacja jest zapisywana na odpowiedni plik śladu. Pliki śladu umieszczone są tam, gdzie wskazuje parametr BACKGROUND_DUMP_DEST jeśli jest to komunikat procesu tła lub tam, gdzie wskazuje parametr USER_DUMP_DEST, jeśli komunikat zapisywany jest przez proces serwera.

Parametr SQL_TRACE

Zapis śladu może być włączony i wyłączony parametrem inicjalizacji SQL_TRACE. Jego wartość to TRUE lub FALSE.

Można też włączyć zapis do pliku śladu tylko dla bieżącej sesji wykonując polecenie:

SQL<ALTER SESSION SET sql_trace = TRUE

Podsumowanie

DBA powinien pamiętać, że:

II. Uruchamianie i zamykanie instancji

Cele

W tej lekcji omówimy kroki, jakie musi wykonać DBA przy uruchamianiu i zamykaniu instancji Oracle w odpowiednim trybie, właściwym dla różnych sytuacji.

Po przerobieniu tej lekcji powinieneś potrafić:

Metody Identyfikacji

W zależności od tego, czy DBA jest administratorem lokalnym bazy danych (na tym samym komputerze, gdzie znajduje się baza danych), czy też DBA administruje wieloma różnymi bazami danych z pojedynczego odległego komputera, możemy wybrać pomiędzy identyfikacją przez system operacyjny lub identyfikacją administratorów przez pliki haseł.

Identyfikacja przez System Operacyjny

Identyfikacja przez Plik Haseł

Uruchamianie Instancji

Przy uruchamianiu instancji trzeba podać stan w jakim ma znaleźć się baza danych.

Stany Uruchomienia

Stan Uruchomienia

Opis

NOMOUNT

Używany przy tworzeniu bazy danych.

MOUNT

Używany przy modyfikowaniu struktury plików i zmianach znaczników w pliku kontrolnym.

OPEN

Udostępnia bazę danych wszystkim użytkownikom.

0x08 graphic
Procedura Uruchamiania

  1. Wystartowanie instancji.

  2. Zamontowanie bazy danych.

  3. Otwarcie bazy danych.

Na diagramie stan SHUTDOWN reprezentuje punkt startowy polecenia STARTUP.

Stan NOMOUNT, MOUNT i OPEN wzajemnie się wykluczają, tj. baza może być w danym momencie tylko w jednym z tych stanów. Aby przejść za stanu SHUTDOWN do otwartej bazy danych, należy wykonać polecenie STARTUP.

Aby otworzyć bazę danych po poleceniu STARTUP MOUNT wykonujemy polecenie ALTER DATABASE OPEN. Wtedy baza danych jest dostępna dla wszystkich użytkowników.

0x01 graphic

Uwaga: Polecenie STARTUP można wykonać dla danej instancji tylko raz.

Kroki Serwera

Uruchomienie instancji powoduje, że serwer Oracle:

Nazwa bazy danych musi być podana w parametrze DB_NAME w pliku init<SID>.ora lub w poleceniu STARTUP.

Tryby Uruchomienia

Opcje Montowania

Opcje PARALLEL używamy tylko jeśli wiele instancji jednoczenie ma mieć dostęp do bazy danych. W przeciwnym razie używamy (domyślnej) opcji EXCLUSIVE. Opcja SHARED jest synonimem opcji PARALLEL. Opcja RETRY jest dostępna tylko dla instancji pracujących w trybie PARALLEL.

Opcje Uruchamiania

Elementy SGA

Składnia:

0x01 graphic

gdzie:

baza danych określa nazwę bazy danych

OPEN udostępnia bazę danych użytkownikom

MOUNT montuje bazę danych na potrzebę pewnych czynności DBA, nie udostępnia bazy użytkownikom

NOMOUNT tworzy SGA i uruchamia procesy tła, nie udostępnia bazy danych użytkownikom

EXCLUSIVE pozwala jedynie bieżącej instancji na dostęp do bazy danych

PARALLEL pozwala na dostęp do bazy danych wielu instancji (uruchamia Serwer Równoległy Oracle).

SHARED inny termin na PARALLEL

RETRY wskazuje, aby instancja równoległa usiłowała się ponownie uruchamiać w pięciosekundowych odstępach.

PFILE=parfile pozwala na użycie innego niż domyślny pliku parametrów dla ustalenia konfiguracji instancji

FORCE przed wykonaniem normalnego uruchomienia przerywa działającą instancję

RESTRICT udostępnia bazę danych tylko użytkownikom posiadającym uprawnienie RESTRICTED SESSION

RECOVER po uruchomieniu bazy rozpoczyna odtwarzanie po awarii nośników.

Przykład

Start instancji bazy danych ORCL z użyciem pliku parametrów initORCL.ora. Wykonujemy polecenie:

SVRMGR > STARTUP NOMOUNT PFILE=initORCL.ora.

Montowanie Bazy Danych

Aktywacja Plików Kontrolnych

Podczas montowania bazy danych:

Zamontować bazę danych można też poleceniem ALTER DATABASE

Składnia:

0x01 graphic

gdzie:

baza danych nazwa bazy, która ma być zmieniona.

MOUNT montuje bazę danych na potrzeby pewnych czynności DBA, nie udostępnia bazy użytkownikom

EXCLUSIVE pozwala jedynie bieżącej instancji na dostęp do bazy

PARALLEL pozwala na dostęp do bazy danych wielu instancji (uruchamia Serwer Równoległy Oracle).

OPEN udostępnia bazę danych użytkownikom

Uruchomianie Odtwarzania

Baza danych musi być zamontowana, lecz nie otwarta w celu

Opcja RESETLOGS jest omawiana na kursie Archiwizacja i Odtwarzanie. Powinna być stosowana bardzo ostrożnie.

Opcje MOUNT i OPEN są dostępne w menu narzędzia Instance Manager oraz w Server Manager w trybie linii poleceń.

Otwieranie Bazy Danych

Otwieramy bazę danych w celu umożliwienia normalnej pracy użytkownikom.

Przykład

Otwieranie zamontowanej uprzednio bazy danych.

SVRMGR> ALTER DATABASE OPEN;

Statement processed.

Argumentu RESTRICTED SESSION używamy w celu udostępnienia bazy danych tylko użytkownikom DBA.

Jeśli którykolwiek plik danych lub plik dziennika powtórzeń jest niedostępny lub nie może być otwarty, serwer Oracle zwraca błąd i nie otwiera bazy danych.

Sesje Zastrzeżone

Stan bazy danych może być zmieniony tak, aby w przyszłe podłączenia mieli prawo wykonywać inni użytkownicy mający prawo do otwierania sesji zastrzeżonych (uprawnienie RESTRICTED SESSION). Służy do tego polecenie ALTER SYSTEM.

Składnia:

0x01 graphic

gdzie:

ENABLE RESTRICTED pozwala na wykonywanie podłączeń tylko użytkowników z uprawnieniami RESTRICTED SESSION

DISABLE RESTRICTED pozwala na podłączenie się wszystkim użytkownikom

Zamykanie bazy danych

Po zamknięciu bazy danych i zatrzymaniu instancji baza danych jest niedostępna dla użytkowników.

Składnia:

0x01 graphic

gdzie:

NORMAL oczekuje aż wszyscy podłączeni użytkownicy normalnie zakończą swoje sesje.

TRANSACTIONAL oczekuje, aż wszyscy użytkownicy zakończą swoje transakcje, rozłącza użytkowników po zakończeniu transakcji

IMMEDIATE kończy bieżąco wykonywane polecenie SQL i wycofuje nie zatwierdzone transakcje.

ABORT najszybsze możliwe zakończenie. Nie czeka na zakończenie operacji ani na odłączenie użytkowników. Nie wycofuje nie zatwierdzonych transakcji.

Zamknięcie Normalne (shutdown normal)

Nie pozwala na nowe podłączenia. Serwer Oracle odwleka zamknięcie bazy aż do odłączenia się wszystkich użytkowników. Następne uruchomienie nie wymaga odtwarzania instancji. NORMAL jest domyślnym trybem zamykania.

Zamknięcie Transakcyjne (shutdown transactional)

Bieżące polecenie SQL klientów nie są kończone. Wszystkie nie zatwierdzone transakcje kontynuują pracę. Po zakończeniu transakcji sesje użytkowników są kończone. Polecenie SHUTDOWN TRANSACTIONAL zamyka i demontuje bazę danych i zatrzymuje instancję. Baza danych jest spójna, następne uruchomienie nie wymaga odtworzenia instancji.

Zamknięcie Natychmiastowe (shutdown immediate)

Bieżące polecenie SQL klientów nie są kończone. Wszystkie nie zatwierdzone transakcje są wycofywane. Serwer Oracle nie czeka na odłączenie się wszystkich podłączonych do bazy danych użytkowników. Polecenie SHUTDOWN IMMEDIATE zamyka i demontuje bazę danych i zatrzymuje instancję. Baza danych jest spójna, następne uruchomienie nie wymaga odtworzenia instancji.

Zamknięcie Awaryjne (shutdown abort)

Przerywa bieżąco wykonywane przez serwer Oracle polecenia SQL klientów. Nie zatwierdzone transakcje nie są wycofywane. Serwer Oracle nie czeka na odłączenie się podłączonych do bazy danych użytkowników. SHUTDOWN ABORT nie zamyka ani nie demontuje bazy danych, zatrzymuje jedynie instancję. Następne uruchamianie wymaga odtwarzania instancji (co odbywa się automatycznie).

Zamykamy bazę danych w celu zrobienia kopii zapasowej wszystkich struktur fizycznych offline z poziomu systemu operacyjnego lub w celu modyfikacji parametrów inicjalizacji.

Aby sprawdzić, czy są jacyś użytkownicy podłączeni do bazy oglądamy perspektywę V$SESSION.

Przykłady

Zamknięcie bazy danych pozwalające użytkownikom zakończyć ich sesje.

SVRMGR> CONNECT / AS SYSDBA

Connected

SVRMGR> SHUTDOWN NORMAL

Database closed

Database dismounted

Oracle instance shut down

Zamknięcie bazy danych zamontowanej, ale nie otwartej.

SVRMGR> CONNECT / AS SYSDBA

Connected

SVRMGR> SHUTDOWN NORMAL

ORA-01109 : database not open

Database dismounted

ORACLE instance shut down

Zamknięcie bazy danych w stanie NOMOUNT

SVRMGR> CONNECT / AS SYSDBA

Connected

SVRMGR> SHUTDOWN NORMAL

ORA-01507 : database not mounted

ORACLE instance shut down

Podsumowanie

Aby baza danych była dostępna dla użytkowników, należy wystartować (uruchomić) instancję.

Procedura Uruchamiania

Po zamknięciu instancji baza danych jest niedostępna dla użytkowników.

Procedura Zamykania

Poleceniami ALTER SYSTEM ENABLE/DISABLE RESTRICTED SESSION ograniczamy dostęp jedynie dla użytkowników DBA lub też pozwalamy na podłączenie wszystkim użytkownikom.

0x01 graphic

Zadania

Podłącz się do bazy jako internal

Zamontuj bazę

Obejrzyj perspektywę V$SGA

Obejrzyj perspektywę DBA_USERS

Otwórz bazę

Zamknij bazę w trybie IMMEDIATE

Otwórz bazę poleceniem STARTUP OPEN

Zobacz, czy teraz da się obejrzeć perspektywę DBA_USERS

Zablokuj dostęp dla użytkowników

Spróbuj zalogować się jako DEMO/DEMO

Zamknij bazę w trybie TRANSACTIONAL

W Instance Managerze zamontuj bazę i otwórz, a następnie zamknij w trybie IMMEDIATE

III. Tworzenie bazy danych

Cele

W tej lekcji omówimy kroki jakie musi podjąć DBA przy tworzeniu nowej bazy danych Oracle.

Po przerobieniu tej lekcji powinieneś potrafić:

Przegląd

Tworzenie bazy danych to pierwszy krok w organizowaniu i zarządzaniu systemu baz danych.

Zadania Związane z Tworzeniem Bazy Danych

Planowanie Przestrzeni Tabel

Baza danych Oracle jest podzielona na mniejsze logiczne części nazywane przestrzeniami tabel.

Przestrzenie Tabel (tablespace)

Przestrzeń tabel zawierająca aktywny segment wycofania nie może być wyłączona.

Przestrzeń tabel SYSTEM jest zawarta w każdej instancji serwera Oracle. Jako uzupełnienie przestrzeni tabel SYSTEM zaleca się zbudowanie dodatkowych przestrzeni tabel:

Przestrzeń tabel

Opis

TEMP

Zawiera segmenty tymczasowe używane np. przy sortowaniu

RBS

Zawiera dodatkowe segmenty wycofania. (Nie można utworzyć przestrzeni tabel o nazwie rollback ponieważ słowo ROLLBACK jest słowem kluczowym).

TOOLS

Przeznaczona na tabele używane przez narzędzia serwera Oracle.

APPLI_DATA

Zawiera dane produkcyjne, używane przez aplikacje. Może istnieć wiele przestrzeni tabel dla danych produkcyjnych, co będzie omawiane w dalszej części lekcji.

APPLI_INDEX

Przeznaczona na indeksy związane z danymi produkcyjnymi z przestrzeni tabel APPLI_DATA. Może istnieć wiele indeksowych przestrzeni tabel

Charakterystyka Danych

Przed zaprojektowaniem struktury przestrzeni tabel w bazie danych należy rozważyć własności przechowywanych danych.

Pozwoli to na:

Na niektórych platformach program instalacyjny Oracle utworzy pewną liczbę predefiniowanych przestrzeni tabel.

Minimalizacja Fragmentacji

W celu minimalizacji fragmentacji oddzielamy grupy obiektów z różną charakterystyką fragmentacji umieszczając je w innych przestrzeniach tabel.

Typ Segmentu

Charakterystyka fragmentacji

Segmenty słownika danych

Brak skłonności do fragmentacji, nigdy nie dzielą wolnej przestrzeni.

Segmenty danych aplikacji

Mała skłonność do fragmentacji, ponieważ tabele mają określoną przestrzeń zgodną z wymaganiami projektu.

Pomocnicze segmenty aplikacyjne

Średnia skłonność do fragmentacji.

Segmenty wycofania

Średnia skłonność do fragmentacji

Segmenty tymczasowe

Średnia skłonność do fragmentacji

Oddzielanie Segmentów

Rozdzielanie grupy segmentów reprezentujące obiekty z inną charakterystyką operacyjną umieszczając je w różnych przestrzeniach tabel.

Kiedy Oddzielać Grupy

Oddzielamy grupy:

Korzyści z Oddzielania Grup

Archiwizacja i odtwarzanie jest prostsza kiedy dane związane z określoną aplikacją są oddzielone od danych aplikacji.

Archiwizacja jest szybsza jeśli dotyczy przestrzeni tabel tylko do odczytu.

Szacowanie i pomiar przyrostu danych w projekcie jest prostsze jeśli dane związane z określonym projektem są oddzielone od danych innego projektu.

Zapewnienie bezpieczeństwa jest prostsze w implementacji jeśli manipulacja uprawnieniami do bazy danych użytkowników dotyczy grup obiektów.

Archiwizacja lub usuwanie danych związanych z zakończonym projektem jest łatwiejsze jeśli dane projektu przechowywane są niezależnie od danych innych projektów.

Umiejscowienie Plików Bazy Danych

Zabezpieczamy bazę danych maksymalizując jednocześnie pojemność i wydajność.

Umiejscowienie Plików Bazy Danych

Tworzenie Bazy Danych

W celu utworzenia bazy danych Oracle podajemy następujące kroki:

  1. Wybierz unikalną nazwę instancji, rozmiar bloku, zestaw znaków bazy danych, maksymalną liczbę plików dziennika.

  2. Przygotuj plik parametrów (init<SID>.ora.).

  3. Ustaw odpowiednie zmienne systemu operacyjnego.

  4. Uruchom Serwer Manager w trybie linii poleceń i podłącz się jako sysdba.

  5. Wystartuj instancję (STARTUP NOMOUNT)

  6. Utwórz bazę danych

Powyższe kroki wykonywane są zwykle przez skrypt instalacyjny. Następnie DBA powinien zainstalować słownik danych, perspektywy importu/eksportu i dodatkowe opcje swojej licencji.

Wybór Nazwy Instancji

Musimy wybrać unikalną nazwę dla instancji. Na pewnych platformach, takich jak UNIX, nazwa instancji jest zawarta w nazwie pliku parametrów.

Przykład

Wyświetlić pliki parametrów w katalogu dbs.

% ls $ORACLE_HOME/dbs/init*.ora

/home/oraclev7/dbs/init.ora

/home/oraclev7/dbs/initEDUC7.ora

/home/oraclev7/dbs/initDBA01.ora

Domyślnie nazwa pliku parametrów instancji o nazwie TEST w systemie UNIX to initTEST.ora umieszczona w katalogu $ORACLE_HOME/dbs.

Konkretna metoda sprawdzenia jakie instancje są uruchomione w systemie zależy od systemu operacyjnego.

W systemie UNIX wyświetlamy wszystkie procesy wprowadzając następujące polecenie:

ps -ef lub

ps -ax

W ten sposób wyświetlamy uruchomione procesy drugoplanowe wszystkich instancji bazy danych Oracle. Nazwa instancji będzie zawierać się w nazwie jej procesów drugoplanowych.

Przygotowanie Pliku Parametrów

Plik parametrów, nazywany zwykle plikiem init<SID>.ora to plik tekstowy, który możemy dopasować do swoich potrzeb używając standardowego edytora systemu operacyjnego.

Plik parametrów jest odczytywany tylko w momencie startu instancji. Jeśli został zmieniony, aby zmiany odniosły skutek trzeba zamknąć i ponownie uruchomić instancję.

Powody Modyfikowania Pliku Parametrów

Parametry w pliku init<SID>.ora mają istotny wpływ na efektywność bazy danych, lub też muszą zostać dopasowane do wymagań produkcyjnych bazy danych:

Cechy pliku parametrów:

Edycja Pliku Parametrów

Podczas przygotowywania nowej bazy danych powinniśmy określić ustawienia pewnych parametrów. Wartości innych mogą pozostać domyślne.

Parametry Które Powinny Być Ustawione

Parametr

Opis

DB_NAME

Maksymalnie ośmioznakowy identyfikator bazy danych. Jedyny parametr obowiązkowy podczas tworzenia nowe bazy danych.

CONTROL_FILES

Nazwy plików kontrolnych

DB_BLOCK_SIZE

Rozmiar (w bajtach) bloku danych bazy danych Oracle. Domyślnie 2048

SHARED_POOL_SIZE

Rozmiar (w bajtach) obszaru dzielonego. Domyślnie 3500000

BACKGROUND_DUMP_DEST

Miejsce tworzenia plików śladu procesów tła.

USER_DUMP_DEST

Miejsce tworzenia plików śladu użytkowników.

DB_BLOCK_BUFFERS

Liczba bloków buforowych w SGA. Domyślnie 32

Wskazówki Ustawienia Parametrów Init<SID>.ora

Najczęściej Modyfikowane Parametry

Parametr

Opis

AUDIT_TRAIL

Włącza lub wyłącza zapis do dziennika obserwacji

IFILE

Nazwa innego pliku parametrów jaki ma być użyty przy starcie.

LOG_BUFFER

Liczba bajtów zarezerwowana na bufor dziennika powtórzeń w SGA.

LOG_ARCHIVE_START

Włącza lub wyłącza automatyczną archiwizację dziennika jeśli baza jest w trybie ARCHIVELOG.

LOG_ARCHIVE_FORMAT

Domyślny format archiwizowanych plików dziennika

LOG_ARCHIVE_DEST

Miejsce archiwizowania plików dziennika powtórzeń

LOG_CHECKPOINT_INTERVAL

Ustawienie częstotliwości punktów kontrolnych

LOG_CHECKPOINT_TIMEOUT

Okresowe wykonywanie punktów kontrolnych

MAX_DUMP_FILE_SIZE

Maksymalny rozmiar (wyrażony w blokach systemu operacyjnego) plików śladu.

OPEN_CURSORS

Maksymalna liczba kursorów otwieranych jednocześnie przez użytkownika.

PROCESSES

Maksymalna liczba procesów systemu operacyjnego podłączonych jednocześnie do tej instancji.

ROLLBACK_SEGMENTS

Nazwy segmentów wycofania utworzonych dla tej instancji.

SQL_TRACE

Włącza lub wyłącza narzędzie śledzenia SQL dla wszystkich sesji użytkownika.

TIMED_STATISTICS

Włącza lub wyłącza pomiar czasów w śladach i w ekranach Performance Monitora.

0x01 graphic

Uwaga: Wszystkie te parametry są opcjonalne. Jeśli któryś z nich nie ma przypisanej wartości, stosowana jest wartość domyślna.

Przykład:

db_name=ORCL

# db_files = 1024 # INITIAL

# db_files = 80 # SMALL

db_files = 400 # MEDIUM

# db_files = 1000 # LARGE

control_files = (E:\database\ctl1orcl.ora, E:\database\ctl2orcl.ora)

db_file_multiblock_read_count = 8 # INITIAL

# db_file_multiblock_read_count = 8 # SMALL

# db_file_multiblock_read_count = 16 # MEDIUM

# db_file_multiblock_read_count = 32 # LARGE

db_block_buffers = 200 # INITIAL

# db_block_buffers = 100 # SMALL

# db_block_buffers = 550 # MEDIUM

# db_block_buffers = 3200 # LARGE

#shared_pool_size = 10000000 # INITIAL

shared_pool_size = 2530000 # SMALL

# shared_pool_size = 5000000 # MEDIUM

# shared_pool_size = 9000000 # LARGE

log_checkpoint_interval = 10000

processes = 59 # INITIAL

# processes = 50 # SMALL

# processes = 100 # MEDIUM

# processes = 200 # LARGE

log_buffer = 8192 # INITIAL

# log_buffer = 8192 # SMALL

# log_buffer = 32768 # MEDIUM

# log_buffer = 163840 # LARGE

audit_trail = true # if you want auditing

timed_statistics = true # if you want timed statistics

max_dump_file_size = 10240 # limit trace file size to 5 Meg each

# log_archive_start = true

# log_archive_dest = e:\kurs\database\db1

# log_archive_format = "%%ORACLE_SID%%T%TS%S.ARC"

# rollback_segments = (name1, name2)

background_dump_dest=E:\database\trace

user_dump_dest=E:\database\trace

db_block_size = 2048

remote_login_passwordfile = exclusive

Ustawienie Identyfikatora Systemowego

Identyfikator systemowy SID (od ang. System IDentifier) to zmienna środowiska używana przez serwer Oracle do określenia instancji, do jakiej użytkownik się podłącza.

Ustawienie Zmiennej

Przed wystartowaniem instancji sprawdzamy poprawność ustawienia SID. Jeśli SID nie jest ustawiony poprawnie, należy tego dokonać używając odpowiedniego polecenia systemu operacyjnego.

Przykłady

Ustawienia wartości ORACLE_SID na TEST pod systemem UNIX i następnie sprawdzanie wartości.

$ ORACLE_SID=TEST;export ORACLE_SID

$ echo $ORACLE_SID

TEST

Wartość SID może mieć do 8 znaków w UNIXie, do 4 znaków w Windows NT.

Zmieniając wartość identyfikatora systemowego możemy podłączyć się do różnych baz danych.

Uuchomienie Instancji

Instancję uruchamiamy używając polecenia STARTUP, tak jak pokazano poniżej.

Przykład

Wystartowanie instancji w trybie NOMOUNT.

SVRMGR> STARTUP NOMOUNT

Uruchamianie Instancji

Tworzenie Bazy Danych

Baza danych Oracle składa się z plików danych przechowujących tabele i indeksy, plików dziennika powtórzeń stanowiących część systemu odtwarzania serwera Oracle oraz plików kontrolnych zawierających informacje niezbędne do uruchomienia i obsługi bazy danych.

Składnia:

0x01 graphic

gdzie:

baza danych nazwa danych jaka ma być tworzona.

spec.pliku specyfikacja pliku danych lub dziennika w formacie: nazwa [SIZE n] [K lub M] [REUSE]

CONTROLFILE REUSE żąda ewentualnego zamazania istniejącego pliku kontrolnego wyspecyfikowanego w pliku parametrów.

LOGFILE GROUP określa nazwy plików dziennika jakie mają być używane i grupę do której należą.

MAXLOGFILES jest maksymalną liczbą plików dziennika tworzonych w bazie danych.

MAXLOGMEMBERS jest maksymalną liczbą elementów w grupie plików dziennika powtórzeń.

MAXLOGHISTORY jest maksymalną liczbą archiwów dziennika powtórzeń w automatycznym odtwarzaniu nośników w Oracle Parallel Serwer.

DATAFILE spec. pliku określa pliki danych jakie mają być użyte.

MAXDATAFILES jest maksymalną liczbą plików danych tworzonych w bazie danych.

MAXINSTANCES maksymalna liczba instancji jakie jednocześnie mogą zamontować i otworzyć bazę danych.

ARCHIVELOG żąda, aby pliki dziennika powtórzeń były przed ich powtórnym użyciem archiwizowane.

NOARCHIVELOG stwierdza, że dzienniki powtórzeń mogą być ponownie zapisywane przed archiwizacją ich zawartości.

EXCLUSIVE po utworzeniu montuje bazę danych w trybie wyłącznym.

CHARACTERSET zestaw znaków używanych w bazie do przechowywania danych.

Jeżeli w specyfikacji pliku podano opcję REUSE, plik taki musi już istnieć. W przeciwnym przypadku konieczna jest opcja SIZE, a podany plik istnieć nie może.

Przykłady

Utworzenie bazy danych o nazwie TEST z jednym plikiem danych o nazwie system.dbf i rozmiarze 10 MB, a także dwoma plikami dziennika o nazwie log1a.rdo oraz log2a.rdo, każda rozmiaru 500 KB. Zestaw znaków pozostanie domyślny, czyli US7ASCII.

SVRMGR> CREATE DATABASE test

      2> DATAFILE `/u02/Oracle/DBA1/system.dbf' SIZE 10M

   3> LOGFILE

   4> GROUP 1 `/u01/Oracle/DBA1/log1a.rdo' SIZE 500K,

   5> GROUP 2 `/u01/Oracle/DBA1/log1a.rdo' SIZE 500K;

Utworzenie bazy danych z 8-bitowym zestawem znaków i zwielokrotnionymi dziennikami powtórzeń.

SVRMGR> CREATE DATABASE test

   2> DATAFILE `/u02/Oracle/DBA1/system.dbf' SIZE 10M

   3> LOGFILE GROUP 1

   4> (`/u01/Oracle/DBA1/log1a.rdo',

   5> `/u02/Oracle/DBA1/log1a.rdo') SIZE 500K,

   6> GROUP 2 (`/u01/Oracle/DBA1/log1a.rdo',

             7> `/u02/Oracle/DBA1/log1a.rdo') SIZE 500K

             8> CHARACTER SET WE8ISO8859P1;

0x01 graphic

Wskazówki :

Jeśli nie wyspecyfikowano pełnych nazw dziennika pliki będą utworzone w katalogu domyślnym systemu.

Polecenie CREATE DATABASE może trwa pewien czas z powodu zadań jakie wykonuje w tle.

Dodawanie Pliku Kontrolnego

Plik kontrolny jest odczytywany w chwili uruchamiania bazy danych. Jeśli nie zostanie znaleziony, uruchomienie się nie powiedzie. Zapewniamy, że przynajmniej dwa pliki kontrolne opisują naszą bazę danych wykonując następujące kroki:

Procedura Dodawania Pliku Kontrolnego

1. Zamknij bazę danych.

2. Skopiuj istniejący plik kontrolny w nowe miejsce.

3. Zmodyfikuj plik parametrów tak, aby zawierał nazwę nowej kopii.

4. Uruchom bazę danych ze zmodyfikowanym plikiem parametrów.

Powyższe kroki zakładają, że istnieje tylko jeden plik kontrolny. Są one zbędne, jeśli od razu utworzymy bazę danych ze zwielokrotnionymi plikami kontrolnymi. Należy także zapewnić, aby serwer Oracle miał prawa odczytu i zapisu do nowoutworzonego pliku kontrolnego.

Przykład (unix)

SVRMGR> SHUTDOWN

SVRMGR> HOST ed init.ora

CONTROL_FILES=(path/file1, path/file2)

SVRMGR> CONNECT / AS SYSDBA

SVRMGR> STARTUP PFILE=init.file

Jeśli plik kontrolny zostanie uszkodzony, to trzeba go stworzyć na nowo poleceniem CREATE CONTROLFILE (przy otwartej instancji i niezamontowanej bazie danych).

Dodawanie Elementu Dziennika Powtórzeń

Pliki dziennika powtórzeń nie muszą być punktem krytycznym dla bezpieczeństwa bazy danych Oracle. Unikamy tego problemu przez zapewnienie, aby każda grupa plików dziennika miała więcej niż jeden element.

Możemy dodać element do grupy dziennika powtórzeń poleceniem ALTER DATABASE.

Składnia:

0x01 graphic

gdzie:

baza danych nazwa bazy jaka jest zmieniana

plik nazwa pliku w systemie operacyjnym

GROUP number numer grupy plików dziennika, gdzie ma być dodany element

Jeżeli użyjemy opcji REUSE, wskazany plik musi istnieć, w przeciwnym przypadku zostanie on utworzony w takim rozmiarze, jak inne elementy jego grupy.

W celu sprawdzenia bieżącego stanu plików dziennika sprawdzamy perspektywę słownika danych V$LOG. W V$LOGFILE oglądamy pełne nazwy plików dziennika powtórzeń. Złączenie V$LOG i V$LOGFILE pozwoli na obejrzenie jednocześnie pełnej nazwy i statusu.

Przykład

Modyfikacja bazy danych TEST polegająca na dodaniu pliku dziennika o nazwie log1b.rdo do grupy 1 oraz weryfikacja efektów.

SVRMGR> ALTER DATABASE test

2> ADD LOGFILE MEMBER `/u02/Oracle/ DBA01/log1b.rdo'

3> TO GROUP 1;

SQL> SELECT * FROM v$logfile;

GROUP # STATUS MEMBER

-------- -------- ---------------------------------------

1 /u01/Oracle/ DBA01/1og1a.rdo

2 /u01/Oracle/ DBA01/1og2a.rdo

1 /u02/Oracle/ DBA01/1og1b.rdo

0x01 graphic

Uwaga: Po dodaniu nowego elementu do plików dziennika perspektywa V$LOGFILE może pokazywać, że STATUS pewnych plików jest niepoprawny (INVALID), co oznacza że nie zostały one jeszcze zapisane przez LGWR. To jest normalny efekt, pliki staną się poprawne jak tylko instancja zacznie ich używać.

Aby instancja użyła nowo dodane pliki dziennika powtórzeń należy wymusić przełączenie grup dziennika poleceniem ALTER SYSTEM SWITCH LOGFILE.

Zmiana Rozmiaru Elementów Grupy Dziennika Powtórzeń

Nie ma bezpośredniego sposobu na zmianę elementów grupy dziennika powtórzeń. Zamiast tego należy utworzyć nowe grupy o innym rozmiarze po czym usunąć stare grupy.

Tworzenie Pliku Haseł

Jeśli zdecydujemy się na używanie pliku haseł do identyfikacji użytkowników pełniących funkcje administracyjne, musimy dokonać następujących czynności:

Tworzenie Pliku Haseł

Jacy użytkownicy mają przyznane uprawnienia systemowe SYSDBA i SYSOPER możemy sprawdzić wykonując zapytanie na perspektywie bazy danych V$PWFILE_USERS.

Słownik Danych

Jedną z najważniejszych części danych Oracle jest słownik danych. Słownik danych to zestaw tabel i perspektyw używanych tylko do odczytu w celu uzyskania informacji o bazie danych. Słownik bazy danych jest tworzony przez plik poleceń sql.bsq.

Zawartość Słownika Danych

Tworzenie Dodatkowych Perspektyw Słownika Danych

Niektóre spośród plików rozkazowych SQL (inaczej skryptów) Oracle wykonują pewne funkcje na słowniku danych i powinny być uruchomione podczas lub po utworzeniu bazy danych.

Skrypty Uruchamiane Po Utworzeniu Bazy Danych

Skrypt

Zadanie

catalog.sql

Tworzenie często używanych perspektyw słownika danych

Catproc.sql

Uruchomienie wszystkich skryptów wymaganych do używania PL/SQL po stronie serwera.

Użytkownicy Słownika Danych

Słownik bazy danych jest centralnym źródłem informacji dla serwera Oracle i użytkowników bazy danych.

Użytkownicy Słownika Danych

Nigdy nie używa się poleceń DML, takich jak INSERT, UPDATE, czy DELETE do bezpośredniej modyfikacji tabel bazowych słownika danych. Słownik jest modyfikowany niejawnie przez polecenia DDL. Sprawdzamy zawartość słownika danych przez wykonywanie zapytań na odpowiednich tabelach i perspektywach.

Użytkownicy Słownika Danych

Kategorie Słownika Danych

Słownik danych składa się z zestawu tabel bazowych i ze związanych z nimi perspektyw, które mogą być podzielone na następujące kategorie:

Kategoria

Opis

USER_xxx

Perspektywy dostępne dla każdego użytkownika dostarczające informacji o jego własnych obie.

ALL_xxx

Perspektywy dostępne dla każdego użytkownika dostarczające informacji o wszystkich obiektach do których ten użytkownik ma dostęp.

DBA_xxx

Perspektywy dostępne tylko dla DBA, dostarczające informacji o definicjach wszystkich obiektów w bazie danych.

zgodne z ANSI

Synonimy takie jak MYPRIVS czy ACCESSIBLE_TABLES utworzone dla zachowania zgodności z ANSI.

Cechy Słownika Danych

Przeglądanie Perspektyw Słownika Danych

Przykłady

Wyświetlanie informacji DBA o kontach w serwerze Oracle z użyciem definicji kolumn takich jak w poprzednim przykładzie.

SQL> SELECT username, user_id, password, default_tablespace,

temporary_tablespace

FROM dba_users

USERNAME USER_ID PASSWORD DEFAULT_TABLESPACE TEMPORARY_TABLESPACE

------------- ----- ------------------ ------------------ -----------------------

SYS 0 15C146A39C91814D SYSTEM SYSTEM

TUTORIAL15 115 565CD49962C3CCCA USER_DATA TEMPORARY_DATA

TUTORIAL16 116 5B61BB5091C4FDBB USER_DATA TEMPORARY_DATA

SYSTEM 5 87C4ECFB800A8C3D USER_DATA TEMPORARY_DATA

CTXSYS 22 EXTERNAL USER_DATA USER_DATA

DEMO 21 EXTERNAL USER_DATA TEMPORARY_DATA

SCOTT 20 F894844C34402B67 USER_DATA TEMPORARY_DATA

ZOLNIERZ 28 9546719E1D5CBD6B USER_DATA TEMPORARY_DATA

REP 46 EA472EF9486DC053 REPOSITORY_DATA TEMPORARY_DATA

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Identyfikacja wszystkich segmentów wycofania i ich statusu.

SQL>SELECT segment_name, status

FROM dba_rollback_segs

SEGMENT_NAME STATUS

------------------------------ ----------------

SYSTEM ONLINE

RB1 ONLINE

RB2 ONLINE

RB3 ONLINE

RB4 ONLINE

RB5 ONLINE

RB6 ONLINE

RB7 ONLINE

RB8 OFFLINE

RB9 OFFLINE

RB10 OFFLINE

RB11 OFFLINE

RB12 OFFLINE

Wyświetlanie informacji o definicjach przestrzeni tabel.

SQL> SELECT TABLESPACE_NAME, INITIAL_EXTENT,

NEXT_EXTENT, STATUS, CONTENTS

FROM dba_tablespaces

TABLESPACE_NAME INITIAL_EX NEXT_EXTEN STATUS CONTENTS

------------------------------ ---------- ---------- --------- ---------

SYSTEM 10240 10240 ONLINE PERMANENT

USER_DATA 10240 10240 ONLINE PERMANENT

ROLLBACK_DATA 10240 10240 ONLINE PERMANENT

TEMPORARY_DATA 10240 10240 ONLINE PERMANENT

REPOSITORY_DATA 10240 10240 ONLINE PERMANENT

INDEX_DATA 10240 10240 ONLINE PERMANENT

Wyświetlanie nazw plików danych należących do naszej bazy danych.

SQL> SELECT file_name, file_id, tablespace_name, bytes, blocks, status

FROM dba_data_files;

FILE_NAME FILE_ID TABLESPACE_NAME BYTES BLOCKS STATUS

----------------------------- --- ----------------- ---------- ------ ---------

D:\ORANT\DATABASE\USR1ORCL.ORA 2 USER_DATA 115343360 56320 AVAILABLE

D:\ORANT\DATABASE\RBS1ORCL.ORA 3 ROLLBACK_DATA 36700160 17920 AVAILABLE

D:\ORANT\DATABASE\TMP1ORCL.ORA 4 TEMPORARY_DATA 17825792 8704 AVAILABLE

D:\ORANT\DATABASE\SYS1ORCL.ORA 1 SYSTEM 167772160 81920 AVAILABLE

D:\ORANT\DATABASE\REPORCL.ORA 5 REPOSITORY_DATA 2097152 1024 AVAILABLE

D:\ORANT\DATABASE\IND1ORCL.ORA 6 INDEX_DATA 55267328 26986 AVAILABLE

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Wyświetlanie informacji o nieużywanych obszarach w bazie danych.

SQL> SELECT * FROM dba_free_space;

TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS

------------------------------ ---------- ---------- ---------- ----------

SYSTEM 1 75101 40960 20

SYSTEM 1 49111 61440 30

SYSTEM 1 77666 8714240 4255

SYSTEM 1 70531 40960 20

USER_DATA 2 19822 204800 100

USER_DATA 2 5392 112640 55

USER_DATA 2 10632 112640 55

USER_DATA 2 31913 81920 40

ROLLBACK_DATA 3 16186 3553280 1735

TEMPORARY_DATA 4 1861 14016512 6844

REPOSITORY_DATA 5 312 30720 15

INDEX_DATA 6 26964 47104 23

Podsumowanie

Bazę danych tworzymy w 8 krokach:

0x01 graphic

Zadania

Obejrzyj perspektywę V$CONTROLFILE i sprawdź, ile masz plików kontrolnych

Dodaj nowy plik kontrolny (ctl2adm#.ora) i sprawdź, czy jest używany

Napisz polecenia dodające do każdej grupy po jednym pliku dziennika powtórzeń (e:\kurs\database\db#\lg3adm#.ora i e:\kurs\database\db#\lg4adm#.ora) i spraw, by obydwa nowe pliki zostały użyte

Utwórz nowego użytkownika ADMIN/ADMIN poleceniem CREATE USER ADMIN IDENTIFIED BY ADMIN i nadaj mu uprawnienia SYSDBA i SYSOPER poleceniem GRANT SYSDBA, SYSOPER TO ADMIN. Co się stało?

Zmień ustawienia w pliku parametrów tak, aby można było nadać użytkownikowi ADMIN uprawnienie SYSDBA i SYSOPER i zrestartuj bazę. Spróbuj ponownie nadać uprawnienia.

Sprawdź perspektywę V$PWFILE_USERS, aby sprawdzić czy nadanie praw się powiodło

Obejrzyj perspektywę DICTIONARY

Obejrzyj perspektywę DBA_TABLESPACES, DBA_DATA_FILES i DBA_FREE_SPACE. O czym świadczy wynik zapytania na DBA_FREE_SPACE?

IV. Wybieranie i aktualizacja danych

Cele

W tej lekcji wyjaśniamy procesy zachodzące przy wybieraniu i aktualizacji danych oraz szczegółowy przebieg operacji SQL.

Po przerobieniu tej lekcji powinieneś potrafić:

Przegląd

Ta lekcja wyjaśnia jak jest przetwarzane w pamięci polecenie SQL i w jaki sposób dokonuje się modyfikacji danych.

Bufory Bazy Danych

Kiedy użytkownik żąda dostępu do danych proces serwera sprawdza w buforach bazy danych, czy nie ma tam już odpowiednich danych.

Bloki Danych

Jeśli brak danych w buforach, proces serwera odczytuje odpowiednie bloki z pliku danych i umieszcza je w buforach bazy danych, z których każdy ma rozmiar taki jak rozmiar bloku danych Oracle (DB_BLOCK_SIZE).

Jeśli użytkownik zmodyfikuje otrzymane dane, zmiany pojawiają się w blokach danych w buforach. Nowa wersja danych nazywana jest obrazem późniejszym (after image), ponieważ jest obrazem danych po dokonaniu zmian.

Bloki Wycofania

Oracle zachowuje oryginalną wersję danych w bloku wycofania. Ta wersja danych nazywana jest obrazem wcześniejszym (before image), ponieważ zawiera zachowane dane sprzed dokonania zmian przez użytkownika. Jeśli użytkownik zmieni swoją decyzję przed zatwierdzeniem zmiany w bazie danych, transakcja może być wycofana dzięki informacji zachowanej w bloku wycofania.

Bufor Dziennika Powtórzeń

Podczas przetwarzania transakcji, proces serwera zapisuje obraz wcześniejszy i obraz późniejszy w buforze dziennika powtórzeń. Ta informacja używana jest przy odtwarzaniu.

Kolejka (Lista LRU)

Bufory bazy danych zorganizowane są w dwóch listach: lista brudna (dirty list) oraz kolejka (LRU od Last Recently Used). Lista brudna zawiera zmienione bufory, które nie zostały zapisane na dysk.

Zawartość Listy LRU

Typ bufora

Opis

Wolne bufory

(free buffers)

Bufory, które nie były zmodyfikowane i są gotowe do użycia

Bufory zaczepione

(pinned buffers)

Bufory obecnie używane.

Bufory brudne

(dirty buffers)

Bufory zmodyfikowane, które trzeba zapisać na dysk.

Kiedy proces używa bufora, przenosi go na początek (do ostatnio używanych) listy LRU. Brudne bufory stopniowo przesuwają się na koniec (do najpóźniej używanych) listy LRU.

Żądania Użytkowników

Wszystkie polecenia SQL przetwarzane są przez proces serwera, który otrzymuje żądania wprost od procesu użytkownika. Proces serwera stosuje trzy główne fazy przetwarzania: analiza (parse), wykonanie (execute) i sprowadzanie (fetch).

Proces serwera

Kiedy proces serwera musi odczytać blok danych z dysku do bufora bazy danych to:

Proces serwera przerywa poszukiwania kiedy znajduje wolny bufor lub kiedy przejrzy określoną liczbę buforów bez natrafienia na wolny.

Konfiguracja PGA

Obszar Globalny Programu (PGA od Program Global Area) to obszar pamięci zawierający dane i informacje kontrolne pojedynczego użytkownika lub procesu serwera. PGA jest rezerwowane przez serwer Oracle, kiedy proces użytkownika podłącza się do bazy danych Oracle i jest otwierana sesja.

Charakterystyka PGA

Przetwarzanie Polecenia SQL

Analiza (parsing) to jeden z kroków przetwarzania polecenia SQL. Podczas wykonywania polecenia SQL Oracle wykonuje:

  1. Analizę (Parse)

  2. Wykonanie (Execute)

  3. Sprowadzanie (Fetch)

Analiza

Drzewo analizy jest przechowywane w obszarze dzielonym. Wiele procesów serwera może korzystać z tego samego drzewa analizy.

Serwer Oracle wykorzystuje pewną przestrzeń pamięci zwaną kursorem do zapisu informacji o statusie każdego polecenia.

Wykonanie

Sprowadzanie

Obszary Dzielone SQL

Oracle automatycznie zauważa kiedy aplikacja wysyła do bazy danych identyczne polecenia SQL. Jeżeli wykonywane są dwa identyczne polecenia, obszar SQL w którym wykonywane jest pierwsze z nich jest też wykorzystywany przez drugie.

Stąd też, zamiast używać wielu obszarów SQL dla identycznych poleceń SQL, istnieje tylko jeden obszar SQL dla identycznych poleceń SQL.

Identyczne Polecenia SQL

Polecenia SQL są uważane za identyczne jeżeli:

Operacja SELECT

Operacja SELECT wymaga aby blok danych używany w kryteriach wyszukiwania znajdował się w buforze bazy danych.

Operacja SELECT

Bloki nagłówków obiektów umieszczone w buforach bazy danych nie są umieszczane na tym i następnych diagramach, jako że nie są chwilowo dla nas istotne.

Kiedy to możliwe (to znaczy przy pełnym przeglądaniu tabel), serwer Oracle dokonuje odczytów wieloblokowych (multiblock reads) do pomięci.

Operacja UPDATE

Wszystkie operacje UPDATE wymagają segmentu wycofania do zapewnienia spójności odczytu, możliwości odtwarzania i wycofania.

Operacja Update

  1. Ściąga bloki danych do buforów bazy danych.

  2. Ściąga bloki wycofania do buforów bazy danych.

  3. Nakłada blokady wyłączne na wiersze przeznaczone do modyfikacji.

  1. Zapamiętuje dane wycofania w buforze bloku segmentu wycofania.

  2. Dokonuje zmian w buforze bloku danych.

  3. Dokonuje zapisów w buforze dziennika powtórzeń identyfikujących obraz późniejszy.

Własności Operacji UPDATE

Operacja SELECT nazywana jest często operacją ODCZYTU. Odczytujący nie powodują blokowania zapisujących, zapisujący nie blokują odczytujących. Serwer Oracle osiąga ten efekt dzięki zastosowaniu segmentów wycofania.

Proces Sekretarza Bazy Danych (DBWR)

DBWR zarządza buforami bazy danych w ten sposób, aby procesy serwera zawsze mogły znaleźć wolne bufory.

Proces DBWR

DBWR zapisuje brudne bufory na dysku kiedy:

Podsumowanie

Podczas odczytywania i modyfikacji danych:

V. Zapewnianie spójności i współbieżności transakcji

Cele

Ta lekcja wyjaśnia zasady rejestrowania danych i obsługi współbieżnego dostępu do danych z zachowaniem spójności odczytu na poziomie polecenia.

Po przerobieniu tej lekcji powinieneś:

Przegląd

W bazie danych Oracle dane są zawsze najpierw tworzone i modyfikowane w pamięci a następnie zapisywane na trwałe w plikach danych.

Ponieważ użytkownicy tworzą i aktualizują dane w buforach bazy danych, Sekretarz Bazy Danych, proces DBWR, okresowo zapisuje zmienione bloki w bezpieczne miejsce do pliku danych. DBWR dokonuje zapisów często, ale nie za każdym razem, kiedy użytkownik zatwierdza transakcję. Stąd też, dane zatwierdzone przez użytkownika mogą pozostawać w buforach bazy danych, gdzie są narażone na awarię instancji, co powoduje utratę zapisów znajdujących się w pamięci.

Mechanizm zabezpieczenia danych w buforach bazy danych stanowią pliki dziennika powtórzeń. Pliki dziennika powtórzeń przechowują wszystkie zmiany dokonane na danych buforach bazy danych.

Transakcje: Przegląd

Serwer Oracle traktuje sekwencję poleceń SQL jako pojedynczą logiczną jednostkę pracy, nazywaną transakcją.

Kiedy Zaczyna się Transakcja?

Kiedy Kończy się Transakcja?

Zatwierdzenie transakcji

Przerwanie transakcji

Zakończenie transakcji może być jawne, wymuszone przez polecenia COMMIT lub ROLLBACK albo niejawne, spowodowane przez inną operację. Wśród poleceń SQL, które powodują zatwierdzenie znajdują się polecenia DDL (Data Definition Language) takie jak CREATE, ALTER czy DROP oraz polecenia DCL (Data Control Language) takie jak GRANT czy REVOKE.

Transakcje w Pamięci

W bazie danych Oracle dane są zawsze najpierw tworzone i modyfikowane w pamięci a następnie zapisywane na trwałe w plikach danych.

Ponieważ użytkownicy tworzą i aktualizują dane w buforach bazy danych, Sekretarz Bazy Danych, proces DBWR, okresowo zapisuje zmienione bloki w bezpieczne miejsce do pliku danych. DBWR dokonuje zapisów często, ale nie za każdym razem, kiedy użytkownik zatwierdza transakcję. Stąd też, dane zatwierdzone przez użytkownika mogą pozostawać w buforach bazy danych, gdzie są narażone na awarię instancji, co powoduje utratę zapisów znajdujących się w pamięci.

Dziennik Transakcji

Serwer Oracle zapisuje wszystkie dokonane w bazie danych zmiany w buforze dziennika powtórzeń. Jeden z procesów tła Sekretarz Dziennika (LGWR od Log Writer) zapisuje informacje z bufora dziennika powtórzeń na dysk. Inny proces tła, Archiwizator (ARCH) może być uruchomiony do archiwizowania informacji dziennika powtórzeń.

Bufor Dziennika Powtórzeń

Zadania Plików Dziennika Powtórzeń

Mechanizm ochrony danych w buforach bazy danych to pliki dziennika powtórzeń.

Zawierają one zapis wszystkich zmian dokonanych w danych buforach bazy danych.

Jeżeli nastąpi awaria instancji, pliki dziennika powtórzeń są wykorzystywane do odtworzenia zmodyfikowanych danych, jakie znajdowały się w pamięci. Te pliki używane są tylko do tego celu.

Proces Sekretarza Dziennika (LGWR)

Proces Sekretarza Dziennika (LGWR od Log Writer) zapisuje bufor dziennika powtórzeń na dysk.

LGWR zapisuje pozycje z bufora dziennika powtórzeń do plików dziennika powtórzeń kiedy:

Własności Procesu LGWR

Zatwierdzenia w Bazie Danych

Przez zatwierdzanie transakcji dokonane zmiany stają się trwałe.

Operacja COMMIT

Własności COMMIT

Przełączanie Dziennika, Numer Sekwencyjny Dziennika

Przełączanie Dziennika (Log Switches)

Numer Sekwencyjny Dziennika (Log Sequence Number)

Punkty Kontrolne (Checkpoints)

Podczas punktu kontrolnego DBWR zapisuje wszystkie brudne bufory z buforów bazy danych na dysk, przez co gwarantuje, że wszystkie zmodyfikowane od czasu ostatniego punktu kontrolnego bloki danych będą zapisane na dysku.

Kiedy Pojawia się Punkt Kontrolny?

Synchronizacja

Przy każdym punkcie kontrolnym modyfikowany jest numer sekwencyjny punktu kontrolnego w nagłówkach każdego z plików bazy danych i w pliku kontrolnym.

Plik kontrolny w chwili uruchomienia instancji sprawdza czy wszystkie pliki mają ten sam numer sekwencyjny punktu kontrolnego.

Parametr LOG_CHECKPOINT_TIMEOUT określa odstęp czasu między kolejnymi punktami kontrolnymi.

Parametr LOG_CHECKPOINT_INTERVAL określa liczbę nowozapisanych bloków pliku dziennika powtórzeń, jaka powoduje inicjalizację punktu kontrolnego.

Proces Punktów Kontrolnych (CKPT)

Punkty kontrolne bazy danych zapewniają, że wszystkie zmodyfikowane bufory bazy danych zostaną zapisane do plików bazy danych. Pliki bazy danych są oznaczone jako pochodzące z bieżącej chwili, punkt kontrolny odnotowany jest w pliku kontrolnym.

Punkty Kontrolne

DBA może wymusić punkt kontrolny poleceniem ALTER SYSTEM CHECKPOINT.

Proces CKPT

Proces Archiwizatora (ARCH)

Proces Archiwizatora (ARCH) kopiuje na bieżąco pliki dziennika powtórzeń na wskazane urządzenie za każdym razem kiedy LGWR przełącza się na inną grupę.

Proces Archiwizatora

0x01 graphic

Spójność Odczytu

W czasie przetwarzania polecenia serwera Oracle posługuje się spójnym obrazem danych tabeli z chwili rozpoczęcia polecenia.

Zasada spójności odczytu stanowi, że dane jakie ogląda lub zmienia użytkownik muszą pozostawać niezmienione dopóki użytkownik nie zakończy ich przetwarzania.

Niezatwierdzone zmiany powinny być widoczne tylko dla użytkownika, który dokonał zmian. Użytkownik wykonujący zapytanie powinien widzieć tylko dane zatwierdzone przed rozpoczęciem zapytania (domyślnie) lub zatwierdzone przed rozpoczęciem transakcji (wymuszane poleceniem SET TRANSACTION READ ONLY).

Przykład Wykorzystania Modułu Spójności Odczytu

Model spójności odczytu wykorzystywany przy podzapytaniach skorelowanych.

SQL> SELECT first_name, dept_id, salary

     2> FROM s_emp

     3> WHERE salary>(SELECT AVG (salary) FROM s_emp

4> WHERE b.dept_id = a.dept_id;

Serwer gwarantuje, że w trakcie przetwarzania powyższego zapytania widoczne będą te same wartości, nawet jeśli inny użytkownik zatwierdzi jednocześnie zmiany w S_EMP.

Serwer Oracle zwróci zatwierdzone dane lub zmiany dokonane wcześniej przez bieżącego użytkownika, jak to ilustruje następujący przykład:

Czas

Użytkownik A

Użytkownik B

0

UPDATE_emp....

1

SELECT...FROM s_emp b

2

COMMIT

3

SELECT...FROM s_emp a

Model Blokowania

Serwer Oracle pozwala na współbieżny dostęp do danych zapewniając integralność danych przez blokady danych i słownika danych.

Model Blokowania

Podsumowanie

DBA powinien rozumieć zasady działania bufora dziennika powtórzeń, procesu Sekretarza Dziennika i Archiwizatora:

VI. Zarządzanie strukturą bazy danych

Cele

Tematem tej lekcji są informacje o dopasowaniu bazy danych

Po przerobieniu tej lekcji powinieneś być w stanie:

Przegląd

Serwer Oracle przydziela przestrzeń bazy danych dla wszystkich danych w bazie.

Definicje Obiektów

Termin

Definicja

Baza danych

Logiczny zbiór danych dzielonych składowanych w przestrzeniach tabel.

Plik

Fizyczny plik danych należący do określonej przestrzeni tabel.

Przestrzeń Tabel

Logiczny skład na fizycznie zgrupowane dane.

Segment

Zbiór jednego lub wielu ekstentów zawierających wszystkie dane określonego obiektu w ramach przestrzeni tabel.

Ekstent

Zbiór spójnych (sąsiednich) bloków w pliku danych.

Blok

Wielokrotność fizycznych bloków pliku zarezerwowana w istniejącym pliku danych.

0x01 graphic

Przydział Przestrzeni

Struktura Logiczna Bazy Danych

Rozpatrując bazę danych z logicznej perspektywy łatwiej można zrozumieć zasady przydziału przestrzeni serwera Oracle.

Baza danych Oracle dzieli się logicznie na osobne przestrzenie tabel.

Przestrzeń tabel SYSTEM jest konieczna do pracy bazy danych.

Przestrzenie tabel zawierają segmenty bazy danych.

Przestrzenie Tabel

Baza danych Oracle dzieli się na mniejsze logiczne fragmenty przestrzeni nazywane przestrzeniami tabel (ang. TABLESPACEs).

Przestrzenie Tabel

Zastosowanie Przestrzeni Tabel

Baza danych składa się z co najmniej jednej przestrzeni tabel SYSTEM. Dodatkowe przestrzenie tabel dodaje się w celu zwiększenia możliwości kontroli i długoterminowej obsługi.

Ogólnie, serwer Oracle rozróżnia dwa typy przestrzeni tabel składające się na bazę danych: przestrzeń systemowa i przestrzenie niesystemowe.

Przestrzeń tabel SYSTEM

Niesystemowe Przestrzenie Tabel

Przestrzeń tabel dla segmentów wycofania

Fizyczna Struktura Bazy Danych

Całkowita wielkość fizycznej przestrzeni rezerwowanej dla obiektów bazy danych Oracle zależy od rozmiaru plików systemu operacyjnego utworzonych na potrzeby każdej przestrzeni tabel.

Opis

0x01 graphic

Tworzenie Przestrzeni Tabel

Przestrzeń tabel możemy utworzyć za pomocą polecenia CREATE TABLESPACE.

Składnia:

0x01 graphic

gdzie:

przestrzeń_tabel to nazwa przestrzeni tabel jaka ma być utworzona.

spec_pliku jest nazwą pliku danych.

Nazwa pliku jest nazwą pliku danych.

SIZE określa rozmiar pliku w bajtach (można też użyć jednostek K lub M).

REUSE pozwala aby serwer Oracle wykorzystał istniejący plik.

DATAFILE specyfikuje plik lub pliki danych z jakich ma się składać przestrzeń tabel.

DEFAULT STORAGE określa domyślne parametry zarządzania przestrzenią dla wszystkich obiektów tworzonych w tej przestrzeni tabel.

ONLINE sprawia, że przestrzeń tabel jest dostępna użytkownikom posiadającym do niej uprawnienia niezwłocznie po utworzeniu.

OFFLINE sprawia, że przestrzeń tabel nie jest dostępna natychmiast po utworzeniu.

PERMANENT wskazuje, że przestrzeń tabel będzie używana do przechowywania trwałych obiektów. Tak też jest domyślnie.

TEMPORARY wskazuje, że przestrzeń tabel będzie używana do przechowywania obiektów tymczasowych. Na przykład segmentów używanych przez niejawne sortowanie przy realizacji klauzuli ORDER BY.

0x01 graphic

Wskazówki

Składnia DEFAULT STORAGE:

0x01 graphic

gdzie:

INITIAL określa rozmiar (w bajtach) pierwszego ekstentu rezerwowanego dla obiektu.

NEXT określa rozmiar (w bajtach) następnego ekstentu rezerwowanego dla obiektu.

MINEXTENTS określa całkowitą liczbę ekstentów przydzielaną podczas tworzenia obiektu.

MAXEXTENTS określa całkowitą liczbę ekstentów (wliczając też pierwszy), jaka może być przydzielona dla obiektu.

PCTINCREASE określa procent o który każdy następny (po drugim) ekstent będzie większy w stosunku do poprzedniego.

0x01 graphic

Wskazówki:

Wartości INITIAL i NEXT są zaokrąglane do następnej wielokrotności rozmiaru bloku danych (wskazywanego przez parametr inicjalizacji DB_BLOCK_SIZE).

Pierwszy blok ekstentu INITIAL jest traktowany jako blok nagłówka segmentu.

Przykład

Tworzenie przestrzeni tabel RBS z pojedynczym plikiem o nazwie rbs01.dbf i rozmiarze 3MB. Przestrzeń tabel ma być natychmiast gotowa do użycia.

SQL>CREATE TABLESPACE rbs

2> DATAFILE `/u01/Oracle/D/rbs 01.dbf ' SIZE 3M

     3> DEFAULT STORAGE (INITIAL 50K NEXT 50K

     4> MINEXTENTS 10 MAXEXTENTS 121

     5> PCTINCREASE 0) ;

PCTINCREASE ma domyślną wartość 50, lecz zwykle zmieniamy ją na 0 dla lepszej kontroli wzrostu segmentu.

Modyfikacja Przestrzeni Tabel

Przestrzeń tabel modyfikujemy, aby zmienić jej domyślne parametry zarządzania przestrzenią, w celu jej wyłączenia lub wyłączenia, dodania kolejnych plików danych, zmiany nazwy istniejących plików danych, przełączania trybu między odczyt-zapis oraz tylko-do-odczytu, lub też w celu wykonania kopii zapasowej.

Dokonujemy tego za pomocą polecenia ALTER TABLESPACE.

0x01 graphic

Składnia:

0x01 graphic

gdzie:

przestrzeń_tabel określa nazwę przestrzeni tabel jaka ma być zmieniona.

ADD DATAFILE dodaje wyspecyfikowany plik do przestrzeni tabel.

RENAME DATAFILE zmienia nazwę jednego lub wielu plików przestrzeni tabel.

DEFAULT STORAGE określa nowe domyślne parametry zarządzania przestrzenią dla obiektów tworzonych następnie w przestrzeni tabel

ONLINE włącza przestrzeń tabel (status online)

OFFLINE wyłącza przestrzeń tabel (status offline).

NORMAL wykonuje punkt kontrolny na wszystkich plikach danych przestrzeni tabel.

TEMPORARY wykonuje punkt kontrolny jedynie na włączonych plikach danych przestrzeni tabel.

IMMEDIATE nie upewnia się, że pliki danych są dostępne i nie wykonuje punktu kontrolnego.

BEGIN BACKUP przygotowuje przestrzeń tabel do archiwizacji online.

END BACKUP przywraca normalny status przestrzeni tabel.

READ WRITE pozwala na tworzenie, modyfikacje i usunięcia obiektów

READ ONLY zapobiega zmianom.

Usuwanie Przestrzeni Tabel

Kiedy przestrzeń tabel i jej zawartość nie jest już potrzebna, możemy usunąć ją z bazy danych posługując poleceniem DROP TABLESPACE.

Składnia:

0x01 graphic

gdzie:

przestrzeń_tabel określa nazwę usuwanej przestrzeni tabel.

INCLUDING CONTENTS usuwa całą zawartość przestrzeni tabel.

CASCADE CONSTRAINTS usuwa wszystkie referencyjne warunki integralności z tabel spoza usuwanej przestrzeni, które odnoszą się do kluczy głównych lub unikalnych tabel z usuwanej przestrzeni.

Usuwanie Przestrzeni Tabel

Tymczasowe Przestrzenie Tabel

Wszystkie operacje sortowania wykonywane w instancji używają wspólnego segmentu sortowania (sort segment) z tymczasowej przestrzeni tabel.

Segment tymczasowy:

Aby wskazać, czy przestrzeń tabel jest tymczasowa, używamy polecenia CREATE TABLESPACE lub ALTER TABLESPACE z odpowiednią opcją.

Składnia

0x01 graphic

gdzie:

PERNAMENT wskazuje, że przestrzeń tabel będzie używana do przechowywania obiektów trwałych. Jest to opcja domyślna.

TEMPORARY wskazuje, że przestrzeń tabel będzie używana jedynie do przechowywania obiektów tymczasowych, na przykład segmentów używanych przy przetwarzaniu klauzuli ORDER BY.

0x01 graphic

Uwaga: Przydział i zwolnienie przestrzeni w segmencie sortowania tymczasowej przestrzeni tabel możemy obserwować w perspektywie V$SORT_SEGMENTS.

Zmiana Rozmiaru Plików Danych

Rozmiar pliku danych może zmieniany automatycznie jeśli użyjemy opcji AUTOEXTEND lub ręcznie za pomocą polecenia ALTER DATABASE.

Automatyczna zmiana Plików Danych

Polecenie AUTOEXTEND włącza lub wyłącza automatyczne rozszerzanie plików danych. Opcję automatycznego rozszerzania pliku możemy podać przy specyfikacji plików następujących poleceniach SQL.

Składnia Opcji Autoextend

Składnia:

0x01 graphic

gdzie:

OFF wyłącz automatyczne rozszerzanie plików danych. NEXT i MAXSIZE są ustawione na zero. Wartości te muszą być ponownie podane w kolejnych poleceniach ALTER TABLESPACE AUTOEXTEND.

ON włącza automatyczne rozszerzanie plików danych.

NEXT przestrzeń dysku przydzielana do pliku kiedy potrzeba więcej ekstentów.

MAXSIZE maksymalna przestrzeń dysku dopuszczalna dla tego pliku danych.

UNLIMITED znosi limity przydziału przestrzeni dysku dla pliku danych.

0x01 graphic

Przykłady

Dodanie nowego pliku do przestrzeni tabel USERS.

SVRMGR> ALTER TABLESPACE users

2> ADD DATAFILE `users02' SIZE 1OM

3> AUTOEXTEND ON

4> NEXT 521K

5> MAXSIZE 250M;

Włączenie automatycznego rozszerzenia istniejącego pliku danych za pomocą polecenia ALTER DATABASE.

SVRMGR> ALTER DATABASE DATAFILE `users 02'

2> AUTOEXTEND ON NEXT 1M MAXSIZE 100M;

Ręczna Zmiana Rozmiaru Plików Danych

Zwiększamy lub zmniejszamy rozmiar pliku danych jawnie za pomocą polecenia ALTER DATABASE.

Ponieważ możemy zmienić rozmiar pliku danych, możemy dodać więcej przestrzeni w bazie danych bez tworzenia dodatkowych plików. Możemy także poprawić błędy szacowania wymagań przestrzeni żądając zwolnienia nieużywanej przestrzeni bazy danych.

Przykład

Zmiana rozmiaru pliku users02.

SVRMGR> ALTER DATABASE DATAFILE `users02'

2> RESIZE 100M;

Parametr COMPATIBLE musi być ustawiony na wersję 7.2.0 lub wyższą.

Przestrzenie Tabel Tylko-Do-Odczytu

Zanim DBA przełączy przestrzeń tabel w stan tylko-do-odczytu, muszą być spełnione następujące warunki (dobrze jest w tym celu uruchomić instancję w trybie restricted):

Zaleca się usunięcie segmentów wycofania przed przełączeniem przestrzeni tabel na tylko-do-odczytu. Z tego też powodu przestrzeń tabel SYSTEM nigdy nie może stać się przestrzenią tabel tylko-do-odczytu.

Przykłady

Zmiana przestrzeni tabel na tylko-do-odczytu za pomocą polecenia ALTER TABLESPACE.

SQL> ALTER TABLESPACE user_tablespace READ ONLY

Zmiana przestrzeni tabel na odczyt-zapis za pomocą polecenia ALTER TABLESPACE.

SQL> ALTER TABLESPACE user_tablespace READ WRITE;

Aby przestrzeń tabel przywrócić w stan odczyt_zapis, wszystkie pliki danych przestrzeni tabel muszą być online. W tym calu można posłużyć się opcją DATAFILE ONLINE polecenia ALTER DATABASE. Bieżący status plików danych sprawdzamy w perspektywie V$DATAFILE lub DBA_DATA_FILES.

Zasady Zarządzania Przestrzeniami Tabel

Istnieją trzy zasady zarządzania przestrzeniami tabel.

Używanie Wielu Przestrzeni Tabel

Użycie wielu przestrzeni tabel pozwala na większą elastyczność w wykonywaniu operacji na bazie danych.

Określaj Parametry Zarządzania Przestrzenią w Przestrzeniach Tabel

Przypisz Użytkownikom Ograniczenia Przestrzeni

Segmenty

Segment to zbiór jednego lub wielu ekstentów zawierających wszystkie dane określonego typu należącego do struktur logicznych przechowywanych

Typ Segmentu

Definicja

Segment wycofania

(rollback segment)

Zbiór ekstentów zawierający dane wycofania używane do wycofania, spójności odczytu lub odtwarzania.

Segment danych

(data segment)

Zbiór ekstentów zawierający całość danych tabeli lub klastra.

Segment indeksu

(index segment)

Zbiór ekstentów zawierający całość danych określonego indeksu.

Segment tymczasowy

(temporary segment)

Zbiór ekstentów zawierający dane należące do obiektu tymczasowego.

Segment Cache

(cache segment)

Ekstent zawierający definicje słownikowe tabel słownikowych, ładowanych podczas otwierania bazy danych. Nie wymaga żadnej obsługi przez administratora bazy danych.

Co To Jest Segment ?

Segmenty Wycofania

Segment wycofania (rollback segment) to fragment bazy danych sprzed wykonania modyfikacji przez transakcję, pozwalający na wycofanie zmian.

Transakcja (transaction) jest jednostką operacji na bazie danych powodującą zmiany i blokady wierszy. Każda transakcja ma przydzielony unikalny identyfikator i dokładnie jeden segment wycofania. Segment wycofania jest obiektem cyklicznym, w którym każda transakcja dokonuje wielu zapisów. Transakcja może używać następnego ekstentu, jeżeli brak w nim aktywnych zapisów.

Jeśli następny ekstent, jaki ma być użyty posiada aktywne zapisy, do segmentu wycofania zostanie dodany nowy ekstent o ile nie osiągnięto jeszcze maksymalnej liczby ekstentów.

Charakterystyka Segmentów Wycofania

Segment Danych i Indeksów

Segmenty danych (data segments) zawierają dane wstawiane do tabel. Segmenty indeksów (index segments) zawierają indeksy, struktury służące do poprawiania efektywności wyszukiwania danych.

Cechy Segmentów

Typ Segmentu

Funkcja

Tabela

Zawiera wiersze pojedynczej tabeli.

Klaster indeksowy

Zawiera wiersze jednej lub wielu tabel zgrupowane według wartości wskazanej kolumny tabeli.

Klaster haszujący

Zawiera wiersze tabeli rozmieszczone za pomocą algorytmu haszowania.

Indeks

Zawiera indeksy utworzone na jednej lub wielu kolumnach tabeli. Służą do zwiększenia efektywności wyszukiwania danych.

Co To Są Klastry?

Segmenty Tymczasowe

Segmenty tymczasowe (temporary segments) dostarczają przestrzeni potrzebnej serwerowi przy sortowaniu danych.

Charakterystyka Segmentów Tymczasowych

Segmenty tymczasowe są:

Segmenty Tymczasowe w Nietymczasowej Przestrzeni Tabel

Segment Bootstrap

Segment bootstrap zawiera definicje struktury tabel słownika danych. Jest ładowany podczas otwierania bazy danych.

Segment bootstrap jest:

Podsumowanie

Dopasowujemy bazę danych przez

0x01 graphic

Zadania

Utwórz przestrzeń tabel USER_DATA o parametrach: plik danych e:\kurs\database\db#\usradm#.ora o rozmiarze 1M, ekstent inicjalny 10K, ekstent następny 10K, pctincrease 0, automatyczne zwiększanie rozmiaru pliku bazy danych, w trybie offline.

Obejrzyj perspektywę DBA_TABLESPACES, zwróć uwagę na status stworzonej przestrzeni tabel

Przełącz przestrzeń USER_DATA w tryb online i obejrzyj to na perspektywie DBA_TABLESPACES

Dodaj plik o wielkości 1MB do przestrzeni USER_DATA, obejrzyj to na perspektywie DBA_DATA_FILES i sprawdź, które pliki danych mają ustawioną opcję AUTOEXTEND

Zmień ustawienia w bazie tak, aby przestrzeń SYSTEM mogła się rozszerzać o 1M za każdym razem, gdy zajdzie taka potrzeba i sprawdź czy się udało

Utwórz tymczasową przestrzeń tabel TEMPORARY_DATA na pliku o rozmiarze 1M i nazwie e:\kurs\database\db#\tmpadm#.ora z domyślnymi parametrami i  sprawdź poprawność utworzenia przestrzeni

Zmień rozmiar pliku dla przestrzeni TEMPORARY_DATA na 2MB, sprawdź, czy się udało

VII. Zarządzanie przydziałem przestrzeni

Cele

W tej lekcji omawiamy jak efektywnie zarządzać i kontrolować przydział przestrzeni w bazie danych.

Po przerobieniu tej lekcji powinieneś potrafić:

Przegląd

Serwer Oracle przydziela przestrzeń bazy danych wszystkim danym w bazie.

Termin

Definicja

Baza danych

Logiczny zbiór dzielonych danych przechowywanych

w przestrzeniach tabel.

Plik

Fizyczny plik danych należący do pojedynczej przestrzeni

tabel.

Przestrzeń tabel

Logiczne repozytorium fizycznie zgrupowanych danych.

Segment

Zbiór złożony z jednego lub z wielu ekstentów zawierający wszystkie dane określonej struktury przechowywania w przestrzeni tabel.

Ekstent

Zbiór spójnych (sąsiednich) bloków bazy danych w pliku danych.

Blok

Wielokrotność fizycznych bloków istniejącego pliku danych.

0x01 graphic

Parametry Zarządzania Przestrzenią

Parametry Wykorzystania Przestrzeni Bloku

Ekstenty

Extent to ciągła sekwencja bloków danych. Ekstenty są przydzielane obiektom bazy danych w miarę ich wzrostu.

Ekstenty są przydzielane kiedy:

Ekstenty są zwalniane kiedy:

Charakterystyka Ekstentów

Kontrola Przydziału Ekstentów

Możemy wpływać na przydział ekstentów segmentom. Ustawiamy parametry przydziału przestrzeni poszczególnym obiektom oraz domyślne parametry przestrzeni tabel.

Parametry Zarządzania Przestrzenią

Ustawiamy parametry zarządzania przestrzenią dla:

Zasady Pierwszeństwa

Parametr

Opis

INITIAL

Rozmiar w bajtach pierwszego ekstentu przydzielanego dla segmentu. Wartość domyślna to odpowiednik pięciu bloków danych.

NEXT

Rozmiar w bajtach następnego ekstentu przydzielanego dla segmentu. Wartość domyślna to odpowiednik pięciu bloków danych.

MAXEXTENTS

Określa całkowitą liczbę ekstentów (wliczając pierwszy) jaką Oracle ma prawo przydzielić obiektowi. Wartość minimalna to 1. Wartość domyślna zależy od wybranego rozmiaru bloku i od

Systemu operacyjnego.

UNLIMITED

Określa, że ekstenty mają być automatycznie dodawane w miarę potrzeb. Nie powinno się używać tej opcji w przypadku segmentów wycofania ani tabel słownikowych.

MINEXTENTS

Całkowita liczba ekstentów rezerwowana podczas tworzenia segmentu. Wartość domyślna to pojedynczy ekstent, z wyjątkiem segmentów wycofania, gdzie niezbędne są dwa.

PCTINCREASE

Procent o jaki rośnie każdy kolejny ekstent w stosunku do poprzedniego. Domyślnie to 50 procent, z wyjątkiem segmentów wycofania, które nie używają tego parametru.

OPTIMAL

Określa optymalny rozmiar segmentu wycofania w bajtach. Wartością domyślna jest null.

FREELISTS

Liczba list wolnych bloków stosowanych przy wstawianiu do tabeli. Domyślnie jest jedna.

FREELIST GROUPS

Liczba oddzielnych grup list wolnych bloków używanych przez oddzielne instancje w konfiguracji Parallel Serwer. Domyślna jest jedna.

0x01 graphic

Uwaga: Podanie MINEXTENTS pozwala na zarezerwowanie dużej przestrzeni już podczas tworzenia segmentu.

Parametry przydziału przestrzeni zmieniamy przez ustawienie wszystkich parametrów przydziału przestrzeni w przestrzeni tabel.

Efekty Zmiany NEXT

Następny ekstent przyrostowy ma rozmiar NEXT. Kolejne ekstenty rosną jak zwykle, stosując parametr PCTINCREASE.

Efekty Zmiany PCTINCREASE

Wartość NEXT jest obliczana z użyciem następującego wzoru:

NEXT = NEXT * (1 + nowe PCTINCREASE/100)

zaokrąglone do następnego bloku Oracle.

Efekty Jednoczesnej Zmiany NEXT oraz PCTINCREASE

Następny ekstent ma przypisaną nową wartość NEXT. Od tej pory wartość NEXT będzie obliczana na podstawie PCTINCREASE zwykłą metodą.

Zmiana wartości domyślnych w przestrzeni tabel stosuje się tylko do nowotworzonych obiektów w tej przestrzeni tabel.

Parametry INITIAL oraz MINEXTENTS nie mogą być modyfikowane.

Przy określaniu parametrów zarządzania przestrzenią kierujemy się zasadą maksymalnego wykorzystania spójnej wolnej przestrzeni i ochroną wolnego miejsca przestrzeni tabel przed fragmentacją.

Fragmentacja wolnej przestrzeni może spowodować zmniejszenie efektywności.

Fragmentację ograniczamy przez:

Bloki Bazy Danych

Bloki bazy danych serwera Oracle są najmniejszą jednostką przestrzeni używaną w bazie danych.

Własności Bloków Bazy Danych

Format bloku serwera Oracle jest podobny niezależnie od tego, czy blok zawiera dane tabeli, indeksu czy klasera.

Części Bloku Bazy Danych

Fragment Bloku

Opis

Nagłówek

(header)

Zawiera ogólne informacje o bloku takie jak adres bloku, typ segmentu.

Słownik tabel

(table directory)

Zawiera informacje o tabelach w przypadku tabel w klaserze.

Słownik wierszy

(row directory)

Zawiera informacje o wierszach zawartych w bloku Wymagany narzut to dwa bajty na każdy wiersz.

Wolne miejsce

(free space)

Składa się z bajtów bloków nadal dostępnych na wstawienia lub aktualizację wierszy lub też na dodatkowe informacje o transakcjach.

Wiersze danych

(row data)

Przechowuje dane tabeli lub indeksu.

0x01 graphic

Wolna przestrzeń w blokach danych tabeli, klastra lub indeksu może również zawierać zapisy transakcji. Zapis transakcji w bloku jest wymagany dla każdej transakcji używającej jednego lub wielu wierszy z tego bloku. Zapisy transakcji, konieczne dla blokad na poziomie wierszy, umieszczane są w wolnej przestrzeni bloku.

Kontrola Wykorzystania Przestrzeni

Wykorzystanie przestrzeni przez operację wstawienia, modyfikacji i usuwania wierszy w bloku bazy danych kontrolujemy przez ustawienie odpowiednich wartości parametrów kontroli wykorzystania przestrzeni.

Parametry Wykorzystania Przestrzeni

Parametry PCTFREE oraz PCTUSED pozwalają na kontrolowanie wykorzystania wolnej przestrzeni w operacjach wstawiania i modyfikacji wierszy w bloku bazy danych. Każdy z tych parametrów może być zdefiniowany dla tabeli, klastra i migawki w poleceniach CREATE i ALTER. PCTFREE może być także definiowany dla indeksów.

Suma PCTFREE i PCTUSED musi być mniejsza lub równa 100.

Parametr

Definicja

PCTFREE

Określa procent przestrzeni każdego bloku danych zarezerwowany na przyszłe modyfikacje wierszy tabeli. Wartością domyślną PCTFREE jest 10 procent.

PCTUSED

Określa minimalny procent użytej przestrzeni jaki jest obliczany przez Oracle dla każdego bloku tabeli. Blok staje się kandydującym

INITRANS

Określa na liczbę zapisów transakcji rezerwowanych inicjalnie w nagłówku bloku.

MAXTRANS

Określa maksymalną liczbę transakcji jakie mogą odwoływać się jednocześnie do pojedynczego bloku.

Zarezerwowany (pozostawiamy wolny) fragment przestrzeni bloku na przyszłe modyfikacje umieszczonych już w bloku wierszy ustawiamy za pomocą parametru PCTFREE.

PCTFREE

Procent wolnej przestrzeni w blokach danych możemy obliczyć używając następującego wzoru:

PCTFREE =0x01 graphic
* 100

0x01 graphic

Uwaga: Zjawiska migracji wierszy i wierszy w łańcuchu nadal mogą mieć miejsce, nawet jeśli obliczymy PCTFREE stosując powyższy wzór.

Parametr PCTUSED ustawiamy aby kontrolować moment, kiedy blok będzie brany pod uwagę podczas wstawiania nowych wierszy. Nowe wiersze będą wstawiane do bloku dopóki blok znajduje się na liście wolnych. Blok jest usuwany z listy wolnych po osiągnięciu granicy PCTFREE i pozostaje poza nią dopóki jest wypełniony bardziej niż PCTUSED.

PCTUSED

Serwer Oracle dodaje blok do listy wolnych kiedy stwierdzi, że używana przestrzeń bloku spadła poniżej granicy PCTUSED. Lista wolnych to lista wskaźników do bloków, które mogą być wykorzystywane przy wstawianiu nowych wierszy. Bloki są dodawane i usuwane z listy wolnych kiedy używana przestrzeń odpowiednio spada poniżej PCTUSED i wzrasta powyżej PCTFREE.

Przez parametry PCTFREE i PCTUSED możemy poprawić efektywność i wykorzystanie przestrzeni.

Mała Wartość Parametru PCTFREE

Duża Wartość Parametru PCTFREE

Mała Wartość PCTUSED

Duża Wartość PCTUSED

Kiedy procent wolnej przestrzeni w bloku danych osiąga PCTFREE, żaden nowy wiersz nie może być wstawiony do bloku dopóki procent wykorzystanej przestrzeni nie spadnie poniżej ustawienia PCTUSED. Stąd, jeśli wartość PCTUSED jest niska, blok nie będzie rejestrowany jako wolny zbyt często i koszt przenoszenia bloku na listę wolnych jest zredukowany. Z drugiej strony, jeśli PCTUSED jest wysokie, blok będzie postrzegany jako wolny dużo częściej i koszt przetwarzania wzrośnie.

Kompromisem wykorzystania przestrzeni i efektywności I/O jest suma PCTFREEPCTFREE różna od 100 o procent dostępnej przestrzeni bloku jaką zajmuje przeciętnie jeden wiersz. Na przykład dla bloku o rozmiarze 2048 po odjęciu 100 bajtów narzutu pozostaje 1948 bajtów dostępnych dla danych. Jeśli przeciętny wiersz zajmuje 195 bajtów, czyli 10% z 1948, suma PCTUSED i PCTFREE powinna wynosić 90%.

Liczbę aktywnych transakcji operujących na tym samym bloku określamy przez parametry INITRANS i MAXTRANS.

INITRANS

MAXTRANS

Łańcuchy i Migracja

Aby uniknąć pogorszenia się efektywności monitorujemy zjawiska wierszy w łańcuchach (row chaining) i migrację wierszy (migration).

Łańcuchy (Chaining)

Migracja (Migration)

Końcowe kolumny NULL (czyli te z końca wiersza) nie są przechowywane jeśli zostały dodane do struktury tabeli poleceniem ALTER TABLE.

Parametry PCTFREE i PCTUSED optymalizują wykorzystanie przestrzeni w blokach danych.

Zwiększając parametr PCTFREE redukujemy zjawisko migracji wierszy.

Łańcuchy i Migracja Wierszy

Wpływ na Efektywność

Usuwanie Migracji Wierszy

Identyfikujemy występowanie wierszy w łańcuchach i wierszy przeniesionych za pomocą polecenia ANALYZE. Polecenie ANALYZE dokonuje analizy wskazanej tabeli.

Składnia:

0x01 graphic

Użycie Polecenia ANALYZE

Polecenie ANALYZE zapamiętuje identyfikatory wierszy (rowid) i inne informacje w tabeli CHAINED_ROWS w Twoim schemacie. Identyfikatory wierszy reprezentują blok początkowy zarówno wierszy w łańcuchach jak i przeniesionych.

Przez podanie polecenia

ANALYZE TABLE tabela1 LIST CHAINED ROWS INTO tabela2

możemy spowodować zapisanie informacji w tabeli o nazwie innej niż CHAINED_ROWS.

Do utworzenia tabeli CHAINED_ROWS można użyć skryptu SQL serwera Oracle o nazwie UTLCHAIN.SQL, (ewentualnie po modyfikacji kopii pliku w celu zmiany nazwy tabeli).

Wyświetlanie Informacji o Ekstentach i Segmentach

Aby obejrzeć ile ekstentów zostało przydzielonych i jak wiele istnieje segmentów piszemy zapytania oparte na perspektywach słownika danych.

Perspektywy Słownika Danych

Przykłady

Lista wszystkich kolumn perspektywy DBA_TABLESPACES.

SQL> DESCRIBE dba_tablespaces

Nazwa kolumny Wartość Typ

------------------------------ -------- ----

TABLESPACE_NAME NOT NULL VARCHAR2(30)

INITIAL_EXTENT NOT NULL NUMBER

NEXT_EXTENT NOT NULL NUMBER

MIN_EXTENTS NOT NULL NUMBER

MAX_EXTENTS NOT NULL NUMBER

PCT_INCREASE NOT NULL NUMBER

STATUS NOT NULL VARCHAR2(9)

CONTENTS NOT NULL VARCHAR2(9)

Lista nazw i statusów wszystkich przestrzeni tabel.

SQL> SELECT tablespace_name, status, contents

2> FROM dba_tablespaces;

TABLESPACE_NAME STATUS CONTENTS

------------------------------ --------- ---------

SYSTEM ONLINE PERMANENT

USER_DATA ONLINE PERMANENT

ROLLBACK_DATA ONLINE PERMANENT

TEMPORARY_DATA ONLINE PERMANENT

REPOSITORY_DATA ONLINE PERMANENT

INDEX_DATA ONLINE PERMANENT

Lista kolumn w DBA_DATA_FILES

SQL> DESCRIBE dba_data_files

Nazwa kolumny Wartość Typ

------------------------------ -------- ----

FILE_NAME VARCHAR2(513)

FILE_ID NOT NULL NUMBER

TABLESPACE_NAME NOT NULL VARCHAR2(30)

BYTES NOT NULL NUMBER

BLOCKS NOT NULL NUMBER

STATUS NOT NULL VARCHAR2(9)

AUTOEXTENSIBLE VARCHAR2(3)

MAXBYTES NOT NULL NUMBER

MAXBLOCKS NUMBER

INCREMENT_BY NUMBER

Lista ogólnych informacji o plikach danych należących do poszczególnych przestrzeni tabel.

SQL> SELECT file_name, file_id, tablespace_name, bytes

2> FROM dba_data_files;

FILE_NAME FILE_ID TABLESPACE_NAME BYTES

------------------------------- -------- -------------------------- ------------

D:\ORANT\DATABASE\USR1ORCL.ORA 2 USER_DATA 115343360

D:\ORANT\DATABASE\RBS1ORCL.ORA 3 ROLLBACK_DATA 36700160

D:\ORANT\DATABASE\TMP1ORCL.ORA 4 TEMPORARY_DATA 7825792

D:\ORANT\DATABASE\SYS1ORCL.ORA 1 SYSTEM 167772160

D:\ORANT\DATABASE\REPORCL.ORA 5 REPOSITORY_DATA 2097152

D:\ORANT\DATABASE\IND1ORCL.ORA 6 INDEX_DATA 55267328

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Wyświetlanie obszarów w wolnej przestrzeni w poszczególnych przestrzeniach tabel.

SQL> SELECT *

2> FROM dba_free_space

3> ORDER BY file_id, block_id:

TABLESPACE_NAME FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_F

--------------------------- ---------- ---------- ---------- --------- ----------

SYSTEM 1 1213 10240 5 1

SYSTEM 1 48896 204800 100 1

SYSTEM 1 49111 61440 30 1

SYSTEM 1 69136 30720 15 1

SYSTEM 1 69251 92160 45 1

SYSTEM 1 70531 40960 20 1

USER_DATA 2 4417 51200 25 2

USER_DATA 2 5392 112640 55 2

USER_DATA 2 29848 81920 40 2

USER_DATA 2 38984 61440 30 2

USER_DATA 2 55872 30720 15 2

USER_DATA 2 56127 327680 160 2

ROLLBACK_DATA 3 16186 3553280 1735 3

TEMPORARY_DATA 4 1861 14016512 6844 4

REPOSITORY_DATA 5 312 30720 15 5

REPOSITORY_DATA 5 632 163840 80 5

INDEX_DATA 6 26964 47104 23 6

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Ta sama informacja o wolnej przestrzeni z wykorzystaniem nazw plików zamiast ich identyfikatorów.

SQL> SELECT free.tablespace_name, bloc_id, free.bytes,

2> free.blocks, df.file_name

3> FROM dba_free_space free, dba_data files df

4> WHERE free. File_id = df.file_id

5> ORDER BY 1 , 2;

TABLESPACE_NAME BLOCK_ID BYTES BLOCKS FILE_NAME

---------------- -------- ---------- -------- -----------------------------------

INDEX_DATA 26964 47104 23 D:\ORANT\DATABASE\IND1ORCL.ORA

REPOSITORY_DATA 312 30720 15 D:\ORANT\DATABASE\REPORCL.ORA

REPOSITORY_DATA 632 163840 80 D:\ORANT\DATABASE\REPORCL.ORA

ROLLBACK_DATA 16186 3553280 1735 D:\ORANT\DATABASE\RBS1ORCL.ORA

SYSTEM 1213 10240 5 D:\ORANT\DATABASE\SYS1ORCL.ORA

SYSTEM 48896 204800 100 D:\ORANT\DATABASE\SYS1ORCL.ORA

SYSTEM 49111 61440 30 D:\ORANT\DATABASE\SYS1ORCL.ORA

SYSTEM 69136 30720 15 D:\ORANT\DATABASE\SYS1ORCL.ORA

SYSTEM 69251 92160 45 D:\ORANT\DATABASE\SYS1ORCL.ORA

SYSTEM 70531 40960 20 D:\ORANT\DATABASE\SYS1ORCL.ORA

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Lista kolumn w DBA_SEGMENTS

SQL> DESCRIBE dba_segments

Nazwa kolumny Wartość Typ

------------------------------ -------- ----

OWNER VARCHAR2(30)

SEGMENT_NAME VARCHAR2(81)

PARTITION_NAME VARCHAR2(30)

SEGMENT_TYPE VARCHAR2(17)

TABLESPACE_NAME VARCHAR2(30)

HEADER_FILE NUMBER

HEADER_BLOCK NUMBER

BYTES NUMBER

BLOCKS NUMBER

EXTENTS NUMBER

INITIAL_EXTENT NUMBER

NEXT_EXTENT NUMBER

MIN_EXTENTS NUMBER

MAX_EXTENTS NUMBER

PCT_INCREASE NUMBER

FREELISTS NUMBER

FREELIST_GROUPS NUMBER

Ogólna informacja o wszystkich segmentach w bazie danych.

SQL> SELECT owner, segment_name, extents, max_extents

2> FROM dba_segments

3> ORDER BY owner, segment_name;

OWNER SEGMENT_NAME EXTENTS MAX_EXTENT

--------- ------------------------ ---------- ----------

SYS ACCESS$ 9 2147483645

SYS AQ$_QUEUE_STATISTICS 1 121

SYS AUD$ 1 121

SYS AUDIT$ 1 121

SYS AUDIT_ACTIONS 1 121

...

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Informacja podsumowująca grupy segmentów w poszczególnych przestrzeniach tabel.

SQL> SELECT TABLESPACE_NAME, COUNT (*) AS SEGMENTS,

2> sum (bytes) AS BYTES

3> FROM dba_segments

4> GROUP BY tablespace_name;

TABLESPACE_NAME SEGMENTS BYTES

------------------------------ ---------- ----------

INDEX_DATA 320 55218176

REPOSITORY_DATA 158 1900544

ROLLBACK_DATA 16 33144832

SYSTEM 235 158472192

TEMPORARY_DATA 80 3807232

USER_DATA 2899 113655808

Lista kolumn w DBA_EXTENTS.

SQL> DESCRIBE dba_extents

Nazwa kolumny Wartość Typ

------------------------------ -------- ----

OWNER VARCHAR2(30)

SEGMENT_NAME VARCHAR2(81)

PARTITION_NAME VARCHAR2(30)

SEGMENT_TYPE VARCHAR2(17)

TABLESPACE_NAME VARCHAR2(30)

EXTENT_ID NOT NULL NUMBER

FILE_ID NOT NULL NUMBER

BLOCK_ID NOT NULL NUMBER

BYTES NOT NULL NUMBER

BLOCKS NOT NULL NUMBER

Informacja o ekstentach przydzielonych w bazie danych.

SQL>SELECT * FROM dba_extents;

OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID BLOCK_ID BYTES BLOCKS

------ ------------- ------------ --------------- --------- -------- ----- ------

SYS FILE$ TABLE SYSTEM 0 162 10240 5

SYS UNDO$ TABLE SYSTEM 0 157 10240 5

SYS BOOTSTRAP$ TABLE SYSTEM 0 352 51200 25

SYS CON$ TABLE SYSTEM 5 47711 61440 30

SYS CON$ TABLE SYSTEM 6 48751 92160 45

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Zwalnianie Niewykorzystanej Przestrzeni

Czasami zdarza się, że zarezerwujemy przestrzeń dla segmentu, a potem stwierdzimy, że nie jest ona używana. Warto wtedy zwolnić nieużywaną przestrzeń, aby można było udostępnić ją innym segmentom.

Maksymalną w całej historii segmentu wielkość wykorzystanej przestrzeni wskazuje tzw. znacznik wysokiej wody (high water mark). Nawet po usunięciu wierszy znacznik ten nie jest przesuwany.

0x01 graphic

Do zwalniania niewykorzystanej pamięci służy polecenie ALTER TABLE.

Składnia:

0x01 graphic

SQL> ALTER TABLE big_emp DEALLOCATE UNUSED;

0x01 graphic

Uwaga: Po zwolnieniu przestrzeni znacznik wysokiej wody pozostaje niezmieniony.

Łączenie Wolnej Przestrzeni

Przydział przestrzeni dla segmentów umieszczonych w przestrzeniach tabel odbywa się za pomocą ekstentów zbudowanych z ciągłych sekwencji bloków danych, Jeśli pewien wolny obszar przestrzeni jest fragmentowany, podzielony na kilka mniejszych obszarów, wolne obszary przestrzeń tabel mogą być złączone (coalesced). Jest to domyślnie wykonywane przez proces monitora systemu (SMON), ale może być także spowodowane wykonaniem polecenia ALTER TABLESPACE z klauzulą COALESCE.

Przykład

SVRMGR> ALTER TABLESPACE users COALESCE;

Statystyki o ekstentach jakie mogą być złączone w przestrzeni tabel możemy obejrzeć w perspektywie DBA_FREE_SPACE_COALESCED. Zapytania na tej perspektywie pozwalają stwierdzić czy obszary przestrzeni tabel wymagają łączenia.

Po każdych ośmiu złączeniach transakcja łącząca zatwierdza zmiany i inne transakcje mogą wtedy dokonywać rezerwacji lub zwalniania przestrzeni. Oznacz to, że być może trzeba będzie wykonać polecenie ALTER TABLESPACE wielokrotnie. Sprawdzaj perspektywę DBA_FREE_SPACE_COALESCED.

0x01 graphic

Walidacja Struktur

Walidacja sprawdza integralność struktur indeksów, tabel i klastrów.

Walidacja Indeksów

Walidacja Tabel

Walidacja Klastrów

Jeżeli została użyta opcja CASCADE w celu sprawdzenia odpowiedniości indeksów, sprawdzane jest czy:

Składnia

0x01 graphic

gdzie:

indeks jest nazwą indeksu jaki ma być analizowany. Jeśli pominięto schemat, serwer Oracle zakłada istnienie indeksu w bieżącym schemacie.

tabela jest nazwą tabeli jaka ma być analizowana. Jeśli pominięto schemat, serwer Oracle zakłada istnienie tabeli w bieżącym schemacie.

klaster jest nazwą klastra jaki ma być analizowany. Jeśli pominięto schemat, serwer Oracle zakłada istnienie klastra w bieżącym schemacie.

VALIDATE STRUCTURE powoduje walidację struktury analizowanego obiektu. Jeżeli użyjemy tej opcji dla klastra, serwer Oracle automatycznie dokona walidacji wszystkich tabel z klastra.

CASCADE powoduje walidację struktury związanych z tabelą lub klastrem indeksów.

Jeśli serwer Oracle dokona pomyślnej walidacji struktury, zwraca komunikat potwierdzający walidację. Jeśli zauważono zniszczenie struktury obiektu, zwracany jest błąd. W takim przypadku należy usunąć i ponownie utworzyć obiekt. Po użyciu polecenia ANALYZE...VALIDATE STRUCTURE do analizy obiektu tabela INDEX_STATS będzie zawierać zapis informacji statystycznej.

Przykłady

Walidacja struktury indeksu PARTS_INDEX.

SQL> ANALYZE INDEX parts_index

2> VALIDATE STRUCTURE;

Walidacja struktury klastra ORDER_CUST, wszystkich jego tabel i indeksów, w tym indeksu klastra.

SQL> ANALYZE CLUSTER order_cust

2> VALIDATESTRUCTURE

3> CASCADE;

Monitorowanie Wykorzystania Przestrzeni

Powinniśmy kontrolować wykorzystanie przestrzeni przez segmenty, zwłaszcza jeśli są one modyfikowane.

Monitorujemy średnią efektywność wykorzystania przestrzeni przez segment przez wykonywanie następujących kroków.

Monitorowanie Wykorzystania Przestrzeni

Wykonujemy kroki 1 i 2 w regularnych odstępach czasu i porównujemy wyniki. Jeśli wykorzystywana przez obiekt przestrzeń maleje poniżej jego przeciętnej, możemy wyeksportować, usunąć i zaimportować ten obiekt.

Indeksy kontrolujemy przez wykonanie polecenia ANALYZE lub wykonując zapytania wprost na perspektywach słownika danych odnoszących się do indeksów. Indeksy mogą być usuwane i tworzone ponownie.

Wszystkie ekstenty pozostają zarezerwowane aż do czasu obcięcia lub usunięcia segmentu.

Monitorujemy wykorzystanie przestrzeni przez indeks za pomocą polecenia ANALYZE STRUCTURE i przeglądania tabeli INDEX_STATS.

Podsumowanie

Serwer Oracle przydziela przestrzeń bazy danych wszystkim danym w bazie.

Termin

Definicja

Baza danych

Logiczny zbiór dzielonych danych przechowywanych w przestrzeniach tabel.

Plik

Fizyczny plik danych należący do pojedynczej przestrzeni tabel.

Przestrzeń tabel

Logiczne repozytorium fizycznie zgrupowanych danych.

Segment

Zbiór złożony z jednego lub z wielu ekstentów zawierający wszystkie dane określonej struktury przechowywanej w przestrzeni tabel.

Ekstent

Zbiór spójnych (sąsiednich) bloków bazy danych w pliku danych.

Blok

Wielokrotność fizycznych bloków istniejącego pliku danych.

Parametry Zarządzania Przestrzenią

Parametry Wykorzystania Przestrzeni Bloku

0x01 graphic

Zadania

Napisz zapytanie na DBA_SEGMENTS, które wypisze nazwę segmentu, jego bajty, bloki i liczbę dopuszczalnych dodatkowych ekstentów

Napisz zapytanie na DBA_FREE_SPACE, które znajdzie ilość wolnej przestrzeni w każdej z przestrzeni

VIII. Zarządzanie segmentami wycofania

Cele

W tej lekcji nauczymy się zarządzać segmentami wycofania Oracle, w tym tez wpływać na ich rozmiar.

Po przerobieniu tej lekcji powinieneś potrafić:

Przegląd

Segment wycofania to zbiór ekstentów zawierających danie wycofania wykorzystywane przy wycofaniu transakcji, zapewnianiu spójności odczytu i odtwarzaniu bazy danych.

Segmenty Wycofania

Segment wycofania (rollback segment) to fragment bazy danych przeznaczony na zapis danych sprzed zmodyfikowania ich przez transakcję, co pozwala na wycofanie zmian w pewnych warunkach.

Transakcja (transaction) jest jednostką operacji na bazie danych powodującą zmiany i blokady wierszy. Każda transakcja ma przydzielony unikalny identyfikator i dokładnie jeden segment wycofania. Segment wycofania jest obiektem cyklicznym, w którym każda transakcja dokonuje wielu zapisów. Transakcja może używać następnego ekstentu, jeżeli brak w nim aktywnych zapisów.

0x01 graphic

Jeśli następny ekstent, jaki ma być użyty posiada aktywne zapisy, do segmentu wycofania zostanie dodany nowy ekstent o ile nie osiągnięto jeszcze maksymalnej liczby ekstentów.

0x01 graphic

Charakterystyka Segmentów Wycofania

Zapisy w segmentach wycofania używane przy wycofaniu, spójności odczytu i odtwarzaniu, dokonywane są w sposób cykliczny.

Własności Segmentów Wycofania

Serwer Oracle wymaga istnienia włączonego (online) segmentu wycofania o nazwie SYSTEM podczas otwierania bazy danych.

Segment wycofania SYSTEM jest zakładany podczas tworzenia bazy danych.

Kiedy transakcja wymaga kontynuacji zapisów informacji wycofania w następnym ekstencie segmentu wycofania, serwer Oracle porównuje bieżący rozmiar segmentu wycofania z rozmiarem optymalnym segmentu. Jeśli segment wycofania jest większy niż jego rozmiar optymalny a ekstent następujący bezpośrednio za właśnie zapełnionym jest nieaktywny, serwer Oracle zwalnia nieaktywne ekstenty segmentu wycofania dopóki całkowity rozmiar segmentu wycofania nie jest równy lub najbliższy nie mniejszy jego rozmiarowi optymalnemu.

Transakcja może zażądać przydzielenia wskazanego segmentu wycofania poleceniem SET TRANSACTION USE ROLLBACK SEGMENT.

Dla segmentów wycofania nie można ustawić parametru PCTINCREASE.

Właściwa wartość OPTIMAL może być znaleziona przez monitorowanie V$ROLLSTAT, lub przez wykorzystanie monitora wycofań z narzędzia Serwer Manager/GUI.

Określamy charakterystyki wykorzystania przestrzeni przez segmenty wycofania.

Parametry Wykorzystania Przestrzeni Segmentów Wycofania

Optymalne Parametry

Istnieją trzy typy segmentów wycofania.

Typ

Funkcja

Prywatny (private)

Aby był rozpoznany przez system musi być uwzględniony w wartości parametru ROLLBACK_SEGMENTS w pliku parametrów

Publiczny (public)

Tworzy pulę segmentów wycofania, które mogą być przydzielone i wykorzystywane w każdej instancji żądającej dodatkowego segmentu wycofania. Użyteczne tylko w środowisku Parallel Serwer, ale wtedy też zwykle lepiej wykorzystywać prywatne segmenty wycofania.

Opóźniony (deferred)

Tworzony kiedy przestrzeń tabel jest wyłączona (offline) tak, że transakcje nie mogą być wycofane natychmiast. Tworzony zawsze w przestrzeni tabel SYSTEM.

Zasady

Tworzenie Segmentu Wycofania

Możemy stworzyć segment wycofania używając polecenie CREATE ROLLBACK SEGMENT.

Składnia:

0x01 graphic

gdzie:

segment_wycofania jest nazwą tworzonego segmentu wycofania.

PUBLIC określa, że segment wycofania należy do puli publicznej.

przestrzeń_tabel specyfikuje nazwę przestrzeni tabel gdzie ma być utworzony segment wycofania.

klauzula_przestrzeni określa zasady przydzielania przestrzeni segmentowi wycofania.

OPTIMAL specyfikuje optymalny rozmiar w bajtach segmentu wycofania. Opcja OPTIMAL należy do klauzuli przestrzeni.

Minimalną wartością MINEXTENTS dla segmentów wycofania jest 2. Można jeszcze zwiększyć wartość MINEXTENTS przy tworzeniu segmentu wycofania np. kiedy przestrzeń bazy danych jest pofragmentowana a chcemy zagwarantować wystarczającą ilość przestrzeni do przechowania wszystkich danych tabeli. W segmentach wycofania PCTINCREASE jest zawsze zero i nie może być podawany.

Przykład

Utworzenie segmentu o nazwie RBS01 w przestrzeni tabel RBS przez polecenie CREATE ROLLBACK SEGMENT. Weryfikacja poprawności utworzenia segmentu wycofania w słowniku danych.

SQL> CREATE ROLLBACK SEGMENT rbs01

2> TABLESPACE rbs

3> STORAGE (INITIAL 10K NEXT 10K

4> MINEXTENTS 20 MAXEXTENTS 121

5> OPTIMAL 200K);

SQL> SELECT * FROM dba_rollback_segs;

SEGMENT_NAME OWNER TABLESPACE_NAME SEGMENT_ID FILE_ID STATUS --------------------- ------ ------------------- ---------- ---------- ----------SYSTEM SYS SYSTEM 0 1 ONLINE

RBS01 PUBLIC RBS 2 3 OFFLINE

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Modyfikacja Segmentu Wycofania

Przełączamy segment wycofania w tryb offline aby usunąć ten segment lub przestrzeń tabel, która go zawiera.

Przełączenie segmentu wycofania na online udostępnia segment transakcjom.

Wyłączamy i włączamy segmenty wycofania poleceniem ALTER ROLLBACK SEGMENT.

Składnia:

0x01 graphic

gdzie:

segment_wycofania to nazwa zmienianego segmentu wycofania.

ONLINE przełącza segmenty wycofania na online.

OFFLINE przełącza segmenty wycofania na offline.

SHRINK usiłuje zmniejszyć segment wycofania do podanego lub optymalnego rozmiaru.

Przełączenie segmentu wycofania na online:

Przełączenie segmentu wycofania na offline:

Ustawienia MAXEXTENTS na liczbę nieco mniejszą niż absolutne maksimum pozwala DBA na obsługę sytuacji kiedy segment wycofania jest bliski osiągnięcia maksymalnego rozmiaru.

Przykład

Udostępnienie segmentu wycofania RBS01, utworzonego w poprzednim przykładzie i weryfikacja statusu ONLINE w słowniku danych.

SQL> SELECT segment_name, status

2> FROM dba_rollback_segs;

SEGMENT_NAME STATUS

------------------------------ ----------------

SYSTEM ONLINE

RBS01 OFFLINE

RBS02 ONLINE

RBS03 ONLINE

SQL> ALTER ROLLBACK SEGMENT rbs01 ONLINE;

SEGMENT_NAME STATUS

------------------------------ ----------------

SYSTEM ONLINE

RBS01 ONLINE

RBS02 ONLINE

RBS03 ONLINE

Zasady Używania Segmentów Wycofania

Dopasowujemy segment wycofania do poziomu aktywności i liczby transakcji zapisujących do segmentu wycofania przez ustawianie parametrów klauzuli przestrzeni (w tym parametru OPTIMAL) podczas tworzenia i strojenia segmentów wycofania.

Rywalizacja o Segmenty Wycofania

Przykład

SELECT n. Name, round (100 * s. waits/ s.gets) ”%Count”

FROM v$rollname n, v$rollstat s

WHERE n.usn = s. usn;

Jeśli uzyskana wartość jest większa niż 1%, potrzeba większej ilości segmentów wycofania. Można rozważyć też wykorzystanie polecenia SET TRASACTION USE ROLLBACK SEGMENT.

W poleceniach ALTER ROLLBACK SEGMENT oraz CREATE ROLLBACK SEGMENT definiujemy optymalny rozmiar w bajtach dla każdego segmentu wycofania.

Cechy Dynamicznego Przydziału ekstentów

Zasady Określania Parametru OPTIMAL

Usuwanie Segmentu Wycofania

Segmenty wycofania często są usuwane z powodu powodowanej przez nie fragmentacji dysku lub ponieważ są przenoszone do innej przestrzeni tabel. Segment wycofania usuwany za pomocą polecenia DROP ROLLBACK SEGMENT.

Składnia:

0x01 graphic

gdzie:

segment_wycofania jest nazwą usuwanego segmentu.

Usuwać można tylko segmenty wycofania znajdujące się w stanie OFFLINE.

Podsumowanie

Segment wycofania to zbiór ekstentów zawierających dane wycofania wykorzystywane przy wycofaniu transakcji, zapewnieniu spójności odczytu i odtwarzaniu bazy danych.

0x01 graphic

Zadania

Utwórz tabelę TEST w przestrzeni tabel USER_DATA (skrypt s:\create_test.sql)

Dodaj wiersz do tabeli TEST poleceniem INSERT INTO TEST VALUES ('TEST'). Co się stało?

Utwórz przestrzeń tabel RBS na pliku e:\kurs\database\db#\rbsadm#.ora o rozmiarze 1MB, ekstencie inicjalnym 20K, ekstencie następnym 20K, minimalną ilością ekstentów równą 2, pctincrease 0

Utwórz publiczny segment wycofania RBS01 w przestrzeni tabel RBS

Obejrzyj perspektywę DBA_ROLLBACK_SEGS, jaki status na utworzony segment wycofania?

Przełącz segment wycofania RBS01 w tryb online

Spróbuj ponownie dodać wiersz do tabeli TEST

Sprawdź perspektywę v$rollstat

Z drugiej sesji spróbuj przełączyć segment RBS01 w stan offline. Sprawdź w perspektywie DBA_ROLLBACK_SEGS i v$rollstat, jaki teraz jest stan tego segmentu wycofania. Spróbuj usunąć segment RBS01.

Zatwierdź transakcję i spróbuj ponownie usunąć segment RBS01. Czy teraz się udało?

Utwórz publiczny segment wycofania RBS02 z maksymalną liczbą ekstentów równą 3.

Przełącz segment RBS02 w tryb online.

Dodaj do tabeli TEST 10 wierszy, gdzie name ma długość 30 znaków: INSERT INTO TEST VALUES ('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX');

W przestrzeni tabel USER_DATA utwórz tabelę TT jako kopię tabeli TEST poleceniem CREATE TABLE TT AS SELECT * FROM TEST;

Powtarzaj polecenie "INSERT INTO TT SELECT * FROM TT" aż do uzyskania błędu. Jaki to błąd ?

Zatwierdź transakcje i sprawdź ile jest wierszy w tabeli TT poleceniem SELECT COUNT(*) FROM TT. Dlaczego?

Spróbuj usunąć wszystkie wiersze z tabeli TT poleceniem DELETE FROM TT. Co się stało?

Zmień w segmencie RBS02 maksymalną liczbę ekstentów na 100 i ponownie spróbuj usunąć wiersze z tabeli TT Spróbuj zatwierdzić transakcję

Spróbuj zmienić w segmencie RBS02 maxextents na 2 . Co się stało?

Zmień w segmencie RBS02 maksymalna ilość ekstentów na 300.

Usuń tabelę TT

Obetnij tabelę TEST poleceniem TRUNCATE TABLE TEST

W sesji nr 1 wstaw wiersz do tabeli TEST,

W sesji nr 2 przełącz przestrzeń tabel USER_DATA w tryb offline.

W sesji nr 2 obejrzyj perspektywę DBA_SEGMENTS i znajdź opóźniony segment wycofania

W sesji nr 2 włącz przestrzeń tabel USER_DATA

W sesji nr 1 zatwierdź transakcję

W sesji nr 2 zobacz ile wierszy na tabela TEST

Usuń tabelę TEST

IX. Obsługa segmentów tabel i indeksów

Cele

Lekcja ta wyjaśnia, w jaki sposób obsługiwać w Oracle segmenty tabel i indeksów, również jak dobierać ich rozmiary.

Na końcu tej sekcji powinieneś potrafić

Przegląd

Segmenty zawierają całość danych dla specyficznej struktury wewnątrz przestrzeni tabel. Segment składa się z jednego lub wielu obszarów (extent)

Własności segmentu

Typ segmentu

Opis

Data

Zawiera dane

Index

Dostarcza efektywnej struktury do lokalizacji w tabeli specyficznych wierszy.

Tabele

Segment danych dla tabeli zawiera wiersze tablicy. Dane tabel przechowywane są w segmentach danych.

Własności tabel

Przykład: Polecenie CREATE TABLE

Utworzenie tabeli ORDERS i podanie parametrów przechowywania danych (storage parameters) w tabeli.

SQL> CREATE TABLE orders (

2> orderid NUMBER (3) NOT NULL,

3> orderdate DATE,

4> shipdate DATE,

5> client VARCHAR2 (3) NOT NULL,

6> amount_due NUMBER (10,2),

7> amount_paid NUMBER (10,2))

8> PCTFREE 5 PCTUSED 65

9> STORAGE (

10> INITIAL 5M

11> NEXT 5M

12> PCTINCREASE 0

13> MINEXTENTS 2

14> MAXEXTENTS 50)

15> TABLESPACE users;

0x01 graphic

Uwaga: Parametry sterujące z wykorzystaniem przestrzeni nie są częścią klauzuli przestrzeni.

Dane z tabel przechowywane są jako wiersze. Wiersz jest kombinacją wartości, którą czytamy zwykle poziomo i która zawiera unikatową kombinację informacji opisującą relacje pomiędzy kawałkami podobnych danych.

Własności wierszy

0x01 graphic

Uwaga: Każdy wiersz używa dwóch bajtów w katalogu wierszy w nagłówku bloku danych.

Alokowanie przestrzeni dla tabeli

Dobrze utworzone tabele utworzą wydajniejszą bazę danych.

Parametry klauzuli przestrzeni

Parametry wykorzystywania przestrzeni (Space Utilization Parameters)

Tworzenie tabel

Składnia:

0x01 graphic

0x01 graphic

0x01 graphic

gdzie:

schemat oznacza właścicieli tabel

tabela jest nazwą tabeli

kolumna jest nazwą kolumny

typ_kulumny jest typem danych w kolumnie

PCTFREE jest ilością miejsca zarezerwowaną w blokach (jako procent całego dostępnego - nie licząc nagłówka bloku - miejsca w bloku) dla wierszy, które powiększą się.

PCTUSED określa limit wykorzystanego miejsca dla bloku (po jak zapełni się do PCTFREE) zanim stanie się on dostępny dla wstawienia wierszy.

INITRANS określa liczbę pozycji przygotowanych dla transakcji nagłówku bloku. Domyślnie 255.

MAXTRANS limit pozycji transakcji, jakie mogą być zaalokowane dla każdego bloku. Domyślnie 255.

TABLESPACE określa przestrzeń tabel, w której ma być tabela

STORAGE określa klauzulę przestrzeni, która determinuje w jaki sposób tablicy będą przydzielane ekstenty.

RECOVERABLE określa, że utworzenie tabeli ma zostać odnotowane w dzienniku powtórzeń. Domyślnie.

UNRECOVERABLE określa, że utworzenie tabeli nie może być odnotowane w dzienniku powtórzeń.

CLUSTER określa, że tabela jest częścią klastra.

PARALLEL określa charakterystykę dostępu równoległego do tabeli. Patrz opisy DEGREE i INSTANCES.

DEGREE Liczba całkowita specyfikująca domyślny stopień paralelizmu dla tabeli; domyślnie jest to obliczane przy uwzględnieniu przypuszczalnego rozmiaru tabeli i wartości parametru inicjalizującego.

ENABLE włącza warunek integralności.

DISABLE wyłącza warunek integralności.

AS podzapytanie wstawia do tabeli wiersze będące wynikiem podzapytania.

CACHE określa, iż bloki tej tabeli są po wczytaniu podczas wykonywania pełnego przejścia przez tabelę (full table scan)umieszczane jako te ostatnio użyte w liście LRU obsługującej bufory danych.

NOCACHE określa, iż bloki wczytane przy przeglądaniu całej tabeli (full table scan) nie są umieszczane jako ostatnio użyte na liście LRU obsługującej bufory danych.

Składnia klauzula_przestrzeni:

0x01 graphic

gdzie:

INITIAL jest rozmiarem pierwszego ekstentu w bajtach.

NEXT jest rozmiarem następnego ekstentu w bajtach.

MINEXTENTS jest liczbą ekstentów tworzonych od razu.

MAXEXTENTS jest liczbą możliwych do zaalokowania ekstentów

PCTINCREASE jest współczynnikiem o jaki powiększany jest każdy następnie przydzielany ekstent.

FREELISTS jest liczbą list wolnych bloków.

FREELIST GROUPS jest liczbą grup list wolnych bloków dla instancji Serwera Równoległego.

Modyfikacja tabel

Do modyfikacji definicja tabeli używa się polecenia ALTER TABLE.

Składnia:

0x01 graphic

0x01 graphic

gdzie:

ALLOCATE EXTENT ręcznie dodaje nowy ekstent.

SIZE jest rozmiarem nowego ekstentu w bajtach.

DATAFILE jest nazwą pliku danych w przestrzeni tabel.

INSTANCE jest nr instancji w środowisku bazy danych MPP.

DEALLOCATE UNUSED jawnie zwalnia niewykorzystaną przestrzeń na końcu tabeli i udostępnia ją dla innych segmentów.

KEEP określa liczbę bajtów powyżej znacznika wysokiej wody (high water mark), jaka ma pozostać w tabeli po dealokacji.

ENABLE enable_clause włącza sprawdzanie pojedynczego constrainta lub wszystkich wyzwalaczy powiązanych z tabelą.

ENABLE TABLE LOCK pozwala na blokady DML i DDL na tabeli w środowisku serwera równoległego.

DISABLE disable-clause wyłącza sprawdzanie pojedynczego constrainta lub wszystkich wyzwalaczy powiązanych z tabelą.

DISABLE TABLE LOCK uniemożliwia blokady DML i DDL na tabeli w środowisku Serwera Równoległego.

Polecenia ALTER TABLE można użyć do kontroli alokacji przestrzeni dla przyszłych bloków.

Przykłady

SQL> ALTER TABLE reserwe

2> STORAGE(MAXEXTENTS 121

3> PCTINCREASE100);

Table created

SQL> ALTER TABLE too_small

2> ALLOCATE EXTENT

3> (SIZE 200K

4> DATAFILE `/u02/Oracle/test/user1 . dbs');

Table altered

Usuwanie tabel

Tabelę i jej zawartość usuwa się poleceniem DROP TABLE.

Składnia

0x01 graphic

gdzie:

schemat jest schematem zawierającym tabelę. Jeśli pominie się schemat Serwer Oracle zakłada, iż chodzi o schemat wydającego polecenie.

tabela jest nazwą tabeli, która ma być usunięta.

CASCADE CONSTRAITS usuwa wszystkie więzy integralności, jakie odnoszą się kluczy Primery i unique w usuwanej tabeli. Jeśli pominie się tą opcję, a istnieje taki klucz obcy, Serwer Oracle zwróci błąd i nie usunie tabeli.

Segmenty Indeksów

Jeśli na tabeli zostanie utworzony indeks, jeśli dla niego tworzony segment indeksowy (index segment). Segment taki jest fizycznie oddzielony od segmentów danych tabeli czy klastra.

0x01 graphic

Charakterystyka drzewa B*Tree

Własności segmentu indeksu

Przykład

Utworzenie indeksu na tabeli EMP.

SQL> CREATE INDEX emp_ename /*Index name*/

2> ON emp(ename) /*Table and column name*/

3> STORAGE (INITIAL 500K NEXT 500K PCTINCREASE 0)

4> TABLESPACE user_data;

Index created

Indeksy bitmapowe

Indeksy bitmapowe są atrakcyjną alternatywą dla normalnych indeksów typu B*-Tree w sytuacji, gdy:

Koncepcja indeksów bitmapowych

Kolumna = REGION

`cast'

`central'

`west'

1

0

0

0

1

0

0

0

1

0

0

1

0

1

0

0

1

0

Kiedy korzystać z indeksów bitmapowych

Indeksy bitmapowe powinny znaleźć zastosowanie w następujących sytuacjach:

Indeksy bitmapowe nie są dostępne przed wersją 7.3.3.

Indeksy typu unique

Indeksów typu unique można użyć by zapewnić, iż w tabeli nie będzie dwóch wierszy z tymi samymi wartościami w kolumnach, na których zbudowany jest indeks.

Nie ma duplikatów wartości

Indeksy typu Non-Unique

Indeksy typu Non-unique pozwalają na powtarzanie wartości w indeksowanej kolumnie.

Indeksy skonkatenowane

Indeksy złożone lub skonkatenowane tworzone są na wielu kolumnach tabeli.

Charakterystyka

Tworzenie indeksów

Indeksy tworzy się poleceniem CREATE INDEX.

0x01 graphic

0x01 graphic

gdzie:

UNIQUE określa, czy wartość w indeksowanej kolumnie ma być unikatowa.

BITMAP określa, że ma zostać utworzony indeks bitmapowy.

schemat jest schematem, które ma zawierać indeks lub tabelę.

indeks jest nazwą tworzonego indeksu.

tabela jest nazwa tabeli, na której zbudowany ma być indeks.

kolumna jest nazwą kolumny w tabeli. Maksymalnie można podać 16 kolumn.

ASC/DESC są obsługiwane ze względu na kompatybilność ze składnią DB2, jednak indeksy tworzone są zawsze z porządkiem rosnącym.

CLUSTER określa klaster, dla którego ma zostać zbudowany indeks.

INITRANS określa liczbę pozycji dla transakcji przygotowanych w nagłówkach bloków danych segmentu. Domyślnie 2.Każda pozycja dla transakcji zajmuje 23 bajty.

MAXTRANS ogranicza liczbę transakcji, które mogą mieć równoczesny dostęp do bloku. Domyślnie 255.

TABLESPACE określa przestrzeń tabel, w której ma zostać umieszczony indeks.

STORAGE patrz składnia klauzuli przestrzeni.

PCTFREE jest ilością miejsca (w procentach) rezerwowanego na dodatkowe pozycje indeksu.

NOSORT mówi Serwerowi Oracle, że wiersze tabeli zostały posortowane w porządku rosnącym.

RECOVERABLE określa, iż utworzenie indeksu zostanie odnotowane w dzienniku powtórzeń. Domyślnie tak się właśnie dzieje.

UNRECOVERABLE określa, iż utworzenie indeksu nie ma być odnotowane w dzienniku powtórzeń.

PARALLEL określa, że indeks ma być tworzony równolegle.

Składnia klauzuli przestrzeni:

0x01 graphic

gdzie:

INITIAL określa rozmiar pierwszego ekstentu segmentu.

NEXT określa rozmiar drugiego ekstentu segmentu.

MINEXTENTS określa liczbę ekstentów, jakie mają zostać zaalokowane w czasie tworzenia indeksu.

MAXEXTENTS określa maksymalną liczbę ekstentów.

PCTINCREASE określa w procentach o ile kolejny ekstent ma być większy od poprzedniego.

FREELISTS określa liczbę list wolnych bloków dla każdej grupy takich list. Domyślnie 1.

FREELIST GROUPS określa liczbę list wolnych bloków dla indeksu. Domyślnie 1.

Przykłady

Poniższe przykłady używają domyślnej przestrzeni tabel twórcy indeksów. Korzystają one również z domyślnych parametrów klauzuli przestrzeni dla tej przestrzeni tabel - zakładając, że tabela nie ma wierszy.

SQL> CREATE INDEX ind_emp_empno ON EMP (EMPNO)

Niżej parametry klauzuli przestrzeni podane są jawnie.

SQL> CREATE INDEX ind_emp_empno ON EMP(EMPNO)

2> TABLESPACE user

3> STORAGE (INITIAL 500K NEXT 500K PCTINCREASE 75);

Indeks skonkatenowany oparty na dwóch kolumnach tabeli PARTS. Jest on przechowywany w osobnej przestrzeni tabel przeznaczonej na wszystkie indeksy w bazie.

SQL> CREATE INDEX ind_parts ON PARTS (set_no, part_no)

2> TABLESPACE tbs_ind

3> STORAGE (INITIAL 1M NEXT 1M PCTINCREASE 0) PCTFREE 0;

0x01 graphic

Wskazówki:

Obsługa indeksów

Gdy poprawiana jest poindeksowana tabela, poprawiony lub utrzymany musi zostać również indeks.

Kompromis wydajności

Przy korzystaniu z indeksów wyważamy wydajność pomiędzy

Kiedy do tabeli wstawia się wiersz lub gdy wiersze są z niej usuwane, powiązane z nią indeksy również muszą zostać poprawione. Im więcej indeksów zbudowanych na tabeli, tym większy będzie narzut. Dlatego, jeśli tabela używana jest głównie do odczytu, istnienie wielu indeksów może pomóc. Jednak jeśli tabela jest często modyfikowana, lepiej mieć na niej mniej indeksów.

Indeksy pomagają, gdy modyfikuje się stosunkowo niewiele wierszy. Jeśli wykonywane jest wiele wstawień i usunięć, lepiej mieć mniej indeksów.

Indeksy są tworzone w domyślnej przestrzeni tabel, lecz przy ich budowaniu można podać inną przestrzeń. Umieszczenie indeksów i tabel, na których są one budowane w różnych przestrzeniach tabel - najlepiej na różnych urządzeniach - poprawia wydajność, ponieważ umożliwia równoległy dostęp do nich.

Kiedy indeks zostanie utworzony, segment zawierający go jest tworzony automatycznie w podanej lub domyślnej przestrzeni tabel.

Parametry klauzuli przestrzeni dla indeksów

Lepiej jest przechowywać indeksy w mniejszej liczbie większych obszarów, niż w wielu małych ekstentach, ponieważ wtedy informacje w indeksie są z większym prawdopodobieństwem rozłożone równomiernie i w sposób ciągły.

Jeśli tabela istnieje w czasie tworzenia indeksu, wszystkie bloki indeksu zostają zapełniane do wartości PCTFREE. Gdy do tabeli zostanie dodany nowy wiersz, odpowiadający mu zapis w indeksie musi zostać umieszczony w odpowiednim bloku (indeksu).

Wartość PCTFREE

Jeśli PCTFREE zostanie ustawione ze zbyt małym zapasem i nowego zapisu zabraknie miejsca w blokach indeksu, blok indeksu zostaje rozbity na wiele bloków

Jeśli PCTFREE jest zbyt duże, w blokach indeksu będzie dużo zmarnowanego miejsca.

Wartość INITRANS i MAXTRANS

Wartość dla INITRANS i MAXTRANS zależą od rozmiaru zapisów w indeksie i liczby równoczesnych transakcji, jakie będą korzystały z indeksu.

Niskie wartości INITRANS i MAXTRANS

Wartości dla INITRANS i MAXTRANS mogą być niskie jeśli

Jeśli wielu użytkowników wyda polecenie, które korzysta z indeksu, większa wartość INITRANS zapewni, że będzie dosyć miejsca na przeprowadzenie transakcji i wyeliminuje narzut potrzeby na tworzenie nowych pozycji dla transakcji. Większe MAXTRANS zapewni, iż użytkownicy nie będą musieli oczekiwać na zwolnienie się miejsca potrzebnego transakcji.

Jeśli parametry klauzuli przestrzeni nie zostaną podane jawnie, przyjmowane są domyślne wartości dla docelowej przestrzeni tabel.

Monitorowanie Indeksów

Jeśli wartości kluczy są często modyfikowane, dobrze jest kontrolować wykorzystanie przestrzeni indeksu.

Monitorowanie średniej efektywności wykorzystania przestrzeni indeksu można osiągnąć powtarzając następujące kroki:

Procedura monitorowania indeksów

Wykonuj kroki 1 i 2 regularnie, porównaj wyniki. Jeśli wykorzystanie przestrzeni w indeksie spadnie poniżej średniej, powinieneś skondensować przestrzeń indeksu poprzez usunięcie i ponowne utworzenie.

W celu przeanalizowania indeksu, skorzystaj z polecenia ANALYZE i bezpośrednio sprawdź zawartość perspektyw słownika danych dotyczących indeksów.

Wszystkie obszary pozostają zarezerwowane, aż do usunięcia indeksu.

Indeks może zostać usunięty jawnie bądź niejawnie poprzez usunięcie tabeli.

Obcięcie tabeli obcina również jej indeksy.

Po pierwsze, korzystamy z polecenia ANALYZE.

Składnia:

0x01 graphic

gdzie:

indeks identyfikuje indeks do przeanalizowania. Jeśli pominie się schemat Serwer Oracle zakłada, iż indeks jest w schemacie aktualnego użytkownika.

VALIDATE STRUCTURE sprawdza strukturę indeksu, generuje statystyki do perspektywy INDEX_STATS.

Przykład

SQL> ANALYZE INDEX tab_index VALIDATE STRUCTURE;

Index analyzed.

Zauważamy procent zużytej przestrzeni. W tym celu wykonujemy zapytania na perspektywach słownika danych.

Przyklad

Po przeanalizowaniu indeksu TAB_INDEX, dane dotyczące jego wykorzystania przestrzeni pojawiają się w perspektywie INDEX_STATS.

SQL> SELECT btree_space, used_space, pct_used

2> FROM index_stats

3> WHERE name = `TAB_INDEX';

BTREE_SPACE USED_SPACE PCT_USED

-------------------- ---------------------- --------------

1891 196 11

0x01 graphic

Wskazówki:

Modyfikacja indeksów

Parametry klauzuli przestrzeni dla indeksu oraz jego parametry dla transakcji można zmienić poleceniem ALTER INDEX.

Składnia:

0x01 graphic

gdzie:

schemat jest nazwą schematu, do którego należy indeks. Domyślnie - schemat aktualnego użytkownika.

PCFREE zmienia wartość PCTFREE.

INITRANS/MAXTRANS ustawia nowe wartości tych parametrów

STORAGE ustawia nowe wartości parametrów klauzuli przestrzeni.

ALLOCATE EXTENT jawnie alokuje następny ekstent dla indeksu.

SIZE określa rozmiar ekstentu w bajtach.

DATAFILE określa jeden z plików danych przestrzeni tabel indeksu jako ten, gdzie ma zostać umieszczony nowy ekstent.

INSTANCE czyni nowy ekstent dostępnym dla podanej instancji. Parametr ten wykorzystuje się jedynie w Serwer Oracle działających w trybie równoległym z opcją Serwera Równoległego.

Za pomocą polecenia ALTER INDEX, można zwolnić niewykorzystaną przestrzeń (DEALLOCATE UNUSED) lub szybko przebudować indeks (REBUILD).

Składnia cd.:

0x01 graphic

gdzie:

DEALLOCATE UNUSED wymusza zwolnienie nie wykorzystanej przestrzeni i pozwala na jej wykorzystanie w innych segmentach.

KEEP określa liczbę bajtów powyżej znacznika wysokiej wody (high water mark), jakie maja pozostać w indeksie po dealokacji.

REBUILD tworzy nowy indeks korzystając ze starego.

PARALLEL do zbudowania nowego indeksu ma zostać użyte numer równoległych procesów.

NOPARALLEL do tworzenia nowego indeksu nie mają być wykorzystane procesy równoległe. Jest to zachowanie domyślne.

RECOVERABLE określa, że tworzenie indeksu zostanie odnotowane w dzienniku powtórzeń. Jest to zachowanie domyślne.

UNRECOVERABLE określa, że tworzenie indeksu nie ma być odnotowane w dzienniku powtórzeń.

TABLESPACE określa przestrzeń tabel, gdzie indeks ma zostać ponownie zbudowany.

Przykłady

Zmiana wartości MAXTRANS na 5.

SQL>ALTER INDEX ind_emp_empno

2> MAXTRANS 5;

Index ALTERed

Nowe ekstenty nie będą większe od swych poprzedników.

SQL> ALTER INDEX ind_emp_empno

2> STORAGE (PCTINCREASE 0);

Index ALTERed

Ponowne tworzenie indeksu

Możliwe jest ponowne utworzenie indeksu przy wykorzystaniu istniejącego indeksu jako źródła danych. Tworzenie indeksu w ten sposób pozwala na zmianę charakterystyki przechowywania indeksu, przeniesienie go do innej przestrzeni tabel. Można również w ten sposób usunąć fragmentację. Faktycznie, w porównaniu z usunięciem i ponownym utworzeniem indeksu za pomocą polecenia CREATE INDEX taki sposób tworzenia indeksu jest wydajniejszy.

Usuwanie indeksu

Indeks usuwa się poleceniem DROP INDEX. Indeks należy usunąć gdy

Składnia:

0x01 graphic

Przykład

Usunięcie indeksu IND_PARTS.

SQL> DROP INDEX ind_parts;

Index dropped.

Kiedy usuwa się tabelę, zbudowane na niej indeksy są również usuwane.

Podsumowanie

Segmenty zawierają wszystkie dane specyficznej struktury wewnątrz przestrzeni tabel. Segment składa się z jednego lub więcej ekstentów.

Własności segmentu

Typ segmentu

Opis

Data

Zawiera dane

Index

Dostarcza efektywnej drogi wyszukiwania wierszy w tabeli.

0x01 graphic

Zadania

Utwórz przestrzeń tabel INDEX_DATA o rozmiarze 1MB z pctincrease = 0

Połącz się jako DEMO, skopiuj do katalogu z:\sql skrypt s:\create_tables.sql, zmodyfikuj go tak aby tabele EMP i DEPT zostały utworzone z następującymi parametrami: ekstent inicjalny 6K, następny 6K, pctincrease=0, pctfree=10 pctused=70, początkowo 2 ekstenty, maksymalnie 30, w przestrzeni tabel USER_DATA i uruchom skrypt ;

Połączony jako DEMO utwórz indeks non-unique EMP_JOB na tabeli EMP oparty na kolumnie job w przestrzeni tabel INDEX_DATA

Połączony jako DEMO wykonaj polecenie ANALYZE, aby zebrać dane o wykorzystaniu przestrzeni przez indeks EMP_JOB ;

Połączony jako DEMO obejrzyj odpowiednie perspektywy i określ jak wiele miejsca zajmuje indeks EMP_JOB. Jakie inne indeksy są utworzone w schemacie DEMO? Skąd się tam wzięły?

Połączony jako DEMO dodaj do tabeli EMP dane wykonując skrypt s:\more_emp.sql

Połączony jako DEMO usuń i utwórz na nowo indeks EMP_JOB, zbierz statystykę i określ miejsce jakie zajmuje indeks. Co się stało?

Połączony jako DEMO usuń indeks

Połączony jako DEMO skopiuj skrypt s:\create_tables.sql do katalogu z:\sql, zmodyfikuj go tak, by utworzył tabelę EMP z parametrami initial=2K, next=2K, pctincrease=0, PCTUSED=80, PCTFREE=10 i uruchom go, a następnie uruchom skrypt s:\more_emp.sql

Połączony jako DEMO zmodyfikuj skrypt z:\sql\create_tables.sql tak, by utworzył tabelę EMP1 z parametrami initial=2K, next=2K, pctincrease=0, PCTUSED=50, PCTFREE=40 i uruchom go, a następnie skopiuj skrypt s:\more_emp do z:\sql i zmodyfikuj go tak, by dodawał wiersze do tabeli EMP1

Sprawdź wielkość segmentów tabel EMP i EMP1. Czy tabele utworzone w ćwiczeniu 67 różnią się wielkością od tabel utworzonych w ćwiczeniu 68?

Usuń tabele EMP, DEPT, EMP1, DEPT1

W bazie potrzebna jest tabela, w której będą przechowywane dane statyczne i która będzie bardzo często przeglądana. W celu rozłożenia operacji I/O na kilka urządzeń utworzymy tę tabelę w przestrzeni tabel rozłożonej na trzech dyskach

Podłączony jako sysdba utwórz przestrzeń tabel STRIPE rozłożoną na trzech plikach, każdy po 110K o następujących nazwach e:\kurs\database\db#\s1adm#.ora, e:\kurs\database\db#\s2adm#.ora, e:\kurs\database\db#\s3adm#.ora i upewnij się, czy jest włączona

Jaka jest w tym momencie ilość wolnego miejsca w przestrzeni tabel STRIPE?

W przestrzeni tabel STRIPE utwórz tabelę BUSY z pojedynczym pierwszym ekstentem o rozmiarze 300K. Co się stało?

W przestrzeni tabel STRIPE utwórz tabelę BUSY, tak aby tabela powstała i ilość miejsca zarezerwowana na początku wynosiła 300K ;

Ile zostało wolnego miejsca w przestrzeni tabel SPRIPE?

Usuń przestrzeń tabel STRIPE.

Obejrzyj perspektywę DBA_FREE_SPACE? Skąd wzięło się tyle ekstentów?

Sprawdź stopień pofragmentowania przestrzeni tabel w perspektywie DBA_FREE_SPACE_COALESCE. Które przestrzenie tabel trzeba zdefragmetować?

Wykonaj defragmentację wszystkich przestrzeni tabel, które tego wymagają, a następnie sprawdź ponownie perspektywę DBA_FREE_SPACE_COALESCE.

X. Obsługa klastrów

Cele

W tej lekcji będziemy omawiać zarządzanie segmentami klastrowymi Oracle, w tym sposoby określania rozmiaru klastrów i klastrów haszujących.

Po przerobieniu tej lekcji powinieneś być w stanie:

Ta lekcja zawiera materiał specyficzny dla pewnych konfiguracji lub implementacji Oracle. Instruktor może ograniczyć omawianie tego tematu w zależności od potrzeb słuchaczy. Pełny tekst, ćwiczenia i rozwiązania mogą być wykorzystane w samodzielnej nauce.

Przegląd

Segmenty danych zawierają dane wstawiane do tabel.

Cechy Segmentu Danych

Typy Segmentu Danych

Funkcja

Klaster indeksowy

(index cluster)

Zawiera wiersze jednej lub wielu tabel pogrupowane fizycznie na podstawie wartości pewnej kolumny tabeli.

Klaster haszujący

(hash cluster)

Zawiera wiersze pewnej tabeli pogrupowane fizycznie przez zastosowanie algorytmu haszowania.

Klastry Indeksowe

Utworzenie klastra (cluster) to opcjonalna metoda przechowywania tabel, która może poprawić wydajność I/O i zmniejszyć narzut wykorzystania przestrzeni. Klucz klastra (cluster key) stanowią kolumny wspólne dla sklastrowanych tabel. Indeks klastra (cluster index) jest indeksem utworzonym na kluczowych kolumnach klastra.

0x01 graphic

Tabele w klastrze:

Zalety użycia klastrów

Teoretycznie maksymalna liczba kolumn klucza klastra wynosi 16. Praktycznie zależy ona od rozmiaru bloku danych, ponieważ rozmiar wartości klucza klastra nie może przekraczać jednej trzeciej rozmiaru bloku danych.

Klastry mogą zwiększyć efektywność zapytań, ale mogą zmniejszyć efektywność operacji wstawiania, modyfikacji i usuwania oraz pełnego przeglądania tabeli.

Przechowywanie tabeli w klastrze wymaga większej liczby bloków danych w porównaniu do tabeli samodzielnej, ponieważ bloki danych w klastrze są dzielone. Jeśli w klastrze jest tylko jedna tabela, ten narzut jest jednak nieznaczny. Stąd właśnie potencjalne zmniejszanie efektywności poleceń DML. Ogólnie, czasami nie warto przechowywać w klastrze bardzo często aktualizowanej tabeli.

Aplikacje używają tabel sklastrowanych automatycznie. Istnienie klastrów jest niewidoczne dla użytkowników i aplikacji.

Jeśli sklastrowanych jest wiele tabel, pełny przegląd tabeli staje się wolniejszy, ponieważ muszą być przeglądane wszystkie rekordy wszystkich tabel. Klaster z pojedynczą tabelą nie ma tej wady.

Zarządzanie Klastrami

Pewne tabele dobrze nadają się do klastrowania.

Tabele Kandydujące do Klastra

Kluczem klastra jest kolumna lub grupa kolumn wspólna dla klastrowanych tabel. Każda tabela w klastrze musi mieć kolumnę lub kolumny o typie i rozmiarze pasującym do klucza klastra.

Klucz Klastra

Dobrymi kluczami klastra są kolumny:

Mniej odpowiednimi kolumnami dla klucza klastra są kolumny:

Zasady

Indeks klastra (cluster index) to indeks utworzony dla klastra zdefiniowany na kolumnach jego klucza.

Indeks klastra

Indeks klastra różni się od indeksu tabeli tym, że:

Zasady

Zarządzanie Klastrami

Klaster i jego indeks mogą być przechowywane w różnych przestrzeniach tabel.

Klaster i jego indeks powinny być tworzone w oddzielnych przestrzeniach tabel i na różnych urządzeniach fizycznych tak, aby dane tabel i indeksu mogły być jednocześnie dostępne przy minimalnej rywalizacji o dysk.

Bloki danych klastra mają taki sam format jak niesklastrowane bloki danych z wyjątkiem dodatkowych danych na słownik tabel.

Przydział i użycie przestrzeni przez dane klastra kontrolujemy za pomocą parametrów wykorzystania przestrzeni.

Parametry Przestrzeni

Parametry przestrzeni PCTFREE oraz PCTUSED stosują się do całego klastra (a nie do poszczególnych tabel).

Parametr SIZE wyznacza maksymalną liczbę wartości klucza klastra, które mogą być przechowywane w pojedynczym bloku danych.

Parametr SIZE:

Domyślnie serwer Oracle przechowuje jeden klucz klastra i związane z nim wiersze w jednym bloku danych.

Mimo, że parametr SIZE wyznacza maksymalną liczbę kluczy klastra przechowywanych w pojedynczym bloku, w bloku może być mniej kluczy klastrowych. Na przykład jeśli z jednym z kluczy związanych jest wiele wierszy, w bloku może być przechowywane tylko jeden klucz klastra.

Przy wyborze wartości parametru wykorzystania przestrzeni SIZE powinniśmy rozważyć dwa warunki:

Tworzenie klastra

Do tworzenia klastra służy polecenie CREATE CLUSTER.

Składnia:

0x01 graphic

0x01 graphic

gdzie:

schemat schemat, który ma zawierać klaster. Domyślnie schemat bieżącego użytkownika.

klaster jest nazwa klastra.

SIZE określa rozmiar przestrzeni (w bajtach, kilobajtach lub megabajtach) na umieszczenie wszystkich wierszy z określoną wartością klucza.

INDEX tworzy klaster indeksowy.

0x01 graphic

Uwaga: Inne opcje były już omawiane.

Po utworzeniu klastra, mogą w nim być tworzone tabele. Jednakże zanim zostaną wstawione wiersze do sklastrowanych tabel, trzeba utworzyć indeks klastra. Użycie klastrów nie pozbawia nas możliwości stosowania dodatkowych indeksów na tabelach w klastrze - mogą one być tworzone i usuwane w zwykły sposób.

Tworzenie Indeksu Klastra

Składnia:

0x01 graphic

gdzie:

schemat to schemat gdzie ma być indeks.

indeks to nazwa tworzonego indeksu.

klaster określa klaster, na którym tworzony jest indeks.

Przy tworzeniu indeksu klastra stosujemy te same zasady co dla zwykłych indeksów.

Przykłady

Utworzenie klastra o nazwie CLUSTER_T1_T2 z kolumną DEPTNO stanowiącą klucz klastra. Klaster ma być umieszczony w przestrzeni tabel TBS_DATA. Na przechowanie grupy wierszy ma być przeznaczone 400 bajtów, pierwszy ekstent ma mieć 30 KB.

SQL> CREATECLUSTER cluster_T1_T2 (dept NUMBER (3))

2> SIZE 400

3> TABLESPACE tbs_data

4> STORAGE (INITIAL 30K);

SQL>CREATE INDEX i_clu_T1_T2

2> ON CLUSTER cluster_T1_T2

3> TABLESPACE tbs_index;

SQL> CREATE TABLE T1 (name VARCHAR2 (20), hire_date DATE,

2> deptno NUMBER (3))

3> CLUSTER cluster_T1_T2 (deptno);

SQL>CREATE TABLE T2 (deptno NUMBER (3),

2> deptname VARCHAR2 (15))

3> CLUSTER cluster_T1_T2 (deptno);

Modyfikowanie Klastra

Do modyfikacji klastra służy polecenie ALTER CLUSTER.

W klastrze można zmodyfikować

Składnia:

0x01 graphic

gdzie:

schemat jest schematem zawierającym klaster. Domyślnie schemat bieżącego użytkownika.

klaster to nazwa modyfikowanego klastra

SIZE określa nowy rozmiar.

ALLOCATE EXTENT jest rozmiarem (KB lub MB) dodawanego ekstentu.

SIZE domyślnie używane są parametry zarządzania przestrzenią klastra

DATAFILE jest jednym z plików danych należących do przestrzeni tabel klastra. Jeśli nie jest podany, wyboru dokona serwer Oracle.

INSTANCE jest używane w trybie równoległym do określenia numeru instancji, która ma używać klastra. Domyślną wartością jest ALL (wszystkie).

Opcje PCTUSED, PCTFREE, INITRANS, MAXTRANS i klauzula_przestrzeni zmieniają wartości parametrów bloku i ekstentu.

Nowe wartości dla parametrów PCTFREE, PCTUSED i SIZE stosują się do wszystkich bloków danych klastra (w tym już istniejących, jak i nowo przydzielanych). Jednak bloki utworzone wcześniej nie są reorganizowane natychmiast. Zmiany następują w miarę potrzeby. Parametry zarządzania przestrzenią INITIAL i MINEXTENTS nie mogą być zmieniane.

Zmiany INITRANS stosują się tylko do nowo dodawanych bloków danych. Zmiany MAXTRANS dotyczą wszystkich bloków.

Przykłady

Zmienić w klastrach CLU1, CLU2, CLU3 parametry wykorzystania przestrzeni i wykorzystania bloku.

SQL> ALTER CLUSTER clu1

2> STORAGE (NEXT 200K PCTINCREASE 33);

SQL>ALTER CLUSTER clu2

2> SIZE 512;

SQL> ALTER CLUSTER clu3

2> PCTFREE 40 PCTUSED 10;

Sklastrowane tabele mogą być modyfikowane poleceniem ALTER TABLE. Jednak polecenia modyfikacji parametrów wykorzystania przestrzeni bloków, zapisów transakcji i zarządzania przestrzenią są ignorowane. Trzeba je zmieniać na poziomie klastra.

Usuwanie Klastra

Kiedy klaster nie jest potrzebny, można go usunąćpoleceniem DROP CLUSTER.

Kiedy klaster jest usuwany:

Składnia:

0x01 graphic

gdzie:

schemat to schemat zawierający usuwany klaster. Domyślnie schemat bieżącego użytkownika.

klaster to nazwa usuwanego klastra.

INCLUDING TABLES powoduje usunięcie tabel należących do klastra. Jeśli nie jest podane a, nie wszystkie tabele z klastra zostały usunięte, operacja się nie powiedzie i spowoduje błąd.

CASCADE CONSTRAINTS usuwa wszystkie związane referencyjne warunki integralności. Jeśli nie jest podane istnienie takich warunków spowoduje błąd.

Przykład

Usunięcie klastra CLU1 i wszystkich jego tabel.

SQL> DROP CLUSTER clu1

2> INCLUDING TABLES;

lub

SQL> DROP TABLE T1;

SQL> DROP TABLE T2;

SQL> DROP CLUSTER T1_T2;

Poszczególne tabele mogą być usuwane z klastra poleceniem DROP TABLE. Podczas usuwania pojedynczej tabeli:

Możemy usuwać indeks klastra aby zmienić parametry wykorzystania przestrzeni lub położenie indeksu klastra. Jednak musimy odtworzyć indeks klastra aby mieć dostęp do danych w tabelach klastra.

Zalety i Wady Klastrów Indeksowych

Haszowanie

Haszowanie (hashing) to inny sposób przechowywania danych tabeli poprawiający efektywność wyszukiwania danych.

Typowe Zastosowania Haszowania

Haszowania używamy kiedy

0x01 graphic

Uwaga: Aby zastosować haszowanie, tabela musi być sklastrowana. Przed utworzeniem tabeli używającej algorytmu haszowania musi być utworzony klaster haszujący.

0x01 graphic

Funkcja Haszująca

Funkcja haszująca (hash function) jest funkcją, która zastosowana na kluczu klastra zwraca wartość haszującą.

Funkcja haszująca:

Kolizje mają miejsce kiedy dwie wartości klucza klastra dają w wyniku identyczną wartość haszującą. Użytkownik może wskazać kolumnę spełniającą takie kryteria, która ma być używana jako funkcja haszująca. Rozważania dotyczące opcji HASH IS (haszem jest) znajdują się w dalszej części tego rozdziału.

Tworzenie Klastra Haszującego

Do tworzenia klastra haszującego służy polecenie CREATE CLUSTER.

Składnia:

0x01 graphic

0x01 graphic

Uwaga: To nie jest pełna składnia polecenia.

gdzie:

schemat jest nazwą schematu tworzonego klastra. Domyślnie schemat bieżącego użytkownika.

klaster to nazwa tworzonego klastra.

SIZE określa rozmiar przestrzeni (w bajtach) na przechowanie wszystkich wierszy z tą samą wartością klucza haszującego. Domyślnie jeden blok.

HASHKEYS określa, że ma być utworzony klaster haszujący (domyślnie zostałby utworzony klaster indeksowy). Pozwala także na ustawienie liczby wartości haszujących. Jeśli podana liczba nie jest liczbą pierwszą, serwer Oracle wybiera następną większą liczbę pierwszą.

HASH IS specyfikuje kolumnę dostarczającą wartości haszujących. Zastępują one WYNIKI funkcji haszującej. Podana kolumna musi być jedyną kolumną klucza klastra i zawierać tylko liczby naturalne).

0x01 graphic

Uwaga: Inne opcje były omawiane wcześniej. Liczba wartości haszujących klucza haszującego jest ustalona w momencie jego tworzenia.

Ustawienie Liczby Wartości Haszujących

Wartość HASHKEYS podawana przy tworzeniu klastra haszującego wyznacza prawdopodobieństwo, że dwa klucze klastra będą miały tę samą wartość haszującą (wystąpi kolizja). Jeśli występuje wiele kolizji, musi być zwiększony rozmiar klucza haszującego i wtedy mniej kluczy mieści się w pojedynczym bloku danych. Minimalizacja liczby kolizji jest istotna, ponieważ na przechowywanie wierszy z kolidującymi wartościami klucza klastra mogą być niezbędne bloki nadmiarowe. Zakładając równomierny rozkład funkcji haszującej, jeśli HASHKEYS jest n, dane mają szanse spowodowania kolizji 1/n.

Liczbę kluczy haszujących przypisanych do pojedynczego bloku danych określamy za pomocą parametru SIZE. Parametr SIZE powinien być ustawiony na średni rozmiar przestrzeni potrzebnej na przechowanie wszystkich wierszy z danym kluczem haszującym.

Ustawienie Liczby Kluczy Haszujących na Blok Danych

Wartości parametrów HASHKEYS i SIZE mają wpływ na umieszczenie danych w blokach klastra haszującego.

Bloki Klastra Haszującego

Przykład

Tworzenie klastra haszującego EMP_H_CLU na kolumnie JOB w przestrzeni tabel TS_USERS. Zakładamy rozmiar bloku 2K i rozmiar przestrzeni danych w bloku 1800 bajtów. Zakładamy też, że SIZE został oszacowany na 500 bajtów, a istnieje 40 stanowisk (wartości haszujących).

SQL> CREATE CLUSTER emp_h_clu (JOB VARCHAR2 (9))

2> TABLESPACE ts_users

3> SIZE 500

4> HASHKEYS 40;

Cluster created

Serwer Oracle w każdym bloku będzie przechowywał po 3 klucze haszujące. Całkowita liczba kluczy haszujących będzie 41 (następna liczba pierwsza większa niż 40).

Serwer Oracle oblicza liczbę kluczy haszujących na blok przez podzielenie dostępnej przestrzeni przez wartość SIZE i zaokrąglenie wyniku w dół. Serwer Oracle od razu rezerwuje odpowiednią liczbę bloków na wszystkie klucze haszujące. W tym przykładzie są 3 klucze na blok, jest 41 kluczy, tak więc początkowo klaster będzie zawierał 14 bloków. Innymi słowy serwer Oracle uważa, że w klastrze haszującym istnieje 14 bloków danych, nawet jeśli tabela nie wymaga 14 bloków przestrzeni.

Parametr HASH IS

Przez parametr HASH IS wskazujemy kolumnę, której wartości mają być używane jako wartości haszujące.

Kolumna HASH IS

Przykłady

Utworzenie klastra haszującego EMP_RAISE w przestrzeni tabel TS_USERS. Jako funkcję haszującą wykorzystujemy kolumnę EMPLOYEE_NUMBER. Specyfikujemy 1000 wartości haszujących. Przeznaczamy 55 bajtów na przechowanie wierszy z tą samą wartością haszującą.

SQL>CREATE CLUSTER emp_raise (employee_number NUMBER (4))

2> TABLESPACE ts_users

3> HASHKEYS 1000

4> HASH IS employee_number

5> SIZE 55;

Cluster created.

Utworzenie tabeli COMPENSATION w klastrze EMP_RAISE.

SQL> CREATE TABLE compensation

2> (empno NUMBER (4), ename VARCHAR2 (10),

3> sal NUMBER (10, 2), comm NUMBER (9,0))

4> CLUSTER emp_raise (empno);

Table created.

0x01 graphic

Uwaga: W tym przykładzie parametr SIZE jest mniejszy niż w poprzednim. Możemy założyć, że EMPNO (numer pracownika) jest unikalny i że będzie prawdopodobnie tylko jeden wiersz przypadający na każdą wartość haszującą. Jest to prawdopodobne kiedy podana kolumna zawiera unikalne, równo rozłożone wartości, a wartość HASHKEYS podamy wystarczająco dużą, aby przewyższyła oczekiwaną liczbę wartości w kolumnie. Istnieje większe prawdopodobieństwo kolizji, kiedy jest więcej różnych wartości niż HASHKEYS lub jeśli w wartościach kolumny są przerwy (czyli wartości kolumny nie są równo rozłożone).

Funkcja Haszująca Definiowana przez Użytkownika

Przykład

Utworzenie klastra haszującego zawierającego informacje o pracownikach, gdzie kluczem klastra jest kod zbudowany na podstawie określonej przez użytkownika kombinacji danych o miejscu zamieszkania.

HASH IS MOD((home_area_code+ home_prefix+ home_suffix),101)

Modyfikacja Klastra Haszującego

Do modyfikacji klastra haszującego służy polecenie ALTER CLUSTER.

Składnia:

0x01 graphic

gdzie:

schemat jest nazwą schematu klastra.

klaster jest nazwą modyfikowanego klastra

STORAGE określa nowe wartości dla rozszerzania klastra (MINEXTENS i INITIAL nie mogą być zmienione).

ALLOCATE EXTENT określa SIZE, DATAFILE i INSTANCE używane przy nowym, jawnie rezerwowanym ekstencie.

Parametry PCTUSED, PCTFREE i INITRANS dotyczą tylko nowych bloków.

W klastrze haszującym modyfikujemy parametry zarządzania przestrzenią, wykorzystania przestrzeni bloków danych i ustawienia zapisów transakcji.

Przykład

Modyfikacja klastra haszującego EMP_RAISE w celu zmiany pewnych parametrów zarządzania przestrzenią.

SQL>ALTER CLUSTER emp_raise

2> STORAGE (NEXT 400K PCTINCREASE 0 MAXEXTENTS 5);

Cluster altered

Parametry SIZE, HASHKEYS i HASH IS nie mogą być zmieniane poleceniem ALTER CLUSTER.

W celu modyfikacji SIZE, HASHKEYS lub HASH IS konieczne jest ponowne utworzenie klastra i ponowne załadowanie danych.

Dodatkowe ekstenty klastra haszującego potrzebne są tylko na bloki nadmiarowe.

Usuwanie Klastra Haszującego

Do usuwania klastrów haszujących służy polecenie DROP CLUSTER.

Składnia:

0x01 graphic

gdzie:

schemat to schemat zawierający usuwany klaster.

klaster to nazwa usuwanego klastra

INCLUDING TABLES powoduje usuniecie tabel należących do klastra. Jeśli nie jest podane a nie wszystkie tabele z klastra zostały usunięte, operacja się nie powiedzie i spowoduje błąd.

CASCADE CONSTRAINTS usuwa wszystkie związane referencyjne warunki integralności.

Przykład

Usuwanie klastra haszującego EMP_RAISE razem z jego tabelami.

SQL> DROP CLUSTER emp_raise

2> INCLUDING TABLES;

Cluster dropped

Zalety i Wady Klastrów Haszujących

Podsumowanie

Segmenty danych zawierają dane wstawiane do tabel.

Cechy Segmentu Danych

Typ Segmentu Danych

Funkcja

Klaster indeksowy

(index cluster)

Zawiera wiersze jednej lub wielu tabel pogrupowane fizycznie na podstawie wartości pewnej kolumny tabeli.

Klaster haszujacy

(hash cluster)

Zawiera wiersze pewnej tabeli pogrupowane fizycznie przez zastosowanie algorytmu haszowania.

0x01 graphic

Zadania

Utwórz przestrzeń QUERY_DATA na pliku e:\kurs\database\db#\qradm#.ora o rozmiarze 100K i parametrach initial 5K, next 5K, pctincrease 0, inne parametry domyślne

Podłącz się jako DEMO i utwórz tabelę o nazwie S_EMP w przestrzeni tabel QUERY_DATA z następującymi kolumnami:

ID NUMBER(6)

FIRST_NAME VARCHAR2(20)

LAST_NAME VARCHAR2(25)

DEPTNO NUMBER(3)

Będąc podłączony jako DEMO utwórz klaster haszujący o nazwie EMP_HCLUSTER na 100 wartości kluczy opartych na kolumnie LAST_NAME tabeli S_EMP. Każdy klucz klastra ma mieć rozmiar 100 bajtów. Wykorzystaj przestrzeń tabel QUERY_DATA

Będąc podłączony jako DEMO w klastrze EMP_HCLUSTER utwórz tabelę H_EMP z takim kolumnami jak tabela S_EMP.

Będąc podłączony jako DEMO utwórz klaster indeksowy o nazwie DEPT_EMP_ICLUSTER. Kolumna klucza klastra powinna być typu NUMBER(3). Pozostaw wartości domyślne wszystkich parametrów oprócz następujacych:

TABLESPACE QUERY_DATA

SIZE 600

INITIAL EXTENT 6000

Będąc podłączony jako DEMO utwórz indeks klastra DEPT_EMP_ICLUSTER w przestrzeni tabel QUERY_DATA z domyślnymi pozostałymi parametrami.

Będąc podłączony jako DEMO skopiuj tabelę S_EMP do klastra DEPT_EMP_ICLUSTER używając klomny deptno tej tabeli jako kolumny klucza klastra. Kopię tabeli nazwij I_EMP.

Będąc podłaczony jako DEMO utwórz tabelę I_DEPT w klastrze DEPT_EMP_ICLUSTER. Tabela I_DEPT powinna mieć następujące kolumny:

ID NUMBER(3)

NAME VARCHAR(15)

Do klucza klastra uzyj odpowiedniej kolumny.

Będąc podłączony jako DEMO w perspektywie USER_SEGMENTS obejrzyj ile przestrzeni zajmuje każdy obiekt w przestrzeni tabel QUERY_DATA.

XI. Obsługa więzów integralności

Cele

Lekcja ta wyjaśnia, w jaki sposób utrzymywać spójność danych i deklaratywne więzy integralności.

Po przerobieniu tej lekcji powinieneś potrafić:

Przegląd

Charakterystykę danych w tabeli definiujemy za pomocą więzów integralności.

Więzy integralności

Więzy definiuje się przy:

Więzy mogą być:

Naruszenia więzów mogą być zapisywane w tabeli wyjątków (exceptions table).

Słownik danych zawiera wiele pomocnych informacji o więzach.

Spójność danych i więzy integralności

Integralność danych gwarantuje, że dane w bazie spełniają predefiniowany zastaw więzów lub reguł biznesowych. Kiedy tylko to możliwe należy korzystać z deklaratywnych więzów integralności.

Deklaratywne więzy integralności

Zalety deklaratywne więzów integralności

Wady deklaratywnych więzów integralności

W niektórych przypadkach do wymuszenia spójności danych korzysta się z wyzwalaczy.

Przykład

Złożone reguły biznesowe mogą zostać wymuszone za pomocą wyzwalaczy. Poniżej mamy kontrolę zmian pensji.

CREATE TRIGGER increase_chk

BEFORE UPDATE OF salary

ON s_emp FOR EACH ROW WHEN (NEW.salary <OLD.salary OR

NEW.salary>1.1* OLD.salary)

BEGIN

Raise_application_error(-20502,

`May not decrease salary. Increase must be<10 % `);

END;

Typy więzów

Za pomocą więzów integralności można wymusić kilka typów spójności danych.

Typy więzów integralności

Definiowanie Więzów

Więzy można deklarować w momencie tworzenia tabeli. Korzysta się wtedy z polecenia CREATE TABLE i dodaje w nim definicje więzów.

Składnia:

0x01 graphic

gdzie:

schemat jest właścicielem tabeli.

tabela jest nazwą tabeli.

kolumna określa nazwę kolumny w tabeli.

typ_kolumny jest typem danych kolumn

DEFAULT określa wartość jaka ma być wstawiona do kolumny jeśli zostanie ona pominięta w poleceniu INSERT.

column_constraint definiuje więz integralności jako część definicji kolumny.

table_constraint definiuje więz integralności jako część definicji tabeli.

Więzy mogą zostać zdefiniowane albo przy kolumnie - inline albo jako część definicji tabeli - out-of-line. Więzy przy kolumnach wprowadzają reguły dotyczące tylko tej kolumny, przy której są definiowane. Więz przy kolumnie jest specyfikowany jako fragment definicji kolumny.

Składnia:

Column_constraint::=

0x01 graphic

gdzie:

CONSTRAINT identyfikuje więz za pomocą nazwy constraint. Nazwa jest przechowywana w bazie.

NULL określa, że dla kolumny dopuszczalne są wartości null. Ustawienie domyślne.

NOT NULL oznacza, że w kolumnach nie może być wartości null.

UNIQUE definiuje kolumnę lub kombinację kolumn jako nie powtarzalne (unique).

PRIMARY KEY definiuje kolumnę lub kombinację kolumn jako klucz tabeli.

FOREIGN KEY definiuje kolumnę lub kombinację kolumn jako klucz obcy.

REFERENCES identyfikuje klucz główny lub unique, który jest wskazywany przez klucz obcy.

ON DELETE CASCADE specyfikuje, iż Serwer Oracle utrzymuje spójność referencyjną poprzez automatyczne usuwanie wierszy z zależnymi wartościami klucza obcego gdy usuwana jest wartość z klucza głównego lub unique.

CHECK definiuje warunek, który musi być spełniony dla każdego wiersza.

USING INDEX określa parametry indeksu, jakiego Serwer Oracle używa do wymuszenia klucza głównego lub klucza unique. Nazwa indeksu jest taka sama jak nazwa constraintu.

NOSORT oznacza, że wiersze są posortowane w porządku rosnącym i Oracle nie musi ich sortować przy tworzeniu indeksu.

DISABLE wyłącza więz integralności. Jeśli więz integralności jest wyłączony, Serwer Oracle nie wymusza go.

Więzy out-of-line są częścią definicji tabeli i mogą definiować reguły dla dowolnych kolumn tabeli. Więz taki specyfikowany jest po wyspecyfikowaniu wszystkich kolumn tabeli.

Składnia:

Table_constraint::=

0x01 graphic

gdzie:

CONSTRAINT identyfikuje więz za pomocą nazwy constraint. Nazwa jest przechowywana w bazie.

NULL określa, że dla kolumny dopuszczalne są wartości null. Ustawienie domyślne.

NOT NULL oznacza, że w kolumnach nie może być wartości null.

UNIQUE definiuje kolumnę lub kombinację kolumn jako nie powtarzalne (unique).

PRIMARY KEY definiuje kolumnę lub kombinację kolumn jako klucz tabeli.

FOREIGN KEY definiuje kolumnę lub kombinację kolumn jako klucz obcy.

REFERENCES identyfikuje klucz główny lub unique, który jest wskazywany przez klucz obcy.

ON DELETE CASCADE specyfikuje, iż Serwer Oracle utrzymuje spójność referencyjną poprzez automatyczne usuwanie wierszy z zależnymi wartościami klucza obcego gdy usuwana jest wartość z klucza głównego lub unique.

CHECK definiuje warunek, który musi być spełniony dla każdego wiersza.

USING INDEX określa parametry indeksu, jakiego Serwer Oracle używa do wymuszenia klucza głównego lub klucza unique. Nazwa indeksu jest taka sama jak nazwa constraintu.

NOSORT oznacza, że wiersze są posortowane w porządku rosnącym i Oracle nie musi ich sortować przy tworzeniu indeksu.

DISABLE wyłącza więz integralności. Jeśli więz integralności jest wyłączony, Serwer Oracle nie wymusza go.

Więzy inline (przy kolumnie) i więzy out-of-line (na poziomie tabeli) są funkcjonalnie takie same. Jednak, do definicji złożonych kluczy (zostaną omówione w następnej sekcji) konieczne jest użycie więzów na poziomie tabeli.

Więzy mogą być w momencie deklaracji nazwane.

Nazwy więzów

Jeśli nazwa constrainta nie zostanie wyspecyfikowana, Serwer Oracle przypisuje mu niepowtarzalną nazwę w formacie: SYS_C00n. Sugerowanym formatem nazw dla więzów jest: NAZWATABELI_TYPWIĘZU_NAZWAKOLUMNY.

Dla przykładu, więz klucza głównego na kolumnie EMPNO w tabeli EMP może otrzymać nazwę EMP_PK_EMPNO.

Więzy Not Null

Więzy NOT NULL używa się gdy kolumna musi zawierać wartości. Więz NOT NULL zapewnia, iż wstawienia i modyfikacje tej kolumny muszą podawać wartość.

0x01 graphic

Przykład

Wymuszenie constrainta NOT NULL dla kolumny ACCOUNT w tabeli LOANS.

SQL>CREATE TABLE loans (

2> Account NUMBER (6,0) CONSTRAINT loans_nn_account

3> NOT NULL,

. . .) ;

Table created.

Więzy NOT NULL powinny być definiowane dla kolumn, które absolutnie wymagają podawania przez cały czas wartości (np. kolumny klucza obcego obowiązkowego związku).

Każde polecenie, które próbuje umieścić w podanej kolumnie NULL'a jest wycofywane a błąd wymazywany.

NOT NULL może zostać przetłumaczony na CHECK (column_name IS NOT NULL).

Więzy Unique

Więzy integralności unique zapewniają, iż ma w tabeli dwóch wierszy posiadających duplikaty wartości w wyspecyfikowanych kolumnach lub zbiorze kolumn.

0x01 graphic

Przykład

Tworzenie tabeli LOANS. Definicja constraintów not null i unique dla kolumny LOAN_NUMBER.

SQL>CREATE TABLE loans(

2> . . . ,

3> loan_number NUMBER (6,0) CONSTRAINT loan_nn_loanno

4> NOT NULL

5> CONSTRAINT loan_uk_loanno

6> UNIQUE

7> USING INDEX TABLESPACE

8> indexes_ts

9> STORAGE (INITIAL500K

10> NEXT 100K),

. . .);

Table created.

W celu wymuszenia klucza unique tworzony jest automatycznie indeks.

Nazwa indeksu jest taka jak nazwa constrainta.

Więzy Check

Za pomocą więzów check zapewniamy, że dla każdego wiersza tabeli spełniony (lub nieokreślony) jest warunek nałożony na kolumnę lub zbiór kolumn.

Przykład

Tworzenie tabeli LOANS i definicja constrainta check na kolumnie LOAN_TYPE.

SQL>CREATE TABLE loans(

2> . . . ,

3> loan_type VARCHAR2 (8) CONSTRAINT loans_ck_ltype

4> CHECK (loan_type IN (`PERS', `HOME', `AUTO')),

5> . . .);

Table created.

Jedna kolumna może mieć wiele więzów typu check. Nie ma limitu liczby więzów check dla kolumny.

Więzy klucz głównego

Za pomocą klucza głównego definiuje się kolumnę lub zbiór kolumn, których wartości jednoznacznie identyfikują każdy wiersz tabeli. Tabela może mieć tylko jeden klucz główny.

0x01 graphic

Przykład

Definicja klucza głównego na kolumnie ACCOUNT w tabeli LOANS.

SQL>CREATE TABLE loans (

2> account NUMBER (6,0) CONSTRAINT loans_pk_account

3>  PRIMARY KEY,

4> . . .);

Table created.

Przykład

Definicja złożonego klucza głównego na kolumnach ACCOUNT i LOAN_NUMBER w tabeli LOANS.

SQL>CREATETABLE loans (account NUMBER (6,0),

2>  loan_number NUMBER (6,0),

3> . . . ,

4> CONSTRAINT loans_PK_acctloan

5> PRIMARY KEY(account, Loan_number),

6> . . .);

Table created.

Więzy klucza obcego

Za pomocą klucza obcego zapewniamy, iż wartości z kolumn klucza istnieją we wcześniej zdefiniowanym kluczu głównym lub kluczu unique w innej lub tej samej tabeli.

0x01 graphic

0x01 graphic

Przykład

Tworzenie tabel z powiązanymi ze sobą więzami: jednym kluczem głównym i jednym wskazującym na niego kluczem obcym.

SQL> CREATE TABLE s_emp(

2> Id NUMBER(7)

3> CONSTRAINT s_dept_pk_id PRIMARY KEY, . . .);

Table created.

SQL> CREATE TABLE s_emp (

2> . . . ,

3> dept_id NUMBER (7)

4> CONSTRAINT s_emp_fk_dept_id REFERENCES s_dept (id));

Table created.

Przykład

Wstawienie wiersza z poprawną wartością DEPT_ID. Wiersz zostanie wstawiony, ponieważ wartość ta jest w kluczu głównym.

SQL> INSERT INTO s_emp VALUES (26, . . . 10);

Row inserted.

Wstawienie wiersza z niepoprawnym DEPT_ID. Wiersz nie zostanie wstawiony, ponieważ wartości takiej nie ma w kluczu głównym.

SQL> insert INTO s_emp VALUES (26, . . , 80) ;

*

ERROR at line 1;

ORA-02291: integrity constraint (S_EMP_FK_DEPT_ID)

violated - parent key not found

W kluczu obcym samo-odwołującym się, klucz obcy wskazuje na klucz główny lub klucz unique tej samej tabeli.

Wiersze wskazywane przez klucz obcy domyślnie nie mogą być modyfikowane ani usuwane.

Kaskadowe usuwanie ustawia się opcją DELETE CASCADE.

Przykład

Usunięcie wszystkich zatrudnionych w departamencie 10 zarówno z tabeli S_EMP jak i departamentu 10 z S_DEPT.

SQL> CREATE TABLE s_emp (. . .

2> dept_id NUMBER(7) CONSTRAINT s_emp_fk_dept_id

3> REFERENCES s_dept ON DELETE CASCADE

4> . . .);

Table created.

SQL> DELETE FROM s_dept

     2> WHERE id =10 ;

1 row deleted

Komunikatn rows deleted” (usunięto n wierszy) bierze pod uwagę jedynie wiersze z głównej tabeli.

Jest kilka reguł dotyczących blokowania, które odnoszą się do kluczy obcych.

Bez indeksu na kluczu obcym

Indeksy na kluczu obcym

Więzy z kluczami złożonymi

Klucz złożony tworzony jest z kilku kolumn. Kluczami złożonymi mogą być klucze główne, klucze obce i więzy unique.

Sposób reakcji na null w złożonym kluczu obcym

Przykład

Tworzenie tabeli ze złożonym kluczem obcym i constraintem CHECK zapobiegającym częściowo pustym kombinacjom wartości klucza.

CREATE TABLE master (

A NUMBER(4),

B NUMBER(4),

CONSTRAINT master_pk_ab PRIMARY KEY (a,b));

CREATE TABLE detail (

A NUMBER(4),

B NUMBER(4),

C NUMBER(4),

CONSTRAINT detail_fk_ab

FOREIGN KEY (a,b) REFERENCES master

Dodawanie więzów

Deklaracja więzów przy modyfikacji (ALTER) tabeli.

Składnia:

0x01 graphic

Pzykłady

Zmiana tabeli S_EMP polegająca na dodaniu klucza głównego na kolumnie ID i constraintu check na kolumnie SALARY.

ALTER TABLE s_emp

ADD (CONSTRAINT s_emp_pk_id PRIMARY KEY (id),

CONSTRAINT s_emp_ck_salary CHECK (salary>500));

Zmiana tabeli S_EMP polegająca na dodaniu klucza obcego na kolumnie MANAGER_ID - wskazującego na klucz główny S_EMP.

ALTER TABLE s_emp

ADD (CONSTRAINT s_emp_fk_manager_id

FOREIGN KEY (manager_id) REFERENCES s_emp);

Polecenie ALTER TABLE może służyć do dodawania kolumn i więzów już po utworzeniu tabeli. Polecenie ALTER TABLE może jedynie zmienić więz NOT NULL na istniejącej kolumnie. Polecenie ALTER TABLE jest również używane do usuwania więzów integralności.

Włączanie i wyłączanie więzów

Sprawdzanie więzów integralności może być włączane i wyłączane

Wyłączanie sprawdzania więzów

Włączanie sprawdzania więzów

Przy włączaniu constrainta, jeśli jakieś wiersze naruszają go, polecenia nie udaje się i constraint pozostaje wyłączony.

Domyślnie, w momencie utworzenia więzy są włączone.

Wyłączanie więzów

Więzy wyłącza się poleceniem ALTER TABLE.

Składnia:

0x01 graphic

gdzie:

schemat jest schematem zawierającym tabelę. Jeśli pominie się schemat, to Serwer Oracle zakłada, iż tabela jest w schemacie aktualnego użytkownika.

tabela jest nazwą tabeli, która ma być zmieniona.

DISABLE wyłącza jeden więz integralności.

UNIQUE wyłącza więz unique zdefiniowany na podanych kolumnach lub kolumnie.

PRIMARY KEY wyłącza klucz główny tabeli.

CONSTRAINT wyłącza więz integralności o nazwie constraint

CASCADE wyłącza więzy integralności zależne od podanego constrainta. Aby wyłączyć klucz główny lub więz unique, na który wskazuje jakiś klucz obcy, podanie tej opcji jest konieczne.

Przykłady

Zapytanie na DBA_CONSTRAINTS wyświetla informacje o więzach dla tabel utworzonych przez użytkownika system. Sortowanie po nazwie constrainta zapewnia zebranie razem constraintów dla jednej tabeli.

SQL> SELECT constraint_name, constraint_type,

2> table_name, status

3> FROM dba_constraints

4> WHERE owner = `SYSTEM'

5> AND table_name IN (` S_EMP', ` S_DEPT')

6> ORDER BY constraint_name;

CONSTRAINT_NAME C TABLE_NAME STATUS

------------------------------ - ------------------------------ --------

S_DEPT_ID_NN C S_DEPT ENABLED

S_DEPT_ID_PK P S_DEPT ENABLED

S_DEPT_NAME_NN C S_DEPT ENABLED

S_DEPT_NAME_REGION_ID_UK U S_DEPT ENABLED

S_DEPT_REGION_ID_FK R S_DEPT ENABLED

S_EMP_COMMISSION_PCT_CK C S_EMP ENABLED

S_EMP_DEPT_ID_FK R S_EMP ENABLED

S_EMP_ID_NN C S_EMP ENABLED

S_EMP_ID_PK P S_EMP ENABLED

S_EMP_LAST_NAME_NN C S_EMP ENABLED

S_EMP_MANAGER_ID_FK R S_EMP ENABLED

S_EMP_TITLE_FK R S_EMP ENABLED

S_EMP_USERID_UK U S_EMP ENABLED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Zapytanie na DBA_CONS_COLUMNS wyświetla kolumny, na których zdefiniowane są więzy.

SQL> SELECT constraint_name, table_name, column_name

2> FROM dba_cons_columns

3> WHERE owner = `SYSTEM'

4> AND table_name IN (`S_EMP' , `S_DEPT')

5> ORDER BY constraint_name;

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME POSITION

------------------------------ ---------------------- -------------- ----------

S_DEPT_ID_NN S_DEPT ID

S_DEPT_ID_PK S_DEPT ID 1

S_DEPT_NAME_NN S_DEPT NAME S_DEPT_NAME_REGION_ID_UK S_DEPT NAME 1

S_DEPT_NAME_REGION_ID_UK S_DEPT REGION_ID 2

S_DEPT_REGION_ID_FK S_DEPT REGION_ID 1

S_EMP_DEPT_ID_FK S_EMP DEPT_ID 1

S_EMP_ID_NN S_EMP ID S_EMP_ID_PK S_EMP ID 1

S_EMP_LAST_NAME_NN S_EMP LAST_NAME

S_EMP_MANAGER_ID_FK S_EMP MANAGER_ID 1

S_EMP_TITLE_FK S_EMP TITLE 1

S_EMP_USERID_UK S_EMP USERID 1

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Próba wyłączenia klucza głównego na kolumnie ID w tabeli S_DEPT.

SQL> ALTER TABLE s_dept

2> DISABLE CONSTRAINT s_dept_id_pk;

alter table s_dept

*

ERROR at line 1:

ORA-02297: cannot disable constraint

(SYSTEM.S_DEPT_ID_PK) - dependencies exists

Wyłączenie klucza głównego z opcją CASCADE. Zapytanie na DBA_CONSTRAINTS sprawdza, jakie więzy zostały wyłączone.

SQL> ALTER TABLE s_dept

2> DISABLE CONSTRAINT s_dept_id_pk CASCADE;

Table altered

SQL> SELECT constraint_name, constraint_type,

2> table_name, status

3> FROM dba_constraints

4> WHERE owner = `SYSTEM'

5> AND table_name IN (` S_EMP', ` S_DEPT')

6> ORDER BY constraint_name;

CONSTRAINT_NAME C TABLE_NAME STATUS

------------------------------ - ------------------------------ --------

S_DEPT_ID_PK P S_DEPT DISABLED

S_DEPT_NAME_NN C S_DEPT ENABLED

S_EMP_DEPT_ID_FK R S_EMP DISABLED

S_EMP_USERID_UK U S_EMP ENABLED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Włączanie więzów

Więzy integralności włącza się poleceniem ALTER TABLE.

Składnia:

0x01 graphic

gdzie:

schemat jest schematem zawierającym tabelę.

tabela jest nazwą zmienianej tabeli.

ENABLE włącza pojedynczy więz integralności.

UNIQUE włącza więz unique zdefiniowany na podanej kolumnie lub kombinacji kolumn.

PRIMARY KEY włącza klucz główny tabeli.

CONTRAINT włącza więz integralności o nazwie constraint.

USING INDEX określa parametry dla indeksu tworzonego przez Serwer Oracle dla wymuszenia unikatowości klucza unique lub klucza głównego.

EXCEPTIONS INTO identyfikuje nazwę istniejącej tabeli wyjątków, do której ma trafić informacja o naruszających włączany więz wierszach tabeli.

Przykłady

Włączanie klucza unique na kolumnie USERID w tabeli S_EMP.

SQL> ALTER TABLE s_emp

2> ENABLE CONSTRAINT s_emp_userid_uk

3> EXCEPTIONS INTO exceptions;

Włączenie klucza głównego na kolumnie ID w tabeli S_DEPT i umieszczenie indeksu w przestrzeni tabel USER_IDX.

SQL>ALTER TABLE s_dept ENABLE CONSTRAINT s_dept_id_pk

2> USING INDEX TABLESPACE user_idx

3> EXCEPTIONS INTO exceptions;

Obsługa wyjątków

Wyjątki zgłaszane przy włączaniu więzów integralności obsługuje się za pomocą tabeli wyjątków (exception table).

Przykłady

Zapytanie na DBA_CONSTRAINS i DBA_CONS_COLUMNS wyświetla więzy zadeklarowane na tabelach użytkownika system.

SQL>SELECT a.constraint_name, constraint_type,

2> a.table_name, column_name, r_constraint_name, status

3> FROM dba_constraints a, dba_cons_columns b

4> WHERE a.table_name = `S_EMP' AND a.owner = `SYSTEM'

5> AND a.constraint_name = b. constraint_name;

CONSTRAINT_NAME C TABLE_NAME COLUMN_NAME R_CONSTRAINT_NAME STATUS

------------------------ - ----------- -------------- ------------------ --------

S_EMP_ID_PK P S_EMP ID ENABLED

S_EMP_USERID_UK U S_EMP USERID ENABLED

S_EMP_COMMISSION_PCT_CK C S_EMP COMMISSION_PCT ENABLED

S_EMP_MANAGER_ID_FK R S_EMP MANAGER_ID S_EMP_ID_PK ENABLED

S_EMP_DEPT_ID_FK R S_EMP DEPT_ID S_DEPT_ID_PK ENABLED

S_EMP_TITLE_FK R S_EMP TITLE S_TITLE_TITLE_PK ENABLED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Wyłączenie constrainta S_DEPT_ID_FK.

SQL>ALTER s_dept DISABLE CONSTRAINS s_dept_id_fk;

Table altered

Modyfikacja wiersza w tabeli S_EMP tak aby wartość na kolumnie DEPT_ID była niepoprawna.

SQL>UPDATE s_emp SET dept_id=100 WHERE id = 1;

1 row update

Próba włączenia klucza obcego z opcją umieszczającą wyjątki w tabeli EXCEPTIONS.

SQL>ALTER TABLE S_EMP

2> ENABLE CONSTRAINT s_emp_dept_id_pk

3> EXCEPTIONS INTO exceptions;

ALTER table s_emp constraint s_emp_dept_id_fk

*

ERROR at line 1:

ORA-02298: cannot enable (SYSTEM.S_EMP_DEPT_ID_FK)- parents key not found

Zapytania na tabeli EXCEPTIONS i tabeli SQL_EMP wyświetlające będące w konflikcie wiersze w tabeli S_EMP.

SQL>SELECT * FROM exceptions;

ROW_ID OWNER TABLE_NAME CONSTRAINT

-------------------------- ----------- -------------- ---------------------------

00000099.0000.0004 SYSTEM S_EMP S_EMP_DEPT_ID_FK

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

SQL>SELECT rowid, id, dept_id

2> FROM s_emp

3> WHERE rowid IN (SELECT row_id FROM exceptions);

ROWID ID DEPT_ID

-------------------------- ----------- --------------

00000099.0000.0004 1 100

Jeśli liczba wyjątków zacznie narastać, należy porozumieć się z twórcą aplikacji administratorem danych w celu poprawienia danych naruszających więzy.

Przed włączeniem więzów dobrze jest usunąć wiersze (delete) lub obciąć (truncate) tabelę wyjątków.

Usuwanie więzów

Więzy usuwa się poleceniem ALTER TABLE.

Składnia:

0x01 graphic

Perspektywy słownika danych dla więzów

Informacje o więzach można obejrzeć w słowniku danych.

Perspektywy słownika danych dla więzów

Perspektywa

Opis

ALL_CONSTRAINTS

Definicje więzów na dostępnych tabelach

ALL_CONS_COLUMNS

Informacje o kolumnach w dostępnych definicjach więzów.

USER_CONSTRAINTS

Definicje więzów na tabelach użytkownika.

USER_CONS_COLUMNS

Informacje o kolumnach w definicjach więzów w tabelach użytkownika.

DBA_CONSTRAINTS

Definicje więzów dla wszystkich tabel.

DBA_CONS_COLUMNS

Informacje o wszystkich kolumnach z definicjami więzów integralności.

Przykłady

Wybranie z DBA_CONSTRAINTS wszystkich więzów na tabelach użtkownika system uporządkowane według nazw constraintów.

SQL> SELECT constraint_name, constraint_type,

2> table_name, r_constraint_name, status

3> FROM dba_constraints

4> WHERE owner = `SYSTEM”

5>ORDER BY constraint_name;

CONSTRAINT_NAME C TABLE_NAME R_CONSTRAINT_NAME STATUS

------------------------------ - -------------- --------------------- --------

CUSTID_ZERO C CUSTOMER ENABLED

CUSTOMER_PRIMARY_KEY P CUSTOMER ENABLED

DEPNO_PK P DEPTS ENABLED

DEPT_PRIMARY_KEY P DEPT ENABLED

DZIAL_PK P DZIALY ENABLED

EMP_FOREIGN_KEY R EMP DEPT_PRIMARY_KEY ENABLED

EMP_PRIMARY_KEY P EMP ENABLED

EMP_SELF_KEY R EMP EMP_PRIMARY_KEY ENABLED

ITEM_FOREIGN_KEY R ITEM ORD_PRIMARY_KEY ENABLED

ITEM_PRIMARY_KEY P ITEM ENABLED

ORD_FOREIGN_KEY R ORD CUSTOMER_PRIMARY_KEY ENABLED

ORD_PRIMARY_KEY P ORD ENABLED

PRAC_DZIAL_FK R PRACOWNICY DZIAL_PK ENABLED

PRAC_PK P PRACOWNICY ENABLED

PRODUCT_PRIMARY_KEY P PRODUCT ENABLED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Wybranie z DBA_CONS_COLUMNS wszystkich kolumn, na których system zadeklarował więzy integralności, uporządkowane według nazw więzów.

SQL>SELECT constraint_name, table_name,column_name

2> FROM dba_cons_columns

3> WHERE owner = `SYSTEM'

4> ORDER BY constraint_name;

CONSTRAINT_NAME TABLE_NAME COLUMN_NAME

------------------------------ ------------------------------ -------------------

EMP_FOREIGN_KEY EMP DEPTNO

EMP_PRIMARY_KEY EMP EMPNO

EMP_SELF_KEY EMP MGR

ITEM_FOREIGN_KEY ITEM ORDID

ITEM_PRIMARY_KEY ITEM ORDID

ITEM_PRIMARY_KEY ITEM ITEMID

ORD_FOREIGN_KEY ORD CUSTID

ORD_PRIMARY_KEY ORD ORDID

PRODUCT_PRIMARY_KEY PRODUCT PRODID

S_CUSTOMER_CREDIT_RATING_CK S_CUSTOMER CREDIT_RATING

S_CUSTOMER_ID_NN S_CUSTOMER ID

S_CUSTOMER_ID_PK S_CUSTOMER ID

S_CUSTOMER_NAME_NN S_CUSTOMER NAME

S_CUSTOMER_REGION_ID_FK S_CUSTOMER REGION_ID

S_DEPT_ID_NN S_DEPT ID

S_DEPT_ID_PK S_DEPT ID

S_DEPT_NAME_NN S_DEPT NAME

S_DEPT_NAME_REGION_ID_UK S_DEPT NAME

S_DEPT_NAME_REGION_ID_UK S_DEPT REGION_ID

S_DEPT_REGION_ID_FK S_DEPT REGION_ID

S_EMP_COMMISSION_PCT_CK S_EMP COMMISSION_PCT

S_EMP_DEPT_ID_FK S_EMP DEPT_ID

S_EMP_ID_NN S_EMP ID

S_EMP_ID_PK S_EMP ID

S_EMP_LAST_NAME_NN S_EMP LAST_NAME

S_EMP_MANAGER_ID_FK S_EMP MANAGER_ID

S_EMP_TITLE_FK S_EMP TITLE

S_EMP_USERID_UK S_EMP USERID

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Podsumowanie

Do zapewnienia spójności danych należy wykorzystać więzy integralności.

Zalety deklarowanych więzów integralności

Typy więzów integralności

Więzy wyłącza się gdy

Do obsługi błędów więzów integralności należy korzystać z tabel wyjątków.

XII. Obsługa użytkowników bazy danych

Cele

Lekcja ta wyjaśnia w jaki sposób obsługiwać użytkowników bazy danych.

Na końcu tej sekcji powinieneś potrafić

Przegląd

Dostęp do bazy danych Oracle kontrolujemy tworząc, modyfikując, usuwając i monitorując użytkowników.

Kontrolowanie dostępu i wykorzystania bazy danych

Obsługa bezpieczeństwa bazy: użytkownicy

Bezpieczeństwem bazy danych zarządzamy tworząc użytkowników i odpowiadające im schematy.

Każda baza danych Oracle posiada listę użytkowników, identyfikowaną poprzez nazwy użytkowników.

Nazwa użytkownika jest

Kiedy użytkownik bazy danych zostanie utworzony, tworzony jest również odpowiadający mu schemat - o tej samej nazwie.

Weryfikacja w bazie Oracle

Specyfikacja autentyfikacji

Opis

Domyślna przestrzeń tabel

Określa gdzie budować obiekty, gdy nie zostanie podana przestrzeń tabel w poleceniach CREATE TABLE, CREATE INDEX, CREATE CLUSTER.

Przestrzeń tymczasowa

Dostarcza przestrzeni poleceniem SQL, które wymagają przestrzeni na dysku do podsumowania czy też posortowania danych.

Kwoty na przestrzeniach tabel

Określenie maksymalnego rozmiaru przestrzeni, jaki użytkownik może użyć w przestrzeni tabel (kwota 0 oznacza, że dana przestrzeń tabel jest niedostępna).

Limity zasobów systemowych

Zawierają czas CPU, liczbę odczytów logicznych, liczbę równoległych sesji użytkownika i czas bezczynności dla sesji; ograniczenia te podawane są poprzez profile.

Tworzenie użytkownika

Użytkownika można utworzyć poleceniem CREATE USER

Składnia:

0x01 graphic

gdzie:

użytkownik to nazwa użytkownika, który jest tworzony.

hasło określa hasło

EXTERNALLY oznacza weryfikację dostępu użytkownika poprzez system operacyjny.

DEFAULT TABLESPACE specyfikuje domyślną przestrzeń tabel dla użytkownika.

TEMPORARY TABLESPACE specyfikuje tymczasową przestrzeń tabel dla segmentów tymczasowych.

QUOTA pozwala użytkownikowi na rezerwowanie miejsca w przestrzeni tabel, numer specyfikuje kwotę w K lub M.

UNLIMITED pozwala użytkownikowi na rezerwowanie miejsca w wymienionej przestrzeni tabel bez ograniczeń.

PROFILE profil przypisuje użytkownikowi wymieniony profil.

Aby użytkownik był weryfikowany przez system operacyjny należy ustawić identyfikację użytkownika na EXTERNALLY, ustawić parametr OS_AUTHENT_PREFIX w pliku parametrów i zrestartować instancję.

Parametr ten określa jaki prefiks zostanie dodany do nazwy użytkownika systemu operacyjnego. Przykładowo, jeśli użytkownik systemu operacyjnego nazwa się BRIAN, a parametr OS_AUTHENT_PREFIX ustawimy na wartość `XYZ' to w bazie Oracle powinien istnieć użytkownik XYZBRIAN.

Aby można było korzystać z identyfikacji użytkownika przez system operacyjny na odległych maszynach należy ponadto ustawić parametr REMOTE_OS_AUTHENT na wartość TRUE.

REMOTE_OS_AUTHENT=TRUE

Domyślnie parametr REMOTE_OS_AUTHENT ma wartość FALSE.

Przykład

Użycie polecenia CREATE USER do utworzenia użytkownika pat z hasłem figgty9bokty. Domyślna przestrzeń tabel to USERS, z kwotą 15 MB. Przestrzeń tymczasowa to TEMP. Dodatkowo przyznana jest kwota 10 MB na przestrzeni tabel USER_DATA

SQL> CREATE USER pat

2> IDENTIFIED BY figgty9bokty

3> DEFAULT TABLESPACE users

4> TEMPORARY TABLESPACE temp

5> QUOTA 15M ON users QUOTA 10M ON user_data;

Lista czynności przy tworzeniu użytkowników

Przy tworzeniu użytkowników bazy danych dobrze jest postępować według poniższych wytycznych.

Rejestrowanie użytkowników

  1. Przypisz użytkownikowi nazwę konta i hasło.

  2. Przypisz użytkownikowi domyślną przestrzeń tabel do tworzenia obiektów.

  3. Przyznaj przestrzeń tymczasową dla tabel tymczasowych użytkownika.

  4. Zidentyfikuj przestrzenie tabel, w których użytkownik będzie potrzebował przechowywać obiekty.

  5. Zdecyduj o kwocie dla każdej przestrzeni tabel lub nadaj użytkownikowi nie limitowaną ilość miejsca.

Po rejestracji poinformuj użytkownika o:

Modyfikacja użytkownika

Zmiana opcji powiązanych z użytkownikiem oznacza modyfikację ustawień bezpieczeństwa dla istniejącego w bazie użytkownika.

Opcje zmieniane poleceniem ALTER USER

Użytkownika można zmodyfikować poleceniem ALTER USER.

Składnia:

0x01 graphic

gdzie:

użytkownik identyfikuje nazwę użytkownika, który ma zostać zmieniony

hasło określa hasło.

EXTERNALLY ustawia weryfikację użytkownika poprzez system operacyjny

DEFAULT TABLESPACE określa domyślną przestrzeń tabel dla obiektów użytkownika

TEMPORARY TABLESPACE określa przestrzeń tabel dla segmentów tymczasowych

PROFILE zmienia profil użytkownika na profile

QUOTA pozwala użytkownikowi na rezerwowanie miejsca w przestrzeni tabel

numer określa kwotę w K lub M

UNLIMITED pozwala użytkownikowi na alokację miejsca w przestrzeni tabel bez żadnych ograniczeń.

DEFAULT ROLE ustanawia domyślne role dla użytkownika.

Do użycia polecenia ALTER USER wymagane jest uprawnienie systemowe ALTER USER.

Przykład

Modyfikacja użytkownika Hanne. Zmiana kwoty na bez limitu dla domyślnej przestrzeni tabel USER_DATA.

SQL> ALTER USER hanne

2> QUOTA UNLIMITED ON user_data;

Usuwanie użytkownika

Użytkowników usuwa się poleceniem DROP USER.

Składnia:

0x01 graphic

gdzie:

użytkownik użytkownik do usunięcia.

CASCADE usuwa wszystkie obiekty ze schematu użytkownika. Opcja ta musi zostać podana jeśli schemat użytkownika zawiera jakieś obiekty.

Kiedy użytkownik jest usuwany z opcją CASCADE, jego nazwa i powiązany z nim schemat zostają usunięte ze słownika danych, a wszystkie obiekty zawarte w schemacie użytkownika są natychmiast usuwane.

Nie można usunąć użytkownika aktualnie podłączonego do bazy danych.

Do użycia polecenia DROP USER wymagane jest posiadanie uprawnienia systemowego DROP USER.

Przykład

Usunięcie użytkownika hanne z wybraniem opcji usuwającej wszystkie obiekty należące do hanne.

SQL> DROP USER hanne CASCADE;

Monitorowanie użytkowników

Informacje o użytkownikach i profilach można znaleźć w słowniku danych, w którym zawarte są dane wszystkich użytkowników.

Słownik danych zawiera informacje o:

Pomocne perspektywy słownika danych

ALL_USERS

wszyscy zarejestrowani użytkownicy

USER_USERS

użytkownik, który pyta

DBA_TS_QUOTAS

kwoty wszystkich użytkowników

USER_TS_QUOTAS

kwoty zalogowanego użytkownika

Monitorowanie bazy danych przez perspektywy słownika danych umożliwia zobaczenie jakie informacje są składowane w bazie. Słownik danych bazy Oracle jest zbiorem tabel i perspektyw, które używane są jedynie do odczytu, jako źródło informacji o bazie.

Perspektywy słownika danych zawierają aktualną informację o użytkownikach i ich obiektach. DBA powinien znać perspektywy omawiane w tej sekcji by móc monitorować użytkowników i ich kwoty.

Przykład

Wyświetlanie informacji o aktualnym użytkowniku z perspektywy słownika danych USER_USERS.

SQL> SELECT USERNAME, USER_ID, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE, CREATED FROM user_users;

USERNAME USER_ID DEFAULT_TABLESPACE TEMPORARY_TABLESPACE CREATED

-------------- ---------- ---------------------- ------------------------ -------

SYS 0 SYSTEM SYSTEM 97/06/14

gdzie:

USERNAME nazwa użytkownika

USER_ID nr ID użytkownika

DEFAULT_TABLESPACE domyślna przestrzeń tabel dla użytkownika

TEMPORARY_TABLESPACE przestrzeń tabel dla segmentów tymczasowych

CREATED data utworzenia użytkownika

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Informacje o wszystkich użytkownikach bazy danych znajdują się w perspektywie DBA_USERS

SQL> SELECT USERNAME, USER_ID, PASSWORD, , PROFILE

2>  FROM dba_users;

USERNAME USER_ID PASSWORD PROFILE

------------------------------ ---------- ------------------------------ --------

SYS 0 15C146A39C91814D DEFAULT

TUTORIAL15 115 565CD49962C3CCCA DEFAULT

TUTORIAL16 116 5B61BB5091C4FDBB DEFAULT

SYSTEM 5 87C4ECFB800A8C3D DEFAULT

CTXSYS 22 EXTERNAL DEFAULT

DEMO 21 EXTERNAL DEFAULT

SCOTT 20 F894844C34402B67 DEFAULT

gdzie:

USERNAME nazwa użytkownika

USER_ID nr ID użytkownika

PASSWORD zakodowane hasło

PROFILE nazwa profilu z ograniczeniami zasobów przydzielonych użytkownikowi

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Informacje o kwotach aktualnego użytkownika znajdują się w perspektywie słownika danych USER_TS_QUOTAS.

SQL> SELECT * FROM user_ts_quotas;

TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS

------------------------------ ---------- ---------- ---------- ----------

TOOLS 51200 -1 25 -1

TEMP 0 10485760 0 5120

gdzie:

TABLESPACE_NAME nazwa przestrzeni tabel

BYTES ilość bajtów użytych przez użytkowników

MAX_BYTES kwota użytkownika w bajtach lub podana jako UNLIMITED

BLOCKS ilość bloków użytych przez użytkownika

MAX_BLOCKS kwota użytkownika podana w blokach lub jako UNLIMITED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Wartość - 1 reprezentuje kwotę nieograniczoną.

Informacje o kwotach wszystkich użytkowników znajdują się w perspektywie słownika danych DBA_TS_QUOTAS.

SQL>SELECT * FROM dba_ts_quotas;

TABLESPACE_NAME USERNAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS

------------------- ---------- ---------- ---------- ---------- ----------

TOOLS SCOTT 51200 -1 25 -1

TEMP SCOTT 0 10485760 0 5120

TOOLS PAT 0 -1 0 -1

TEMP PAT 0 10485760 0 5120

gdzie:

TABLESPACE_NAME nazwa przestrzeni tabel

USERNAME użytkownik, którego dotyczy kwota

BYTES ilość bajtów użytych przez użytkownika

MAX_BYTES kwota dla użytkownika w bajtach lub - 1 dla UNLIMITED

BLOCKS liczba bloków użytych przez użytkownika

MAX_BLOCKS kwota użytkownika w blokach lub -1 dla UNLIMITED

0x01 graphic

Uwaga: Format powyższego wydruku został poprawiony.

Zabijanie sesji użytkownika

Jeśli jest to potrzebne, możliwe jest zakończenie sesji użytkownika podłączonego do bazy danych.

Zabicie sesji użytkownika

Sesję użytkownika należy zabijać gdy

Jako alternatywę dla zabijania sesji użytkowników przy zamykaniu bazy danych można wykorzystać opcję IMMEDIATE.

Sesję użytkownika kończy się wydając polecenie ALTER SYSTEM.

Składnia:

0x01 graphic

gdzie:

KILL SESSION zabija sesję

Numer 1 określa nr sesji użytkownika (SESSION ID)

Numer 2 określa nr seryjny użytkownika

Polecenie ALTER SYSTEM KILL SESSION

Jeśli sesja użytkownika oczekuje na zakończenie jakiegoś działania, które powinno zostać dokończone, np. oczekuje na odpowiedź z odległej bazy danych czy wycofuje transakcję, Serwer Oracle czeka, aż działania to zakończy się.

Nr identyfikacyjny sesji i nr seryjny sesji użytkownika może odszukać w perspektywie V$SESSION.

Przykład

Wykonanie kroków potrzebnych do zabicia sesji użytkownika scott.

SQL> SELECT sid, serial#, USERNAME

2> FROM v$session;

SID SERIAL# USERNAME

---------- ---------- ------------------------------

...

8 103 SCOTT

...

SQL> ALTER SYSTEM

2> KILL SESSION `8,103';

Podsumowanie

Należy ostrożnie monitorować dostęp użytkowników do bazy danych i utrzymywać kontrolę nad procesami użytkowników.

Monitorowanie

0x01 graphic

Zadania

utwórz użytkownika "adm#" identyfikowanego przez hasło "adm#" na domyślnej przestrzeni tabel USER_DATA i tymczasowej TEMPORARY_DATA, nadaj mu kwotę 50K na przestrzeni USER_DATA i nadaj mu rolę CONNECT

będąc połączony jako adm# wypisz kwoty przyznane użytkownikowi adm#

napisz polecenie SQL wypisujące wszystkich użytkowników bazy danych, a następnie wszystkich podłączonych aktualnie do bazy

podłącz się jako adm#, a następnie z konta sysdba zabij sesję adm#

zmień sposób autoryzacji podłączenia do bazy użytkownika adm# na zewnętrzne, ustaw odpowiednie parametry w pliku parametrów, zrestartuj bazę i spróbuj podłączyć się do bazy w SQL Worksheet podając przy logowaniu tylko alias bazy.


XIII. Kontrola użycia zasobów systemowych

Cele

Lekcja ta opisuje w jaki sposób kontrolować użycie zasobów systemowych.

Na końcu tej sekcji powinieneś potrafić

Przegląd

Profile wykorzystuje się do kontroli użytkowania zasobów systemowych.

Zasoby systemowe

Profile

Definiowanie profili

Limity profili mogą być wymuszone na poziomie sesji, poziomie wywołania lub obu poziomach równocześnie. Limity z poziomu sesji wymuszane są dla każdego połączenia.

Kiedy przekroczony zostanie limit na poziomie sesji

Limity na poziomie wywołania wymuszone są dla każdego wywołania realizowanego w czasie wykonywania poleceń SQL.

Kiedy przekroczony zostanie limit na poziomie wywołania

Profile

Przy wykorzystaniu profili można kontrolować zasoby systemowe.

Profile

Wykorzystanie profilów

Wymuszanie limitów systemowych włącza się i wyłącza za pomocą parametru inicjalizacyjnego RESOURCE_LIMIT lub poleceniem ALTER SYSTEM.

Parametr inicjalizacyjny RESOURCE_LIMIT

Polecenie ALTER SYSTEM

Z polecenia ALTER SYSTEM należy korzystać gdy baza nie może zostać zamknięta lub gdy zmiana jest tymczasowa.

Składnia:

0x01 graphic

Przykład

Włączenie wymuszania limitów zasobów dla instancji.

SQL> ALTER SYSTEM SET RESOURCE_LIMIT = TRUE;

0x01 graphic

Uwaga: Do wydania tego polecenia wymagane jest posiadanie przywileju systemowego ALTER SYSTEM.

Zasoby kontrolowane na poziomie sesji

Zasób

Opis

CPU_PER_SESSION

Czas CPU w setnych sekundach.

SESSIONS_PER_USER

Liczba równoczesnych sesji dozwolonych dla każdego użytkownika

CONNECT_TIME

Czas trwania sesji w minutach.

IDLE_TIME

Okres bezczynności w minutach.

LOGICAL_READS_PER_SESSION

Liczba bloków danych (odczytów logicznych i fizycznych).

PRIVATE_SGA

Prywatny obszar w SGA, mierzony w bajtach (tylko dla MTS).

Zasoby kontrolowane na poziomie wywołania

Zasób

Opis

CPU_PER_CALL

Czas CPU dla wywołania, mierzony w setnych sekundy.

LOGICAL_READS

Liczba bloków danych.

0x01 graphic

Wskazówki:

Tworzenie profilu

Profile tworzymy poleceniem CREATE PROFILE

Do utworzenia profilu potrzebne jest uprawnienie systemowe CREATE PROFILE. Serwer Oracle automatycznie tworzy profil DEFAULT w momencie tworzenia bazy danych.

Składnia:

0x01 graphic

gdzie:

COMPOSITE_LIMIT oznacza całkowity koszt zasobów dla sesji wyrażony w jednostkach obsługi.

UNLIMITED oznacza, że użytkownik, któremu przypisano profil może korzystać z podanego zasobu bez ograniczeń.

DEFAULT oznacza, że profil ten ma odziedziczyć ograniczenie dla podanego zasobu z profilu DEFAULT.

Przykład

Tworzenie profilu o nazwie developer_profile z maksymalnie pięcioma równoczesnymi sesjami, nie limitowanym czasem CPU dla wywołania i maksymalnym czasem bezczynności 60 minut.

SQL>CREATE PROFILE developer_profile LIMIT

2> SESSIONS_PER_USER 5

3> CPU_PER_CALL UNLIMITED

4> IDLE _TIME 60 ;

Password Complexity Verification (od wersji 8.0).

Sprawdza czy hasło posiada następujące cechy:

Skrypt UTLPWDMG SQL - tworzy funkcję weryfikującą verify_function

Zmiana profilu

Zmianę profilu przeprowadzamy poleceniem ALTER PROFILE

Składnia:

0x01 graphic

gdzie:

COMPOSITE_LIMIT oznacza całkowity koszt zasobów dla sesji wyrażony w jednostkach obsługi.

UNLIMITED oznacza, że użytkownik, któremu przypisano profil może korzystać z podanego zasobu bez ograniczeń.

DEFAULT oznacza, że profil ten ma odziedziczyć ograniczenie dla podanego zasobu z profilu DEFAULT.

0x01 graphic

Wskazówki:

0x01 graphic

Uwaga: Do modyfikacji profilu wymagane jest uprawnienie systemowe ALTER PROFILE.

Przykład

Zmiana limitów w profilu developer_profile i ustawienie liczby sesji równoczesnych na dwie, 30000 setnych sekundy czasu CPU na sesję, maksymalnego czasu bezczynności na 30 minut, a odczytów logicznych dla wywołania na 1000.

SQL >ALTER PROFILE developer_profile LIMIT

2> SESSIONS_PER_USER 2

3> CPU_PER_SESSION 300000

4> IDLE_TIME 30

5> LOGICAL_READS_PER_CALL 1000;

Określenie profilu domyślnego (DEFAULT)

Każda baza danych ma swój profil domyślny nazwany default.

Profil Default

W celu zapobieżenia nielimitowanemu wykorzystaniu zasobów, należy zmienić profil default.

Przykład

Zmiana profilu default poleceniem ALTER PROFILE. Ustawienie równoczesnych sesji na maksymalnie pięć połączeń 36 sekund czasu CPU dla wywołania i 30 minut czasu bezczynności.

SQL> ALTER PROFILE default LIMIT

2> SESSIONS_PER_USER 5

3> CPU_PER_CALL 3600

4> IDLE_TIME 30;

Przypisywanie profilów

Profil można przypisać przy tworzeniu bądź modyfikacji użytkownika. Każdy użytkownik może mieć w danym momencie przypisany tylko jeden profil.

Przykład

Utworzenie użytkownika Hanne z hasłem Rue - przy użyciu polecenia CREATE USER.

Przypisanie mu profilu developer_profile.

SQL> CREATE USER Hanne IDENTIFIED BY Rue

2> DEFAULT TABLESPACE user_data

3> TEMPORARY TABLESPACE temp

4> PROFILE developer_profile;

Przypisanie profilu istniejącemu użytkownikowi odbywa się poleceniem ALTER USER.

Charakterystyka profilów

Jeśli przy tworzeniu użytkownika nie poda się profilu, automatycznie ma on przydzielanych profil default.

Przykład

Zmiana użytkownika beri i przypisanie mu profilu developer_profile.

SQL> ALTER USER bert PROFILE developer_profile;

Limity złożone

Za pomocą limitu złożonego możliwe jest kontrolowanie kombinacji użycia zasobów systemowych.

Limit złożony

Zasoby wchodzące w skład limitu złożonego mogą posiadać swoje wagi.

Koszty zasobów

Tak jest w wypadku limitów ustawianych jawnie, można zbierać informacje historyczne o typowym użytkowniku by określić wykorzystanie limitu złożonego

Pierwszy przekroczony limit (złożony lub jawny) zatrzyma działanie sesji.

Usuwanie profilu

Profil usuwamy poleceniem DROP PROFILE

Składnia:

0x01 graphic

gdzie:

profil jest nazwą profilu do usunięcia.

CASCADE odbiera profil użytkownikom, którzy go posiadali. Serwer Oracle automatycznie przypisze wszystkim takim użytkownikom profil DEFAULT. Opcję tę należy podać przy usuwaniu profili, które są już komuś przydzielone.

Do usunięcia profilu potrzebny jest przywilej systemowy DROP PROFILE

Profilu DEFAULT nie da się usunąć.

Zmiana polegająca na usunięciu profilu odbija się na następnych sesjach, ale nie na sesjach właśnie trwających.

Przykład

Usunięcie profilu developer_profile i odebrania go użytkownikom, którym był przypisany.

SQL> DROP PROFILE developer_profile CASCADE;

Przeglądanie informacji o profilach

W celu obejrzenia informacji o profilach używamy perspektyw słownika danych.

Perspektywy słownika danych powiązane z profilami

  • DBA_USERS

  • username profile

  • USER_RESOURCE_LIMITS

  • limity dla zalogowanego użytkownika

  • DBA_PROFILES

  • wszystkie dane wszystkich profili

  • RESOURCE_COST

  • wyświetla wagi wszystkich zasobów

Przykład

SQL>SELECT username, profile FROM dba_users;

USERNAME PROFILE

------------------------------ ------------------------------

SYS DEFAULT

SYSTEM DEFAULT

DEMO DEFAULT

SCOTT DEFAULT

PAT  DEVELOPER_PROFILE

HANNE  DEVELOPER_PROFILE

SQL>SELECT * FROM profiles;

Aby zmienić wagę zasobu wydajemy polecenie ALTER RESOURCE COST.

Podsumowanie

Profile wykorzystywane są do przypisywania i obsługi limitów zasobów systemowych.

Odpowiednie ograniczenia dla zasobów można określić korzystając z:

Limity zasobów

Przeglądanie informacji o profilach

0x01 graphic

Zadania

Utwórz profil TEMP_PROFILE z czasem bezczynności =1

Włącz wymuszanie limitów dla instancji

Stwórz użytkownika ZYGMUNT/ZYGMUNT z profilem TEMP_PROFILE i nadaj mu prawo do podłączenia

Sprawdź, czy po 1 minucie od podłączenia bez wykonywania operacji SQL użytkownik ZYGMUNT zostanie rozłączony, aby to sprawdzić obejrzyj perspektywę V$SESSION

Zmień ustawienie SESSIONS_PER_USER na 1 dla TEMP_PROFILE i sprawdź, co się stanie przy próbie drugiego podłączenia jako użytkownik ZYGMUNT

Usuń profil TEMP_PROFILE i użytkownika ZYGMUNT

XIV. Zarządzanie dostępem do bazy danych

Cele

W lekcji tej zobaczymy jak obsługiwać w bazie danych uprawnienia.

Na końcu tej lekcji powinieneś potrafić

Przegląd

Użytkownikom można nadać uprawnienia dostępu do bazy i do obiektów w tej bazie, można również nadać im specjalne uprawnienia systemowe.

Kontrola DBA nad uprawnieniami oznacza

Typ przywileju

Opis

SYSTEMOWY

Każde uprawnienie systemowe pozwala użytkownikowi na wykonanie pewnej operacji (lub też klasy operacji) w bazie.

OBIEKTOWY

Każde uprawnienie obiektowe pozwala użytkownikowi na wykonanie pewnej akcji na podanej tabeli, perspektywie, sekwencji, procedurze, funkcji lub pakiecie.

Uprawnienia można kontrolować przy pomocy ról, które formują nazwaną grupę powiązanych uprawnień.

Do własności ról należy

Uprawnienia systemowe

Użytkownik nabiera praw do wykonania operacji lub klas operacji w bazie danych poprzez otrzymanie uprawnień systemowych. Uprawnienie systemowe jest prawem do wykonania polecenia pewnego typu.

Typy uprawnień systemowych

Uprawnienia systemowe nie są ograniczone do jednego obiektu czy struktury w schemacie. Są one specyficzne dla pewnej operacji lub klasy operacji na typie obiektów czy struktur.

Dla przykładu, uprawnienie systemowe SELECT ANY TABLE pozwala użytkownikowi na formułowanie zapytań do dowolnej tabeli w bazie danych. Uprawnienie obiektowe pozwoli użytkownikowi na dostęp do specyficznej tabeli, takiej jak SCOTT.EMP.

Istnieje 80 różnych uprawnień systemowych. Każde uprawnienie systemowe pozwala użytkownikowi na wykonanie pewnej operacji lub klasy operacji w bazie.

Nadawanie uprawnień systemowych

Uprawnienia systemowe można nadawać i odbierać użytkownikom i rolom za pomocą polecenia GRANT

Rola to nazwana grupa powiązanych uprawnień, którą można nadawać użytkownikom lub innym rolom.

Składnia:

0x01 graphic

gdzie:

rola jest nazwą przyznawanej roli

PUBLIC nadaje uprawnienie systemowe lub rolę wszystkim użytkownikom.

WITH ADMIN OPTION pozwala uprawnianemu na przekazywanie przywileju systemowego lub roli dale, innym użytkownikom lub rolom. Jeśli nadaje się rolę z opcją ADMIN OPTION, uprawniony może również taką rolę zmodyfikować lub usunąć.

Aby nadać komuś uprawnienie, trzeba posiadać je WITH ADMIN OPTION.

Specjalne uprawnienia systemowe, SYSDBA I SYSOPER, używane w połączeniu z plikami haseł dla nie zabezpieczanych połączeń, wymagają specjalnej obsługi. Nie można nadać ich w formie WITH ADMIN OPTION i nie można nadać ich rolom.

Wyświetlanie uprawnień systemowych

Nadane uprawnienia systemowe można znaleźć w perspektywie DBA_SYS_PRIVS.

Przykład

Wyświetlanie wszystkich uprawnień systemowych nadanych rolom oraz użytkownikom DBA_SYS_PRIVS.

SQL>SELECT * from DBA_SYS_PRIVS;

GRANTEE PRIVILEGE ADM

------------------------------ ---------------------------------------- ---

ANIA UNLIMITED TABLESPACE NO

CONNECT ALTER SESSION NO

CONNECT CREATE CLUSTER NO

CONNECT CREATE DATABASE LINK NO

CONNECT CREATE SEQUENCE NO

CONNECT CREATE SESSION NO

CONNECT CREATE SYNONYM NO

CONNECT CREATE TABLE NO

CONNECT CREATE VIEW NO

DBA ALTER ANY CLUSTER YES

DBA ALTER ANY INDEX YES

DBA ALTER ANY LIBRARY YES

DBA ALTER ANY PROCEDURE YES

DBA ALTER ANY ROLE YES

DBA ALTER ANY SEQUENCE YES

DBA ALTER ANY SNAPSHOT YES

DBA ALTER ANY TABLE YES

DBA ALTER ANY TRIGGER YES

DBA ALTER ANY TYPE YES

DBA ALTER DATABASE YES

DBA ALTER PROFILE YES

DBA ALTER RESOURCE COST YES

DBA ALTER ROLLBACK SEGMENT YES

DBA ALTER SESSION YES

DBA ALTER SYSTEM YES

DBA ALTER TABLESPACE YES

DBA ALTER USER YES

DBA ANALYZE ANY YES

DBA AUDIT ANY YES

DBA AUDIT SYSTEM YES

DBA BACKUP ANY TABLE YES

Odbieranie uprawnień systemowych

Uprawnienia systemowe można za pomocą polecenia REVOKE.

Składnia:

0x01 graphic

gdzie:

przywilej_systemowy jest uprawnieniem, który ma zostać odebrane

rola jest rolą, która ma zostać odebrana.

FROM identyfikuje użytkowników i role, którym mają zostać odebrane wymienione uprawnienia.

PUBLIC odbiera uprawnienia systemowe i role nadane wszystkim użytkownikom.

Odbieranie uprawnień systemowych WITH ADMIN OPTION

Podanie „WITH ADMIN OPTION” w momencie odbierania przywileju użytkownikowi nie jest potrzebne. Jeśli opcja ta była nadana, zostanie teraz odebrana.

Przykład

Odebranie scott'owi uprawnień modyfikacji i usuwania użytkowników.

SQL> REVOKE ALTER USER, DROP USER FROM scott;

Nadawanie uprawnień obiektowych

Nadając uprawnienie obiektowe, można pozwolić użytkownikom na wykonanie pewnej akcji na wyspecyfikowanej tabeli, perspektywie, sekwencji lub procedurze. Typy uprawnień obiektowych różnią się dla różnych obiektów.

Różne uprawnienia obiektowe pozwalają na korzystanie z odpowiednich poleceń SQL.

Polecenia SQL dozwalane przez uprawnienia obiektowe

Uprawnienie obiektowe

Dozwolone polecenie SQL

SELECT

SELECT FROM object (tabela, perspektywa lub snapshot), polecenia SQL korzystające z sekwencji

UPDATE

UPDATE object (tabela lub perspektywa)

INSERT

INSERT INTO object (tabela lub perspektywa)

ALTER

ALTER object (tabela lub sekwencja), CREATE TRIGGER ON object (tylko tabele)

DELETE

DELETE FROM object (tabela lub perspektywa), TRUNCATE object (tylko tabele)

EXECUTE

EXECUTE object (procedura lub funkcja),

Odwoływanie się do publicznych zmiennych pakietowych

INDEX

CREATE INDEX ON object (tylko tabele)

REFERENCES

Polecenie CREATE lub ALTER TABLE definiujące klucz obcy FOREIGN KEY na obiekcie (tylko tabele)

Uprawnienia obiektowe można nadawać poleceniem GRANT.

Składnia:

0x01 graphic

gdzie:

przywilej_obiektowy jest nadawanym uprawnieniem obiektowym

kolumna określa kolumnę tabeli lub perspektywy, dla której nadawane są prawa. Kolumny podaje się tylko dla uprawnień INSERT, REFERENCES i UPDATE. Jeśli kolumny nie zostaną podane, uprawnienie dotyczy wszystkich kolumn tabeli czy perspektywy.

ALL oznacza wszystkie uprawnienia obiektowe.

ON identyfikuje obiekt, którego dotyczy nadawane uprawnienie. Jeśli nie poda się schematu, Serwer Oracle zakłada, że chodzi o schemat aktualny.

TO identyfikuje użytkowników lub role, którym nadawane są uprawnienia.

PUBLIC nadanie uprawnień do obiektu wszystkim użytkownikom.

WITH GRANT OPTION pozwala uprawnionemu na przekazanie praw innym użytkownikom lub rolom. GRANT OPTION nie może zostać nadana roli.

Przykłady

Nadanie użytkownikom hanne i ernie uprawnień do przeglądania tabeli S_EMP.

SQL> GRANT SELECT ON s_emp TO hanne, ernie;

Uprawnienie hanne'ego do przeglądania tabeli S_EMP z wartościami dla kolumn ID, LAST_NAME, FIRST_NAME i DEPT_ID; do modyfikowania kolumny FIRST_NAME w tabeli S_EMP.

SQL> GRANT SELECT

2>  INSERT (ID, LAST_NAME, FIRST_NAME, DEPT_ID),

3> UPDATE (FIRST_NAME)

4> ON s_emp TO hanne;

0x01 graphic

Wskazówki:

Nadawanie uprawnień WITH GRANT OPTION

Uprawnienie nadane WITH GRANT OPTION może zostać przez obdarowanego przekazany dalej innym użytkownikom lub rolom.

SQL> GRANT SELECT ON s_emp TO hanne, ernie

2> WITH GRANT OPTION;

0x01 graphic

Wskazówki:

Wyświetlanie uprawnień obiektowych

Uprawnienia obiektowe nadane w systemie można wyszukać w słowniku danych.

Perspektywy z uprawnieniami obiektowymi

Dostępne dla DBA

Opis

DBA_TAB_PRIVS

Wszystkie uprawnienia obiektowe w bazie.

DBA_COL_PRIVS

Wszystkie uprawnienia w bazie dotyczące kolumn

Perspektywy uprawnień obiektowych dostępne użytkownikom

Opis

USER_TAB_PRIVS

Uprawnienia obiektowe, dla których użytkownik jest właścicielem, nadającym lub uprawnionym.

USER_TAB_PRIVS_MADE

Wszystkie uprawnienia na obiektach będących własnością użytkownika.

USER_TAB_PRIVS_RECD

Uprawnienia, dla których użytkownik jest uprawnionym.

USER_COL_PRIVS

Uprawnienia obiektowe na kolumnach, dla których użytkownik jest właścicielem, nadającym lub uprawnionym

USER_TAB_PRIVS_MADE

Wszystkie uprawnienia udzielone na kolumnach obiektów, których właścicielem jest użytkownik.

USER_TAB_PRIVS_RECD

Uprawnienia na kolumnach, dla których użytkownik jest uprawnionym.

ALL_TAB_PRIVS

Uprawnienia obiektowe, dla których uprawnionym jest użytkownik lub PUBLIC.

ALL_TAB_PRIVS_MADE

Uprawnienia użytkownika i uprawnienia na obiektach użytkownika.

ALL_TAB_PRIVS_RECD

Uprawnienia obiektowe, dla których uprawnionym jest użytkownik lub PUBLIC.

TABLE_PRIVILEGES

Uprawnienia na obiektach, dla których użytkownik jest nadającym, uprawnionym lub właścicielem oraz te, dla których uprawnionym jest PUBLIC.

ALL_COL_PRIVS

Uprawnienia obiektowe na kolumnach, dla których uprawnionym jest użytkownik lub PUBLIC.

ALL_COL_PRIVS_MADE

Uprawnienia na kolumnach, dla których użytkownik jest właścicielem lub nadającym.

ALL_COL_PRIVS_RECD

Uprawnienia obiektowe na kolumnach, dla których uprawnionym jest użytkownik lub PUBLIC.

COLUMN_PRIVILEGES

Uprawnienia na kolumnach, dla których użytkownik jest nadającym, uprawnionym lub właścicielem oraz te, dla których uprawnionym jest PUBLIC.

Odbieranie uprawnień obiektowych

Uprawnienia obiektowe odbiera się (revoke) poleceniem REVOKE.

Składnia:

0x01 graphic

gdzie:

przywilej_obiektowy jest uprawnieniem obiektowym, który ma być odebrany.

ON identyfikuje obiekt, do którego odbierane są uprawnienia.

FROM identyfikuje użytkowników i role, którym cofane są uprawnienia.

PUBLIC odebranie praw nadanych wszystkim użytkownikom.

CASCADE CONSTRAINTS usuwa wszystkie więzy spójności referencyjnej zdefiniowane przy wykorzystaniu cofanego przywileju REFERENCES. Opcja ma znaczenie tylko przy cofaniu praw REFERENCES i jeśli ktoś z tego prawa w międzyczasie korzystał, musi zostać podana, by uprawnienia zostały cofnięte.

0x01 graphic

Uwaga: Nadający mogą odebrać uprawnienia jedynie tym, którym je nadali.

Odbieranie uprawnień nadanych WITH GRANT OPTION

Cofnięcie przywileju obiektowego pociąga za sobą efekt kaskady, który powinien zostać zbadany przed wykonaniem polecenia REVOKE.

Załóżmy, że użytkownik A nadał użytkownikowi B uprawnienie WITH GRANT OPTION, który z kolei przekazał je użytkownikowi C. Jeśli użytkownik A cofnie uprawnienie użytkownikowi B, to przywilej straci również C.

Użytkownik B nie ma możliwości odebrania praw użytkownikowi A, a użytkownik C nie będzie mógł odebrać przywileju ani użytkownikowi A, ani B.

Podsumowanie

Użytkownikom można nadać uprawnienia dostępu do bazy i do obiektów w tej bazie, można również nadać im specjalne uprawnienia systemowe.

Kontrola uprawnień przez DBA

Uprawnienia systemowe

Uprawnienia obiektowe

0x01 graphic

Zadania

Stwórz użytkownika ZYGMUNT/ZYGMUNT z domyślną przestrzenią tabel USER_DATA, tymczasową TEMPORARY_DATA i nadaj mu prawo podłączenia do bazy i tworzenia tabel oraz kwotę 100K na USER_DATA

Stwórz użytkownika WACEK/WACEK i z domyślną przestrzenia tabel USER_DATA, tymczasową TEMPORARY_DATA, kwotą 100K na przestrzeni USER_DATA i nadaj mu prawo podłączenia do bazy i tworzenia tabel

Podłącz się do bazy jako ZYGMUNT i obejrzyj perspektywy SESSION_PRIVS i USER_SYS_PRIVS

Jako Zygmunt wykonaj skrypt s:\create_tables.sql tworzący tabele EMP i DEPT i wypełniający je danymi

Sprawdź w słowniku danych czy tabele zostały utworzone

Podłącz się do bazy jako sysdba i spróbuj nadać użytkownikowi WACEK prawo SELECT do tabeli EMP w schemacie ZYGMUNT

Spróbuj wykonać powyższe będąc podłączony jako ZYGMUNT

Sprawdź w perspektywie USER_TAB_PRIVS czy nadanie się powiodło

Będąc podłączony jako ZYGMUNT nadaj użytkownikowi WACEK prawo modyfikacji kolumn JOB i HIREDATE w tabeli EMP i prawo przeglądania tabeli EMP

Podłącz się jako WACEK i sprawdź USER_TAB_PRIVS i USER_COL_PRIVS

Będąc podłączonym jako WACEK zmień stanowisko CLERK na URZEDNIK w tabeli EMP użytkownika ZYGMUNT

Wycofaj zmianę

XV. Obsługa ról

Cele

Lekcja ta wyjaśnia w jaki sposób obsługiwać w bazie danych role.

Na końcu tej sekcji powinieneś potrafić

Role

Role mają uprościć zarządzanie uprawnieniami. Role są nazwanymi grupami powiązanych uprawnień, które mogą być nadane użytkownikom lub innym rolom.

Charakterystyka roli

Rola A nie może zostać nadana roli B jeśli rola B miała wcześniej nadaną rolę A.

Dla roli może być zdefiniowane hasło, a użytkownicy mogą mieć ją nadaną, lecz nie znać jej hasła. Hasło będzie zakodowane w aplikacji tak, iż użytkownik może korzystać z roli jedynie poprzez aplikację.

Korzyści z ról

Mniej nadawania uprawnień

Dynamiczna obsługa uprawnień

Selektywny dostęp do uprawnień

Korzyści dodatkowe

Efektywność

Tworzenie roli

Tworzenie roli poleceniem CREATE ROLE.

Składnia:

0x01 graphic

gdzie:

rola jest nazwą tworzonej roli

NOT IDENTIFIED wskazuje, że użytkownicy, którym rola zostanie nadana nie będą weryfikowani przez Serwer Oracle przy jej włączaniu.

IDENTIFIED wskazuje, że użytkownicy, którym rola zostanie nadana muszą zostać przy jej włączeniu zweryfikowani przez Serwer Oracle.

hasło wskazuje, że przy włączaniu roli użytkownik musi podać hasło.

EXTERNALLY Serwer Oracle będzie do weryfikacji użytkowników korzystających z tej roli używał narzędzi systemu operacyjnego.

Po utworzeniu roli należy nadać jej uprawnienia poleceniem GRANT, a ją samą nadać użytkownikom również poleceniem GRANT.

Do tworzenia ról potrzebne jest posiadanie uprawnienia CREATE ROLE.

Modyfikowanie roli

Modyfikując rolę można zmienić typ autoryzacji potrzebny, by ją włączyć.

Składnia:

0x01 graphic

gdzie:

rola jest nazwą tworzonej roli

NOT IDENTIFIED wskazuje, że użytkownicy, którym rola zostanie nadana nie będą weryfikowani przez Serwer Oracle przy jej włączaniu.

IDENTYFIED wskazuje, że użytkownicy, którym rola zostanie nadana muszą zostać przy jej włączeniu zweryfikowani przez Serwer Oracle.

hasło wskazuje, że przy włączaniu roli użytkownik musi podać hasło.

EXTERNALLY Serwer Oracle będzie do weryfikacji użytkowników korzystających z tej roli używał narzędzi systemu operacyjnego.

Włączanie i wyłączanie ról

Role włącza się lub wyłącza by udostępnić lub ograniczyć użytkownikom pewne uprawnienia.

Włączenie i wyłączenie

Rola może zostać włączona z

Role włącza się poleceniem SET ROLE.

Składnia:

0x01 graphic

gdzie:

rola jest rolą, jaka ma być w bieżącej sesji włączona. Wszystkie nie wymienione role zostają wyłączone.

hasło jest hasłem dla roli. Jeśli rola posiada hasło, musi ono zostać tu podane.

ALL włącza wszystkie role nadane użytkownikowi, prócz tych wymienionych w klauzuli EXCEPT. Role wymienione w klauzuli EXCEPT muszą być rolami nadanymi bezpośrednio; nie wolno podawać tam ról otrzymywanych poprzez inne role. Nie można również skorzystać z tej opcji do włączenia tych ról nadanych bezpośrednio, które mają hasła. Jeśli w liście ról w klauzuli EXCEPT wystąpi rola nadana zarówno bezpośrednio jak i poprzez inną rolę, rola taka zostanie włączona w momencie włączenia roli, której została nadana.

NONE wyłącza wszystkie role.

Opcja ALL działa jedynie wtedy, gdy wszystkie role albo nie mają haseł (nie są autoryzowane), albo są autoryzowane zewnętrznie (externally - w systemie operacyjnym).

Przy opcji ALL, nie ma możliwości podania haseł. Dlatego role te muszą albo nie mieć haseł, albo być autoryzowane zewnętrznie (externally).

Polecenie SET ROLE wyłącza wszystkie inne role użytkownika.

Ustalanie ról domyślnych

Role domyślne dla danego użytkownika ustala się poleceniem ALTER USER.

Składnia:

0x01 graphic

gdzie:

użytkownik to użytkownik, który ma być zmieniony.

DEFAULT ROLE ustawia domyślne role użytkownika. Serwer Oracle włącza domyślnie role w momencie otwierania przez użytkownika sesji. Domyślnie, wszystkie role nadane użytkownikowi są jego rolami domyślnymi.

ALL czyni wszystkie role nadane użytkownikowi rolami domyślnymi, z wyłączeniem tych, które zostaną wymienione w klauzuli EXCEPT.

NONE żadna z ról nadanych użytkownikowi nie jest jego rolą domyślną.

Polecenie ustanawia role, które będą włączane automatycznie przy podłączaniu się przez użytkownika do bazy (nie jest potrzebne hasło).

Jeśli dla użytkownika nie są podane żadne role domyślne, to przy podłączeniu się przez użytkownika do bazy (nie jest potrzebne hasło).

Rola domyślna jest włączana automatycznie przy podłączaniu się do bazy (nie jest potrzebne hasło).

Role domyślne można wyspecyfikować również w poleceniu CREATE USER.

0x01 graphic

Uwaga: Aby rolę uczynić rolą domyślną użytkownika musi być ona wcześniej nadana użytkownikowi poleceniem GRANT.

Wyświetlanie informacji o rolach

W celu wyświetlania użytkowników i nadanych im ról oraz nadanych rolom uprawnień, należy skorzystać z następujących perspektyw słownika danych.

Perspektywa

Opis

ROLEE_SYS_PRIVS

Informacje o uprawnieniach systemowych nadanych rolom.

ROLE_TAB_PRIVS

Informacje o uprawnieniach obiektowych nadanych rolom.

ROLE_ROLE_PRIVS

Informacje o rolach nadanych innym rolom.

SESSION_ROLES

Role, które są w sesji aktualnie włączone.

USER_ROLE_PRIVS

Role nadane użytkownikowi.

DBA_SYS_PRIVS

Opis uprawnień systemowych nadanych rolom i użytkownikom.

DBA_ROLES

Wszystkie istniejące w bazie role.

Role OSOPER i OSDBA

Dwie specjalne role, OSOPER i OSDBA, wykorzystywane są do kontrolowania operacji bazodanowych gdy słownik danych jest niedostępny (innymi słowy, gdy baza jest zamknięta), specjalnie - do ochrony użycia słowa kluczowego INTERNAL.

Role OSOPER i OSDBA pozwalają na dwa poziomy wykorzystania słowa kluczowego INTERNAL.

Rola

Opis

OSOPER

Pozwala użytkownikowi na wykonanie STARTUP, SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER DATABASE BACKUP CONTROLFILE, ALTER TABLESPACE BEGIN/END BACKUP, ARCHIVE LOG AND RECOVER; rola OSOPER zawiera również uprawnienie RESTRICTED SESSION.

OSDBA

Zawiera wszystkie uprawnienia systemowe z opcją administracji nimi (WITH ADMIN OPTION) oraz rolę OSOPER; jedynie rola OSDBA pozwala na wykonanie polecenia CREATE DATABASE i wykonanie odtwarzacza do punktu w czasie.

Role SYSOPER i SYSDBA

Oracle może dokonać weryfikacji użytkowników próbujących podłączyć się do bazy danych korzystając z informacji umieszczonej w bazie danych lub w pliku z hasłami, do których użytkownicy muszą zostać przypisani.

Dwie specjalne role, SYSOPER i SYSDBA, zawierają uprawnienia pozwalające administratorom bazy na wykonanie następujących akcji.

Rola

Opis

SYSOPER

Pozwala użytkownikom na wykonanie STARTUP, SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER DATABASE BACKUP CONTROLFILE, ALTER TABLESPACE BEGIN/END BACKUP, ARCHIVE LOG AND RECOVER; rola SYSOPER zawiera również uprawnienie RESTRICTED SESSION.

SYSDBA

Zawiera wszystkie uprawnienia systemowe z opcją administracji nimi (WITH ADMIN OPTION) oraz rolę SYSOPER; jedynie rola SYSDBA pozwala na wykonanie polecenia CREATE DATABASE i wykonanie odtwarzania do punktu w czasie

Podsumowanie

Nadanie użytkownikom uprawnień dostępu do bazy i do obiektów w bazie oraz udostępnienie im pewnych uprawnień systemowych.

Kontrola DBA nad przywilejami .

Własności roli

0x01 graphic

Zadania

Podłącz się jako sysdba, stwórz użytkownika CEZARY/CEZARY, przypisz mu domyślną przestrzeń USER_DATA, tymczasową przestrzeń TEMPORARY_DATA, nadaj mu prawo podłączenia się do bazy stwórz rolę SECURITY_ROLE

Nadaj roli SECURITY_ROLE wszystkie prawa potrzebne do zarządzania uprawnieniami i uprawnienie do przeglądania wszystkich tabel (w Security Managerze)

Nadaj rolę SECURITY_ROLE użytkownikowi CEZARY

Obejrzyj zapisy dotyczące roli SECURITY_ROLE w perspektywach DBA_ROLE_PRIVS , DBA_ROLES, DBA_SYS_PRIVS ROLE_ROLE_PRIVS i ROLE_SYS_PRIVS

Podłącz się jako CEZARY i obejrzyj perspektywy SESSION_ROLES, SESSION_PRIVS

Jako CEZARY utwórz rolę DEV_USER i nadaj jej prawa do tworzenia tabel, perspektyw, klastrów, sekwencji i synonimów (w Security Managerze)

Jako CEZARY nadaj rolę SECURITY_ROLE użytkownikowi ZYGMUNT

Podłącz się ZYGMUNT obejrzyj perspektywy USER_ROLE_PRIVS, USER_SYS_PRIVS

Będąc podłączonym jako CEZARY utwórz rolę END_USER

Będąc podłączonym jako ZYGMUNT nadaj roli END_USER prawa SELECT, UPDATE i INSERT na tabeli EMP

Będąc podłączonym jako CEZARY nadaj te rolę użytkownikowi WACEK

Będąc podłączonym jako ZYGMUNT odbierz użytkownikowi WACEK uprawnienie SELECT na tabeli EMP

Podłącz się jako WACEK i sprawdź, że dzięki roli END_USER użytkownik

WACEK może nadal wykonywać zapytania na ZYGMUNT.EMP

XVI. Obserwacja bazy danych

Cele

Lekcja ta wyjaśnia w jaki sposób korzystać z obserwacji bazy danych do zbierania statystyk z działania bazy oraz jak przeglądać i utrzymywać wyniki obserwacji.

Na końcu tej sekcji powinieneś potrafić

Lekcja opcjonalna

Lekcja ta zawiera materiał, który jest specyficzny dla niektórych instalacji i konfiguracji Oracle

Instruktor może dokonać wyboru materiału w zależności od potrzeb uczestników. Całość tekstu, ćwiczeń i rozwiązań została tu zamieszczona do ewentualnego samodzielnego przestudiowania.

Przegląd

Monitorowanie i zapis wybranych akcji użytkownik bazy danych przy pomocy obserwacji bazy.

Obserwacja (Auditing)

Operacje obserwacji

Zapis obserwacji (Audit Trail)

Rekomendacje obserwacji

Przy dobieraniu strategii obserwacji należy rozważyć następujące wskazania.

Generalnie przy obserwacji

Podczas obserwacji związanej z podejrzanymi działaniami w bazie danych należy

Podczas obserwacji w celu gromadzenia informacji historycznych o działaniu bazy danych należy

Włączanie obserwacji

Chociaż polecenia AUDIT i NOAUDIT mogą być użyte w dowolnej chwili, zapis do dziennika obserwacji będzie odbywać się jedynie, gdy DBA ustawi parametr inicjalizacji AUDIT_TRAIL w pliku startowym.

Składnia:

AUDIT_TRAIL = wartość

gdzie wartość może być jedną z następujących opcji:

DB włącza obserwację bazy i kieruje wszystkie zapisy do dziennika obserwacji (sys.aud$).

OS włącza obserwację bazy i kieruje wszystkie zapisy do dziennika obserwacji w systemie operacyjnym (jeśli system operacyjny dopuszcza to).

NONE wyłącza obserwację (jest to wartość domyślna).

Po zmianie parametru inicjalizacyjnego AUDIT_TRAIL, instancja musi zostać zatrzymana i wystartowana ponownie, by nowa wartość zaczęła obowiązywać.

Jeśli obserwacja nie jest potrzebna, należy uruchomić skrypt catnoaud.sql. który usunie tablice i perspektywy słownika danych używane do obserwacji. Jeśli następnie obserwacja będzie potrzebna, uruchomienie skryptu cataudit.sql zainstaluje ponownie potrzebne tablice i perspektywy słownika danych.

Miejsce gdzie znajdują się skrypty cataudit.sql i catnoaudit.sql zależy od systemu operacyjnego.

Zdarzenia zawsze obserwowane

Niezależnie od tego czy obserwacja bazy danych jest włączona, czy nie, Serwer Oracle zawsze zapisuje pewne akcje:

Start instancji

Zapisywana jest informacja o użytkowniku w systemie operacyjnym, który startuje instancję, identyfikatorze terminala, znacznik daty i czasu oraz czy obserwacja bazy danych została włączona czy wyłączona.

Zamknięcie instancji

Zapisywana jest informacja o użytkowniku w systemie operacyjnym, który zamyka instancję, identyfikatorze terminala, znacznik daty i czasu.

Podłączenie się do bazy danych z uprawnieniami administracyjnymi

Zapisywana jest informacja o użytkowniku w systemie operacyjnym, który podłącza się do Oracle jako sysoper lub sysdba - w celu sprawdzenia kont użytkowników (w systemie operacyjnym) posiadających uprawnienia administracyjne.

Ogniskowanie obserwacji

Po włączeniu obserwacji, będziemy chcieli zogniskować jak się tylko da. Dzięki temu zminimalizowana zostanie ilość informacji zapisywanej do dziennika. Jeśli obserwacja jest zbyt ogólna, dziennik obserwacji może bardzo szybko zapełnić się nie istotnymi informacjami.

Dla każdej obserwacji należy ograniczać zakres poprzez:

Obserwacja poleceń i uprawnień

Obserwacja obiektów

Obserwacja nie jest realizowana dla połączeń CONNECT INTERNAL i dla połączeń jako użytkownik sys.

0x01 graphic

Uwaga: Opcje obserwacji poleceń i uprawnień podane w poleceniu AUDIT odnoszą się do następujących sesji, a nie do sesji bieżących.

Do wykonania poleceń AUDIT i NOAUDIT wymagane jest posiadanie przywileju AUDIT SYSTEM.

Jeśli pominie się klauzulę WHENEVER, Serwer Oracle będzie obserwował zarówno udane jak i nie udane próby.

Kiedy obserwuje się działania nieudane, zapis obserwacji nie jest generowany dla poleceń niepoprawnych (np. z błędem składniowym).

Obserwowanie poleceń

Możliwe jest wybiórcze obserwowanie powiązanych grup poleceń, które mieszczą się w dwóch kategoriach.

Kategorie obserwowanych poleceń

0x01 graphic

Wskazówki:

Wykonanie polecenia zakończone niepowodzeniem może być obserwowane, jeśli niepowodzenie nastąpiło z powodu braku autoryzacji lub odwołania się do nieistniejącego obiektu.

Wykonanie polecenia zakończone niepowodzeniem nie jest obserwowane jeśli samo polecenie SQL było niepoprawne.

Specyfikowanie obserwacji poleceń

Obserwacje poleceń i jej opcje specyfikuje się poleceniem AUDIT

Składnia:

0x01 graphic

gdzie:

polecenie określa polecenia SQL, których obserwacja ma mieć miejsce.

BY użytkownik określa, iż tylko polecenia SQL wydane przez podanego użytkownika mają być obserwowane. Jeśli klauzula ta zostanie pominięta, Serwer Oracle będzie obserwował wszystkich użytkowników.

BY SESSION powoduje, iż Serwer Oracle będzie generował do dziennika tylko jeden rekord dla danego obiektu bazy danych na każdą sesję, niezależnie od tego ile poleceń SQL tego samego typu zostanie wydanych.

BY ACCESS powoduje, iż Serwer Oracle będzie generował do dziennika zapis za każdym razem, gdy obserwowane polecenie zostanie wykonane. Jeśli podamy opcje obserwacji poleceń lub uprawnień dotyczących Języka Definicji Danych (DDL), Oracle będzie wykonywał obserwację dla wywołań, niezależnie od tego jakie było zlecenie. Dla poleceń z poza grupy DDL domyślna jest klauzula BY SESSION.

WHENEVER SUCCESSFUL określa, iż obserwacja ma się odbywać jedynie dla poprawnie zakończonych poleceń SQL.

NOT określa, iż obserwacja ma się odbywać jedynie dla poleceń SQL zakończonych niepowodzeniem.

Przykład

Obserwacja poleceń CREATE/ALTER/DROP USER, zakończonych sukcesem lub nie, dla wywołania (by access) w celu wykrycia modyfikacji atrybutów użytkownika.

SQL> AUDIT user BY ACCESS

Włączenie obserwacje poleceń przy użyciu skrótu CONNECT - w celu rejestrowania wszystkich połączeń do bazy danych.

SQL> AUDIT connect

Zapytanie na DBA_STMT_AUDIT_OPTS.

SQL> SELECT user_name, audit_option, success, failure

2> FROM dba_stmt_audit_opts;

USER_NAME AUDIT_OPTION SUCCESS FAILURE

------------------ ---------------------------- ---------- ----------

USER BY ACCESS BY ACCESS

CREATE SESSION BY ACCESS BY ACCESS

Wszystkie opcje obserwacji poleceń są podane w perspektywie STMT_AUDIT_OPTION_MAP

Obserwowanie uprawnień

Za pomocą obserwacji uprawnień możliwa jest selektywna obserwacja poleceń wydanych przez uprawnionych do ich wykonania. Obserwacja uprawnień może być szeroka i obejmować wszystkich użytkowników bazy danych lub też zogniskowana na wybranych użytkownikach. Obserwacja uprawnień jest składniowo i funkcjonalnie bardzo podobna do obserwacji poleceń. Powinna być bardzo wybiórcza, minimalizująca ilość informacji zapisywanej do dziennika obserwacji.

Obserwacja uprawnień

Specyfikowanie obserwacji uprawnień

Składnia

0x01 graphic

gdzie:

przywilej_systemowy określa przywilej systemowy którego wykorzystanie będzie obserwowane.

BY użytkownik określa, iż tylko polecenie SQL wydane przez podanego użytkownika mają być obserwowane. Jeśli klauzula ta zostanie pominięta Serwer Oracle będzie obserwował wszystkich użytkowników.

BY SESSION powoduje, iż Serwer Oracle będzie generował do dziennika tylko jeden rekord na każdą sesję, niezależnie od tego ile poleceń SQL tego samego typu zostanie wydanych.

BY ACCESS powoduje, iż Serwer Oracle będzie generował do dziennika zapis za każdym razem, gdy obserwowane polecenie zostanie wykonane. Jeśli podamy opcję obserwacji poleceń lub uprawnień dotyczących Języka Definicji (DDL). Oracle będzie wykonywał obserwację dla wywołań, niezależnie od tego jakie było zlecenie. Dla poleceń spoza grupy DDL domyślna jest klauzula BY SESSION.

WHENEVER SUCCESSFUL określa, iż obserwacja ma się odbywać jedynie dla poprawnie zakończonych poleceń SQL.

NOT określa, iż obserwacja ma się odbywać jedynie dla poleceń SQL zakończonych niepowodzeniem.

Przykłady

Obserwacje prób scotta, udanych i nieudanych, tworzenia tabel i indeksów we własnym schemacie.

SQL> AUDIT create table BY scott BY ACCESS;

Obserwacja zakończonych powodzeniem prób zmiany (ALTER) tabel, procedur, funkcji lub pakietów dokonywanych przez scotta w dowolnym schemacie.

SQL> AUDIT alter any table, alter any procedure

2> BY scott BY ACCESS

3> WHENEVER SUCCESSFUL;

Zapytanie na DBA_PRIV_AUDIT_OPIS.

SQL> SELECT * FROM dba_priv_audit_opts;

USER_NAME PRIVILEGE SUCCESS FAILURE

------------------ ---------------------------- ---------- ----------

SCOTT CREATE TABLE BY ACCESS BY ACCESS

SCOTT ALTER ANY TABLE BY ACCESS NOT SET

SCOTT ALTER ANY PROCEDURE BY ACCESS NOT SET

Obserwowanie obiektów

Do selektywnej obserwacji poleceń wykonywanych na podanych obiektach danego schematu korzystamy z obserwacji obiektów. Obserwacja obiektów będzie rejestrowała wszystkie polecenia DML i zapytania dla każdego obiektu dowolnego schematu, a dodatkowo wykonywane na tym obiekcie polecenia GRANT i REVOKE.

Obserwowane obiekty

Procedury w pakietach nie mogą być obserwowane osobno.

Ponieważ perspektywy i procedury mogą odwoływać się do innych obiektów w bazie, efektem korzystania z nich może być pojawienie się kilku zapisów z obserwacji.

Opcje obserwacji obiektów są zawsze ustawiane dla wszystkich użytkowników bazy danych. Nie ma możliwości ustawienia ich dla podanej listy użytkowników.

Opcje obserwacji obiektów

Opcja pakietu/obiektu

Tabela

Perspektywa

Sekwencja

Snapshot

Procedura

ALTER

X

X

AUDIT

X

X

X

X

COMMENT

X

X

DELETE

X

X

EXECUTE

X

GRANT

X

X

X

X

INDEX

X

INSERT

X

X

LOCK

X

X

RENAME

X

X

X

SELECT

X

X

X

X

UPDATE

X

X

Specyfikowanie obserwacji obiektów

Obserwację obiektów i jej opcje specyfikuje się poleceniem AUDIT

Składnia:

0x01 graphic

gdzie:

akcja_na_obiekcie określa konkretną operację do obserwowania.

obiekt określa obserwowany obiekt. Obiektem tym może być jedna lub więc tabel, perspektyw, sekwencji, procedur, pakietów, funkcji lub „migawek”. Jeśli pominięty zostanie schemat, Serwer Oracle przyjmie, iż chodzi o schemat aktualnego użytkownika.

DEFAULT określa, że opcje obserwacji będą przyjmowane domyślnie dla wszystkich tworzonych w przyszłości obiektów.

BY SESSION powoduje, iż Serwer Oracle będzie generował do dziennika tylko jeden rekord na każdą sesję, niezależnie od tego ile poleceń SQL tego samego typu zostanie wydanych.

BY ACCESS powoduje, iż Serwer Oracle będzie generował do dziennika zapis za każdym razem, gdy obserwowane polecenie zastanie wykonane. Domyślną klauzulą jest BY SESSION.

WHENEVER SUCCESSFUL określa, iż obserwacja ma się odbywać jedynie dla poprawnie zakończonych poleceń SQL.

NOT określa, iż obserwacja ma się odbywać jedynie dla poleceń SQL zakończonych niepowodzeniem.

Obiekt musi należeć do schematu wydającego polecenie lub wydający to polecenie musi posiadać przywilej AUDIT ANY.

Jako opcja obserwacji obiektów może być użyty skrót ALL. ALL oznacza obserwację wszystkich opcji mających dla danego typu obiektu sens.

Przykłady

Włączenie obserwacji EXECUTE dla procedury CHANGE_PRICE, jeden raz dla każdej sesji.

SQL> AUDIT EXECUTE ON change_price BY SESSION;

Włączenie obserwacji DELETE na tabeli EMP, dla każdej próby wykonania polecenia.

SQL> AUDIT DELETE ON emp BY ACCESS;

Włączenie obserwacji GRANT na tabeli EMP. Zapis prób zakończonych powodzeniem.

SQL> AUDIT GRANT ON emp BY SESSION WHENEVER SUCCESSFUL;

Opcje te są używane głównie do obserwacji działań podejrzanych i nieuprawnionych.

Zapytanie na USER_OBJ_AUDIT_OPTS pokazuje jakie opcje obserwacji zostały ustawione.

SQL> SELECT * FROM user_obj_audit_opts;

OBJECT_NAME TYPE ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE CRE REA WRI

------------- ---------- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

CUSTOMER TABLE -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/-

DEPT TABLE -/- -/- -/- A/A S/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/-

EMP TABLE -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/-

CHANGE_PRICE PROCEDURE -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- -/- S/S

Włączenie obserwacji wszystkich poleceń dotyczących tabeli DEPT.

SQL>AUDIT ALL ON dept

Wyświetlenie wyniku polecenia z USER_OBJ_AUDIT_OPTS.

SQL> SELECT * FROM user_obj_audit_opts

2> WHERE object_name = `DEPT'

OBJECT_NAME TYPE ALT AUD COM DEL GRA IND INS LOC REN SEL UPD REF EXE CRE REA WRI

------------- ---------- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- ---

DEPT TABLE S/S S/S S/S S/S S/S S/S S/S S/S S/S S/S S/S S/S -/- -/- S/S S/S

Za pomocą klauzuli DEFAULT mogą być definiowane domyślne opcje obserwacji obiektów mające obowiązywać dla nowo tworzonych obiektów.

Domyślne opcje obserwacji obiektów

Każda zmiana w opcjach domyślnych obowiązuje dla obiektów, które będą dopiero tworzone i nie jest odzwierciedlana w ustawieniach opcji dla żadnego już z istniejących obiektów.

Do ustawienia domyślnych opcji obserwacji potrzebne jest uprawnienie systemowe AUDIT SYSTEM.

Przykład

Włączenie opcji obserwacji obiektów ALTER, SELECT i RENAME dla wszystkich jeszcze nie utworzonych obiektów.

SQL>AUDIT alter, select, rename ON default;

W poprzednim przykładzie

Wyłączanie obserwacji uprawnień i poleceń

Obserwację uprawnień i poleceń oraz ich opcje wyłącza się poleceniem NOAUDIT.

Składnia:

0x01 graphic

gdzie:

polecenie specyfikuje polecenie, które nie ma być dłużej obserwowane.

przywilej_systemowy specyfikuje przywilej systemowy, którego wykorzystanie nie ma być dłużej obserwowane.

BY użytkownik zatrzymuje obserwację poleceń SQL podanych użytkowników (w ich następnych sesjach). Jeśli klauzula ta zostanie pominięta, Serwer Oracle zaprzestaje obserwacji wszystkich użytkowników.

WHENEVER SUCCESSFUL zatrzymuje obserwację operacji zakończonych sukcesem

NOT zatrzymuje obserwację poleceń, których wynikiem był błąd.

Do wykonywania tego polecenia potrzebne jest posiadanie przywileju AUDIT SYSTEM.

Przykład

Wyłączenie obserwacji scotta dotyczącej wszystkich jego prób (udanych i nie) tworzenia tabel i indeksów w swoim schemacie.

SQL> NOAUDIT create table BY scott;

Wyłączenie obserwacji udanych prób tworzenia tabel, procedur, funkcji i pakietów podejmowanych przez scotta w dowolnym schemacie.

SQL> NOAUDIT alter any table, alter any procedure

2> BY scott

3> WHENERVER SUCCESSFUL;

Wyłączanie obserwacji obiektów

Obserwację obiektów wyłącza się wersją polecenia NOAUDIT.

Składnia:

0x01 graphic

gdzie:

akcja_na_obiekcie określa, jakie typy obserwacji mają zostać zatrzymane.

ON poprzedza nazwę obiektu, dla którego zaprzestajemy obserwacji. Jeśli pominięty zostanie schemat, Serwer Oracle będzie zakładał, iż chodzi o obiekt aktualnego użytkownika.

WHENEVER SUCCESSFUL zatrzymuje obserwację działań zakończonych sukcesem.

NOT zatrzymuje obserwację działań, dla których Serwer Oracle zwrócił błąd.

Obiekt, dla którego obserwację chcemy zatrzymać musi należeć do naszego własnego schematu lub też musimy posiadać przywilej systemowy AUDIT ANY.

Przykład

Wyłączenie obserwacji EXECUTE dla procedury CHANGE_PRICE.

SQL> NOAUDIT execute ON change_price;

Wyłączenie obserwacji DELETE na tabeli EMP.

SQL> NOAUDIT delete ON emp;

Wyłączenie obserwacji GRANT na tabeli EMP, z opcją WHENEVER SUCCESSFUL.

SQL> NOAUDIT grant ON emp

2> WHENEVER SUCCESSFUL;

Polecenie NOAUDIT usuwa wszystkie znajdujące się w słowniku danych zapisy dotyczące obserwacji tego obiektu.

Dziennik obserwacji

Dziennik obserwacji zawiera zapisy generowane przez obserwację poleceń, uprawnień i obiektów. Dziennik ten stanowi tabela słownika danych SYS.AUD$.

Każdy wiersz w dzienniku obserwacji zawiera informacje o:

Zapisy obserwacji dokonywane są w czasie fazy wykonywania (execute phase) polecenia.

0x01 graphic

Wskazówki:

Monitorowanie dziennika obserwacji

Należy monitorować rozmiar i rozrost dziennika obserwacji w celu oszczędzenia miejsca na dysku i zapewnienia kontynuacji działania bazy danych. Kiedy dziennik zostanie zapełniony, nowe zapisy nie mogą być do niego wstawiane i obserwowane polecenia będą zwracały błędy.

Dziennik obserwacji rośnie zależnie od:

Maksymalny rozmiar dziennika jest definiowany w momencie tworzenia bazy danych. Plik wykonywany przy tworzeniu bazy, sqlbsq, zawiera polecenie CREATE dla tabeli AUD$.

Jeśli dziennik przepełni się, nie można wstawić więcej zapisów z obserwacji i obserwowane polecenia nie będą mogły być wykonywane. Wszystkim próbującym wykonać te polecenia będą zgłaszane błędy. Zanim polecenia te będą mogły być wykonywane, konieczne jest wtedy zwolnienie miejsca w dzienniku obserwacji.

Należy upewnić się, iż dziennik obserwacji nie rośnie zbyt gwałtownie.

Kontrolowanie rozrostu dziennika obserwacji

Ograniczenie obserwacji obiektów

Aby obserwować obiekt, trzeba albo być jego właścicielem, albo posiadać przywilej AUDIT ANY. Dlatego, w celu zapewnienia, że „Security Administrator” jest jedynym użytkownikiem, który może obserwować obiekty, należy przestrzegać dwóch zasad:

  1. Jedynie „Security Administrator” posiada przywilej AUDIT ANY.

  2. Żaden inny użytkownik nie posiada swoich własnych obiektów.

Obsługa dziennika obserwacji

Obsługa dziennika obserwacji, polega głównie na periodycznym usuwaniu zapisów obserwacji i zerowaniu dziennika.

Zapisy z dziennika należy usuwać poprzez

Przykład

Usunięcie z dziennika obserwacji wszystkich rekordów.

SQL> TRUNCATE TABLE sys.aud$;

Usunięcie z dziennika wszystkich rekordów sprzed trzech miesięcy.

SQL> DELETE FROM sys.aud$

2> WHERE TIMESTAMP< SYSDATE-90;

Archiwizacja zapisów obserwacji do pliku w systemie operacyjnym. Korzystamy z narzędzia Export w trybie tabel. Należy pamiętać, że nastąpi eksport całej tabeli. W najprostszej wersji, polecenie poniższe wyeksportuje tabelę AUD$ do pliku expdat.dmp.

EXP USERID = sys/password TABLES = (AUD$) FILE = expdat.dmp

Narzędzia Export nie zmieni w żaden sposób tabeli SYS.AUD$, a więc nadal należy obciąć dziennik powtórzeń.

Jeśli w dzienniku jest wiele nieużywanych ekstentów, należy obciąć go (truncate) aby je zwolnić.

  1. Skopiuj rekordy, które mają zostać zachowane do tabeli tymczasowej lub wyeksportuj dziennik na plik.

  2. Podłącz się do bazy jako plik.

  3. Obetnij SYS>AUD$ używając polecenia TRUNCATE.

  4. Załaduj rekordy zarchiwizowane w kroku 1.

Kopię dziennika należy robić jedynie gdy istnieją zapisy, które trzeba zachować; w przeciwnym przypadku można ominąć kroki 1 i 4.

SYS.AUD$ jest jednym z niewielu obiektów należących do sys'a, które mogą być modyfikowane bezpośrednio.

Rekordy z dziennika obserwacji mogą być usunięte przez użytkownika sys lub innego posiadającego prawo DELETE ANY TABLE.

Jeśli obserwowane są połączenia do bazy danych i dziennik przepełni się, użytkownicy czekają nie mogąc podłączyć się. Wtedy administrator musi podłączyć się jako sys (podłączenia jako sys nie są obserwowane) i zrobić miejsce w dzienniku.

Jeśli dziennik obserwacji jest przepełniony, obserwowane polecenia nie mogą być wykonywane, ponieważ nie może zostać zapisana informacja z obserwacji

Ograniczenia pamięci (Storage Limitations)

Przy obserwacji podejrzanych działań, administrator powinien chronić integralność dziennika obserwacji.

Przykład

Obserwacja dziennika obserwacji.

SQL> AUDIT insert, update, delete

2> ON sys.aud$

3> BY ACCESS;

W celu ochrony dziennika obserwacji przed nieuprawnionymi usunięciami zapisów, jedynie administrator powinien dysponować uprawnieniem systemowym DELETE ANY TABLE.

Wyświetlanie informacji o obserwacji

Predefiniowane perspektywy na dzienniku obserwacji tworzone są przez skrypt cataudit.sql.

Aby usunąć wszystkie te perspektywy ze słownika danych, należy uruchomić skrypt catnoaud.sql.

Informacje z obserwacji można wyświetlić korzystając z predefiniowanych perspektyw dziennika obserwacji.

Predefiniowane perspektywy dziennika obserwacji

Perspektywy dziennika obserwacji

Krótki opis

STMT_AUDIT_OPTION_MAP

Mapowanie nr opcji obserwacji i jej nazwy.

AUDIT_ACTIONS

Mapowanie nr akcji i jej nazwy.

ALL_DEF_AUDIT_OPTS

Domyślne opcje obserwacji.

DBA_STMT_AUDIT_OPTS

Opcje obserwacji systemu (poleceń).

DBA_PRIV_AUDIT_OPTS

Opcje obserwacji uprawnień.

DBA_OBJ_AUDIT_OPTS

Opcje obserwacji obiektów.

USER_OBJ_AUDIT_OPTS

Opcje obserwacji obiektów.

DBA_AUDIT_TRAIL

Wszystkie zapisy obserwacji.

USER_AUDIT_TRAIL

Zapisy obserwacji dla danego użytkownika.

DBA_AUDIT_SESSION

Wszystkie zapisy o początkach i końcach sesji.

USER_AUDIT_SESSION

Początki i końce sesji użytkownika.

DBA_AUDIT_STATEMENT

Wszystkie zapisy dotyczące obserwacji dla opcji DBA.

USER_AUDIT_STSTEMENT

Jak wyżej, lecz dla aktualnego użytkownika.

DBA_AUDIT_OBJECT

Wszystkie zapisy dotyczące obiektów.

USER_AUDIT_OBJECT

Jak wyżej, lecz dotyczące obiektów aktualnego użytkownika.

DBA_AUDIT_EXISTS

Wszystkie zapisy dla EXISTS/NOT EXISTS.

Przykład

Obserwacja usuwania wierszy dla konkretnej tabeli.

SQL> CONNECT system/password;

SQL> AUDIT delete ON scott.emp BY SESSION WHENEVER

SUCCESSFUL;

SQL> CONNECT adams/wood;

SQL> DELETE scott.emp WHERE empno = 1111;

SQL> CONNECT scott/tiger

SQL> DELETE emp WHERE empno = 1112;

SQL> CONNECT system/password

SQL> DELETE scott.emp WHERE empno = 1113;

Wydruk z dziennika obserwacji dotyczący poprzednich poleceń mogłyby wyglądać następująco:

SQL> SELECT username,

2> TO_CHAR (timestamp, `DD-MON-YY')

3> owner, obj_name, action_name,

4> returncode, priv_used

5> FROM sys . dba_audit_trail

6> WHERE action_name = `DELETE';

USERNAME TIMESTAMP OWNER OBJ_NAME ACTION_NAME RETURNCODE PRIV_USED

-------- ------------ ------ --------- ----------- ---------- -----------

ADAMS 15-SEP-92 SCOTT EMP DELETE 0 DELETE

SCOTT 15-SEP-92 SCOTT EMP DELETE 0

SYSTEM 15-SEP-92 SCOTT EMP DELETE 0 DELETE ANY TABLE

Ponieważ scott jest właścicielem obiektu, nie potrzebuje on specjalnych uprawnień do wykonania polecenia DELETE. Jednak system skorzystał z przywileju DELETE ANY TABLE, a adam z przywileju DELETE.

Podsumowanie

Rejestracja działań w bazie danych za pomocą obserwacji.

Typy Obserwacji

Wykorzystanie obserwacji

Dziennik obserwacji

0x01 graphic

Zadania

Włącz opcje obserwacji, które pozwolą sprawdzić, że kto próbuje podłączyć się do bazy (zarówno udane jak i nieudane próby)

Jakie perspektywy należy obejrzeć, aby sprawdzić, czy zostały ustawione poprawne opcje?

Spróbuj podłączyć się do bazy jako WACEK/PIOTREK

Podłącz się do bazy jako WACEK/WACEK

Podłącz się jako sysdba i sprawdź wyniki obserwacji w perspektywie DBA_AUDIT_TRAIL. Gdzie można zobaczyć, które próby zakończyły się niepowodzeniem?

Ustaw odpowiednie opcje obserwacji, aby monitorować wszystkie udane modyfikacje tabeli EMP użytkownika ZYGMUNT

Podłącz się jako WACEK i zmodyfikuj tabelę EMP w schemacie ZYGMUNTA, obejrzyj zapisy w dzienniku informacji

Użytkownik WACEK często tworzy, modyfikuje strukturę i usuwa tabele. Jak monitorować to, co robi użytkownik WACEK? Włącz odpowiednie opcje obserwacji, tak aby każde wydane polecenie powodowało wpis w dzienniku obserwacji.

Podłącz się jako WACEK i uruchom skrypt s:\wacekddl.sql, aby wykonać kilka poleceń DDL.

Będąc podłączonym jako sysdba przejrzyj dziennik obserwacji, aby zobaczyć, co zostało zaobserwowane.

Wyłącz opcje obserwacji i sprawdź poprawność wyłączenia oglądając odpowiednie perspektywy

XVII. Obsługa języków narodowych

Cele

Lekcja ta zawiera różne koncepcje i terminologię związaną z obsługą języków narodowych - National Language Support (NLS).

Po przerobieniu tej lekcji powinieneś potrafić

Lekcja opcjonalna

Lekcja ta zawiera materiał, który jest specyficzny dla niektórych instalacji i konfiguracji Oracle.

Instruktor może dokonać wyboru materiału w zależności od potrzeb uczestników. Całość tekstu, ćwiczeń i rozwiązań została tu zamieszczona do ewentualnego samodzielnego przestudiowania.

Przegląd

Parametry National Language Support (NLS) pozwalają Oracle na obsługę danych w wielu zestawach narodowych znaków czy stron kodowych (schematów kodowania znaków). NLS pozwala instancji na interakcję z użytkownikiem w jego własnym języku.

NLS nie tłumaczy słów w bazie danych. Pozwala natomiast aplikacjom na konwersję schematów kodowania znaków i pozwala Oracle na wyświetlanie komunikatów w wyspecyfikowanym języku, włączając w to daty i inne dane w określonych formatkach.

Wykorzystanie National Language Support

Określanie domyślnego zachowania NLS dla instancji

Zmiany domyślnego zachowania NLS dla użytkownika

Zmiany zachowania NLS w czasie sesji

Funkcje SQL i NLS

Własności NLS

Aplikacje projektowane z NLS mogą obsługiwać wiele schematów kodowania znaków, języków, formatów dat i liczb jak również konwencji sortowania i użycia wielkich i małych liter.

Schematy kodowania znaków w jednym bajcie (Single-byte character schemes) używane są dla języków europejskich (dla przykłady francuski, niemiecki, islandzki, hiszpański, portugalski, grecki, czeski, słowacki, rosyjski i arabski) i języków amerykańskich (np. amerykański, kanadyjski francuski, meksykański hiszpański czy brazylijski portugalski).

Obsługa języków narodowych (National Language Support)

Schematy kodowania znaków

Schematy kodowania znaków określają kody numeryczne odpowiadające literom, które komputer lub terminal może wyświetlić i otrzymać.

Schematy kodowania znaków używane są do interpretowania danych - jako mające znaczenie symbole z terminala do komputera. Dla przykładu, znak zostaje wprowadzony na klawiaturze, terminal przekłada go na liczbę, która z kolei zostaje wysłana do komputera. W przeciwnym kierunku, liczba reprezentująca znak zostaje otrzymana przez terminal z komputera. Terminal dokonuje konwersji liczby w literę, która zostaje wyświetlona na ekranie. Schemat kodowania znaków terminala określa więc, jaki kod reprezentuje jego literę.

Przykłady schematów jednobajtowych

Jednobajtowe schematy kodowania mogą zostać podzielone na schematy siedmio- i ośmiobitowe. Schematy siedmiobitowe mogą definiować do 128 znaków i normalnie obsługują jeden język. Schematy ośmiobitowe definiują do 256 znaków i mogą obsługiwać kilka języków.

Przykłady schematów wielobajtowych

Komputery, drukarki i terminale korzystają w celu obsługi alfabetów narodowych z wielu różnych schematów kodowania znaków. Schematy te bazują albo na kodzie ASCH, albo na kodzie EBCDIC. Są również standardy ANSI i ISO, lecz producenci, nawet ze Wspólnoty Europejskiej (EU), posiadają swoje własne „standardy”.

Niektóre schematy kodowania znaków korzystają ze stałej liczby bajtów dla każdego znaku (np. jeden bajt, dwa bajty, cztery bajty). Jednak inne schematy (nazywane schematami „z przesuwaniem”- shift-in/shift-out) używają do reprezentacji każdego znaku innej liczby bajtów. Kod kontrolny shift-out, przesłany do urządzenia, wskazuje, iż następne bajty mają być traktowane jako znaki dwubajtowe, aż do przesłania kodu sterującego shift-in.

Parametry i zmienne środowiskowe NLS

Jeśli dla wersji 7.2 lub późniejszych nie jest ustawiona w środowisku unixowym zmienna środowiskowa ORA_NLS to możliwe jest utworzenie bazy danych jedynie z domyślnym zestawem znaków US7ASCH. ORA_NLS powinno (pod UNIXem) zostać ustawione w następujący sposób:

$ORACLE_HOME/ocomon/nls/admin/data

Jeśli w środowisku nie jest ustawiona zmienna NLS_CHARACTERSET (lub NLS_LANG), a baza danych została utworzona z zestawem znaków innym niż US7ASCH, nie będzie możliwe wystartowanie bazy - zostanie zgłoszony błąd ORA_12701.

W wersjach 7.2 i późniejszych, wszystkie parametry NLS z initSID.ora dostępne są również jako zmienne środowiskowe, co pozwala na określonej indywidualnej charakterystyki NLS dla każdego klienta bez korzystania z aplikacji z poleceniem ALTER SESSION.

Określenie zachowania charakterystycznego dla języka

Zachowanie charakterystyczne dla danego języka określa się za pomocą podawanego w pliku startowym parametru inicjalizacyjnego NLS_LANGUAGE.

NLS_LANGUAGE specyfikuje

Składnia:

NLS_LANGUAGE=język

Obsługiwane języki różnią się w zależności od systemu operacyjnego.

Zachowanie charakterystyczne dla danego języka określa się za pomocą podawanego w pliku startowym parametru inicjalizacyjnego NLS_TERRITORY.

NLS_TERRITORY specyfikuje

Składnia:

NLS_TERRITORY=terytorium

Jeśli nazwa terytorium zawiera spację, jak np. The Netherlands, nazwa ta powinna zostać ujęta w cudzysłów (”THE NETHRTLANDS”).

Określenie zachowania NLS dla użytkowników

Zmianę domyślnego zachowania NLS dla pojedynczego użytkownika umożliwia zmienna środowiskowa NLS_LANG. Wartość NLS_LANG przesłania wartości parametrów inicjalizacyjnych NLS.

Każdy ze składników kontroluje część własności NLS.

Składnia:

NLS_LANG = język_terytorium.schemat_kodowania_znaków

gdzie:

język przesłania wartości NLS_LANGUAGE i kontroluje te same własności co NLS_LANGUAGE.

terytorium przesłania wartość NLS_TERRITORY i kontroluje te same własności co NLS_TERRITORY.

schemat_kodowania_znaków określa schemat kodowania znaków używany przez aplikację kliencką (normalnie - ten sam co schemat terminala użytkownika).

NLS_LANG definiuje schemat kodowania znaków terminalu klienta, Różni użytkownicy mogą korzystać z różnych schematów. Dane przesyłane między klientem a serwerem są automatycznie konwertowane pomiędzy dwoma schematami kodowania. Schemat kodowania używany w bazie danych powinien być nadzbiorem lub ekwiwalentem wszystkich schematów klienckich. Konwersja jest transparentna dla aplikacji klienckich.

Zerowanie schematu kodowania znaków za pomocą NLS_LANG powinno być dokonywane jedynie w środowisku klient-serwer.

W systemie Windows NT zmienną NLS_LANG ustawiamy w rejestrach:

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\NLS_LANG = POLISH_POLAND.EE8MSWIN1250

Wyświetlanie charakterystyki NLS

Przeglądanie aktualnych wartości parametrów NLS

V$NLS_PARAMETERS

Kolumna

Opis

NLS_DATE_FORMAT

Jawnie definiuje nowy format daty. Wartość `fmt' musi być zgodna z modelem formatu daty.

NLS_DATE_LANGUAGE

Jawnie zmienia język dla nazw dni i miesięcy oraz skróty i wartości tekstów dla innych elementów formatu daty.

NLS_NUMERIC_CHARACTERS

Jawnie określa nowy separator dziesiętny i grupowy.

NLS_ISO_CURRENCY

Jawnie określa terytorium, którego znak i waluty ISO powinien być używany.

NLS_CURRENCY

Jawnie specyfikuje nowy lokalny symbol waluty

NLS_SORT

Zmienia lingwistyczną sekwencję sortowania używaną przez Oracle do sortowania tekstów. Wartość ta musi to być albo `BINARY' bądź nazwa lingwistycznej sekwencji sortowania.

Przykład

Wyświetlanie aktualnych ustawień parametrów NLS.

SQL> SELECT * FROM v$nls_parameters

PARAMETER VALUE

---------------------------------------------------------------- ----------------

NLS_LANGUAGE POLISH

NLS_TERRITORY POLAND

NLS_CURRENCY zł

NLS_ISO_CURRENCY POLAND

NLS_NUMERIC_CHARACTERS ,

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT YY/MM/DD

NLS_DATE_LANGUAGE POLISH

NLS_CHARACTERSET EE8MSWIN1250

NLS_SORT POLISH

Zmiana indywidualnej charakterystyki NLS

Zmiana indywidualnej charakterystyki NLS dla sesji.

Przykłady

Rozważamy następującą tabelę LETTERS.

SQL> SELECT * FROM letters ORDER BY letter;

LETTER

---------------------------------------

ca

cha

cla

cz

la

lla

lx

ma

Zmiana sortowania dla aktualnej sesji na sekwencję hiszpańską.

SQL> ALTER SESSION SET nls_sort = `xspanish';

Polecenie wyświetlania posortowanej zawartości LETTERS.

SQL> SELECT * FROM letters ORDER BY letter;

LETTER

---------------------------------------

ca

cla

cz

cha

la

lx

lla

ma

Określenie języka dla nazw dni tygodnia i miesięcy zwracanych przez funkcję TO_CHAR i TO_DATE odbywa się za pomocą parametru NLS_DATE_LANGUAGE. Można podać wszystkie języki, jakie mogą być wartością parametru NLS_LANGUAGE.

Składnia:

NLS_DATA_LAGUAGE = język

Przykład

Ustawienie parametrów językowych funkcji TO_CHAR i TO_DATE na francuski a następnie na duński.

SQL> ALTER SESSION SET NLS_DATE_LANGUAGE = french;

SQL> SELECT TO_CHAR (sysdate, `Day:Dd Month yyyy')

2> ANNIVERSAIRE FROM dual;

ANNIVERSAIRE

---------------------------------------

Samedi :21 Mai 1993

SQL>ALTER SESSION SET nls_data_language = danish;

SQL> SELECT TO_CHAR (sysdate, `Day;Dd Month yyyy')

2> FRDSELSDAG FROM dual;

FRDSELSDAG

---------------------------------------

Torsdag :4 maj 1993

Separator dziesiętny i grupowy określa się za pomocą parametru NLS_NUMERIC_CHARACTERS. Oba symbole muszą być różnymi, jednobajtowymi znakami.

Składnia:

NLS_NUMERIC_CHARACTERS = 'separator_dziesiętny separator_grupowy'

Przykład

Ustawienie separatora dziesiętnego na ”,” a separatora grupowego na ” .

SQL> ALTER SESSION

2> SET nls_numeric_characters = `,.'

Zauważamy użycie w poleceniu SELECT apostrofów.

SQL> SELECT 3 * `1,5' FROM DUAL

3* `1,5'

-----------------

4,5

Liczby zawierające przecinek jako separator dziesiętny wymagają ” ”. Bez cudzysłowów nie było by możliwe rozróżnianie pomiędzy liczbą zawierającą część dziesiętną a listą dwóch liczb.

Liczby z separatorem tysięcy przechowywane jako napis muszą być do formatu numerycznego konwertowane za pomocą funkcji TO_NUMBER z odpowiednią maską formatu.

Określenie tekstu zwracanego przez maskę formatu liczbowego C, symbol waluty ISO odbywa się za pomocą parametru NLS_ISO_CURRENCY. Do specyfikacji symbolu ISO korzysta się z odpowiadającej mu nazwy terytorium.

Składnia:

NLS_ISO_CURRENCY = terytorium

Przykład

Ustawienie symbolu waluty ISO na Francję .

SQL> ALTER SESSION SET nls_iso_currency = FRANCE;

Przy takim terytorium polecenie SELECT

SQL>SELECT TO_CHAR (750, `C999') „TOTAL” FROM dual;

zwraca

TOTAL

----------------

FRF750

Określenie typu sortowania liter odbywa się za pomocą NLS_SORT.

Składnia:

NLS_SORT=BINARY | nazwa

BINARY specyfikuje sortowanie binarne, oparte na schemacie kodowania znaków (name określa specyficzną sekwencję sortowania).

Przykłady

Ustawienie sekwencji sortowania na sortowanie binarne.

SQL>ALTER SESSION SET nls_sort = binary;

SQL>SELECT * FROM animals ORDER BY animal;

ANIMAL

----------------

camel

lion

llama

lynx

Ustawienie sekwencji sortowania na alfabet hiszpański.

SQL> ALTER SESSION SET nls_sort = xspanish;

SQL>SELECT * FROM animals ORDER BY animal;

ANIMAL

----------------

camel

lion

lynx

llama

Elementy masek formatów NLS

Zostało zdefiniowanych kilka nowych elementów masek formatu. Niektóre z nich zostały zdefiniowane jako elementy masek formatu NLS.

Elementy numerycznych masek formatu

Elementy masek formatu dla dat

Przykład

Wynik poniższego zapytania wykonanego przy NLS_TERRITORY ustawionym na Francję dnia pierwszego stycznia 1993

SQL> SELECTTO_CHAR (SYSDATE, `DD MM YY') ”TODAY” ,

2> TO_CHAR (SYSDATE, `DD RM YY') ”TODAY”,

3> TO_CHAR (SYSDATE, `YYYY IW') ”TODAY”,

4> TO_CHAR 12345.67, `99G999D99') ”12345.67”

5> FROM dual;

TODAY TODAY TODAY 12345.67

---------- ---------- ---------- ---------

01 01 93 1 I 93 1992 53 12.345,67

Niezależnie od tego jakie są standardowe konwencje dla nr tygodnia na wybranym terytorium, nr tygodni Oracle nie są domyślnie ustawiane na nr tygodni ISO.

Funkcje NLS

Z NLS mogą być używane niektóre z funkcji SQL.

Konwersja liter

Konwersja liter na wielkie lub małe przy uwzględnieniu narodowych schematów kodowania znaków odbywa się za pomocą zmodyfikowanych funkcji SQL.

Pobranie aktualnego ustawienia języka

Pobranie aktualnego ustawienia języka, terytorium i schematu kodowania znaków.

Porównanie napisów

Konwersja schematów kodowania danych

Konwersja danych z jednego schematu kodowania znaków do innego.

Korzystanie z parametrów NLS w funkcjach

Podanie parametrów NLS w funkcjach SQL, których zachowanie zależy od konwencji NLS.

Funkcje SQL przyjmujące parametry NLS

Jawne podanie opcjonalnych parametrów NLS dla tych funkcji pozwala na obliczenie funkcji niezależnie od ustawień NLS dla sesji.

Przykłady

TO_CHAR ('13.000,00', `99G999D99',

`NLS_NUMERIC_CHARACTERS = `'.,''')

TO_CHAR (12345, `L099G999'

`NLS_NUMERIC CHARACTERS=',.', `NLS_CURRENCY='DFL')

Podsumowanie

Obsługa języków narodowych (National Language Support)

Określanie zachowania domyślnego dla NLS

0x01 graphic

Zadania

Obejrzyj wszystkie prawidłowe wartości ustawień NLS

Podłącz się jako WACEK, sprawdź ustawienia NLS dla sesji

Będąc podłączonym jako WACEK zmień symbol waluty na 'PLN', format daty na 'DD-MM-YY' i sprawdź, czy zmiany zostały dokonane i wyświetl datę systemową

Będąc podłączonym jako WACEK ustaw język daty na turecki, a następnie sprawdź czy data systemowa (przy pomocy funkcji TO_CHAR) jest wyświetlana w nowym języku

0x01 graphic

Materiały szkoleniowe —Administracja bazą danych Oracle

Strona 312 z 337

Strona 313 z 337

0x01 graphic



Wyszukiwarka