Використання кошика Oracle - Програмні продукти

Одне з нововведень Oracle 10g – це кошик. Ця можливість працює аналогічно до кошика в OC Windows або Mac OS. У цій статті буде описано, як працювати з кошиком.

  • Oracle Database 10g R1
  • Oracle Database 10g R2
  • Oracle Database 11g R1

Існує два уявлення кошика: USER_RECYCLEBIN та DBA_RECYCLEBIN. Для зручності синонім RECYCLEBIN вказує на USER_RECYCLEBIN. За замовчуванням кошик активований, але його можна вимкнути в ініціалізаційному параметрі RECYCLEBIN на рівні сесії або системи.

Коли кошик активний, будь-які таблиці, які ви видаляєте, не видаляються повністю, а потрапляють у кошик. Замість того щоб видалити таблицю, Oracle перейменовує її і всі пов'язані об'єкти (індекси, тригери, LOB сегменти і т.д.). Дає їм системне ім'я, яке починається на BIN $.

Наприклад, розглянемо таку ситуацію:

Якщо параметр RECYCLEBIN виставлений у значенням ON (за замовчуванням у Oracle 10g він включений), видалення таблиці призведе до її переміщення до кошика.

Таким чином бачимо, що таблиця перейменована, всі дані, які в ній містилися, як і раніше знаходяться в ній. Для Oracle це, як і раніше, звичайна таблиця.

Оскільки дані все на місці, то не важко повернути з кошика таблицю назад. Ця операція відома як "flashback drop". Команда FLASHBACK TABLE. TO BEFORE DROP перейменовує таблицю з імені з BIN$ на її оригінальне ім'я, у разі TEST.

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

Єкілька опцій видалення. Можна видалити всі USER_RECYCLEBIN за допомогою PURGE RECYCLEBIN; користувач з привілеями DBA може видалити всі корзини, використовуючи DBA_RECYCLEBIN; і нарешті, можна очистити кошик за схемою та користувачем, використовуючи PURGE TABLESPACE USER.

Oracle зберігає об'єкти в таблиці до тих пір, поки ви не видалили їх, або в табличному просторі вистачає місця, або не перевищена квота користувача. Очищення відбудеться однією операцією з поточного моменту доти, доки звільниться достатньо місця для поточної операції. Якщо файли даних табличного простору з опцією AUTOEXTEND ON, корзина буде очищена до того, як спрацює автоприріст.

Видалення версій таблиці

Так само як у кошику Windows може бути кілька файлів з однаковим ім'ям та розширенням, у кошику Oracle може бути кілька версій таблиці. Створимо та видалимо двічі таблицю TEST.

Зробимо запит до таблиць, щоб переконатися, що вони різні:

Тепер постає питання, яку версію Oracle відновить за вказівкою FLASHBACK DROP?

Oracle завжди відновлює останню за часом версію об'єкта. Щоб відновити більш ранню версію, можна вказати ім'я таблиці для відновлення. Зараз у кошику дві версії:

Для відновлення першої версії будемо використовувати ім'я першого примірника:

Друга версія залишилася у кошику:

У сучасних базах даних дуже рідкісні ситуації, коли таблиця існує як така. Як правило, вони мають індекси, тригери, зв'язки обмеження. Видалення таблиці призводить до видалення всіх залежних об'єктів. При видаленні всі об'єкти, як і таблиця, перейменовуються, їхнє нове ім'я починається так само з BIN$.

Подання RECYCLEBIN має й інші стовпці, що показують і зв'язок між TEST таTEST_COL_IDX.

Колонка PURGE_OBJECT містить номер об'єкта, BASE_OBJECT містить номер головного об'єкта. Таблиця TEST має номер 233031, базовий об'єкт нею - той самий, тобто. вона сама собі базовий об'єкт. Індекс TEST_COL_IDX має номер 233434, а базовий об'єкт для нього – 233031, таблиця TEST.

Якщо виконати FLASHBACK TABLE для таблиці TEST, її індекс буде відновлено, але Oracle не перейменує його назад на оригінальне ім'я. У індексу так і залишиться ім'я BIB $.

Швидше за все, Oracle не дуже дбає про збереження оригінального імені індексу. Якщо зараз знову видалити копію таблиці TEST, то з'ясується, що Oracle не пам'ятає оригінального імені індексу.

Зверніть увагу на значення у стовпцях CAN_UNDROP та CAN_PURGE (ми їх показуємо як UND та PUR) для індексу. Індекс може бути відновлено без таблиці, значення CAN_UNDROP одно NO. У той же час, індекс може бути видалений без таблиці.

Зараз якщо відновити таблицю, то її буде відновлено без індексу

Якщо видаліть таблицю зі зв'язаними LOB сегментами, то з ними буде подібна ситуація, виняток полягає в тому, що вони не можуть бути незалежно видалені, CAN_UNDROP і CAN_PURGE будуть виставлені в NO. Якщо відновити таблицю, то вони будуть відновлені разом з нею, якщо таблиця буде видалена з кошика, то і вони будуть видалені.

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

Аналогічно кошику в Windows, де можна видалити файл,минаючи кошик, в Oracle реалізований такий самий механізм. Для цього у пропозиції DROP TABLE вказується PURGE.

Якщо відключати корзину на рівні сесії, потрібно виконати пропозицію ALTER SESSION SET RECYCLEBIN=OFF. Це дасть той самий ефект, що додавання PURGE в пропозицію DROP TABLE. Але, варто відзначити, що можна використовувати FLASHBACK DROP для відновлення об'єктів, які були поміщені в кошик до того, як було виконано відключення кошика.

Кошик може містити кілька версій одного об'єкта.

Oracle відновлює об'єкти за алгоритмом LIFO, можна відновити найстарішу версію із зазначенням прямого імені об'єкта. Oracle при видаленні основного об'єкта видаляє і залежні об'єкти, при відновленні залежні об'єкти відновлюються (за винятком зазначених вище обмежень). Для індексів відновлення не відновлюється оригінальне ім'я. При відключенні кошика можливість відновити об'єкти з нього залишається, це стосується об'єктів поміщених до кошика до його відключення.