Мій перший день з сервером Oracle Database 10g Release 2, Ссітемное адміністрування, Локальні мережі, статті

Джерело: журнал Oracle Magazine, September-October 2005 

  Наш експерт розповідає про свій перший досвід роботи з сервером бази даних Oracle Database 10 g Release 2.

Питання. Чи можете ви розповісти нам про ваш досвід роботи з сервером Oracle Database 10g Release 2 і показати деякі з його важливих нових функціональних можливостей?

Відповідь. По-перше, у цій колонці ми навіть не будемо намагатися охопити все нове в сервері Oracle Database 10 g Release 2 – це неможливо викласти на кількох сторінках. (Прим. пер.: Див також технічний документ “Top Ten Things About Oracle Database 10g Release 2“, Написаний Томом з співавтором Кері Міллсап (Cary Millsap, www.hotsos.com/). Деякі додаткові деталі можна знайти в серії публікацій “ Найбільш важливі можливості для АБД Oracle Database 10g: Випуск 2 – Додаткові властивості “.) Більш детальну інформацію див в керівництві Oracle Database 10g Release 2 New Features Guide (посилання наведена в урізанні Наступні кроки ). Я ж викладу тут те, на що звернув увагу і вважав корисним для вас.

Автотрасування (autotrace)

За першу пару хвилин використання сервера Oracle Database 10 g Release 2 я відразу ж виявив це удосконалення (див. лістинг 1). У механізмі автотрасування для виведення на екран планів виконання тепер використовується пакет DBMS_XPLAN. Це дозволяє отримувати набагато більш деталізовані плани в порівнянні з попередніми версіями сервера бази даних. Ми могли отримувати такі плани в сервері Oracle9 i Database Release 2 і вище з допомогою поставляється пакета DBMS_XPLAN, але використання цього пакету механізмом автотрасування істотно спрощує їх отримання. Особливо відзначимо, інформація про предикатах внизу плану виконання точно показує, на яких кроках сервер Oracle Database застосовує їх. Здорово.








Лістинг 1: Автотрасування з використанням пакета DBMS_XPLAN.

