Инструкция по экспорту и импорту базы данных 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. Общие замечания и подготовка


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

Важно: при экспорте в кодировке 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

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

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

Примеры путей:

Запускайте скрипт несколько раз, пока в выводе не будет 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) или слишком малым буфером.

Решение:


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) – это даёт наибольший прирост производительности.


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