Я хочу импортировать дамп оракула в другое табличное пространство.
У меня есть табличное пространство A, используемое пользователем A. Я отозвал администратора базы данных для этого пользователя и предоставил ему право на подключение и ресурс. Потом все свалил командой
exp a/*** owner=a file=oracledump.DMP log=log.log compress=y
Теперь я хочу импортировать дамп в табличное пространство B, используемое пользователем B. Итак, я дал ему гранты на подключение и ресурсы (без администратора базы данных). Затем я выполнил следующий импорт:
imp b/*** file=oracledump.DMP log=import.log fromuser=a touser=b
В результате получился журнал с множеством ошибок:
IMP-00017: following statement failed with ORACLE error 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: ORACLE error 20001 encountered ORA-20001: Invalid or inconsistent input values
После этого я попробовал ту же команду импорта, но с параметром statistics = none. Это привело к следующим ошибкам:
ORA-00959: tablespace 'A_TBLSPACE' does not exist
Как это сделать?
Примечание: многие столбцы относятся к типу CLOB. Похоже, проблемы тут как-то связаны.
Примечание 2: версии Oracle представляют собой смесь 9.2, 10.1 и 10.1 XE. Но я не думаю, что это связано с версиями.





Проблема связана со столбцами CLOB. Кажется, что инструмент imp не может переписать оператор create для использования другого табличного пространства.
Источник: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848
Решение: Создайте схему вручную в правильном табличном пространстве. Если у вас нет сценария для создания схемы, вы можете создать его с помощью indexfile = инструмента imp.
Вам нужно отключить все ограничения самостоятельно, инструмент oracle imp не отключит их.
После этого вы можете импортировать данные с помощью следующей команды:
imp b/*** file=oracledump.dmp log=import.log fromuser=a touser=b statistics=none ignore=y
Примечание: мне все еще нужна статистика = нет из-за других ошибок.
дополнительная информация о насосе данных
Начиная с Oracle 10, импорт / экспорт улучшен: инструмент перекачки данных ([http://www.oracle-base.com/articles/10g/OracleDataPump10g.php visible[1])
Используя это для повторного импорта данных в новое табличное пространство:
Сначала создайте каталог для временного дампа:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/tempdump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO a;
Экспорт:
expdp a/* schemas=a directory=tempdump dumpfile=adump.dmp logfile=adump.log
Импорт:
impdp b/* directory=tempdump dumpfile=adump.dmp logfile=bdump.log REMAP_SCHEMA=a:b
Примечание: файлы дампа хранятся и читаются с диска сервера, а не с локального (клиентского) диска.
Да, экспорт / импорт - это "последнее средство" резервного копирования.
В моем случае это не всегда связано с резервным копированием и восстановлением. Мы также перемещаем и копируем демонстрационные базы данных. И это может быть между разными серверами или просто дублирование на одном сервере.
Какую версию Oracle вы используете? Если его 10 г или больше, вам все равно следует использовать Data Pump вместо импорта / экспорта. Я не уверен на 100%, сможет ли он справиться с этим сценарием, но я ожидал, что сможет.
Data Pump - это замена exp / imp для 10g и выше. Он работает очень похоже на exp / imp, за исключением того, что он (якобы не использую его, так как застрял на земле 9i) лучше.
Если вы используете Oracle 10g и datapump, вы можете использовать предложение REMAP_TABLESPACE. пример:
REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
У вас тут пара проблем.
во-первых, разные версии Oracle, которые вы используете, являются причиной ошибки статистики таблицы - у меня была такая же проблема, когда некоторые из наших баз данных Oracle 10g были обновлены до версии 2, а некоторые все еще находились в версии 1, и я менял местами. DMP файлы между ними.
Решение, которое сработало для меня, заключалось в использовании одной и той же версии инструментов exp и imp для экспорта и импорта в разных экземплярах базы данных. Это было проще всего сделать, используя один и тот же компьютер (или сервер Oracle) для выполнения всех команд экспорта и импорта.
во-вторых, я подозреваю, что вы получаете ORA-00959: tablespace 'A_TBLSPACE' does not exist, потому что пытаетесь импортировать файл .DMP из полнофункциональной базы данных Oracle в базу данных 10g Express Edition (XE), которая по умолчанию создает единое предопределенное табличное пространство с именем USERS для вас.
В таком случае вам необходимо сделать следующее.
С помощью вашего .DMP файла создайте файл SQL, содержащий структуру (Таблицы):
imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y
Откройте индексный файл (index.sql) в текстовом редакторе, который может выполнять поиск и замену по всему файлу, и выполните следующие операторы поиска и замены IN ORDER (игнорируйте одинарные кавычки .. '):
Find: 'REM<space>' Replace: <nothing>
Find: '"<source_tablespace>"' Replace: '"USERS"'
Find: '...' Replace: 'REM ...'
Find: 'CONNECT' Replace: 'REM CONNECT'
Сохраните индексный файл, затем запустите его для своей учетной записи Oracle Express Edition (я считаю, что лучше всего создать новую пустую учетную запись пользователя XE - или отбросить и воссоздать, если я обновляюсь):
sqlplus <xe_username>/<password>@XE @index.sql
Наконец, запустите тот же файл .DMP, с которым вы создали индексный файл для той же учетной записи, чтобы импортировать данные, хранимые процедуры, представления и т. д.:
imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y
Вы можете получить страницы с ошибками Oracle при попытке создать определенные объекты, такие как задания базы данных, поскольку Oracle попытается использовать тот же идентификатор базы данных, что, скорее всего, не удастся, поскольку вы находитесь в другой базе данных.
«который ограничен одним предопределенным табличным пространством с именем USERS». Это неправда. У меня работает несколько серверов Oracle XE, и все они имеют несколько пользователей и табличных пространств. Вы о чем-то другом говорите?
Вы правы - XE позволяет создавать Tabelspace. Я не знаю, где я думал, что прочитал, что это не так, поэтому спасибо, что указали на это! Вот ссылка на документацию Oracle, которая поддерживает вас: download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25107/…
Если вы хотите импортировать только указанную схему файла дампа, вы можете использовать импорт с fromuser и touser: <code> imp <xe_username> / <password> @XE file = <filename.dmp> indexfile = index.sql fromuser = <original_username> touser = <xe_username> </code>
Прошло много времени с тех пор, как вы вошли в это. Похоже, что в datapump, возможно, добавлены дополнительные функции. Я вижу в металинке пример использования опции remap_tablespace, impdp username/password dumpfile=example schema=example remap_tablespace=tablespace_source:tablespace_target
Ответ сложный, но выполнимый:
Ситуация такова: пользователь А и табличное пространство Икс
переименовать табличное пространство
изменить табличное пространство Икс переименовать в Y
создать каталог для команды expdp и предоставить права
импортировать дамп с помощью impdp
impdp B / B directory = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = А: B
и это все...
Для меня это работает нормально (Oracle Database 10g Express Edition Release 10.2.0.1.0):
impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS
Но для нового восстановления вам нужно новое табличное пространство
P.S. Может пригодится http://www.oracle-base.com/articles/10g/OracleDataPump10g.php
Да, REMAP_TABLESPACE = (..) - простой ответ при использовании impdp.exe
Да, но для использования expdp / impdp вам нужен каталог в базе данных ... У меня нет разрешения на его создание.
Мое решение - использовать утилиту GSAR для замены имени табличного пространства в файле DUMP. Когда вы делаете ответ, убедитесь, что размер файла дампа не изменился, добавив пробелы. Например.
gsar -f -s"TSDAT_OV101" -r"USERS " rm_schema.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ ENABLE STORAGE IN ROW CHUNK 8192 RETENTION" -r" " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ LOGGING" -r" " rm_schema.n1.dump rm_schema.n.dump
gsar -f -s"TABLESPACE """USERS """ " -r" " rm_schema.n.dump rm_schema.n1.dump
К сожалению, я больше не работаю с Oracle, но все равно дам вам положительный голос. Может кто подтвердит, что это работает?
Я хочу улучшить для двух пользователей как в разных табличных пространствах на разных серверах (базах данных))
1. Сначала создайте каталоги для временного дампа для обоих серверов (баз данных):
сервер №1:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/old_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO old_user;
сервер №2:
CREATE OR REPLACE DIRECTORY tempdump AS '/temp/new_datapump/';
GRANT READ, WRITE ON DIRECTORY tempdump TO new_user;
2. Экспорт (сервер №1):
expdp tables=old_user.table directory=tempdump dumpfile=adump.dmp logfile=adump.log
3. Импорт (сервер №2):
impdp directory=tempdump dumpfile=adump_table.dmp logfile=bdump_table.log
REMAP_TABLESPACE=old_tablespace:new_tablespace REMAP_SCHEMA=old_user:new_user
--- Создайте новое табличное пространство:
СОЗДАТЬ TABLESPACE TABLESPACENAME DATAFILE 'D: \ ORACL \ ORADATA \ XE \ TABLESPACEFILENAME.DBF' РАЗМЕР 350M АВТОРАСШИРЕНИЕ НА СЛЕДУЮЩЕМ 2500M МАКСИМАЛЬНЫЙ РАЗМЕР НЕОГРАНИЧЕННЫЙ ПРОТОКОЛИРОВАНИЕ ПОСТОЯННЫЙ УПРАВЛЕНИЕ EXTENT LOCAL AUTOALLOCATE РАЗМЕР БЛОКА 8K РУКОВОДСТВО ПО УПРАВЛЕНИЮ СЕГМЕНТНЫМ ПРОСТРАНСТВОМ ВОСПРОИЗВЕДЕНИЕ ВКЛЮЧЕНО;
--- а затем импортируйте с помощью команды ниже
СОЗДАТЬ ПОЛЬЗОВАТЕЛЬСКИЙ BVUSER, ОПРЕДЕЛЕННЫЙ ЗНАЧЕНИЯМИ 'bvuser' ПО УМОЛЧАНИЮ TABLESPACE TABLESPACENAME
- где D: \ ORACL - путь установки оракула
Поскольку я хотел перенести import (в Oracle 12.1 | 2) дамп, который был exp перенесен из локальной базы данных разработки (18c xe), и я знал, что все мои целевые базы данных будут иметь доступное табличное пространство с именем DATABASE_TABLESPACE, я просто создал свою схему / пользователя чтобы использовать новое табличное пространство с этим именем вместо USERS по умолчанию (к которому у меня нет доступа в целевых базах данных):
-- don't care about the details
CREATE TABLESPACE DATABASE_TABLESPACE
DATAFILE 'DATABASE_TABLESPACE.dat'
SIZE 10M
REUSE
AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
ALTER DATABASE DEFAULT TABLESPACE DATABASE_TABLESPACE;
CREATE USER username
IDENTIFIED BY userpassword
CONTAINER=all;
GRANT create session TO username;
GRANT create table TO username;
GRANT create view TO username;
GRANT create any trigger TO username;
GRANT create any procedure TO username;
GRANT create sequence TO username;
GRANT create synonym TO username;
GRANT create synonym TO username;
GRANT UNLIMITED TABLESPACE TO username;
exp, созданный на основе этого, делает imp счастливым в достижении моей цели.
Я ТАК надеялся, что у тебя есть лучший ответ. Это просто доказывает, что «вы должны подумать о том, как вы собираетесь восстановить данные, прежде чем думать о том, как вы собираетесь их резервировать».