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

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

У меня есть табличное пространство 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. Но я не думаю, что это связано с версиями.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
38
0
206 046
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Проблема связана со столбцами 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])

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

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

    CREATE OR REPLACE DIRECTORY tempdump AS '/temp/tempdump/';
    GRANT READ, WRITE ON DIRECTORY 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

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

Я ТАК надеялся, что у тебя есть лучший ответ. Это просто доказывает, что «вы должны подумать о том, как вы собираетесь восстановить данные, прежде чем думать о том, как вы собираетесь их резервировать».

Brad Bruce 15.09.2008 15:45

Да, экспорт / импорт - это "последнее средство" резервного копирования.

Matthew Watson 16.09.2008 16:14

В моем случае это не всегда связано с резервным копированием и восстановлением. Мы также перемещаем и копируем демонстрационные базы данных. И это может быть между разными серверами или просто дублирование на одном сервере.

Michiel Overeem 17.09.2008 10:25

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

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

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

Если вы используете 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 для вас.

В таком случае вам необходимо сделать следующее.

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

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

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

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

«который ограничен одним предопределенным табличным пространством с именем USERS». Это неправда. У меня работает несколько серверов Oracle XE, и все они имеют несколько пользователей и табличных пространств. Вы о чем-то другом говорите?

Michiel Overeem 17.09.2008 10:23

Вы правы - XE позволяет создавать Tabelspace. Я не знаю, где я думал, что прочитал, что это не так, поэтому спасибо, что указали на это! Вот ссылка на документацию Oracle, которая поддерживает вас: download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25107/…

Andrew 18.09.2008 01:33

Если вы хотите импортировать только указанную схему файла дампа, вы можете использовать импорт с fromuser и touser: <code> imp <xe_username> / <password> @XE file = <filename.dmp> indexfile = index.sql fromuser = <original_username> touser = <xe_username> </code>

David García González 05.11.2009 11:28

Прошло много времени с тех пор, как вы вошли в это. Похоже, что в datapump, возможно, добавлены дополнительные функции. Я вижу в металинке пример использования опции remap_tablespace, impdp username/password dumpfile=example schema=example remap_tablespace=tablespace_source:tablespace_target

Patrick Bacon 12.04.2016 23:01

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

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

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

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

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

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

Paul Lockwood 03.12.2012 22:19

Да, но для использования expdp / impdp вам нужен каталог в базе данных ... У меня нет разрешения на его создание.

masterxilo 01.02.2019 20:11

Мое решение - использовать утилиту 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, но все равно дам вам положительный голос. Может кто подтвердит, что это работает?

Michiel Overeem 15.03.2012 23:10

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

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 счастливым в достижении моей цели.

Другие вопросы по теме