Инструкция по экспорту и импорту базы данных Oracle (для системы «Супермаг»)

Содержание

  1. Общие замечания и подготовка

  2. Экспорт базы данных
    2.1. Классический экспорт (exp)
    2.2. Экспорт с помощью Data Pump (expdp)

  3. Импорт базы данных
    3.1. Классический импорт (imp)
    3.2. Импорт с помощью Data Pump (impdp)

  4. Действия после импорта
    4.1. Выдача привилегий пользователю SUPERMAG
    4.2. Восстановление триггера DBPasswordChange
    4.3. Перекомпиляция объектов
    4.4. Запуск Генератора БД и установка сервис‑паков

  5. Решение типовых проблем
    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. Ускорение импорта


1. Общие замечания и подготовка

  • Версия 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)


2. Экспорт базы данных

2.1. Классический экспорт (exp)

Используйте утилиту 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.log
  • full=y – полный экспорт всей БД.

  • file – путь к файлу дампа.

  • log – файл журнала (необязательно, но рекомендуется).

Важно: при экспорте в кодировке UTF8 могут возникнуть ошибки при импорте (см. п. 5.2). Рекомендуется использовать единую кодировку CL8MSWIN1251.


2.2. Экспорт с помощью Data Pump (expdp)

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 – число потоков (обычно равно числу ядер).


3. Импорт базы данных

Важно: импорт выполняется в пустую базу данных, которая не инициализирована Генератором БД СМ2000. База должна быть создана, но без схемы SUPERMAG или с чистой схемой.

3.1. Классический импорт (imp)

Если вы снимали дамп через 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=5000000
  • buffer – размер буфера в байтах. Увеличение (например, до 5 000 000) помогает избежать ошибки IMP-00032.

  • Для Linux команда аналогична (пути указываются в формате /home/oracle/...).


3.2. Импорт с помощью Data Pump (impdp)

Для дампов, созданных через 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

4. Действия после импорта

Сразу после завершения импорта выполните следующие шаги (все команды выполняются в SQL*Plus под пользователем SYS как SYSDBA).

4.1. Выдача привилегий пользователю SUPERMAG

Подключитесь:
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, предварительно создайте их, либо замените на фактические роли.

4.2. Восстановление триггера DBPasswordChange

Создайте триггер заново (под пользователем 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;
/

4.3. Перекомпиляция объектов

После импорта многие объекты (процедуры, функции, пакеты) могут стать невалидными. Их необходимо перекомпилировать с помощью скрипта 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). Если остались предупреждения – разбирайтесь с ними отдельно.

4.4. Запуск Генератора БД и установка сервис‑паков

  • Запустите программу Генератор БД и укажите в качестве целевой БД ту, в которую был выполнен импорт (не выбирайте опцию «Новая БД»).

  • Если ваша версия «Супермаг» предполагает установку сервис‑паков, выполните соответствующие скрипты из поставки.


5. Решение типовых проблем

5.1. Пустые таблицы не попадают в дамп (deferred segment creation)

Проблема: начиная с Oracle 11g, таблицы без данных не имеют сегментов и не экспортируются утилитами exp/imp (Data Pump экспортирует их корректно). После импорта таких таблиц не будет.

Решение (для exp/imp):

  1. Перед экспортом отключите отложенное создание сегментов:
    sql

    ALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE SCOPE=BOTH;
  2. Найдите все пустые таблицы схемы 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.)

  3. Для каждой такой таблицы принудительно выделите экстент:
    sql

    ALTER TABLE SUPERMAG.имя_таблицы ALLOCATE EXTENT;
  4. После этого выполните экспорт – пустые таблицы теперь попадут в дамп.

    Альтернативный способ: выполнить ALTER TABLE ... MOVE; для каждой пустой таблицы – это также создаст сегмент.

Для Data Pump эта проблема неактуальна – он экспортирует все таблицы, включая пустые.


5.2. Ошибка IMP‑00032 / IMP‑00008

Симптомы:
IMP-00032: SQL statement exceeded buffer length
IMP-00008: unrecognized statement in the export file

Причины: часто связаны с несовпадением кодировок (экспорт в UTF8, импорт в CL8MSWIN1251) или слишком малым буфером.

Решение:

  • Увеличьте параметр buffer при импорте (например, buffer=10000000).

  • Убедитесь, что переменная NLS_LANG на момент экспорта и импорта одинакова.

  • Если проблема остаётся, на Metalink есть патчи (Note 278980.1) – примените соответствующий fix.


5.3. Ошибка MSVCR100.dll не найдена

Симптомы: при запуске 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++ установлены.


5.4. Отсутствуют системные пользователи (OLAPSYS, MDSYS)

Симптомы: при импорте возникают ошибки вида 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).


5.5. Ошибка нехватки места в табличном пространстве (ORA‑01658)

Симптомы: при импорте возникает ORA-01658: unable to create INITIAL extent for segment in tablespace INDX или другом табличном пространстве.

Решение: включите автоувеличение для файлов данных:
sql

ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\LEGER\INDX01.dbf' AUTOEXTEND ON;

Либо увеличьте размер файла вручную.


5.6. Ускорение импорта

Если процесс импорта идёт слишком медленно, можно применить следующие настройки (выполнять только во время импорта, после чего вернуть обратно):

  1. Отключить журналирование (скрытый параметр):
    sql

    ALTER SYSTEM SET "_disable_logging"=TRUE SCOPE=SPFILE;
    SHUTDOWN IMMEDIATE;
    STARTUP;

    После импорта обязательно верните FALSE и перезапустите БД.

  2. Увеличить размеры сортировочных областей и пула потоков:
    sql

    ALTER SYSTEM SET streams_pool_size=2147483648 SCOPE=SPFILE;
    ALTER SYSTEM SET sort_area_size=2097152000 SCOPE=SPFILE;

    (Значения указаны в байтах – 2 ГБ для каждого параметра. Корректируйте под свои ресурсы.)

  3. Используйте parallel в impdp (см. п. 3.2) – это даёт наибольший прирост производительности.


Заключение: После выполнения всех шагов проверьте целостность данных и работоспособность приложения. Рекомендуется также сделать полный бэкап БД после успешного импорта и настройки.

  • Нет меток