Використання кошика Oracle, Інші СУБД, Бази даних, статті

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


Рекомендовано для:



Початок


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


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


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

SQL> CREATE TABLE TEST (COL VARCHAR2(10), CHANGE_DATE DATE);
TABLE created.
SQL> INSERT INTO TEST VALUES (“Версія 1”, SYSDATE);
1 row created.
SQL> SELECT * FROM TEST ;
COL CHANGE_DATE
————- ————————— Версія 1 14:10:03

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

SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————————— ————- —– — —- —————
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:15:45:22

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

SQL> ALTER SESSION SET NLS_DATE_FORMAT=”HH24:MI:SS”;
Session altered.
SQL> SELECT * FROM “BIN$HGnc55/7rRPgQPeM/qQoRw==$0”;
COL CHANGE_DATE
————- ————————— Версія 1 14:10:03

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

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 1 14:10:03
SQL> SELECT * FROM RECYCLEBIN;
no rows selected

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

SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————————— ————- —– — —- —————
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:05:54
SQL> PURGE TABLE “BIN$HGnc55/7rRPgQPeM/qQoRw==$0”;
TABLE purged.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected

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


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


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


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

SQL> CREATE TABLE TEST (COL VARCHAR2(10), CHANGE_DATE DATE);
TABLE created.
SQL> INSERT INTO TEST VALUES (“Версія 1”, SYSDATE);
1 row created.
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> CREATE TABLE TEST (COL VARCHAR2(10), CHANGE_DATE DATE);
TABLE created.
SQL> INSERT INTO TEST VALUES (“Версія 2”, SYSDATE);
1 row created.
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 AN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————————— ————- —– — —- —————
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:05:54
BIN$HGnc55/8rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:10:54

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

SQL> SELECT * FROM “BIN$HGnc55/7rRPgQPeM/qQoRw==$0”;
COL CHANGE_DATE
————- ————————— Версія 1 14:10:03
SQL> SELECT * FROM “BIN$HGnc55/8rRPgQPeM/qQoRw==$0”;
COL CHANGE_DATE
————- ————————— Версія 2 15:38:03

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

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 2 15:38:03

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

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————————— ————- —– — —- —————
BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:05:54
BIN$HGnc55/8rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:10:54

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

SQL> FLASHBACK TABLE BIN$HGnc55/7rRPgQPeM/qQoRw==$0 TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 1 14:10:03

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

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————————— ————- —– — —- —————
BIN$HGnc55/8rRPgQPeM/qQoRw==$0 TEST TABLE YES YES 2008-09-24:16:10:54

Залежні об’єкти


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

SQL> TRANCATE TABLE TEST;
TABLE truncated.
SQL> INSERT INTO TEST VALUES (“Версія 3”, SYSDATE);
1 row created.
SQL> CREATE INDEX TEST_COL_IDX ON TEST(COL);
Index created.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 3 16:59:21
SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME
3 FROM RECYCLEBIN ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME
—————- ————- —– — —- ——————-
BIN$HGnc55/8rRPg TEST TABLE YES YES 2008-09-24:16:10:54
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST TABLE YES YES 2006-09-01:17:08:41
QPeM/qQoRw==$0
BIN$HGnc55/+rRPg TEST_COL_IDX INDEX NO YES 2006-09-01:17:08:41
QPeM/qQoRw==$0

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

SQL> ALTER SESSION SET NLS_DATE_FORMAT=”HH24:MI:SS”;
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”, DROPTIME,
3 BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
—————- ————- —– — —- ——— ———– ————
BIN$HGnc55/8rRPg TEST TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST TABLE YES YES 17:08:41 233031 233031
QPeM/qQoRw==$0
BIN$HGnc55/+rRPg TEST_COL_IDX INDEX NO YES 17:08:41 233031 233434
QPeM/qQoRw==$0

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


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

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 3 16:59:21
SQL> SELECT * INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME=”TEST”;
INDEX_NAME
——————————
BIN$HGnc55/+rRPgQPeM/qQoRw==$0

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

SQL>DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”,
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
—————- ————— —– — —- ——— ———– ————
BIN$HGnc55/8rRPg TEST TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST TABLE YES YES 17:08:41 233031 233031
QPeM/qQoRw==$0
BIN$HGnc56AArRPg BIN$HGnc55/+rRP INDEX NO YES 17:08:41 233031 233434
QPeM/qQoRw==$1
gQPeM/qQoRw==$0

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

SQL> PURGE INDEX “BIN$HGnc56AArRPgQPeM/qQoRw==$1”;
Index purged.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”,
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
—————- ————— —– — —- ——— ———– ————
BIN$HGnc55/8rRPg TEST TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
BIN$HGnc55//rRPg TEST TABLE YES YES 17:08:41 233031 233031
QPeM/qQoRw==$0

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

SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 3 16:59:21
SQL> SELECT * INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME=”TEST”;
no rows selected

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


Обмеження


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


Відключення кошика


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

SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected
SQL> CREATE TABLE NEW_TABLE (COL1 VARCHAR2(10), COL2 VARCHAR2(10));
TABLE created.
SQL> DROP TABLE NEW_TABLE PURGE;
TABLE dropped.
SQL> SELECT * FROM RECYCLEBIN;
no rows selected

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

SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”,
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
—————- ————— —– — —- ——— ———– ————
BIN$HGnc56ACrRPg TEST TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
SQL> ALTER SESSION SET RECYCLEBIN=OFF;
Session altered.
SQL> CREATE TABLE TEST (COL VARCHAR2(10), CHANGE_DATE DATE);
TABLE created.
SQL> INSERT INTO TEST VALUES (“Версія 5”, SYSDATE);
1 row created.
SQL> DROP TABLE TEST;
TABLE dropped.
SQL> SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE,
2 CAN_UNDROP AS “UND”, CAN_PURGE AS “PUR”,
3 DROPTIME, BASE_OBJECT, PURGE_OBJECT
4 FROM RECYCLEBIN
5 ORDER BY DROPTIME;
SQL>
OBJECT_NAME ORIGINAL_NAME TYPE UND PUR DROPTIME BASE_OBJECT PURGE_OBJECT
—————- ————— —– — —- ——— ———– ————
BIN$HGnc56ACrRPg TEST TABLE YES YES 16:10:54 233032 233032
QPeM/qQoRw==$0
SQL> FLASHBACK TABLE TEST TO BEFORE DROP;
Flashback complete.
SQL> SELECT * FROM TEST;
COL CHANGE_DATE
————- ————————— Версія 3 16:59:21

Висновки


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


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

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


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

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

Ваш отзыв

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

*

*