воскресенье, 30 октября 2011 г.

RECYCLEBIN. Восстановление после удаления

Восстановление таблицы с корзины.
В Oracle начиная с 10-й версии есть корзина аналогичная той что есть в Windows.

Итак, перед тем как удалить что то ненужное нужно создать это что то ненужное.
Create Table Drink (Type varchar(20), Price Number, change_date date); 
Insert Into Drink (Type, Price, Change_Date) Values ('fizzy water, 1', '5,5', '01.12.2010'); 
Insert Into Drink (Type, Price, Change_Date) Values ('fizzy water, 2', '5,6', '01.12.2010'); 
Insert Into Drink (Type, Price, Change_Date) Values ('coffee, 1', '7,1', '02.12.2010'); 
Insert Into Drink (Type, Price, Change_Date) Values ('juice, 1', '8,3', '02.12.2010'); 
Insert Into Drink (Type, Price, Change_Date) values ('coffee, 2', '7,0', '01.12.2010');
Теперь выполняем команду:
Drop Table Drink; 
commit;
Заглядываем в корзину:
Select * from user_recyclebin 
Где:
Original_name - имя нашего объекта,
Object_name - новое имя объекта. Т.е. при удалении таблицы на самом деле она была просто переименована.
Самый главный параметр - Can_undrop, если значение "YES" значит таблица может быть восстановлена.

Восстановление таблицы из корзины производится командой
FLASHBACK TABLE drink TO BEFORE DROP;
Удаление таблицы из корзины
purge table "BIN$wBNIk1xUSfiyxRQsgb6dqw==$0"; 
Очистка корзины
PURGE RECYCLEBIN 
При наличии привилегий DBA можно удалить данные изо всех корзин через dba_recyclebin.
Таблица может хранится в корзине пока есть место в табличном пространстве либо если превышается квота пользователя. Если места не хватает производится поэтапное удаление для освобождения места под выполняемую операцию.

Версионность
В корзине может хранится несколько версий одного и того же объекта.
Для демонстрации выполним следующее:
Create Table Drink_copy As Select * From Drink; 
Drop Table Drink; 
Commit; 
Выполним еще раз
Create Table Drink As Select * From Drink_copy; 
Drop Table Drink; 
Commit; 
В корзине окажется 2 версии таблицы. По умолчанию восстановится более поздняя версия (т.н. LIFO - last in, first out). Для восстановления определенной версии таблицы нужно явно указать ее имя
FLASHBACK TABLE "BIN$lhuG5y7vRAy89rWMCG2EnQ==$0" TO BEFORE DROP

Удаление без использования корзины
Проверка включена ли корзина
select value from v$parameter where name = 'recyclebin' 
На уровне сессии отключение корзины производится следующей командой
ALTER SESSION SET RECYCLEBIN=OFF
Если на совсем то
ALTER SYSTEM SET recyclebin = OFF; 
Отключать корзину "на совсем" не рекомендуется. При необходимости можно удалить таблицу "мимо" корзины - аналогично Shift+Del
Drop Table Drink Purge;
Теперь таблица удалена и восстановление с корзины невозможно.
Следует помнить что в корзине остаются все объекты удаленные до отключения.

Более подробно про Recyclebin можно посмотреть здесь