Използване на количката за пазаруване на Oracle - Софтуерни продукти

Едно от нововъведенията в Oracle 10g е пазарската количка. Тази функция работи подобно на кошчето в OC Windows или Mac OS. Тази статия ще опише как да работите с пазарската количка.

  • Oracle Database 10g издание 1
  • Oracle Database 10g R2
  • Oracle Database 11g издание 1

Има два изгледа на количката: USER_RECYCLEBIN и DBA_RECYCLEBIN. За удобство синонимът RECYCLEBIN сочи към вашия USER_RECYCLEBIN. По подразбиране кошчето е активирано, но може да бъде деактивирано в параметъра за инициализация RECYCLEBIN на ниво сесия или система.

Когато кошчето е активно, всички таблици, които изтриете, не се изтриват напълно, а отиват в кошчето. Вместо да изпуска таблицата, Oracle я преименува и всички свързани обекти (индекси, тригери, LOB сегменти и т.н.). Дава им системно име, което започва с BIN$.

Например, разгледайте тази ситуация:

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

Така виждаме, че таблицата е преименувана, всички данни, които съдържа, все още са в нея. За Oracle това все още е обикновена таблица.

Тъй като всички данни са на мястото си, няма да е трудно да върнете масата обратно от кошницата. Тази операция е известна като "изпускане на ретроспекция". Команда 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. Ако възстановите таблицата, те ще бъдат възстановени заедно с нея, ако таблицата бъде изтрита от кошчето, те също ще бъдат изтрити.

Ако таблица бъде премахната и след това възстановена, референтната цялост се губи. За материализирани изгледи, ако таблица бъде изтрита, всички регистрационни файлове, дефинирани за тази таблица, се изтриват, без да бъдат поставени в кошчето. Ако основната таблица бъде премахната, индексите на растерните изображения не се поставят в кошчето. Възстановяването на таблица от кошчето не възстановява индекси.

Подобно на кошчето в Windows, където можете да изтриете файл,заобикаляйки кошницата, Oracle прилага същия механизъм. За да направите това, клаузата DROP TABLE указва PURGE.

Ако деактивирате кошницата на ниво сесия, тогава трябва да изпълните клаузата ALTER SESSION SET RECYCLEBIN=OFF. Това ще има същия ефект като добавянето на PURGE към клаузата DROP TABLE. Но си струва да се отбележи, че можете да използвате FLASHBACK DROP, за да възстановите обекти, които са били поставени в кошчето, преди кошчето да бъде деактивирано.

Кошчето може да съдържа няколко версии на един и същи елемент.

Oracle възстановява обекти с помощта на алгоритъма LIFO, можете да възстановите най-старата версия, като посочите директното име на обекта. Когато изтрива основен обект, Oracle изтрива и зависимите обекти; при възстановяване зависимите обекти се възстановяват (с изключение на ограниченията, отбелязани по-горе). За индекси повторното изграждане не възстановява оригиналното име. Когато кошчето е деактивирано, възможността за възстановяване на обекти от него остава, това се отнася за обекти, поставени в кошчето, преди да бъде деактивирано.