Общие замечания и подготовка
Экспорт базы данных
2.1. Классический экспорт (exp)
2.2. Экспорт с помощью Data Pump (expdp)
Импорт базы данных
3.1. Классический импорт (imp)
3.2. Импорт с помощью Data Pump (impdp)
Действия после импорта
4.1. Выдача привилегий пользователю SUPERMAG
4.2. Восстановление триггера DBPasswordChange
4.3. Перекомпиляция объектов
4.4. Запуск Генератора БД и установка сервис‑паков
Решение типовых проблем
5.1. Пустые таблицы не попадают в дамп (deferred segment creation)
5.2. Ошибка IMP‑00032 / IMP‑00008
5.3. Ошибка MSVCR100.dll не найдена
5.4. Отсутствуют системные пользователи (OLAPSYS, MDSYS)
5.5. Ошибка нехватки места в табличном пространстве (ORA‑01658)
5.6. Ускорение импорта
Версия Oracle. Убедитесь, что версия целевой БД соответствует исходной (Enterprise → Enterprise, Standard → Standard). Импорт дампа с Enterprise в Standard часто приводит к большому количеству нескомпилированных объектов.
Порядок обновления «Супермаг». Если вы обновляете саму систему, обязательно проходите все промежуточные версии (например, 1.024.4 → 1.025 → 1.026 и т.д.). Лицензии на них не требуются. Перед установкой версии 1.024.4 установите компоненты из папки dotnet for 1.024.4, перед версией 1.026 – из папки dotnet for 1.026.1 sp3. Перед обновлением остановите все сервисы «Супермаг».
Перед экспортом необходимо удалить триггер DBPasswordChange (выполняется в SQL*Plus под пользователем SUPERMAG):
sql
DROP TRIGGER DBPasswordChange;После импорта триггер будет восстановлен (см. п. 4.2).
Настройка NLS_LANG. Для корректной работы с кодировкой (обычно CL8MSWIN1251) перед запуском exp/imp задайте переменную окружения:
text
set NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251(в Linux: export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251)
Используйте утилиту exp (для версий Oracle до 11g или при необходимости совместимости).
Команда (выполняется из командной строки):
text
exp sys/пароль@имя_БД full=y file=путь\дамп.dmp log=путь\exp_лог.logПример:
text
exp sys/qqq@orcl full=y file=C:\backup\mydb.dmp log=C:\backup\exp_mydb.logfull=y – полный экспорт всей БД.
file – путь к файлу дампа.
log – файл журнала (необязательно, но рекомендуется).
Важно: при экспорте в кодировке UTF8 могут возникнуть ошибки при импорте (см. п. 5.2). Рекомендуется использовать единую кодировку CL8MSWIN1251.
Data Pump (начиная с Oracle 10g) работает быстрее и позволяет использовать параллельные потоки.
Предварительный шаг – создать директорию (каталог), куда будет сохранён дамп. Это делается в SQL*Plus под пользователем с правами SYSDBA:
sql
CREATE OR REPLACE DIRECTORY dir AS 'C:\путь_к_папке';(можно использовать уже существующую директорию, например DATA_PUMP_DIR – её путь можно узнать запросом SELECT * FROM dba_directories;)
Команда expdp:
text
expdp sys/пароль@имя_БД full=Y directory=dir dumpfile=дамп.dmp logfile=expdp_лог.logС параллельными потоками (ускорение на многопроцессорных системах):
text
expdp sys/пароль@имя_БД full=Y directory=dir dumpfile=дамп_%U.dmp logfile=expdp_лог.log parallel=4%U в имени файла создаст несколько частей (дамп_01.dmp, дамп_02.dmp и т.д.).
parallel – число потоков (обычно равно числу ядер).
Важно: импорт выполняется в пустую базу данных, которая не инициализирована Генератором БД СМ2000. База должна быть создана, но без схемы SUPERMAG или с чистой схемой.
Если вы снимали дамп через exp, используйте imp:
text
imp sys/пароль@имя_БД full=y file=путь\дамп.dmp log=путь\imp_лог.log buffer=5000000Пример:
text
imp sys/qqq@orcl full=y file=C:\backup\mydb.dmp log=C:\backup\imp_mydb.log buffer=5000000buffer – размер буфера в байтах. Увеличение (например, до 5 000 000) помогает избежать ошибки IMP-00032.
Для Linux команда аналогична (пути указываются в формате /home/oracle/...).
Для дампов, созданных через expdp:
text
impdp sys/пароль@имя_БД full=Y directory=dir dumpfile=дамп.dmp logfile=impdp_лог.logС параллельными потоками (при этом дамп должен быть тоже многоканальным, с %U):
text
impdp sys/пароль@имя_БД full=Y directory=dir dumpfile=дамп_%U.dmp logfile=impdp_лог.log parallel=4Если требуется импортировать только конкретную схему (например, SUPERMAG):
text
impdp system/пароль SCHEMAS=supermag directory=dir dumpfile=DumpSCHEMAS.dmp logfile=ImportSCHEMAS.logСразу после завершения импорта выполните следующие шаги (все команды выполняются в SQL*Plus под пользователем SYS как SYSDBA).
Подключитесь:
text
conn sys/пароль@имя_БД as sysdbaВыполните все приведённые ниже гранты (скопируйте блок целиком). Внимание: некоторые гранты могут повторяться – это допустимо.
sql
GRANT ADMINISTER DATABASE TRIGGER TO SUPERMAG; GRANT ALTER ANY ROLE TO SUPERMAG; GRANT ALTER USER TO SUPERMAG WITH ADMIN OPTION; GRANT ANALYZE ANY TO SUPERMAG; GRANT CREATE DATABASE LINK TO SUPERMAG; GRANT CREATE LIBRARY TO SUPERMAG; GRANT CREATE PUBLIC SYNONYM TO SUPERMAG; GRANT CREATE ROLE TO SUPERMAG WITH ADMIN OPTION; GRANT CREATE SNAPSHOT TO SUPERMAG; GRANT CREATE TABLE TO SUPERMAG; GRANT CREATE USER TO SUPERMAG WITH ADMIN OPTION; GRANT DROP ANY ROLE TO SUPERMAG WITH ADMIN OPTION; GRANT DROP PUBLIC SYNONYM TO SUPERMAG; GRANT DROP USER TO SUPERMAG WITH ADMIN OPTION; GRANT GRANT ANY ROLE TO SUPERMAG WITH ADMIN OPTION; GRANT SELECT ON SYS.DBA_CONS_COLUMNS TO SUPERMAG WITH GRANT OPTION; GRANT SELECT ON SYS.DBA_CONSTRAINTS TO SUPERMAG WITH GRANT OPTION; GRANT SELECT ON SYS.DBA_JOBS TO SUPERMAG WITH GRANT OPTION; GRANT SELECT ON SYS.DBA_ROLES TO SUPERMAG; GRANT SELECT ON SYS.DBA_TAB_COLUMNS TO SUPERMAG WITH GRANT OPTION; GRANT SELECT ON SYS.DBA_USERS TO SUPERMAG WITH GRANT OPTION; GRANT EXECUTE ON SYS.DBMS_ALERT TO SUPERMAG; GRANT EXECUTE ON SYS.DBMS_LOCK TO SUPERMAG; GRANT EXECUTE ON SYS.DBMS_OUTPUT TO SUPERMAG; GRANT EXECUTE ON SYS.DBMS_PIPE TO SUPERMAG; GRANT SELECT ON SYS.V_$SESSION TO SUPERMAG; GRANT SELECT ON SYS.V_$INSTANCE TO SUPERMAG; GRANT SELECT ON SYS.DBA_JOBS TO SUPERMAG WITH GRANT OPTION; GRANT EXECUTE ON SYS.DBMS_UTILITY TO SUPERMAG WITH GRANT OPTION; GRANT CREATE ANY INDEX TO SUPERMAG; GRANT DROP ANY INDEX TO SUPERMAG; GRANT GLOBAL QUERY REWRITE TO SUPERMAG; GRANT ALTER SYSTEM TO SUPERMAG; GRANT SELECT ON SYS.DBA_USERS TO SUPERMAG_USER; -- если есть роль supermag_user GRANT SUPERMAG_USER TO SUPERMAG; GRANT SUPERMAG_ADMIN TO SUPERMAG; ALTER USER SUPERMAG DEFAULT ROLE SUPERMAG_ADMIN, SUPERMAG_USER; -- Дополнительные гранты, если требуются: GRANT SELECT ANY TABLE TO SUPERMAG; -- использовать с осторожностью -- GRANT SELECT ON DBA_USERS TO PUBLIC; -- не рекомендуется COMMIT;
Примечание: если в вашей системе используется роль
SUPERMAG_USERилиSUPERMAG_ADMIN, предварительно создайте их, либо замените на фактические роли.
Создайте триггер заново (под пользователем SUPERMAG или с явным указанием схемы):
sql
CREATE OR REPLACE TRIGGER SUPERMAG.DBPasswordChange AFTER ALTER ON DATABASE BEGIN IF ora_dict_obj_type='USER' and ora_dict_obj_name is not null and ora_des_encrypted_password is not null THEN SMAddOfficeLog(ora_dict_obj_name, ora_dict_obj_name, '1', 5); END IF; END; /
После импорта многие объекты (процедуры, функции, пакеты) могут стать невалидными. Их необходимо перекомпилировать с помощью скрипта utlrp.sql.
Запустите из серверного SQL*Plus (в рабочей папке, где находится utlrp.sql, например $ORACLE_HOME/rdbms/admin):
text
@$ORACLE_HOME/rdbms/admin/utlrp.sqlПримеры путей:
Oracle 11: @C:\oracle\ora11\RDBMS\ADMIN\utlrp.sql
Oracle 12: @d:\oracle\ORA12\RDBMS\ADMIN\utlrp.sql
Linux: @/u01/app/oracle/product/12.2.0/dbhome_1/rdbms/admin/utlrp.sql
Запускайте скрипт несколько раз, пока в выводе не будет 0 объектов с ошибками (строка OBJECTS WITH ERRORS должна показывать 0). Если остались предупреждения – разбирайтесь с ними отдельно.
Запустите программу Генератор БД и укажите в качестве целевой БД ту, в которую был выполнен импорт (не выбирайте опцию «Новая БД»).
Если ваша версия «Супермаг» предполагает установку сервис‑паков, выполните соответствующие скрипты из поставки.
Проблема: начиная с Oracle 11g, таблицы без данных не имеют сегментов и не экспортируются утилитами exp/imp (Data Pump экспортирует их корректно). После импорта таких таблиц не будет.
Решение (для exp/imp):
Перед экспортом отключите отложенное создание сегментов:
sql
ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE SCOPE=BOTH;Найдите все пустые таблицы схемы SUPERMAG:
sql
SELECT table_name FROM dba_tables WHERE owner='SUPERMAG' AND num_rows=0 AND table_name NOT IN (SELECT segment_name FROM dba_segments WHERE owner='SUPERMAG');
(Также можно сравнить dba_tables и dba_segments.)
Для каждой такой таблицы принудительно выделите экстент:
sql
ALTER TABLE SUPERMAG.имя_таблицы ALLOCATE EXTENT;После этого выполните экспорт – пустые таблицы теперь попадут в дамп.
Альтернативный способ: выполнить ALTER TABLE ... MOVE; для каждой пустой таблицы – это также создаст сегмент.
Для Data Pump эта проблема неактуальна – он экспортирует все таблицы, включая пустые.
Симптомы:IMP-00032: SQL statement exceeded buffer lengthIMP-00008: unrecognized statement in the export file
Причины: часто связаны с несовпадением кодировок (экспорт в UTF8, импорт в CL8MSWIN1251) или слишком малым буфером.
Решение:
Увеличьте параметр buffer при импорте (например, buffer=10000000).
Убедитесь, что переменная NLS_LANG на момент экспорта и импорта одинакова.
Если проблема остаётся, на Metalink есть патчи (Note 278980.1) – примените соответствующий fix.
Симптомы: при запуске imp (особенно в Oracle 12c) появляется сообщение о пропущенной MSVCR100.dll.
Решение: запускайте утилиту с указанием полного пути к исполняемому файлу, например:
text
C:\ORACLE\ORA12\BIN>imp sys/пароль@demo full=y file=C:\Base\demo.dmp log=C:\Base\demo.log buffer=1000000Либо добавьте путь %ORACLE_HOME%\bin в переменную PATH и убедитесь, что библиотеки Visual C++ установлены.
Симптомы: при импорте возникают ошибки вида ORA-01918: user 'OLAPSYS' does not exist или user 'MDSYS' does not exist. Это случается, если целевая БД создана без этих схем (например, при выборочной установке компонентов).
Решение: создайте недостающих пользователей вручную перед импортом. Ниже приведён пример для OLAPSYS (аналогично можно создать MDSYS):
sql
CREATE USER OLAPSYS IDENTIFIED BY qqq DEFAULT TABLESPACE SYSAUX TEMPORARY TABLESPACE TEMP PROFILE DEFAULT PASSWORD EXPIRE ACCOUNT LOCK; GRANT OLAP_DBA TO OLAPSYS; GRANT RESOURCE TO OLAPSYS; ALTER USER OLAPSYS DEFAULT ROLE ALL; GRANT CREATE ANY DIMENSION TO OLAPSYS; GRANT CREATE ANY SYNONYM TO OLAPSYS; GRANT CREATE PROCEDURE TO OLAPSYS; GRANT CREATE PUBLIC SYNONYM TO OLAPSYS; GRANT CREATE SEQUENCE TO OLAPSYS; GRANT CREATE SESSION TO OLAPSYS; GRANT CREATE TABLE TO OLAPSYS; GRANT CREATE VIEW TO OLAPSYS; GRANT DROP ANY DIMENSION TO OLAPSYS; GRANT DROP ANY SYNONYM TO OLAPSYS; GRANT DROP PUBLIC SYNONYM TO OLAPSYS; GRANT SELECT ANY DICTIONARY TO OLAPSYS; GRANT SELECT ANY TABLE TO OLAPSYS; GRANT UNLIMITED TABLESPACE TO OLAPSYS; ALTER USER OLAPSYS QUOTA UNLIMITED ON SYSAUX;
Для MDSYS обычно достаточно создать пользователя и дать необходимые роли (например, CONNECT, RESOURCE).
Симптомы: при импорте возникает ORA-01658: unable to create INITIAL extent for segment in tablespace INDX или другом табличном пространстве.
Решение: включите автоувеличение для файлов данных:
sql
ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\LEGER\INDX01.dbf' AUTOEXTEND ON;Либо увеличьте размер файла вручную.
Если процесс импорта идёт слишком медленно, можно применить следующие настройки (выполнять только во время импорта, после чего вернуть обратно):
Отключить журналирование (скрытый параметр):
sql
ALTER SYSTEM SET "_disable_logging"=TRUE SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP;
После импорта обязательно верните FALSE и перезапустите БД.
Увеличить размеры сортировочных областей и пула потоков:
sql
ALTER SYSTEM SET streams_pool_size=2147483648 SCOPE=SPFILE; ALTER SYSTEM SET sort_area_size=2097152000 SCOPE=SPFILE;
(Значения указаны в байтах – 2 ГБ для каждого параметра. Корректируйте под свои ресурсы.)
Используйте parallel в impdp (см. п. 3.2) – это даёт наибольший прирост производительности.
Заключение: После выполнения всех шагов проверьте целостность данных и работоспособность приложения. Рекомендуется также сделать полный бэкап БД после успешного импорта и настройки.