Импорт схемы в новое или другое табличное пространство

13

Есть ли удобный способ импортировать схему в Oracle 11gR2, используя одно новое или другое табличное пространство, отличное от того, где были получены данные?

В качестве примера я экспортировал BLOG_DATA из OLDDB, где все пользовательские данные хранятся в табличном пространстве USERS.

На NEWDB я хотел бы импортировать схему BLOG_DATA, но сохранить пользовательские объекты в табличном пространстве BLOG_DATA, созданном специально для этого пользователя.

Я создал пользователя BLOG_DATA, создал табличное пространство BLOG_DATA и установил его в качестве табличного пространства по умолчанию для этого пользователя и добавил соответствующую неограниченную квоту.

CREATE TABLESPACE blog_data DATAFILE SIZE 1G;

CREATE USER blog_data IDENTIFIED BY secretpassword DEFAULT TABLESPACE blog_data QUOTA UNLIMITED ON blog_data;

GRANT connect,resource TO blog_data

Схема была экспортирована из OLDDB с чем-то вроде

exp blog_data/secretpassword@OLDDB file=blog_data.dmp 

Прочитав превосходный ответ Фила ниже, я подумал :

Поскольку для данных нет другого места, кроме табличного пространства по умолчанию - единственного табличного пространства, на которое пользователь имеет квоту, - будет ли это эффективно заставлять imp помещать все пользовательские объекты в это табличное пространство по умолчанию?

imp blog_data/secretpassword@NEWDB file=blog_data.dmp

Будет ли это тогда поместить всю схему blog_data в табличное пространство blog_data на NEWDB? Есть ли какая-то причина, по которой это не сработает или у меня возникнут проблемы с определенными объектами и т. Д.?

Обновить:

Я сделал быстрый тест и обнаружил, что это так. Impпомещает объекты в табличное пространство по умолчанию для этого пользователя, при условии, что он не может поместить его в исходное табличное пространство (например, табличное пространство не существует). Полное объяснение: http://www.dolicapax.org/?p=57

Тем не менее, я полагаю, что использование Data Pump, как предполагает Фил, может быть предпочтительным вариантом.

Рой
источник
Был ли он экспортирован с использованием устаревшей expутилиты или с помощью expdp(насоса данных)?
Philᵀᴹ
В примере он был экспортирован с помощью обычной утилиты exp, как показано выше. Я полагаю, что можно было бы так же легко использовать expdp и забрать файл со старого сервера базы данных, не облегчит ли это переход к новому табличному пространству?
Рой
Я рассмотрел оба в своем ответе. Используйте информационный насос - эту задачу легче выполнить
Philᵀᴹ

Ответы:

15

На самом деле невозможно указать другое табличное пространство при импорте с помощью impутилиты oracle . Однако в качестве обходного пути вы можете предварительно создать таблицы, выполнив ROWS=Nимпорт в USERSтабличное пространство, затем alter table mytable move tablespace BLOG_DATA;для каждой таблицы переместить их в новое табличное пространство, а затем снова выполнить импорт с IGNORE=Yпараметром, чтобы игнорировать ошибки создания таблицы и импортировать все данных.

Если данные были экспортированы с использованием Data Pump ( expdp), (кроме этого, все должны использовать это в наши дни, а не старые устаревшие exp/ impутилиты), вы можете легко импортировать их в другое табличное пространство, используя REMAP_TABLESPACEпараметр.

например:

impdp scott/tiger@ZOMG file=blog_data.dmp directory=mydir remap_tablespace=USERS:BLOG_DATA
Philᵀᴹ
источник
Большое спасибо, Фил. Мне было интересно: если пользователь, импортируемый в эксклюзивно, имеет квоту в табличном пространстве по умолчанию, заставит ли это imp поместить все импортированные объекты в это табличное пространство по умолчанию независимо от расположения в источнике данных?
Рой
Я работаю над чем-то похожим, но это целая миграция БД с использованием expdp / impdp, потому что я хочу, чтобы наш QA env соответствовал производственному. Если бы я использовал remap_tablespace, он переназначил бы каждую схему в другое отдельное табличное пространство, однако я думаю, что я могу выполнить команду impdp один раз для схемы и использовать remap_tablespace. Это должно достичь работы.
Николас де Фонтене
0

Вы должны выполнить следующие действия: -

  • Экспортировать пользователя
  • Выполните импорт с помощью команды.
    imp system/manager file=export.dmp indexfile=newfile.sql
    Это позволит импортировать данные и сохранить все определения в newfile.sql.
  • Бросьте необходимые предметы.
  • Запустите скрипт newfile.sqlпосле изменения табличных пространств.
  • Импорт из резервной копии необходимых объектов.
Мд Васи
источник