SQL> set autotrace traceonly explain
SQL> select *
2 from emp, dept
3 where emp.deptno = dept.deptno
4 and emp.job = “CLERK”;
Execution Plan
—–
Plan hash value: 877088642
/ Id / Operation / Name / Rows / Bytes / Cost (%CPU) / Time /
/ 0 / SELECT STATEMENT / / 4 / 468 / 7 (15) / 00:00:01 /
/* 1 / HASH JOIN / / 4 / 468 / 7 (15) / 00:00:01 /
/* 2 / TABLE ACCESS FULL / EMP / 4 / 348 / 3 (0) / 00:00:01 /
/ 3 / TABLE ACCESS FULL / DEPT / 4 / 120 / 3 (0) / 00:00:01 /
Predicate Information (identified by ) Інформація про предикатах (Ідентифікуються ідентифікаторами операцій (operation id):
——–
1 – access(“EMP”.”DEPTNO”=”DEPT”.”DEPTNO”)
2 – filter(“EMP”.”JOB”=”CLERK”) Примітка
——– – Для цього оператора використана динамічна статистична вибірка)

Умовна компіляція (conditional compilation)

У мові PL / SQL з’явилося багато нових можливостей. Першою річчю, на яку я звернув увагу, була умовна компіляція; це те, що відсутнє у мене з тих пір, коли я був програмістом на мові C. Умовна компіляція дозволяє змусити компілятор ігнорувати код (або не ігнорувати). Можливо, спочатку це не здається занадто корисним, але … З умовною компіляцією:


На лістингу 2 показаний швидкий приклад, що представляє із себе умовна компіляція і як вона працює.








Лістинг 2: приклад умовної компіляції PL / SQL-коду.

SQL> create or replace procedure p
2 as
3 begin
4 $IF $$debug_code $THEN 5 dbms_output.put_line (“Наш налагоджувальний код”); 6 dbms_output.put_line (“буде розміщений тут”);
7 $END 8 dbms_output.put_line (“А наш реальний код – тут”);
9 end;
10 /
Procedure created
.

Зверніть увагу, що без визначення значення $ $ debug_code “налагоджувальний” код не друкується і не компілюється:

SQL> exec p А наш реальний код – тут
PL/SQL procedure successfully completed.

Просто активуючи змінну debug_code (як це показано нижче), ми активуємо налагоджувальний код. Зверніть увагу, “debug_code” – задане мною ім’я, а не якесь спеціальне ім’я; ви за бажанням можете визначати свої власні змінні.

SQL> alter procedure P compile
2 plsql_ccflags = “debug_code:true” reuse settings;
Procedure altered.
SQL> exec p Наш налагоджувальний код буде розміщений тут А наш реальний код – тут
PL/SQL procedure successfully completed.

Пакет DBMS_OUTPUT

Пакет DBMS_OUTPUT модернізований в сервері Oracle Database 10 g Release 2. Ви не тільки можете задавати необмежений (unlimited) розмір буфера (немає більше обмеження в 1000000 байтів!), Але ви також можете друкувати рядки, довжина яких набагато перевищує 255 символів. Гранична довжина рядка тепер дорівнює 32K. Продемонструємо цю модернізацію:

SQL> set serveroutput on –
> size unlimited
SQL> begin
2 dbms_output.put_line
3 ( rpad(“*”,2000,”*”) );
4 end;
5 /
************************

************************
PL/SQL procedure successfully completed.

Швидкий аварійний перехід на резервний ресурс (Oracle Fast-Start Failover)

Інша нова функціональна можливість в сервері Oracle Database 10 g Release 2 – автоматичний аварійний перехід на резервну базу даних. Тепер у разі збою сервера основної бази даних, пристроїв зберігання або мережі технологія Oracle Data Guard дозволяє автоматично перейти на роботу з резервною базою даних – не потрібна людина, що виконує послідовність команд або натискає на кнопки.

Перенесення баз даних (database transports) У сервері Oracle Database 10 g Release 1 були введені табличні простору з міжплатформеній переносимістю (cross-platform transportable tablespaces), а в сервері Oracle Database 10 g Release 2 всі це переходить на наступний рівень. Тепер ви можете переносити всю базу даних на платформи, які використовують однаковий порядок проходження байтів (endianess). Це означає, що ви можете переносити всю базу даних (а не тільки окремі табличні простору) з платформи HP-UX на платформу Apple Macintosh або з платформи Open VMS на платформу Solaris x86. Немає більше ніяких дампів і перезавантажень.

Стиснення в утилітах Data Pump (data pump compression)

Коли вийшов сервер Oracle Database 10 g Release 1, хорошою новиною було те, що утиліти експорту (EXP) і імпорту (IMP) були повністю переписані і з’явилися нові утиліти Oracle Data Pump – EXPDP і IMPDP відповідно. Утиліти EXPDP і IMPDP мали один недолік – під час процесу експорту неможливо було стискати DMP-файли. Використовуючи утиліту експорту EXPDP, ви повинні були спочатку створити DMP-файл і лише потім стиснути його (на відміну від процесу зі старою утилітою експорту EXP, який міг писати в іменований канал (named pipe) дані, стискувані в ньому на цьому ж кроці).

На щастя, в сервері Oracle Database 10 g Release 2 полегшено створення і стиснення DMP-файлів, навіть у порівнянні зі старими утилітами. Утиліта EXPDP тепер сама стискає файли, а утиліта IMPDP автоматично відновлює стислі дані – зникла “метушня” на рівні операційної системи. І сервер Oracle Database 10 g Release 2 на платформі Windows вперше може стискати DMP-файли “на ходу” (іменовані канали – Функціональна можливість платформ UNIX / Linux).

Асинхронна фіксація транзакцій (asynchronous commit)

Зазвичай, коли програми на мовах Java, C або Visual Basic виконують оператор COMMIT, вони повинні чекати, зокрема, завершення події очікування “log file sync” (синхронізація журнальних файлів). Це очікування відбувається через те, що клієнт чекає, коли процес запису в журнал (log writer process) скине на диск журнальну інформацію, щоб зробити транзакцію постійної (permanent), забезпечуючи сохраняемость даних. Зазвичай це те, що ви і хочете. Коли ви виконуєте оператор COMMIT, всі зміни, зроблені в транзакції стають постійним.

Проте немає правил без винятків. Як щодо системи, яка повинна якомога швидше обробляти записи, що надходять, можливо, від датчиків або з мережі? Мета цієї програми в реальності полягає в тому, щоб сформувати пакет з кількох записів, вставити їх в базу даних оператором INSERT, зафіксувати цю вставку оператором COMMIT (щоб зробити записи видимими) і продовжити свою роботу далі. Їй дійсно не потрібно чекати фіксації транзакції; фактично, наявність очікувань не дозволяє цій програмі працювати з такою швидкістю, з якою вона може.

У сервері Oracle Database 10 g Release 2 з’явилася асинхронна фіксація транзакцій. Ми тепер можемо сказати: “фіксуй, але не чекай” (commit, but don “t wait) або” фіксуй і, будь ласка, чекай “(commit, and please do wait). Але якщо ви використовуєте спосіб “фіксуй, але в режимі без очікування”, ви повинні бути готові до того, що в певний момент часу в майбутньому дані, які були “зафіксовані”, будуть загублені. Якщо ви фіксуєте транзакцію, але не чекаєте, і в системі відбувається збій, дані можуть виявитися незафіксованими. Тільки ви можете вирішити, чи прийнятно це для вас. Є багато класів додатків (включаючи програми високошвидкісного “заковтування” даних), єдина мета яких полягає в тому, щоб включати в базу даних потік даних; для таких додатків режим “фіксуй, але не чекай” не тільки прийнятний, але і дуже бажаний з точки зору продуктивності.

Я на мові Java написав невеликий приклад, показаний на лістингу 3.







Лістинг 3: фіксація транзакції без очікування – асинхронна фіксація.

import java.sql.*;
public class instest
{
static public void main(String args[]) throws Exception
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
Connection
conn = DriverManager.getConnection
(“jdbc:oracle:thin:@desktop:1521:ora10gr2”,
“scott”,”tiger”);
conn.setAutoCommit( false )
Statement sql_trace =
conn.createStatement();
sql_trace.execute
( “truncate table t” );
System.out.println( “Table truncated” );
sql_trace.execute
( “begin ” +
” dbms_monitor.session_trace_enable( WAITS=>TRUE );” +
“end;” );
// create table t(x char(2000))
// create index t_idx on t(x)
PreparedStatement pstmt =
conn.prepareStatement
(“insert into t(x) values(?)” );
pstmt.setString( 1, “x” );
PreparedStatement commit =
conn.prepareStatement
(“commit work write batch nowait”);
// (“commit work write immediate wait”);
for( int i = 0; i < 1000; i++ )
{
pstmt.executeUpdate();
commit.executeUpdate();
}
conn.close();
}
}

Зверніть увагу, як на лістингу 3 я використовую оператор COMMIT: або COMMIT WORK WRITE BATCH NOWAIT, або COMMIT WORK WRITE IMMEDIATE WAIT. Перший варіант – нова можливість – фіксація транзакції без очікування завершення виконання цієї операції. Останній варіант – це спосіб, який використовувався традиційно. Коли я прогнав тестову програму, показану на лістингу 3 (закоментовані оператор CREATE TABLE (перед оператором INSERT) наведено для довідки), з опцією WAIT (з очікуванням), я помітив, що маса часу витрачається на очікування синхронізації журнальних файлів, а при прогоні з опцією NOWAIT (Без очікування) на очікування фактично не витрачається ніякого часу. Результати показані на лістингу 4.








Лістинг 4: порівняння результатів виконання програми з опціями WAIT і NOWAIT.

Event Waited On         Times Waited         Max. Wait               Total Waited
—————- —————- ——————– ——————–
log file sync (nowait) 19 0.02 0.04
log file sync (wait) 1017 0.04 1.43

Ця різниця в програмах високошвидкісний завантаження даних, які під час завантаження повинні періодично фіксувати транзакції, буде досить відчутним.

Прозоре шифрування даних (transparent data encryption)

Тепер про революційну функціональної можливості в сервері Oracle Database 10 g Release 2 – прозорому шифруванні даних. Вона дозволяє легко і, як каже її назву, прозоро шифрувати збережену інформацію. Авторизовані користувачі не повинні мати справу з ключами шифрування; дані для них будуть розшифровані (і шифруватися) абсолютно прозоро. Дані зберігаються на диску зашифрованими, тому навіть якщо хтось і вкраде вашу базу даних, інформація буде захищена. Мій досвід роботи з засобами прозорого шифрування даних не дозволяє дати вам вичерпного прикладу їх використання (“тут все, що ви можете робити “), а скоріше показує, як налаштувати ці кошти і як ви могли б використовувати їх.

Перше, що я повинен зробити, це – налаштувати цифровий гаманець (wallet). У ньому будуть зберігатися ключі шифрування; цей гаманець захищається паролем.

Для мого прикладу “на швидку руку” я в домашньому каталозі Oracle просто створив каталог “wallet” і в файл sqlnet.ora вставив наступне:

WALLET_LOCATION=
(SOURCE=(METHOD=FILE)
(METHOD_DATA=
(DIRECTORY=/home/ora10gr2/wallet)
)
) Після цього мені залишається тільки відкрити цей гаманець:
SQL> alter system
2 set encryption wallet open
3 identified by foobar;
System altered.

Якщо ви почали використовувати засоби прозорого шифрування, цей оператор необхідно виконувати один раз при кожному запуску екземпляра сервера бази даних, в іншому випадку ключі шифрування будуть недоступні системі, і отже, будуть недоступні і зашифровані дані.

Тепер, оскільки я ще не створив ніяких ключів шифрування, потрібно зробити це:

SQL> alter system
2 set encryption key
3 identified by foobar;
System altered.

У цьому випадку ключ генерує система, але я міг би так само просто визначити ключ, обраний мною самим, якщо б мені потрібно було легко переносити одні й ті ж дані з однієї системи в іншу.

І це все, що потрібно було зробити для настройки. Тепер я готовий зберігати зашифровані дані:

SQL> create table t
2 ( c1 varchar2(80),
3 c2 varchar2(80) encrypt )
4 tablespace test;
Table created.
SQL> insert into t values 2 (“еті_данние_не_зашіфровани”, 3 “еті_данние_зашіфровани”);
1 row created.

Ці дані були прозоро зашифровані на диску, а при вибірці вони дешифруються:

SQL> select *
2 from t;
C1 C2
————————- ———— еті_данние_не_зашіфровани еті_данние_зашіфровани

Як упевнитися, що ці дані насправді зашифровані? Для пошуку цих рядків у файлі даних Oracle я використовував утиліти strings і grep (утиліти ОС UNIX для пошуку в файлах). Спочатку я повинен гарантувати, що зашифровані дані записані на диск:

SQL> alter system checkpoint;
System altered.

А потім я шукав ці рядки. Я шукав у файлі даних encrypt.dbf будь рядки, в які входив текст “еті_данние”:

$ Strings-a encrypt.dbf / grep еті_данние еті_данние_не_зашіфровани

Як бачите, була знайдена тільки рядок “еті_данние_не_зашіфровани”. Інша рядок не видно, тому що перед збереженням вона дійсно була зашифрована.




ЗАПИТУЙТЕ Тома
Том Кайт, віце-президент корпорації Oracle, відповідає на найбільш важкі питання, пов’язані з технологією баз даних Oracle. Найбільш яскраві матеріали цього форуму публікуються в даній колонці.

ЧИТАЙТЕ більш докладно про сервер Oracle Database 10 g Release 2:
Oracle Database 10 g Release 2 New Features Guide
Transparent Data Encryption (Є російський переклад “Прозоре шифрування даних”)

ЧИТАЙТЕ ще Тома
Expert Oracle: 9 i and 10 g Programming Techniques and Solutions


Цей швидкий приклад показує тільки верхівку айсберга цієї нової можливості шифрування. Засоби прозорого шифрування даних працюють з висновком в зовнішні таблиці, утилітами Data Pump і т.д., а інструменти з графічними користувацькими інструментами, такі, як диспетчер гаманців Oracle Wallet Manager, дозволяють вам управляти вашим гаманцем і паролями. Є також оператори зміни ключів даних, коли ви відчуваєте, що ці ключі скомпрометовані. Я вважаю, що прозоре шифрування даних – одна з найбільш революційних функціональних можливостей сервера Oracle Database 10 g Release 2.

Пропозиція LOG ERRORS

У сервері Oracle Database 10 g Release 2 в операторах DELETE, INSERT, MERGE і UPDATE можна використовувати нову пропозицію LOG ERRORS (протоколювати помилки). Використання цієї пропозиції в операторах масової обробки даних дозволяє записувати рядки, при обробці яких відбулися помилки, і не відкочувати весь цей оператор.

Ви можете виконати оператор, такий, як INSERT INTO T SELECT A, B, C FROM T2 LOG ERRORS INTO ERRLOG (“BAD_ROWS_FOR_T”) REJECT LIMIT UNLIMITED. При виконанні цього оператора в таблицю BAD_ROWS_FOR_T (некоректні записи для таблиці Т) будуть записуватися всі рядки, які порушують обмеження; наприклад, будуть протоколюватися помилки, викликані занадто великими значеннями стовпців, порушеннями обмежень цілісності (Обмеження NOT NULL, унікальності, посилальної цілісності і перевірочні), помилки, що виникають при виконанні тригерів, помилки перетворення типу стовпця підзапиту до типу відповідного стовпця таблиці, помилки розподілу рядків по секціях і деякі помилки при виконанні оператора MERGE (оновлення зі вставкою), наприклад, ORA-30926: Unable to get a stable set of rows for MERGE operation – неможливо отримати стійкий набір рядків для операції MERGE. Коли виникає помилка, рядок, що викликала її, протоколюється в таблиці “некоректних записів” поряд з номером помилки, текст повідомлення про помилку, типом операції (INSERT, UPDATE або DELETE), а також з ідентифікатором цього рядка ROWID (для операцій UPDATE і DELETE).

Цієї нової функціональної можливості судилося стати моєю улюбленою можливістю сервера Oracle Database 10 g Release 2. Виконання масштабних операцій масової обробки даних краще порядкової обробки з точки зору швидкості та використання ресурсів, але протоколювання помилкових рядків завжди було проблемою в минулому. З появою цієї нової можливості проблема зникла.

Точки відновлення (restore points)

У сервері Oracle Database 10 g Release 2 з’явилася нова можливість – створення точок відновлення. В сервер Oracle Database 10 g Release 1 була введена можливість ретроспективного відкату бази даних (Flash back a database), але для цього ви повинні були знати системний номер зміни (SCN) або час, до якого потрібно відкотитися. Тепер в сервері Oracle Database 10 g Release 2 ви можете створити точку відновлення: CREATE RESTORE POINT “X”, потім зробити щось потенційно небезпечне, можливо, спробувати провести модернізацію деякого програми, і якщо в процесі модернізації відбудеться збій, ви можете просто виконати оператор ретроспективного відкату бази даних до точки відновлення: FLASHBACK DATABASE TO RESTORE POINT “X”. Вам більше не потрібно перед виконанням ретроспективних операцій придумувати оператор SELECT для пошуку SCN або вгадувати час, до якого потрібно відкотитися.

“Пряма” підтримка мови XQuery

В сервер Oracle Database 10 g Release 2 добавлена ​​власна реалізація мови XQuery, нового стандарту консорціуму W3C для XML-запитів. У ці нові засоби введені дві нові функції XMLQUERY і XMLTABLE. Функція XMLQUERY дозволяє виконувати запити до документів репозиторію Oracle XML DB або до XML-уявленням реляційних даних, використовуючи на SQL-клієнті мову XQuery. Функція XMLTABLE дозволяє перетворити результат виконання Xquery-вирази в реляційні рядки і стовпці, щоб з цим результатом могли працювати SQL-запити.

Підбиваючи підсумки сказаного

Це був тільки швидкий погляд на деякі з нових функціональних можливостей сервера Oracle Database 10 g Release 2. Тепер, щоб використовувати всі переваги нового матеріалу, я починаю повне читання документації.

Ведучий цієї колонки Том Кайт (Tom Kyte, thomas.kyte @ oracle.com) працює в корпорації Oracle з 1993 року. Кайт – віце-президент корпорації Oracle, який очолює групу Oracle Public Sector, він автор книг “Effective Oracle by Design” (Видавництво Oracle Press, 2003) – “Проектування ефективних додатків Oracle” і “Expert One on One: Oracle” (видавництво Apress, 2003) (Прим. пер. Є російський переклад: Oracle для професіоналів. Книга 1. Архітектура та основні особливості. Книга 2. Розширення можливостей і захист. – ДиаСофт, 2003 р.).


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*