Есть ли удобный способ импортировать схему в 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
(насоса данных)?Ответы:
На самом деле невозможно указать другое табличное пространство при импорте с помощью
imp
утилиты oracle . Однако в качестве обходного пути вы можете предварительно создать таблицы, выполнивROWS=N
импорт вUSERS
табличное пространство, затемalter table mytable move tablespace BLOG_DATA;
для каждой таблицы переместить их в новое табличное пространство, а затем снова выполнить импорт сIGNORE=Y
параметром, чтобы игнорировать ошибки создания таблицы и импортировать все данных.Если данные были экспортированы с использованием Data Pump (
expdp
), (кроме этого, все должны использовать это в наши дни, а не старые устаревшиеexp
/imp
утилиты), вы можете легко импортировать их в другое табличное пространство, используяREMAP_TABLESPACE
параметр.например:
источник
Вы должны выполнить следующие действия: -
imp system/manager file=export.dmp indexfile=newfile.sql
Это позволит импортировать данные и сохранить все определения в
newfile.sql
.newfile.sql
после изменения табличных пространств.источник