Oracle - импортировать данные в таблицу с другим именем? - PullRequest
4 голосов
/ 14 декабря 2009

У меня есть большой (несколько ГБ) файл данных, экспортированный из таблицы Oracle. Я хочу импортировать эти данные в другой экземпляр Oracle, , но я хочу, чтобы имя таблицы отличалось от исходной таблицы. Это возможно? Как?

Как системы импорта, так и экспорта - Oracle 11g. Таблица содержит столбец BLOB, если это имеет какое-либо значение.

Спасибо!

ОБНОВЛЕНИЕ

Идея состояла в том, чтобы обновить таблицу, сводя к минимуму время простоя системы, которая ее использует. Решение (на основе ответа Vincent Malgrat и APC ):

  1. Предполагая, что наше имя таблицы A
  2. Создать временную схему TEMP_SCHEMA
  3. Импорт наших данных в TEMP_SCHEMA.A
  4. CREATE REAL_SCHEMA.B AS SELECT * FROM TEMP_SCHEMA.A
  5. DROP TABLE REAL_SCHEMA.A Переименовать REAL_SCHEMA.A в REAL_SCHEMA.A_OLD
  6. Переименовать REAL_SCHEMA.B в REAL_SCHEMA.A
  7. DROP REAL_SCHEMA.A_OLD

Таким образом, время простоя только на этапах 4 и 5, оба должны быть независимы от размера данных. Я выложу обновление здесь, если это не сработает: -)

Ответы [ 5 ]

5 голосов
/ 14 декабря 2009

Если вы используете старые утилиты EXP и IMP, вы не сможете этого сделать. Единственный вариант - импортировать в таблицу с тем же именем (хотя вы можете изменить схему, которой принадлежит таблица.

Однако вы говорите, что находитесь на 11g. Почему бы не использовать утилиту DataPump, представленную в 10g, которая заменяет импорт и экспорт. Потому что в 11g эта утилита предлагает опцию REMAP_TABLE, которая делает именно то, что вы хотите.

редактировать

Прочитав комментарии, которые ОП добавил к другому ответу, пока я писал это, я не думаю, что опция REMAP_TABLE будет работать в их случае. Переименовывает только новые объекты. Если в целевой схеме существует таблица с исходным именем, то импорт завершится неудачно с ORA-39151. К сожалению.

редактировать бис

Учитывая решение, которое ОП окончательно выбрал (удалить существующую таблицу, заменить новой таблицей), существует решение с Data Pump, которое должно использовать предложение TABLE_EXISTS_ACTION={TRUNCATE | REPLACE}. Выбор REPLACE удаляет таблицу, тогда как TRUNCATE просто усекает ее. В любом случае нам нужно беспокоиться об ограничениях ссылочной целостности, но это также проблема с выбранным решением.

Я публикую это дополнение не для ФП, а в интересах других искателей, которые найдут эту страницу в будущем.

2 голосов
/ 14 августа 2014

Используйте параметр REMAP_TABLE = EXISITNG_TABLE_NAME: NEW_TABLE_NAME в impdp. Это работает в 11gR2.

2 голосов
/ 14 декабря 2009

Полагаю, вы хотите импортировать таблицу в схеме, в которой имя уже используется. Я не думаю, что вы можете изменить имя таблицы во время импорта. Однако вы можете изменить схему с помощью параметров FROMUSER и TOUSER. Это позволит вам импортировать таблицу в другую (временную) схему.

Когда это будет сделано, скопируйте таблицу в целевую схему с помощью CREATE TABLE AS SELECT. Время, необходимое для копирования таблицы, будет незначительным по сравнению с импортом, поэтому это не будет тратить слишком много времени. Во время операции вам потребуется вдвое больше места на диске.

Обновление

Как подсказал Гари , более умный метод - создать представление или синоним во временной схеме, которая ссылается на новую таблицу в целевой схеме. Вам не нужно будет копировать данные после импорта, так как они будут напрямую переданы в целевую таблицу.

1 голос
/ 14 декабря 2009

Создайте представление как select * from ... таблицу, в которую вы хотите импортировать, с представлением, совпадающим с именем таблицы в экспорте. Игнорировать ошибки при импорте.

1 голос
/ 14 декабря 2009

Просто импортируйте его в таблицу с тем же именем, затем переименуйте таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...