Рейтинг: 0/5
Подання FLASHBACK_TRANSACTION_QUERY дозволяє ідентифікувати транзакцію або трансакції, що відповідають за певні зміни даних таблиці, які відбулися за вказаний інтервал часу. Flashback Transaction Query просто опитує уявлення FLASHBACK_TRANSACTION_QUERY і надає інформацію про транзакції. включаючи оператори SQL. необхідні для скасування змін, проведених або одиночної транзакцією, або набором транзакцій за вказаний період часу. Це засіб дозволяє не тільки виправляти логічні помилки, але також проводити аудит транзакцій в базі даних.
Flashback Transaction Query отримує всю інформацію про транзакції з сегментів скасування. Тому значення, вказаний у меню UNDO_RETENTION. визначає, наскільки глибоко в минуле можна повернутися, щоб отримати дані скасування.
Використання засобу Flashback Transaction Query
Для опитування уявлення FLASHBACK_TRANSACTION_QUERY знадобиться системна привілей SELECT ANY TRANSACTION. Це уявлення містить стовпці, що дозволяють ідентифікувати тимчасову мітку транзакції, користувача, який виконав транзакцію, тип операції, виконаної в процесі транзакції, а також сегменти скасування, необхідні для отримання початкового рядка. У лістингу нижче показана структура представлення FLASHBACK_TRANSACTION_QUERY.
Подання FLASHBACK_TRANSACTION_QUERY включає такі стовпці.
- START_SCN і START_TIMESTAMP ідентифікують, коли певна рядок була створена.
- COMMIT_SCN і COMMIT_TIMESTAMP повідомляють, коли транзакція була зафіксована.
- XID. ROW_ID і UNDO_CHANGE # ідентифікують транзакцію, рядок і номер відміни зміни, відповідно.
- OPERATION повідомляє, яка операція DML була виконана - вставка, оновлення або видалення.
На замітку! Якщо в стовпці OPERATION знаходиться значення UNKNOWN. це означає, що в табличному просторі скасування недостатньо інформації, щоб коректно ідентифікувати точний тип операції транзакції.
- LOGON_USER. TABLE_NAME і TABLE_OWNER представляють ім'я користувача, ім'я таблиці та ім'я схеми.
- UNDO_SQL показує точний оператор SQL, який необхідно виконати для скасування транзакції. Ось приклад типу даних, який можна зустріти в стовпці UNDO_SQL:
У разі якщо будь-яка з таблиць, що беруть участь в операції Flashback Transaction Query, містить пов'язані рядки, або якщо використовуються Групові таблиці, перед застосуванням Flashback Transaction Query в базі даних слід включити додаткове протоколювання. Це робиться за допомогою наступного оператора SQL:
Наведений нижче запит відобразить всі транзакції, як зафіксовані, так і активні, у всіх сегментах скасування:
Запит в лістингу нижче показує, як визначити операцію, яка скасує транзакцію, і конкретний оператор SQL, який виконає таке скасування:
Стовпець OPERATION в лістингу вище показує, що за період часу, вказаний в запиті, було виконано дві вставки. Стовпець UNDO_SQL показує точний оператор SQL, який буде потрібно виконати для скасування змін - цю інформацію запит витягує із сегментів скасування. У цьому простому прикладі ми бачимо тільки два оператора delete. які ви повинні виконати, якщо захочете скасувати вставки, показані запитом. Однак транзакції зазвичай містять кілька операторів DML, і в цьому випадку потрібно застосувати скасування змін до тієї послідовності, в якій це повернув запит, щоб коректно відновити дані в їх початковий стан.
Порада. Якщо ви збираєтеся користуватися запитами Oracle Flashback Query або Oracle Flashback Transaction Query для виправлення критичних помилок даних, розгляньте застосування установки RETENTION_GARANTEE для табличного простору скасування. Це гарантує, що база даних збереже необхідно не застарілі дані скасування у всіх сегментах скасування.
Міркування з приводу Flashback Transaction Query
Щодо Flashback Transaction Query необхідно брати до уваги такі міркування.
- Включайте мінімальне додаткове протоколювання, якщо операції мають справу зі зв'язаними рядками і спеціальними структурами зберігання, такими як Групові таблиці.
- При опитуванні індекс-таблиць операція поновлення завжди відображається як двокрокова операція видалення / вставки.
- Якщо запит включає віддалену таблицю або віддаленого користувача, він поверне номера об'єктів і ідентифікатори користувачів замість імен об'єктів і імен користувачів.
Спільне використання Flashback Transaction Query і Flashback Versions Query
Засіб Flashback Versions Query дозволяє витягувати різні версії рядки, разом з їх унікальними ідентифікаторами, тимчасовими мітками версії рядки, номерами SCN і т.п. Воно показує, що було в рядку, і що сталося з нею. Засіб Flashback Transactions Query, з іншого боку, не тільки ідентифікує тип операції, виконаний з кожною версією рядки, але також надає код SQL, необхідний для повернення її в оригінальне стан. Воно показує, як повернутися до попередньої версії рядка.
Можливості цих двох засобів можна комбінувати, використовуючи їх послідовно для проведення аудиту і пов'язаних з ним дій. Розглянемо приклад, який демонструє, як комбінувати засоби Flashback Versions Query і Flashback Transactions Query для скасування небажаних змін в даних.
Для початку скористаємося Flashback Versions Query для ідентифікації всіх версій рядки в певній таблиці, які змінилися за певний період часу, як показано в лістингу нижче (це ідентично першому лістингу в даній статті).
Припустимо, що в лістингу вище ідентифікована другий рядок, яка показує операцію видалення (D). Помилково один з користувачів неправильно видалив рядок. Все, що потрібно зробити, щоб отримати коректний SQL-оператор для скасування цього видалення - це взяти ідентифікатор транзакції (XID) з цього результату Flashback Versions Query і знайти його в поданні FLASHBACK_TRANSACTION_QUERY .У лістингу нижче показаний запит, який потрібно виконати.
Засіб Flashback Table
Засіб Oracle Flashback Table дозволяє відновлювати таблицю станом на певний момент часу в минулому. Це засіб покладається на інформацію скасування із сегментів скасування бази даних для виконання відновлення до моменту часу, без відновлення будь-яких файлів даних або застосування якихось архівних файлів журналів повторного виконання, що потрібно при традиційному відновленні бази до конкретного моменту часу. Засіб Flashback Table можна використовувати для відкату змін до минулого моменту часу, визначеного часовою міткою або номером SCN.
Оскільки для повернення стану таблиці (замість відновлення ваших файлів резервних копій) ви покладаєтеся на дані скасування, переводити базу даних або якісь її табличні простору в автономне (відключене) стан на період виконання операції Flashback Table не буде потрібно. Oracle встановлює монопольні блокування DML на відновлювану таблицю або таблиці, але ці таблиці залишаються в онлайновому режимі.
Як працює засіб Flashback Table
Flashback Table використовує інформацію скасування для відновлення рядків даних в блоках таблиць, змінених операторами DML на кшталт INSERT. UPDATE і DELETE. Давайте послідовно розглянемо кроки операції Flashback Table.
На замітку! Об'єкти користувача SYS відновити не вдасться.
Насамперед слід переконатися, що користувач, що виконує операцію Flashback Table, має всі привілеї, які можуть бути або FLASHBACK ANYTABLE, або більш специфічна об'єктна привілей FLASHBACK на необхідної таблиці. Користувач повинен також мати на таблиці привілеї SELECT. INSERT, DELETE і ALTER.
Операції ретроспективи (flashback) не захищають ROWID-ідентифікатори Oracle, коли вони відновлюють рядки в змінених блоках таблиці, оскільки при своїй роботі виконують операції DML. Ці операції DML змінюють ROWID-ідентифікатори порушених рядків, тому ви повинні гарантувати дозвіл переміщення рядків в таблицях з використанням засобу Flashback Table:
Дозволивши переміщення рядків в таблиці, ви готові виконати ретроспективу таблиці на будь-який момент часу або до будь-якого номеру SCN в минулому, за умови наявності необхідної інформації в табличному просторі скасування.
Перш ніж застосовувати засіб Flashback Table, ознайомтеся з його повним синтаксисом:
Ось приклад, який показує, як виконати ретроспективу таблиці до минулого номеру SCN:
Порада. По завершенні операції Flashback Table все індекси, які стосуються таблиць в списку Flashback Table, також будуть повернуті до стану на момент часу, до якого повертається таблиця. Однак статистика оптимізатора буде відображати поточні дані в таблиці.
Можна також уточняти час, задаючи тимчасову мітку замість номера SCN:
Повернення таблиці на один день назад здійснюється за допомогою наступного оператора:
Ретроспективу можна виконати для більш однієї таблиці за раз, як показано в наступному прикладі (спочатку необхідно упевнитися, що переміщення рядків в таблиці дозволено):
Операція Flashback Table виконується "за місцем", в онлайновому режимі, і тому не вимагає перекладу файлів даних або табличних просторів в автономне стан, на відміну від традиційного відновлення до певного моменту часу. СУБД Oracle Database за замовчуванням відключає всі пов'язані тригери і заново включає їх по завершенні відновлення таблиці, хоча це поведінка легко змінити, додавши конструкцію ENABLE TRIGGERS до оператора FLASHBACK TABLE.
У разі відсутності достатніх даних скасування для повернення таблиці до старого стану виявилася невдалою, то показана в лістингу нижче, і це означає, що частина даних скасування була переписана. На жаль, засіб Flashback Table не допоможе в цьому випадку, оскільки воно повністю покладається на присутність необхідної інформації скасування. Єдине рішення в цьому випадку полягає в використанні табличного простору скасування більшого розміру або включення кошти гарантованого збереження даних скасування.
Скасування операції Flashback Table
Якщо виявиться, що результати Flashback Table не задовольняють, можна знову видати оператор FLASHBACK TABLE для повернення таблиці до стану, в якому вона перебувала перед першим викликом FLASHBACK TABLE.
Перед запуском операції Flashback Table важливо завжди запам'ятовувати поточний номер SCN, щоб при необхідності можна було скасувати операцію повторним викликом FLASHBACK TABLE. TO SCN. Поточний номер SCN бази даних відображається за допомогою наступного запиту:
Обмеження кошти Flashback Table
З засобом Flashback Table пов'язано кілька обмежень, найважливіші з яких перераховані нижче.
- Неможливо виконувати ретроспективу таблиці, що належить SYS. відновлених об'єктів або видаленої (remote) таблиці.
- Неможливо виконувати ретроспективу таблиці до моменту, що передував будь-якої операції DDL, яка включає зміни в структурі таблиці, такі як видалення стовпця, усічення таблиці, додавання обмеження або виконання операцій, пов'язаних з розділами, на зразок додавання або видалення розділу.
- Оператор FLASHBACK включає єдину транзакцію, і операція Flashback або повністю виконується, або ні. Якщо операція ретроспективи охоплює кілька таблиць, повернутися в стан на заданий момент часу або номер SCN повинні всі ці таблиці або жодної з них.
- Якщо Oracle виявить будь-яке порушення обмежень під час операції Flashback, операція буде скасована, і таблиці залишаться в початковому стані.
- При усечении таблиці або зміні будь-яких атрибутів, що не відносяться до зберігання (відмінних від PCTFREE. INITTRANS і MAXTRANS), виконувати операцію ретроспективи до моменту, що передував цим змінам, не можна.
На замітку! Вся операція ретроспективи виконується як одна транзакція