Как очистить корзину oracle

Обновлено: 02.07.2024

Багдади Синдбад | বাগদাদী সিন্দবাদ পর্ব-২৩-২৫ | Bangla Дубляж | বাংলা ভাষায় এখন | Часть-23-25

Можно ли удалить все содержимое схемы в Oracle? Нашел вот такой скрипт:

Но я хотел бы знать, есть ли что-нибудь, что может отбросить все в схеме, индексах, таблицах, ограничениях . но не в схеме (удалить пользователя . ).

  • Если вы имеете в виду не удалять идентификаторы пользователей Oracle, я думаю, что сценарий сделает это. Но создайте тестовую базу данных и попробуйте.
  • Какова ваша цель? Очистить содержимое всех таблиц? Тогда не стоит их ронять. Если вы хотите просто получить пустую схему, думаю, ее проще воссоздать. Вы получите новую схему с нуля с пустой статистикой, без каких-либо объектов (таблиц, представлений, синонимов, материализованных представлений и т. Д.)
  • 2 У меня нет прав на создание пользователей, поэтому я не могу удалить пользователя и воссоздать его (не могу использовать DROP USER, как это указано в вопросе)
  • Если тебе действительно нужно бросить каждый типа объекта, вам придется покопаться в Справочнике по языку SQL и обработать большую часть DROP . заявления.
  • 1 Жаль, что Oracle предоставляет create schema команда, но не drop schema . Я полагаю, что это довольно распространенное требование для автоматизированного тестирования сборки, когда обычно вы не можете создавать пользователей с нуля.

Обычно проще всего отбросить и добавить пользователя. Это предпочтительный метод, если у вас есть системный или системный доступ к базе данных.

Если у вас нет доступа на системном уровне и вы хотите очистить свою схему, следующий sql создаст серию выпадающих статусов, которые затем могут быть выполнены.

Затем я обычно вычищаю мусорную корзину, чтобы действительно очистить вещи. Честно говоря, я не вижу большого использования корзины oracle и хотел бы отключить ее, но в любом случае:

Это создаст список операторов drop. Не все из них будут выполняться - если вы сбросите каскадом, сброс индексов PK_ * не удастся. Но в итоге у вас будет довольно чистая схема. Подтвердите с помощью:

Кроме того, просто чтобы добавить, блок Pl / sql в вашем вопросе удалит только таблицы, он не удалит все другие объекты.

ps: Скопировал с какого-то сайта, мне пригодилось. Проверено и работает как шарм.

Да, ты можешь. Вы можете удалить пользователя и таким образом удалить объекты схемы. Оператор DROP USER используется для удаления пользователя из базы данных Oracle и удаления всех объектов, принадлежащих этому пользователю.

Если TestDB владеет объектами в своей схеме, вам нужно будет вместо этого выполнить следующий оператор DROP USER:

Этот оператор удалит все объекты, принадлежащие TestDB, и все ограничения ссылочной целостности для объектов TestDB также будут отброшены.

  • 10 Это явно что сделал OP не спросить.

Спасибо автору Рафаэлю Эйнгу.

Просто войдите в схему, объекты которой вы хотите удалить.

Следующий сценарий SQLplus генерирует операторы SQL, необходимые для удаления всех объектов схемы у нужного пользователя:

Скрипт у меня работает на 100% как есть, но если по какой-то причине он не завершен для вас, то его легко улучшить с помощью виртуальной машины (ВМ) следующим образом:

Если шаг 6 завершился неудачно, вам необходимо определить оставшиеся объекты, препятствующие удалению вашего пользователя, и добавить их в приведенный выше сценарий. Повторяйте, пока ваш пользователь не упадет (т. Е. Ваш сценарий будет исчерпывающим), затем сохраните свой сценарий

Верните виртуальную машину к снимку и повторите шаги 3 и 4 (используя обновленный скрипт) - и теперь у вас должна быть 100% пустая схема.

Одно из нововведений 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 при удалении основного объекта удаляет и зависимые объекты, при восстановлении зависимые объекты восстанавливаются (за исключением ограничений указанных выше). Для индексов при восстановлении не восстанавливается оригинальное имя. При отключении корзины, возможность восстановить объекты из нее остается, это касается объектов помещенных в корзину до ее отключения.

[Учитель Чжао Цян, запись в блоге] Оператор Oracle Drop Table и корзина Oracle


Во-первых, давайте взглянем на формат синтаксиса Oracle Drop Table.


Объясните параметры внутри:

  • Схема представляет собой имя схемы, которое можно понимать как имя пользователя, а по умолчанию используется таблица под текущим пользователем. Например, чтобы удалить таблицу emp под пользователем scott, удалите таблицу scott.emp
  • Очистка не является обязательной.Если корзина включена (после Oracle 10g, корзина включена по умолчанию), без опции очистки, это означает, что удаленная таблица помещается в корзину, а пространство не восстанавливается. Используйте flashbask, чтобы вернуться к столу. С опцией очистки это означает удаление таблицы и освобождение места.
  • Необязательно, если есть другие таблицы, связанные со столбцом первичного ключа или столбцом уникального ключа таблицы, подлежащей удалению (удаляемая таблица - это первичная таблица (родительская таблица), а вторичная таблица (дочерняя таблица) имеет внешний ключ связанная с этой таблицей), то при прямом использовании таблицы перетаскивания будет выдана ошибка.В настоящее время, если вы хотите принудительно удалить эту таблицу, вам необходимо добавить параметр каскадных ограничений.

