Oracle9i. Огляд деяких нових можливостей. H2>
Ольга Карбасова p>
Набір продуктів Oracle9i складається з
трьох основних компонентів - Oracle9i Database
(сервер бази даних), Oracle9i Application Server (сервер
додатків) і Oracle9i Developer Suite (засоби розробки). У
цій статті мова піде про нововведення Oracle9i Database. p>
Нові можливості Oracle9i Database можна з деякою
часткою умовності розділити на дві групи - призначені для розробників
додатків і для адміністраторів баз даних. Під розробкою будемо
на увазі створення серверної частини додатків. p>
Розробнику
h2>
Історично склалося, що при знайомстві з новим
продуктом в першу чергу зазвичай цікавляться тим, чи з'явилися якісь
принципово нові засоби і технології розробки. У Oracle8i такий
«Революцією» була поява на сервері мови Java як альтернативи PL/SQL. У
Oracle9i настільки нових засобів розробки серверної частини додатків не
з'явилося. Але і нових можливостей старих добрих Java і PL/SQL цілком
достатньо, щоб полегшити процес створення додатків, а в деяких випадках
змінити технологію розробки. p>
Спочатку розглянемо нові можливості саме для
розробки додатків. Але будемо пам'ятати про те, що хорошого розробника цікавлять
не тільки засоби розробки ( «як зробити ...»), а й засоби оптимізації
( «... Щоб добре працювало!»). Крім того, при встановленні тиражованою системи
замовнику часто з'ясовується, що кількість користувачів значно перевищує
заплановане. Тому важливо мати можливість масштабування системи. p>
Розвиток SQL головним чином рухається в бік
відповідності стандартам. SQL в Oracle9i відповідає вимогам стандарту ISO
SQL1999. Для задоволення цих вимог в мову введено багато нових
синтаксичних конструкцій. Це, наприклад, оператор CASE, що перекриває
функціональність старої доброї функції DECODE (у прикладах за традицією
використовуються всім відомі таблиці Emp і Dept): p>
SELECT ename "Прізвище", p>
(CASE WHEN sal <1000 THEN 'Низька' p>
WHEN sal> 4000 THEN 'Висока' p>
ELSE 'Середній' p>
END) "Зарплата" p>
FROM
emp; p>
Змінився і синтаксис з'єднань. Тепер і в Oracle
є поняття правого/лівого/повного зовнішнього з'єднання (outer join), наприклад,
запит p>
select
ename, dname from emp right outer join dept p>
on
(emp.deptno = dept.deptno); p>
повертає той же результат, що і p>
select
ename, dname from emp, dept p>
where
emp.deptno (+) = dept.deptno; p>
А ось запит p>
select
ename, dname from emp full outer join dept p>
on
(emp.deptno = dept.deptno); p>
в старому синтаксисі аналога не має. p>
Ці здебільшого формально-синтаксичні
нововведення будуть дуже корисні при перенесенні додатків на Oracle з інших
СУБД. Наприклад, розробникам легше буде перейти, скажімо, з MS SQL на Oracle. P>
Нововведення в PL/SQL більш революційні, вони носять
набагато більш кардинальний характер. Прихильникам об'єктної технології приємно
буде дізнатися, що в об'єктних типах з'явилося спадкування, принципи якого
задовольняють стандарту ANSI SQL99. Успадкування в Oracle9i строго ієрархічну,
множинне спадкування не допускається. Типи-нащадки успадковують у свого
батька атрибути і методи. Природно, нащадки можуть додавати свої атрибути
і методи, а також і перевизначати методи батька. Приклад типу-батька: p>
CREATE TYPE Person AS OBJECT p>
( p>
person_id NUMBER, p>
date_of_birth DATE, p>
name VARCHAR2 (30), p>
address VARCHAR2 (100), p>
MEMBER PROCEDURE Hire, - може перевизначатися p>
FINAL MEMBER FUNCTION Age
RETURN NUMBER - не перевизначається p>
) NOT FINAL; - може мати підтипи p>
Можливі підтипи: p>
CREATE TYPE Student UNDER Person p>
(deptid NUMBER, major
VARCHAR2 (30)); - додавання атрибутів p>
CREATE TYPE Employee UNDER Person p>
(empid NUMBER, mgr
VARCHAR2 (30)) p>
NOT FINAL; p>
CREATE TYPE PartTimeEmployee UNDER Employee p>
(numhours NUMBER); p>
Вводиться і поняття абстрактних (not-instantiable)
типів і методів. Розробник може створювати підтипи таких типів, але не може
створювати екземпляри таких типів. p>
PL/SQL-пакети можна компілювати у вигляді поділюваних
бібліотек. Це усуває накладні витрати на інтерпретацію PL/SQL-коду, що
може призвести до прискорення виконання в 2-10 разів. Так що тепер бажаючі
зможуть писати функції обчислення інтегралів на PL/SQL, не жертвуючи при цьому
продуктивністю. Звичайно, якщо PL/SQL-програми інтенсивно працюють з базою
даних, значного виграшу від компіляції PL/SQL отримати не вдасться. p>
У SQL і PL/SQL з'явилися нові типи даних. Особливо
оригінальний тип AnyData. У стовпці цього типу в кожному рядку можуть зберігатися
дані різних типів (в одному рядку - символьні, в іншій - числові, в
третя - структура з двох бінарних і трьох числових полів). Опис типу
даних у полі кожної конкретної рядка зберігається в самому полі. Доступ до даних
такого типу поки що можливий тільки через OCI. p>
Менш оригінальні, але не менш корисні нові типи для
дати і часу. По-перше, тип TimeStamp дає можливість зберігати в базі даних
дату з точністю до часток секунди (до 9 знаків після коми). По-друге, тип
TimeStamp with Time Zone разом з датою зберігає код часового поясу. Порівняння
даних цього типу здійснюється з урахуванням часового поясу. Це дуже полегшує
роботу з розподіленими системами та реплікацією. До речі, список стандартних
часових поясів в Oracle9i охоплює всю земну кулю. Введені і два принципово
нові типи даних для зберігання інтервалів часу, не прив'язаних до конкретної
даті - INTERVAL DAY TO SECOND і INTERVAL YEAR TO MONTH. Використовуючи ці типи,
зручно ставити, наприклад, тривалість випробувального терміну при прийомі на
роботу: p>
Create table Jobs (job varchar2 (9), trial_period INTERVAL YEAR TO
MONTH); p>
insert into Jobs - випробувальний термін p>
values ( 'MANAGER', '1 -6 ') --
для менеджера - півтора року; p>
select ename, hiredate, p>
hiredate + trial_period - і коли ж він закінчиться? p>
from emp - а ось ще один приклад нового p>
natural join jobs; --
синтаксису з'єднань p>
Підтримка Java інтенсивно розвивається в напрямку
відповідності все більш новими стандартами. У Oracle9i підтримуються стандарти
Servlet 2.2, JavaServer Pages 1.1, JDBC 2.0. P>
Окремо варто згадати і підтримку XML. Введено новий
тип даних XMLType, реалізований як LOB, і робота з даними цього типу
підтримується через SQL, PL/SQL і Java. p>
Ідея глобалізації знайшла своє застосування в розвитку
підтримки багатомовних баз даних і засобів роботи з ними, що відображено і в
термінології: термін National Language Support замінений в Oracle9i на
Globalization. Серед нововведень у цій галузі можна виділити нову кодування
для двухбайтного Unicode (UTF16), Unicode на основі кодування EBCDIC (UTFE) і
багатомовні сортування. Для полегшення переказу бази даних на нову
кодування пропонується утиліта Character Set Scanner. Вона сканує базу даних
і визначає, які стовпчики яких таблиць буде потрібно розширити, і які символи
буде втрачено при переході. Утиліта Locale Builder дозволяє модифікувати
мовні, територіальні та лінгвістичні установки (правила сортування,
назви днів і місяців, правила перекладу між верхнім і нижнім регістрами,
формати дати і т.п.), а також і таблиці кодування. p>
Принципове нововведення, що не має аналогів у
попередніх версіях Oracle - робочі області (workspaces). Введення робочих
областей можна розглядати як появу в базі даних ще одного рівня версійність. p>
Відомо, що підтримка цілісності читання (read
consistency) в Oracle реалізована через Багатоверсійність. Якщо сесія змінила
дані і не зафіксувала (commit) транзакцію, то інші сесії отримують стару
версію даних. Після фіксації транзакції її скасування змін вже неможлива, а
всі інші сесії починають бачити змінений стан даних. Тому
практично неможливо перевірити, чи правильно працює яке-небудь велике
пакетне завдання типу виставлення рахунків всім клієнтам. Без фіксації транзакцій
такого роду речі зазвичай не обходяться, і якщо ви виявили, що рахунки
виставлені неправильно, скасувати вже нічого не можна, і дані зіпсовані. p>
Тепер для таких тестів можна створити робочу
область і працювати в ній. Всередині робочої області діють стандартні правила
і стандартні алгоритми підтримки цілісності читання. Користувач,
що працює в своєї робочої області, може робити запити, зміни даних і
фіксувати транзакції. Ці зміни, навіть зафіксовані, видно тільки користувачам,
чинним в тій же самій робочої області. Після закінчення роботи з робочої
областю її можна знищити, втративши всі зміни в ній, або з'єднати з
основним вмістом бази даних. Так що вищеописана завдання тестування
вирішується так: створюємо робочу область, переходимо до неї, запускаємо процедуру,
дивимося результат. Якщо все правильно - з'єднуємо з основними даними, якщо немає
- Знищуємо робочу область і шукаємо помилку ... p>
Оптимізація додатків
p>
На жаль, в рамках цієї статті неможливо описати
всі нововведення вартісного оптимізатора. Варто згадати про те, що
оптимізатор при виборі плану виконання враховує процесорний час сервера,
використання тимчасового простору, а також (чого раніше не було) поточну
статистику екземпляра Oracle. З'явилася можливість редагувати збережені
каркасні плани (stored outlines). p>
Неможливо залишити без уваги ще один оригінальний
нововведення - бітові індекси з'єднання (bitmap join indexes, BJI). Це звичайні
бітові індекси, але побудовані по стовпцях, яких в індексованих таблиці
немає. Наприклад, в таблиці продажів (назвемо її за традицією Sales) є код регіону
продажу, але немає його назви. Назва є в довіднику регіонів (Regions). У
той же час запит, що вибирає всі продажі по регіону з заданим назвою,
досить типовий. При його виконанні кожного разу потрібно з'єднання (join)
таблиць Sales і Regions. Розглянемо приклад. P>
Створимо таблиці: p>
create table Regions p>
( p>
region_id number primary
key, - первинний
ключ обов'язковий для створення BJI p>
region_name varchar2 (200) p>
); p>
create table Sales p>
( p>
id number primary key, p>
region_id number, - опустимо
Обмеження зовнішнього ключа p>
product_id number, p>
amount number, p>
sal_date date p>
); p>
Виконаємо запит: p>
Select
sum (amount) p>
from sales, regions p>
where p>
regions.region_id = sales.region_id p>
and regions.region_name = 'Центр' p>
Розглянемо план виконання цього запиту (це не
єдино можливий, але цілком ймовірний план). У плані, природно,
присутній перегляд обох таблиць і операція їх з'єднання: p>
SELECT
STATEMENT Optimizer = ALL_ROWS p>
SORT (AGGREGATE) p>
NESTED LOOPS p>
TABLE ACCESS (FULL) OF 'SALES' p>
TABLE ACCESS (BY INDEX ROWID) OF 'REGIONS' p>
INDEX (UNIQUE SCAN) OF 'REGIONS_PK'
(UNIQUE) p>
Якщо ж це з'єднання виконати один раз при
побудові індексу, і в індексі зберігати покажчики на рядки таблиці Sales
разом з відповідними назвами регіонів з таблиці Regions, то для
виконання вищеописаного запиту таблиця Regions взагалі не знадобиться, і
можна уникнути дуже дорогої операції з'єднання. p>
Створимо індекс: p>
create
bitmap index Sales_reg_bji p>
on Sales (regions.region_name) p>
from Sales, Regions p>
where sales.region_id = regions.region_id p>
Щоб спонукати оптимізатор використовувати цей індекс,
застосуємо підказку (hint). У реальності, якщо таблиці будуть достатньо
великими, підказки швидше за все не знадобляться, тому що вартість виконання
цього запиту з використанням індексу буде істотно менше, ніж без нього: p>
select
/ * + Index (sales sales_reg_bji) */ p>
sum (amount) from sales, regions p>
where p>
regions.region_id = sales.region_id p>
and regions.region_name = 'Центр' p>
Розглянемо план виконання і переконаємося, що перегляд
таблиці Regions і операція з'єднання зникли: p>
SELECT
STATEMENT Optimizer = ALL_ROWS p>
SORT (AGGREGATE) p>
TABLE ACCESS (BY INDEX ROWID) OF 'SALES' p>
BITMAP CONVERSION (TO ROWIDS) p>
BITMAP INDEX (SINGLE VALUE) OF
'SALES_REG_BJI' p>
Засоби забезпечення масштабованості додатків
технологію розробки прямо не зачіпають, але дозволяють обійтися без
модифікації програми при збільшенні обсягу даних або кількості
користувачів. p>
Real Application Cluster
p>
Технологія Real Application Cluster заслуговує
окремої статті чи навіть серії статей. Ця технологія дозволяє перенести програму,
розроблене без урахування особливостей кластерної архітектури, на кластер, і
отримати при цьому істотне збільшення і продуктивності, і
відмовостійкості. p>
Крім цього до засобів забезпечення масштабованості
можна віднести автоматичне розподіл пам'яті PGA і тонке розподіл
ресурсів сервера (розвиток технології Database Resource Manager). p>
Дуже велика увага в Oracle9i приділено засобам
роботи з сховищами даних. При роботі з ними, як правило, потрібно вирішити
дві основні проблеми - як отримати дані в сховищі і як їх потім
аналізувати. p>
Для вирішення першої проблеми дані потрібно спочатку
отримати з будь-якого джерела (часто цим джерелом є OLTP-система),
потім перетворити (виконати денормализация, підсумувати з якого-небудь
показником і т.п.), і потім завантажити в базу даних. Для позначення цього
процесу звичайно використовується абревіатура ETL (Extraction, Transformation and
Loading). P>
Одна з основних задач у процесі ETL - визначити,
які дані були змінені після останнього завантаження сховища. Технологія
Change Data Capture дозволяє відстежувати всі зміни даних, зберігати
інформацію про зміни в таблицях змін (change tables) та переглядати
зміни даних за потрібний проміжок часу. p>
Якщо дані в сховищі завантажуються з зовнішніх файлів,
то поява зовнішніх таблиць (External Tables) дозволяє уникнути одного з
кроків у ETL-процесі. Зовнішня таблиця - це таблиця, структура якої описана
в базі даних, а дані зберігаються в плоскому файлі. У базі даних необхідно
описати формат цього файлу, для цього використовується мова, дуже схожий на мову
керуючих файлів SQL * Loader. Природно, зовнішні таблиці можна використовувати
тільки для запитів. Описуються вони приблизно так: p>
create table emp_external p>
( p>
empno number (4), p>
ename char (10), p>
job char (9), p>
mgr number (4), p>
sal number (7,2), p>
comm number (7,2), p>
deptno number (2) p>
) p>
organization external p>
( p>
type oracle_loader - іншого
поки немає p>
default directory emp_dir - об'єкт типу Directory в базі даних p>
access parameters p>
( p>
fields rtrim p>
( p>
EMPNO (01:04), p>
ENAME (06:15), p>
JOB (17:25), p>
MGR (27:30), p>
SAL (32:39), p>
COMM (41:48), p>
DEPTNO (50:51) p>
) p>
) p>
location ( 'ulcase2.dat') p>
) p>
Для полегшення кроку Transformation в ETL-процесі
пропонуються конвеєрні (pipelined) функції. Це функції, які на вході
отримують набір строк (ref cursor) і на виході видають теж набір строк (nested
table). Їх принципова новизна в тому, що це безліч рядків вони видають не
відразу, а по одній. Всередині такої функції ставиться оператор PIPE ROW, який
видає один рядок результату і призупиняє виконання функції до тих пір,
поки середу, що викликала цю функцію (це може бути, наприклад, теж конвеєрна
функція), не зажадає наступний рядок. Розглянемо приклад конвеєрної функції. P>
Оголошення типу для джерела (producer) даних: p>
create
or replace package emp_pipe is p>
type strong_refcur_t is ref cursor return
emp% rowtype; p>
end; p>
Оголошення типу для приймача (consumer) даних: p>
create
or replace type emp_t is p>
object (empno number, ename varchar2 (10),
sal number); p>
create
or replace type emp_t_table as table of emp_t; p>
Сама конвеєрна функція: p>
create or replace FUNCTION emp_pipe_fun (cur emp_pipe.strong_refcur_t) p>
RETURN emp_t_table p>
PARALLEL_ENABLE (PARTITION cur
BY ANY) p>
PIPELINED is p>
one_row cur% rowtype; p>
BEGIN p>
LOOP p>
FETCH cur INTO one_row; p>
/* Тут можна вставити будь-яку обробку отриманої
рядка */ p>
EXIT
WHEN cur% NOTFOUND; p>
/*
Оператор PIPE ROW повертає один рядок результату */ p>
PIPE ROW
(emp_t (one_row.empno, one_row.ename, one_row.sal * 10 )); p>
END LOOP; p>
CLOSE cur; p>
/* RETURN викликається без аргументів, */ p>
/* тому що всі результати функція вже повернула
через PIPE ROW */ p>
RETURN; p>
END; p>
Використання цієї функції: p>
select
* From table (emp_pipe_fun (cursor (select * from emp ))); p>
Результат роботи emp_pipe_fun може послужити
джерелом даних для іншої конвеєрної функції (назвемо її another_fun): p>
Select
* P>
from table (another_fun (cursor ( p>
select * from
table (emp_pipe_fun (cursor (select * from emp )))))); p>
Це дозволяє «нанизувати» такі функції один на одного
і організовувати конвеєр перетворення даних. p>
Новий SQL-оператор Merge і новий багатотабличних
синтаксис оператора Insert полегшують крок Loading. Оператор Merge - реалізація
стандартною для сховищ даних операції UPSERT, призначеної для вирішення
завдань типу «якщо продаж у цьому регіоні вже були - збільшити суму продажів
(Update) за кодом регіону, якщо не було - вставити рядок з кодом і сумою
продажів (Insert) ». Наприклад (використовуємо вже згадувані тАбліцов Sales і
Regions): p>
Створимо сумарну таблицю продажів за регіонами: p>
create
table Sales_sum (region_id number, sum_amount number); p>
Внесемо до неї дані про продажі за останню добу: p>
merge into sales_sum SS p>
using (select region_id, amount
from sales where sal_date> sysdate-1) S p>
on (SS.region_id = S.region_id) p>
when matched then - продажу по регіону вже були p>
update set
SS.sum_amount = SS.sum_amount + S.amount p>
when not matched then - перший продаж у даному регіоні p>
insert (SS.region_id, SS.sum_amount) p>
values (S.region_id, S.amount); p>
багатотабличних Insert дозволяє одним оператором
вставити рядки відразу в кілька таблиць, причому можна задавати умови вставки
рядки для кожної таблиці. Наприклад, при перенесенні даних про продажі в архів
потрібно окремо враховувати особливо великі угоди. p>
Створимо таблиці для архівних даних і великих угод: p>
create
table sales_arch as select * from sales where 0 = 1; p>
create
table super_sales as select * from sales where 0 = 1; p>
Перенесемо дані: p>
insert
all p>
when amount> 100000 p>
then into super_sales values (id,
region_id, product_id, amount, sal_date) p>
when 1 = 1 p>
then into sales_arch values (id, region_id,
product_id, amount, sal_date) p>
select
* From sales; p>
Адміністратора
p>
Адміністратор бази даних - людина, що відповідає в
першу чергу за збереження даних і працездатність системи. Нові способи
забезпечення безперебійної роботи дозволять йому жити більш спокійно. p>
Зупинки бази даних можна розділити на планові
(наприклад, для зміни параметрів примірники) та позапланові (різні збої).
Oracle9i дозволяє істотно знизити частоту планових зупинок, оскільки
допускає динамічна зміна майже всіх параметрів примірника, у тому числі
і таких параметрів системної глобальної області, як розмір кеша буферів бази
даних або розділяється пулу. Що ж до збоїв, то гарантувати їх
відсутність не може ніхто. Oracle9i містить засоби для зниження ймовірності
збоїв і максимально безболісного усунення їх наслідків. p>
Технологія Oracle Data Guard - розвиток старої ідеї
резервної бази даних (Standby Database). Основним недоліком старого варіанту
була неможливість повного відновлення резервної бази перед її активізацією.
Якщо при аварії основного сервера пошкоджуються поточний журнал (current redo
log), то всі зміни бази даних, записані в цей журнал, губилися
безповоротно. Для багатьох OLTP-систем це було неприйнятно. Технологія Oracle
Data Guard дозволяє адміністратору бази даних самому вибрати, що для нього
важливіше - недопущення втрати навіть самого малого кількості даних або
максимальна продуктивність. Якщо втрата даних недопустима, то можна
змусити Oracle відправляти зміни на резервний сервер у синхронному режимі,
тобто поки ці зміни не виконуватися на резервної бази даних, транзакція не
вважається зафіксованою. Природно, це може привести до деяких втрат
в продуктивності. Можна використовувати старий метод - зміни передаються на
резервний сервер тільки після заповнення чергового журналу на основному
сервер. Тут ми жертвуємо збереженням даних ради продуктивності. І є
компромісний варіант - зміни передаються на резервний сервер «майже
синхронно », тоді невелика втрата даних у разі аварії можлива, але
малоймовірна. p>
Особливої уваги заслуговує нова можливість
Recovery Manager - відновлення окремого блоку файлу даних. Раніше одним
зі стандартних способів відновлення при виявленні пошкодженого
(corrupted) блоку було копіювання файлу, який містить цей блок, з резервної
копії і застосування до нього архівних і оперативних журналів. Це вимагало як
мінімум перекладу пошкодженого табличного простору в автономний режим на
час копіювання файлу, що призводило до недоступності частини даних на досить
тривалий термін. Тепер Recovery Manager може отримати з резервної копії
тільки пошкоджений блок, виконати його відновлення за допомогою журналів та
записати відновлений блок у файл даних. У цьому випадку тимчасово недоступними
виявляються тільки дані в пошкодженій блоці. p>
Так звані відновлювальні операції (Resumable
Operations) дозволяють боротися з іншим дуже поширеним видом збоїв --
браком простору в базі даних. Кожен адміністратор напевно не раз
потрапляв у ситуацію, коли операція на зразок перестроювання великого індексу або
реорганізації величезною таблиці працює кілька годин і обривається через
брак місця у табличному просторі (постійне або тимчасове) або
неможливість розширити сегмент відкату. У Oracle9i таку операцію можна
оголосити відновлюваної. Тоді у разі виникнення подібної помилки процес
не переривається, а припиняється до тих пір, поки адміністратор не усуне
перешкода чи не закінчиться заданий таймаут. Ось як це виглядає. P>
Створимо таблицю (для чистоти експерименту - в
керованому системою (dictionary managed) табличному просторі, тому що в
локально-керованому (locally managed) не діє параметр Maxextents): p>
create table Small_extent_table p>
tablespace dict_tbs p>
storage (initial 10K maxextents
1) p>
as select * from emp; p>
Кілька разів продубліруем в ній дані: p>
insert
into Small_extent_table p>
select * from Small_extent_table; p>
Приблизно на п'ятий-шостий спробі отримаємо помилку "ORA-01631: max # extents (1) reached in table
SCOTT.SMALL_EXTENT_TABLE ». Включимо
відновлювальні операції (для цього користувач повинен мати привілей
Resumable): p>
alter session enable resumable; p>
Спробуємо ще раз: p>
insert
into Small_extent_table p>
select * from Small_extent_table; p>
Сесія зависає і чекає можливості додати екстент в
таблицю. З другої сесії виявимо це: p>
select
name, sql_text, error_msg from dba_resumable; p>
Отримаємо: p>
User
SCOTT (70), Session 7, Instance 1 p>
insert
into small_extent_table s select * from small_extent_table p>
ORA-01631:
max # extents (1) reached in table SCOTT.SMALL_EXTENT_TABLE p>
Усунемо причину помилки: p>
alter
table Scott.Small_extent_table storage (maxextents 10); p>
Тепер залишилося тільки переконатися, що в першій сесії
оператор Insert успішно закінчився. p>
Ще один класичний вид збоїв - помилки
користувачів. Якщо хтось з користувачів, розробників або сам
адміністратор випадково видалив таблицю або запустив неотлаженную процедуру,
відновити втрачені дані буває дуже важко. У Oracle8i в таких випадках
дуже допомагає утиліта Log Miner. У Oracle9i ця утиліта збагатилася новими
можливостями, такими як відновлення тексту DDL-операцій або можливість
пропуску пошкодженої частини журналу. p>
Крім Log Miner, відновити дані після
призначеної для користувача помилки допомагає ще одне нововведення - ретроспективні
запити (flashback query). За допомогою процедур пакету dbms_flashback
користувач може задати потрібний момент часу (попередній помилку), і
після цього всі його запити будуть повертати стан даних на вказаний
момент. Спробуємо це зробити. P>
Видалимо важливі дані з таблиці: p>
delete from small_extent_table; p>
Commit; p>
Подивимося стан даних на момент, що передує
фіксації транзакції (точний час фіксації можна отримати за допомогою LogMiner): p>
exec
dbms_flashback.enable_at_time ('05 .12.2001 15:21:58 ') p>
select
* From small_extent_table; p>
Отримані "старі" дані можна зберегти в базі і
ліквідувати наслідки помилки: p>
declare p>
cursor c is (select * from
scott.small_extent_table); p>
cc c% rowtype; p>
begin p>
exec
dbms_flashback.enable_at_time ('05 .12.2001 15:21:58 ') p>
open c; - відкриваємо курсор,
перебуваючи в режимі FlashBack p>
dbms_flashback.disable; - вимикаємо
FlashBack, щоб дозволити DML p>
loop p>
fetch c into cc; p>
exit when c% notfound; p>
insert into
scott.small_extent_table values p>
(cc.empno, cc.ename, cc.job,
cc.mgr, p>
cc.hiredate, cc.sal,
cc.comm, cc.deptno); p>
end loop; p>
end; p>
/ p>
commit; p>
Природно, можливість відновлення старого
стану даних обмежена об'ємом сегментів відкату. p>
У адміністратора бази даних залишається все менше
можливостей пошкодити базу даних. Не секрет, що однією з найбільш
поширених причин збоїв є помилкове стирання файлу бази даних
адміністратором, наприклад, при видаленні табличного простору. У Oracle9i
з'явилися файли, керовані сервером Oracle (Oracle Managed Files, OMF). При
додавання файлу до бази достатньо вказати його розмір, а його ім'я буде
Згенеровано Oracle. Під час видалення файлу з бази даних Oracle сам стирає його
з диска. Таким чином, з адміністратора бази даних знімається обов'язок
маніпулювати файлами бази даних, а отже, зменшується ймовірність помилки. p>
Життя адміністратора бази даних у Oracle9i взагалі
помітно полегшена, багато рутинних операції з адміністрування Oracle
виконує сам. Динамічна зміна параметрів екземпляра і автоматичне
управління файлами вже згадувалося. Крім цього, можна змусити Oracle
самостійно конфігурувати сегменти відкату. Адміністратор повинен тільки
створити спеціальне табличне простір для зберігання інформації відкату, а
необхідну кількість сегментів відкату оптимального розміру створить сам
Oracle. До того ж адміністратор може визначити, скільки часу Oracle повинен
зберігати інформацію відкоту навіть після фіксації транзакції. Це дозволяє якщо
не позбутися від знайомої багатьом помилки «ORA-1555: snapshot too old», то
істотно знизити імовірність її прояви. p>
Завдання перенесення даних з однієї бази в іншу теж
помітно полегшується. Можливість використання їх переносите табличних
просторів (transportable tablespaces) раніше істотно обмежувалася
вимогою однакового розміру блоку в базі-джерелі і базі-приймачі. У
Oracle9i в одній базі даних можуть співіснувати табличні простору з
різним розміром блоку, так що це обмеження знімається. Використовуючи різні
розміри блоку в одній базі даних, можна оптимально організувати зберігання
дані різного характеру. p>
Захист від збоїв - важлива, але не єдине завдання
адміністратора бази даних. Анітрохи не менш важливим є захист даних від
несанкціонованого доступу. Одне з рішень, пропонованих Oracle9i для захисту
даних - віртуальна власна база даних (Virtual Private Database, VPD).
Це розвиток технології деталізованого контролю доступу (Fine-Grained Access
Control), реалізованої в Oracle8i. Як відомо, за допомогою цієї технології
можна було до будь-якої таблиці приєднати набір функцій, які спрацьовували при
кожному запиті або зміні таблиці. Функція повертала текстовий рядок,
яка приєднувалася до умови WHERE запиту або DML-оператора і таким
чином обмежувала набір рядків, які користувач міг бачити чи змінювати.
Ці функції зазвичай використовували так званий контекст програми (application
context). Контекст програми можна розглядати як набір змінних,
містять атрибути користувача, такі як посада користувача, номер його
відділу, рівень допуску і т.п. Контекст зазвичай заповнювався тригером при вході
користувача в базу даних, і функції деталізованого контролю доступу
використовували атрибути контексту для того, щоб визначити, до яких даними
має доступ даний користувач. p>
Ця система добре працює в класичній
клієнт-серверної технології, коли користувач відкриває сесію в базі даних
і зберігає цю сесію за собою. У багаторівневої архітектури сервер додатків
часто відкриває в базі даних відразу кілька сесій і потім передає ці
сесії працюють через нього користувачам. Причому через одну сесію можуть
працювати кілька користувачів, які мають різні права та рівні допуску,
тому вони повинні мати і різні контексти. У VPD ця проблема вирішується
введенням поняття глобального контексту (Global Context) та ідентифікатора
клієнта. Тепер в одній сесії в одному контексті може бути кілька
однакових атрибутів (наприклад, кілька посад) з різними значеннями й
різними ідентифікаторами клієнта. Сервер додатків, передаючи сесію
користувачеві, має встановити ідентифікатор, і користувач зможе працювати
зі своїми значеннями атрибутів контексту. p>
У Oracle9i входить і готовий варіант реалізації цієї
технології - Oracle Label Security. Це функціональність Trusted Oracle,
реалізована засобами VPD. Контроль доступу до рядків заснований на системі
міток, які можна призначити кожному користувачеві, додатку та рядку в
таблиці. Вся система налаштовується за допомогою графічного інтерфейсу Oracle Policy
Manager, не вимагаючи ніякого програмування. P>
Висновок
h2>
Обсяг однієї статті не дозволяє докладно описати всі
нові засоби Oracle9i Database, не кажучи вже про інші продукти серії 9i.
Тому в цій статті ми зосередили свою увагу на найбільш цікавих на
наш погляд нововведення. У подальших матеріалах ми плануємо розглянути
можливості продукту, що не увійшли в цей огляд. p>
Всі приклади, наведені в цій статті, були перевірені
автором на Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production на
Windows NT Version 4.0 Service Pack 5. P>
Список літератури h2>
Для підготовки даної роботи були використані
матеріали з сайту http://www.rsdn.ru/
p>