Oracle DBA
До цього часу в цьому розділі ви знайомилися з компонентами системи бази даних Oracle: необхідними файлами та розподілом пам'яті, а також способами їх налаштування. Тепер настав час подивитися, як Oracle обробляє запити користувача і як проводить зміну в даних. Важливо розуміти механізм обробки транзакцій SQL, тому що вся взаємодія з базою даних Oracle відбувається або у формі запитів SQL, які читають дані або операцій SQL (або PL/SQL), які модифікують, вставляють або видаляють дані.
Транзакція – це логічна одиниця роботи у базі даних Oracle, що з одного чи більше операторів SQL. Транзакція починається з першого виконуваного SQL-оператора і завершується, коли ви фіксуєте або відмовляєте транзакцію. Фіксація (commiting) транзакції закріплює проведені вами зміни, а відкат (roll back) – звичайно ж, скасовує їх. Як тільки ви зафіксували транзакцію, всі інші транзакції інших користувачів, які почалися після неї, матимуть змогу бачити зміни, проведені вашими транзакціями.
Коли транзакція взагалі може виконатися (скажімо, через відключення електроживлення), вона вся цілком має бути скасована. Oracle відкочує всі зміни, проведені попередніми операторами SQL, повертаючи дані у вихідний стан (який мали перед початком транзакції). Весь процес побудований те щоб підтримувати цілісність даних – тобто. концепцію «все чи нічого».
Наступний простий приклад вставки рядка визначає те, як Oracle обробляє транзакцію.
Фіксація та відкат
Ви повинні чітко розуміти два фундаментальні терміни, що стосуються транзакцій: фіксацій (commiting) та відкат (rolling back) транзакцій. Нижче коротко пояснюються обидва терміни.
Фіксація транзакції
Коли ви фіксуєте транзакцію, скажімо, за допомогою оператора COMMIT, Oracle робить усі імзії, виконані всіма операторами SQL, в рамках цієї транзакції, постійною частиною бази даних. Перш, ніж Oracle зафіксує результати транзакції, він робить таке.
- Генерує інформацію скасування (undo), що складається із значень даних, що підлягають модифікації, до змін. Ці дані збережуться у сегменті undo, що у табличному просторі undo.
- Він також генерує дані повторного виконання (redo), що містять зміни в блоках даних і блоках відкату, буфер журналу повторного виконання. База даних може писати на диск вміст буферів журналу повторного виконання перед фіксацією транзакцій.
- Здійснює зміни в буферах бази даних, що знаходяться у SGA. База даних може писати модифіковані буфери на диск перед фіксацією транзакції.
База даних може писати зміни транзакції, які були виконані першими, з буферів бази даних SGA в файли даних негайно або через деякий час після фіксації транзакції, або навіть перед її фіксацією. Коли бази даних фіксує транзакцію, вона виконує наступне.
- База даних призначає та записує SCN для фіксованої транзакції.
- Письменник журналів пише елементи журналу повторного виконання у файл журналу повторного виконання на диску з буфера журналу повторного виконання SGA: він також записує SCN транзакції у файл журналу повторного виконання, позначаючи тим офіційну фіксацію транзакції.
- База даних звільняє всі блокування таблиць та рядків.
- База даних позначає транзакцію як завершену.
Відкот транзакції
Скасувати зміни, виконані транзакцією, які ще не булиможна зафіксувати за допомогою команди ROLLBACK. У той час як журнал повторного виконання містить усі зміни, проведені в транзакції, сегмент скасування (undo) містить усі старі значення, які існували до моменту проведення змін. Ви можете або відкотити зміни, проведені всією транзакцією, або просто повернутися до маркера, який помістили раніше всередині транзакції, який називається точкою збереження (savepoint). Існує кілька типів відкату, серед яких перераховані нижче:
- Відкат , запрошений користувачем.
- Відкат, що стався через ненормальне переривання роботи процесу чи екземпляра.
- Відкат незафіксованих транзакцій під час відновлення.
- Відкат рівня оператора, що стався через помилку виконання цього оператора.
Незалежно від причини відкату, процедура завжди та сама.
- База даних використовує дані у вигляді, який вони мали до зміни в табличному просторі undo, щоб скасувати зміни, проведені під час транзакції.
- База даних звільняє всі блокування транзакції та таблиці.
- База даних завершує транзакцію
Цілісність даних та паралелізм даних
База даних була б не надто корисною, якби багато користувачів не могли звертатися до даних та модифікувати їх одночасно. Під паралелізмом даних (a concurrency) розуміють здатність бази даних забезпечувати паралельний доступ для багатьох користувачів. Щоб забезпечити узгоджені результати, база даних потребує механізму, який гарантує, що користувачі не натикатимуться на зміни, що проводяться один одним. Цілісність даних (data consistence) – це можливість для користувача отримувати узгоджене подання даних, включаючи всізміни, здійснені в них іншими користувачами.
Oracle використовує механізм блокування для забезпечення паралелізму даних. Дозволяючи одному користувачеві блокувати індивідуальні рядки або цілі таблиці, він гарантує виняткове використання таблиці з метою оновлення. Важливою характеристикою механізмів блокування Oracle є те, що вони переважно відбуваються автоматично. Вам не потрібно турбуватися про деталі блокування об'єктів, які ви хочете модифікувати – Oracle «за лаштунками» подбає про це.
Блокування Oracle складні, і ви детально познайомитеся з ними в розділі 8, разом з тим, як Oracle забезпечує узгодженість та паралелізм даних.
Письменник бази даних та протокол випереджувального запису
Коли користувач фіксує транзакцію, процес-письменник журналу негайно вносить у файли журналів повторного виконання запис фіксації. Повний набір записів, порушених зафіксованою транзакцією, може і не записуватися одночасно в файли даних. Механізм швидкої фіксації, поряд з журналом випереджувального запису, гарантує, що база даних не буде чекати завершення всіх фізичних операцій запису після кожної транзакції. Як ви можете уявити, величезні бази даних OLTP з численними змінами протягом усього дня не могли б функціонувати оптимально, якби їм довелося виконувати запис на диск після кожної зафіксованої зміни даних.
За наявності величезної кількості транзакцій і, як наслідок, величезної кількості запитів на фіксацію, процес-письменник журналу може не вносити негайно запис про кожну зафіксовану транзакцію до журналу повторного виконання. Він може накопичувати кілька запитів на фіксацію, якщо дуже зайнятий в даний момент. Така пакетованазапис інформації про безліч зафіксованих транзакцій називається груповий фіксацією.
Системний номер зміни
Системний номер зміни, або SCN (system change number) – важливий фактор оцінювання, що використовується базою даних Oracle для відстеження стану в кожен момент часу. Коли ви читаєте (SELECT) дані в таблицях, то не торкаєтеся стану бази даних, але коли модифікуєте, вставляєте або видаляєте рядок, стан бази даних по відношенню до того, яким воно було до операції. Oracle використовує SCN для стеження всіх змін, проведених у базі даних з часом. SCN – це логічна мітка, що використовується Oracle для впорядкування подій, що відбуваються з базою даних. SCN дуже важливий із кількох причин, не остання з яких – відновлення бази даних після збою.
SCN подібні до зростаючих номерів послідовності, і Oracle спочатку збільшує їх у SGA. Коли транзакція модифікує або вставляє дані, Oracle спочатку пише новий SCN сегмент відкату. Процес-письменник журналів потім негайно вносить запис про фіксацію транзакції в журнал повторного виконання, і цей запис отримує унікальний SCN сегмент відкату. Процесор-письменник журналів, потім негайно вносить запис про фіксацію транзакції до журналу повторного виконання, і цей запис отримує унікальний SCN нової транзакції. Фактично запис цього SCN журнал повторного виконання відзначає зафіксовану транзакцію в базі даних Oracle.
SCN допомагає Oracle визначати необхідність відновлення після збою, після раптового переривання роботи екземпляра бази даних або після видання команди SHUTDONW ABORT. Щоразу, коли база даних виконує операцію контрольної точки, Oracle пише команду START SCN у заголовки файлів даних.Керуючий файл підтримує значення SCN для кожного файлу даних, званий STOP SCN, який зазвичай встановлюється в нескінченність, і щоразу, коли екземпляр зупиняється нормально (командою SHUTDOWN NORMAL або SHUTDOWN IMMEDIATE). Oracle копіює номер START SCN у заголовках файлів даних у номери STOP SCN для файлів даних у керуючому файлі. Коли ви перезапускаєте базу даних після успішного зупинення, немає необхідності в жодному відновленні, тому що номери SCN у файлах даних та файлах, що управляють, відповідають. З іншого боку, раптове переривання роботи екземпляра не залишає часу на приведення у відповідність номерів SCN, і Oracle виявляє необхідність відновлення екземпляра, тому що відрізняються номери SCN у файлах даних з одного боку, і файл керуючого - з іншого. Вони відіграють ключову роль у відновленні бази даних. Oracle визначає, на скільки потрібно повернутися, використовуючи архівні журнали повторного виконання під час відновлення на основі SCN.
Управління скасуванням
Коли ви проводите зміни в базі даних, ви повинні мати можливість скасувати або відкотити цю зміну за потреби. Інформація, необхідна для скасування або відкату змін транзакції, яка в основному складається з інформації таблиці, що передує зміні, називається даними скасування (векторами змін) і зберігається в записах скасування (undo records). При видачі команди ROLLBACK Oracle використовує ці записи скасування для заміни змінених даних їх вихідними версіями. Записи скасування життєво важливі для відновлення бази даних, коли незавершені або незафіксовані транзакції повинні бути скасовані, щоб залишити базу в узгодженому стані.
Oracle настійно рекомендує використовувати засіб автоматичного керуваннязмінами (Automatic Undo Management - AUM), при якому сам сервер oracle буде підтримувати та керувати сегментами скасування (відкату). Все, що вам потрібно зробити – це надати виділений табличний простір undo та встановити параметр ініціалізації UNDO_MANAGEMENT у auto. Oracle створить необхідну кількість сегментів скасування, які структурно подібні до традиційних сегментів відкату, і буде розширювати їх у міру необхідності. Немає нічого незвичайного в тому, що будуть створюватися нові сегменти скасування, а старі деативізуватися в залежності від кількості транзакцій, що проводяться в базі даних.
Оскільки Oracle самостійно керує розмірами індивідуальних сегментів скасування, два рішення, які ви повинні прийняти, стосуються розміру табличного простору undo та встановлення ініціалізаційного параметра UNDO_RETINTION (який визначає, наскільки довго Oracle намагатиметься зберігати для вас записи про скасування в табличному просторі undo). Пам'ятайте, що ваш табличний простір undo повинен не тільки вмістити всі довготривалі транзакції, але також бути достатньо великим, щоб дозволити працювати всім засобам ретроспективи (flashback), які ви можете реалізувати у вашій базі даних; Засоби ретроспективи Oracle дозволяють скасовувати зміну даних на різних рівнях. Деякі з них, такі як Flashback Query, Flashback Versions Query та Flashback Table використовують дані скасування.
Ви можете використовувати Undo Advisor Oracle через OEM для знаходження ідеального розміру табличних просторів undo та ідеальної тривалості, щоб специфікувати параметр UNDO_RETENTION. За допомогою статистики поточного використання місця скасування можна оцінити оптимальні параметри генерації даних скасування для вашого екземпляра.