Используя функцию удаления из ретроспективного кадра, вы можете отменить влияние оператора DROP TABLE, не прибегая к традиционному восстановлению на определенный момент времени. Это вызваноКорзинаДля этого можно запросить корзину через представление DBA_RECYCLEBIN.

  • Проверьте, включена ли функция корзины для текущей базы данных



  • Запросить данные таблицы по имени объекта в корзине




Во время выполнения операции таблицы ретроспективного просмотра база данных получает независимые блокировки DML для всех указанных отчетов в списке ретроспективного просмотра. При восстановлении к предыдущему состоянию эти блокировки предотвращают любые операции с таблицей. Операции с таблицами ретроспективного просмотра выполняются за одну транзакцию, независимо от количества таблиц, указанных в таблице ретроспективного просмотра. Либо все таблицы восстанавливаются до более раннего состояния, либо ни одна из них не восстанавливается. Если операция ретроспективной таблицы для какой-либо таблицы завершается неудачно, то весь оператор терпит неудачу. Когда операция ретроспективного воспроизведения завершена, данные в таблице будут такими же, как и в предыдущий момент времени в таблице. Однако FLASHBACK TABLE to SCN или timestamp не сохраняет rowid, а FLASHBACK TABLE TO BEFORE DROP не может восстановить ссылочные ограничения. База данных не может восстановить статистику более ранней структуры, связанной с таблицей. Текущий индекс таблицы восстанавливается и отражает состояние таблицы точек восстановления. Если индекс не существует в точке восстановления, данные обновляются в индексе, чтобы отразить состояние таблицы точек восстановления. Однако, если индекс удален между текущим временем и точкой восстановления, его нельзя будет восстановить.

Возможно ли удалить все содержимое в схеме в Oracle? Я нашел этот скрипт:

Но я хотел бы знать, есть ли что-нибудь, чтобы отбросить все в схеме, индексах, таблицах, ограничениях . но не в схеме (удалить пользователя . ).

Обычно проще всего удалить и добавить пользователя. Это предпочтительный метод, если у вас есть системный или системный доступ к базе данных.

Если у вас нет доступа на системном уровне, и вы хотите очистить свою схему, следующий sql произведет серию отбрасывающих оценок, которые затем можно будет выполнить.

Затем я обычно очищаю корзину, чтобы действительно очистить вещи. Честно говоря, я не вижу особой пользы для корзины Oracle, и хотелось бы ее отключить, но в любом случае:

Это создаст список операторов отбрасывания. Не все из них будут выполняться - если вы уроните каскадом, сброс индексов PK_ * завершится неудачей. Но в итоге у вас будет довольно чистая схема. Подтвердите с помощью:

Кроме того, просто добавьте, что блок Pl/sql в вашем вопросе удалит только таблицы, но не удалит все остальные объекты.

pS: Скопировано с какого-то сайта, было полезно для меня. Проверено и работает как шарм.

Да, ты можешь. Вы можете удалить пользователя и, таким образом, удалить объекты схемы. Оператор DROP USER используется для удаления пользователя из базы данных Oracle и удаления всех объектов, принадлежащих этому пользователю.

Если TestDB имеет собственные объекты в своей схеме, вам нужно будет выполнить следующую инструкцию DROP USER:

Этот оператор удалит все объекты, принадлежащие TestDB, и все ограничения ссылочной целостности объектов TestDB также будут удалены.

Это то, что я использовал:

Следующий скрипт SQLplus генерирует операторы SQL, необходимые для удаления всех объектов схемы от нужного пользователя:

Сценарий работает на 100% для меня как есть, но если по какой-то причине он не завершен для вас, его легко улучшить с помощью виртуальной машины (ВМ) следующим образом:

  1. войдите как [ваш пользователь схемы, чтобы очистить]
  2. Сделайте снимок вашей виртуальной машины
  3. запустите приведенный выше скрипт, чтобы создать операторы удаления
  4. запустите операторы удаления (вы можете игнорировать любые ошибки «объект не существует», так как некоторые объекты будут автоматически удалены до оператора удаления сценария. Это происходит в результате удаления объектов-владельцев)
  5. выйти
  6. войдите в систему как SYS и выполните команду «drop user [пользователь вашей схемы пуст]]»; - БЕЗ каскадного варианта

Если шаг 6 не удался, вам нужно определить оставшиеся объекты, которые не позволяют удалить пользователя, и добавить их в приведенный выше скрипт. Повторяйте до тех пор, пока ваш пользователь не уйдет (т. Е. Ваш скрипт будет исчерпывающим), затем сохраните ваш скрипт

Откатите VM к вашему снимку и повторите шаги 3 и 4 (используя обновленный скрипт) - и теперь у вас должна быть на 100% пустая схема.

Читайте также: