it-swarm-ru.tech

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

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

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

exp// *** владелец = файл = oracledump.dmp log = log.log compress = y

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

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

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

IMP-00017: следующий оператор завершился ошибкой с ошибкой Oracle 20001: "BEGIN DBMS_STATS.SET_TABLE_STATS IMP-00003: Обнаружена ошибка Oracle 20001 ORA-20001: неверные или несогласованные входные значения

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

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

Как это должно быть сделано?

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

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

33
Michiel Overeem

У вас есть пара вопросов здесь.

Во-первых , причиной того, что ошибка статистики таблиц используется в разных версиях Oracle, - у меня была такая же проблема, когда некоторые из наших баз данных Oracle 10g были обновлены до выпуска 2, а некоторые все еще были в выпуске 1 и Я обменивался файлами .DMP между ними.

Решение, которое работало для меня, заключалось в том, чтобы использовать одну и ту же версию инструментов exp и imp для экспорта и импорта в разных экземплярах базы данных. Это было проще всего сделать, используя один и тот же компьютер (или сервер Oracle) для выдачи всех команд экспорта и импорта.

Во-вторых , я подозреваю, что вы получаете ORA-00959: tablespace 'A_TBLSPACE' does not exist, потому что вы пытаетесь импортировать файл .DMP из полноценной базы данных Oracle в базу данных 10g Express Edition (XE), которая по умолчанию создает одну предопределенное табличное пространство с именем USERS для вас.

Если это так, то вам нужно сделать следующее ..

  1. С вашим файлом .DMP создайте файл SQL, содержащий структуру (таблицы):

    imp <xe_username>/<password>@XE file=<filename.dmp> indexfile=index.sql full=y

  2. Откройте файл индекса (index.sql) в текстовом редакторе, который может найти и заменить весь файл, и введите следующие операторы поиска и замены в порядке (игнорируйте одинарные кавычки .. '):

    Find: 'REM<space>' Replace: <nothing>

    Find: '"<source_tablespace>"' Replace: '"USERS"'

    Find: '...' Replace: 'REM ...'

    Find: 'CONNECT' Replace: 'REM CONNECT'

  3. Сохраните индексный файл, затем запустите его для своей учетной записи Oracle Express Edition (я считаю, что лучше создать новую, пустую учетную запись пользователя XE - или удалить и заново создать, если я обновляю):

    sqlplus <xe_username>/<password>@XE @index.sql

  4. Наконец, запустите тот же файл .DMP, с которым вы создали индексный файл, для той же учетной записи, чтобы импортировать данные, хранимые процедуры, представления и т.д.

    imp <xe_username>/<password>@XE file=<filename.dmp> fromuser=<original_username> touser=<xe_username> ignore=y

Вы можете получить страницы ошибок Oracle при попытке создания определенных объектов, таких как Задания базы данных, поскольку Oracle будет пытаться использовать тот же Идентификатор базы данных, который, скорее всего, потерпит неудачу, когда вы находитесь в другой базе данных.

31
Andrew

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

REMAP_TABLESPACE=A_TBLSPACE:NEW_TABLESPACE_GOES_HERE
16
Neil Kodner

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

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

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

Постскриптум Может быть полезно http://www.Oracle-base.com/articles/10g/OracleDataPump10g.php

6
Grebets Kostyantyn

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

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

Вот документы Data Pump

3
Matthew Watson

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

1 . Сначала создайте каталоги для временного дампа для обоих серверов (баз данных):

server # 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
1
peter

мое решение состоит в том, чтобы использовать утилиту GSAR для замены имени табличного пространства в файле DUMP. Когда вы делаете replce, убедитесь, что размер файла дампа не изменился, добавив пробелы . E.g.

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
1
Dmitry

Проблема связана со столбцами 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 статистика = нет игнорировать = y

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

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

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

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

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

    CREATE OR ЗАМЕНИТЕ СПРАВОЧНИК tempdump AS '/ temp/tempdump /';
    GRANT READ, НАПИСАТЬ НА КАТАЛОГ tempdump TO a;

  2. Экспорт:

    expdp a/* schemas = a directory = tempdump dumpfile = adump.dmp logfile = adump.log

  3. Импортировать:

    impdp b/* directory = tempdump dumpfile = adump.dmp logfile = bdump.log REMAP_SCHEMA = a: b

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

1
Michiel Overeem

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

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

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

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

  3. создать каталог для команды expdp и предоставить права

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

    каталог impdp B/B = DIR-файл дампа = DUMPFILE.dmp logfile = LOGFILE.log REMAP_SCHEMA =A:B

и это все...

1
Michiel Overeem

Поскольку я хотел import (для Oracle 12.1 | 2) создать дамп, который был exported из локальной базы данных разработки (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 счастливым для моей цели.

0
masterxilo