Подтвердить что ты не робот

Как импортировать дамп oracle в другое табличное пространство

Я хочу импортировать дамп oracle в другое табличное пространство.

У меня есть табличное пространство A, используемое пользователем A. Я отменил DBA для этого пользователя и дал ему гранты connect и resource. Затем я сбросил все с помощью команды

exp a/*** owner = файл = oracledump.dmp log = log.log compress = y

Теперь я хочу импортировать дамп в табличное пространство B, используемое пользователем B. Поэтому я дал ему гранты на подключение и ресурс (без DBA). Затем я выполнил следующий импорт:

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b

Результатом является журнал с большим количеством ошибок:

IMP-00017: следующая инструкция не выполнена с ошибкой 20001 ORACLE: "НАЧАТЬ DBMS_STATS.SET_TABLE_STATS IMP-00003: обнаружена ошибка 20001 ORACLE ORA-20001: недопустимые или несогласованные входные значения

После этого я попробовал ту же команду импорта, но с опцией statistics = none. Это привело к следующим ошибкам:

ORA-00959: табличное пространство "A_TBLSPACE" не существует

Как это сделать?

Примечание: много столбцов имеют тип CLOB. Похоже, что проблемы имеют какое-то отношение к этому.

Примечание2: версии оракула представляют собой смесь из 9.2, 10.1 и 10.1 XE. Но я не думаю, что это связано с версиями.

4b9b3361

Ответ 1

У вас здесь пара проблем.

Во-первых, разные версии Oracle, которые вы используете, являются причиной ошибки статистики таблицы. У меня была такая же проблема, когда некоторые из наших баз данных Oracle 10g были обновлены до версии 2, а некоторые все еще были в Release 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) в текстовом редакторе, который может найти и заменить весь файл, и выпустить следующие инструкции поиска и замены В ЗАКАЗ (игнорировать одиночные кавычки.. '):

    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 при попытке создания определенных объектов, таких как Database Jobs, поскольку Oracle будет пытаться использовать тот же идентификатор базы данных, который скорее всего будет терпеть неудачу, поскольку вы находитесь в другой базе данных.

Ответ 2

Если вы используете Oracle 10g и datapump, вы можете использовать предложение REMAP_TABLESPACE. Пример:

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE

Ответ 3

Для меня это нормально работает (Oracle Database 10g Express Edition Release 10.2.0.1.0):

impdp B/B full=Y dumpfile=DUMP.dmp REMAP_TABLESPACE=OLD_TABLESPACE:USERS

Но для нового восстановления вам нужно новое табличное пространство

PS Может быть полезно http://www.oracle-base.com/articles/10g/OracleDataPump10g.php

Ответ 4

Какую версию Oracle вы используете? Если его 10 г или больше, вы должны смотреть на использование Data Pump вместо импорта/экспорта в любом случае. Я не уверен на 100%, если он может справиться с этим сценарием, но я бы ожидал, что это возможно.

Data Pump является заменой exp/imp на 10g и выше. Он очень похож на exp/imp, кроме его (предположительно, я его не использую, так как я застрял на земле 9i).

Ниже приведены документы Data Pump

Ответ 5

Проблема связана с столбцами CLOB. Кажется, что инструмент imp не может переписать оператор create для использования другого табличного пространства.

Источник: http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:66890284723848

Решение: Создайте схему вручную в правильном табличном пространстве. Если у вас нет script для создания схемы, вы можете создать ее с помощью indexfile = инструмента imp.

Вам нужно отключить все ограничения самостоятельно, инструмент oracle imp не отключит их.

После этого вы можете импортировать данные с помощью следующей команды:

imp b/*** file = oracledump.dmp log = import.log fromuser = a touser = b статистика = none ignore = y

Примечание. Мне все еще нужна статистика = нет из-за других ошибок.

дополнительная информация о насосе данных

По сравнению с Oracle 10 улучшен импорт/экспорт: инструмент накачки данных ([http://www.oracle-base.com/articles/10g/OracleDataPump10g.php][1])

Используя это, чтобы повторно импортировать данные в новое табличное пространство:

  • Сначала создайте каталог для временного дампа:

    СОЗДАТЬ ИЛИ ЗАМЕНИТЬ СПРАВОЧНИК tempdump AS '/temp/tempdump/';
    GRANT READ, НАПИШИТЕ НА СПРАВОЧНИКЕ 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

Примечание: файлы дампов сохраняются и считываются с диска сервера, а не с локального (клиентского) диска

Ответ 6

Ответ сложный, но выполнимый:

Ситуация: пользователь A и табличное пространство X

  • импортируйте файл дампа в другую базу данных (это необходимо, только если вам нужно сохранить копию оригинала)
  • переименовать табличное пространство

    изменить табличное пространство X переименовать в Y

  • создать каталог для команды expdp en grant rights

  • создать дамп с помощью expdp
  • удалить старый пользователь и старое табличное пространство (Y)
  • создать новое табличное пространство (Y)
  • создать нового пользователя (с новым именем) - в этом случае B - и предоставить права (также в каталог, созданный с шагом 3)
  • импортировать дамп с помощью impdp

    impdp B/B directory = DIR dumpfile = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA = A: B

и что он...

Ответ 7

Мое решение - использовать утилиту 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

Ответ 8

Я хочу улучшить для двух пользователей как в разных табличных пространствах на разных серверах (базах данных)

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

Ответ 9

Потому что я хотел imp ПРТА (в Oracle 12.1 | 2) дамп, который был exp orted из локальной базы данных в целях развития (18с х), и я знал, что все мои целевые базы данных будут иметь доступный табличную под названием DATABASE_TABLESPACE, я просто создал свою схему /user использовать новое табличное пространство с таким именем вместо 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 счастливым на моей цели.

Ответ 10

--- Создать новое табличное пространство:

CREATE TABLESPACE TABLESPACENAME DATAFILE 'D:\ORACL\ORADATA\XE\TABLESPACEFILENAME.DBF' SIZE 350M AUTOEXTEND ON NEXT 2500M MAXSIZE UNLIMITED ВЕДЕНИЕ ЖУРНАЛА ПОСТОЯННАЯ МНОГОСТОРОННЕЕ УПРАВЛЕНИЕ МЕСТНЫЙ АВТОАЛЛКАТ BLOCKSIZE 8K РУКОВОДСТВО ПО УПРАВЛЕНИЮ МЕСТОПОЛОЖЕНИЕМ СЕГМЕНТА FLASHBACK ON;

--- и затем импортировать с помощью команды ниже

СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ BVUSER, ИДЕНТИФИЦИРОВАННОГО ЦЕННОСТЯМИ bvuser 'DEFAULT TABLESPACE TABLESPACENAME

- где D:\ORACL - путь установки оракула