Измените TABLESPACE пункта назначения при восстановлении базы данных в Oracle 11g (Windows Server 2012 R2) - PullRequest
0 голосов
/ 15 января 2019

Я выполнял импорт базы данных (схема) из предыдущей версии (Oracle 10g express editon) в более новую версию (Oracle 11g express edition) в Oracle из .dmp файла (я не экспортировал, я отвечал только за импорт в новую среду) , как это сделать, я консультировался на предыдущем форуме, и яудалось импортировать с помощью imp, я не смог использовать impdp, потому что экспорт не был выполнен с помощью expdp.

Что ж, после того, как восстановление было сделано, мне больше всего нужно было восстановить всеобъекты в другом табличном пространстве, для этого я ранее создал пользователя, табличное пространство, связанное с этим пользователем, и, естественно, файл данных, связанный с этим табличным пространством.Но все объекты были восстановлены в системном табличном пространстве (USERS), поскольку в исходной базе данных они находятся в этом табличном пространстве.

Инструкция, которую я использовал и подумал, поможет мне, была следующей:

imp my_user/password@XE FILE=C:\oraclexe\app\oracle\admin\XE\dpdump\my_file.dmp FROMUSER=my_user TOUSER=my_user

Однако, хотя я и пытался сменить пользователя (FR0MUSER и TOUSER), данные все еще восстанавливаются в табличном пространстве USERS, а также в SYSTEM.

Я думаю, что единственный способ решить эту проблему - снова экспортировать.У меня есть три варианта: exp, expdp и RMAN.Хотя я не уверен, что это поможет мне самостоятельно изменить или изменить целевое табличное пространство.

Любая ссылка будет очень полезной.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Чтобы уточнить, вы уже завершили импорт, и данные были загружены в базу данных, однако импортированные объекты были загружены в табличные пространства «Пользователи» и «Система», а не в табличное пространство, которое вы создали для них, правильно?

Существует несколько способов сделать это, например, использовать пакет DBMS_REDEFINITION или выполнить команды, подобные ALTER TABLE [SCHEMA].[TABLE] MOVE TABLESPACE [NEW TABLESPACE], однако это может быть чрезвычайно утомительным и может вызвать проблемы, если база данных используется , Вам нужно будет перестроить индексы, а также переместить файлы больших объектов.

Я бы рекомендовал использовать насос данных (EXPDP) для создания нового экспорта схемы, а затем переназначить табличные пространства при повторном импорте в базу данных. Ваши шаги будут следовать этой общей схеме:

  1. Экспортируйте схему, используя команду, подобную этой: expdp [user]/[pass] SCHEMAS=[SCHEMA] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=export.log, где [SCHEMA] - имя схемы, которую вы хотите переназначить. Вы можете использовать любой каталог, файл дампа и имя файла журнала, который вы хотите - это только пример.
  2. Вы захотите удалить схему перед ее повторным импортом. Обязательно используйте опцию каскадирования, чтобы все объекты были сброшены: DROP USER [SCHEMA] CASCADE;
  3. Наконец, вы можете повторно импортировать схему и использовать предложение REMAP_TABLESPACE для переназначения объектов в желаемое табличное пространство: impdp [user]/[pass] SCHEMAS=[SCHEMA] REMAP_TABLESPACE=SYSTEM:[TABLESPACE] REMAP_TABLESPACE=USERS:[TABLESPACE] DIRECTORY=DATA_PUMP_DIR DUMPFILE=Export.dmp LOGFILE=import.log, где [TABLESPACE] - это табличное пространство, созданное вами для схемы.

При условии, что все идет хорошо, схема будет повторно импортирована в базу данных, и объекты этой схемы, которые были первоначально сопоставлены с табличными пространствами USERS и SYSTEM, будут переназначены в ваше [TABLESPACE].

0 голосов
/ 15 января 2019

Поскольку вы уже импортировали все, вы можете переместить все таблицы и индексы в предпочитаемое табличное пространство с помощью команд alter table и alter index, например ::

alter table my_table move tablespace my_tablespace;
alter index my_index rebuild tablespace my_tablespace;

Вы можете использовать словарь данных для генерации этих операторов, например:

select 'alter table "' || object_name || '" move tablespace my_tablespace;'
from user_objects
where object_type = 'TABLE';

select 'alter index "' || object_name || '" rebuild tablespace my_tablespace;'
from user_objects
where object_type = 'INDEX';

с выводом, записанным в скрипт, который вы затем запускаете; или вы можете использовать похожие запросы и динамический SQL, чтобы сделать все это за один раз.

Могут быть крайние случаи, с которыми вам придется иметь дело - может быть, дополнительные шаги для разделов, и я не уверен, что IOT вызовут проблемы, но это может помочь вам начать - и, по крайней мере, уменьшит объем реэкспорта / ре-импорт нужно сделать.

Конечно, вам нужно достаточно места для того, чтобы и старое, и новое табличное пространства могли перемещать объекты, поскольку они будут существовать в обоих по мере их перемещения - по одному, но, возможно, проблема также остается ...

...