У меня есть база данных Oracle 11g (11.2.0.1), работающая в Linux (x64). В базе данных у меня есть схема и 33 таблицы для нее (все в одном табличном пространстве). Когда я вхожу в систему через sqlplus, я могу перечислить все таблицы через
SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';
Но когда я экспортирую табличное пространство, используя
exp ... BUFFER=65536 FULL=N COMPRESS=N CONSISTENT=Y TABLESPACES=... FILE=...
Затем он экспортирует только 24 из 33 таблиц. Я попытался экспортировать недостающие таблицы через
exp ... TABLES=<missing_table> ...
Но тут появляется ошибка:
EXP-00011: <schema>.<missing_table> does not exist
Как я могу узнать, что здесь не так?
Как я могу экспортировать все таблицы?
ОБНОВИТЬ:
Следуя совету Гэри, я обнаружил следующую разницу между экспортированными и отсутствующими таблицами. DDL экспортированной таблицы:
CREATE TABLE "MY_SCHEMA"."EXPORTED_TABLE" ( ... ) TABLESPACE "MY_TS" PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 64K BUFFER_POOL DEFAULT) LOGGING NOCOMPRESS
А теперь DDL неэкспортированной таблицы:
CREATE TABLE "MY_SCHEMA"."MISSING_TABLE" ( ... ) TABLESPACE "MY_TS" PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( BUFFER_POOL DEFAULT) LOGGING NOCOMPRESS
Вышеупомянутые DDL были созданы Enterprise Manager. Те, которые созданы с помощью sqlplus, содержат нет раздела ХРАНИЛИЩЕ для недостающих таблиц.
Я обнаружил, что таблицы экспортируются, когда я реорганизовываю их и устанавливаю для параметра STORAGE INITIAL значение 64K.
Задача решена. (С надеждой ;))
Начиная с Oracle 11gR2 (11.2.0.1) появилась новая функция: Отложенное создание сегмента: создание отправленной таблицы откладывается до тех пор, пока не будет вставлена первая строка. В результате пустые таблицы не отображаются в dba_segments и не экспортируются утилитой exp.
Самое простое решение - использовать утилиту expdp.
Если вам нужно использовать утилиту exp, вы должны запустить эту команду для всех ваших пустых таблиц:
ALTER TABLE tablename ALLOCATE EXTENTS
Сделать SELECT DBMS_METADATA.GET_DDL('TABLE','yourTableName')
для одной из таблиц, которая работает, а для другой - нет. Затем поиграйте в разницу. (Обратите внимание, что yourTableName
чувствителен к регистру.)
Это может быть что-то вроде BLOB / CLOB или разделов в другом табличном пространстве, зависимость от TYPE, принадлежащего другой схеме, которая не экспортируется ...
Таблица существует в БД, но вы не можете экспортировать ее, пока не выделите экстент для этой таблицы….
Прошло: 00: 00: 00.04 14:44:54 PIMUSER @ mdmqa> изменить таблицу RECORDAPPROVALHISTORY выделить экстент;
Я получаю аналогичную ошибку и думаю, что это тоже связано с синонимами.
Я могу описать конкретную таблицу в базе данных и выбрать из нее (нулевые строки). Я также могу описать выбор из общедоступного синонима
Но когда я экспортирую эту таблицу, я получаю сообщение об ошибке 011 не существует, имя или синоним. Когда я вставляю строку (это решает одну проблему), я могу экспортировать через имя таблицы, но не через синоним.
Конечно, раньше все это работало в 11.1.
Впервые я услышал об expdp. Посмотрим на это
находятся ли таблицы в тех же табличных пространствах, которые вы экспортируете? Проверьте с помощью этого запроса:
SELECT table_name, tablespace_name FROM user_tables
Это новая функция Oracle11. только в редакции Enterprise. Пустая таблица не будет экспортирована.
Да, таблицы существуют в одной схеме. Некоторые таблицы, которые не экспортируются, содержат данные, есть только несколько таблиц с нулевым счетчиком, все остальные содержат данные.
С уважением
Выделить экстент работает. Вы можете найти таблицы с этим утверждением:
select 'alter table '||table_Name||' allocate extent;' from user_Tables where temporary='N' and table_name not in (select segment_name from user_segments)