Инструкция по экспорту и импорту базы данных Oracle (для системы «Супермаг»)
Содержание
Общие замечания и подготовка
Экспорт базы данных
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. Ускорение импорта
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):
sqlDROP TRIGGER DBPasswordChange;После импорта триггер будет восстановлен (см. п. 4.2).
Настройка NLS_LANG. Для корректной работы с кодировкой (обычно CL8MSWIN1251) перед запуском
exp/impзадайте переменную окружения:
textset 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.logfull=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=5000000buffer– размер буфера в байтах. Увеличение (например, до 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.log4. Действия после импорта
Сразу после завершения импорта выполните следующие шаги (все команды выполняются в 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.sqlOracle 12:
@d:\oracle\ORA12\RDBMS\ADMIN\utlrp.sqlLinux:
@/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):
Перед экспортом отключите отложенное создание сегментов:
sqlALTER SYSTEM SET DEFERRED_SEGMENT_CREATION=FALSE SCOPE=BOTH;Найдите все пустые таблицы схемы
SUPERMAG:
sqlSELECT 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.)Для каждой такой таблицы принудительно выделите экстент:
sqlALTER TABLE SUPERMAG.имя_таблицы ALLOCATE EXTENT;После этого выполните экспорт – пустые таблицы теперь попадут в дамп.
Альтернативный способ: выполнить
ALTER TABLE ... MOVE;для каждой пустой таблицы – это также создаст сегмент.
Для Data Pump эта проблема неактуальна – он экспортирует все таблицы, включая пустые.
5.2. Ошибка IMP‑00032 / IMP‑00008
Симптомы: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.
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. Ускорение импорта
Если процесс импорта идёт слишком медленно, можно применить следующие настройки (выполнять только во время импорта, после чего вернуть обратно):
Отключить журналирование (скрытый параметр):
sqlALTER SYSTEM SET "_disable_logging"=TRUE SCOPE=SPFILE; SHUTDOWN IMMEDIATE; STARTUP;
После импорта обязательно верните
FALSEи перезапустите БД.Увеличить размеры сортировочных областей и пула потоков:
sqlALTER SYSTEM SET streams_pool_size=2147483648 SCOPE=SPFILE; ALTER SYSTEM SET sort_area_size=2097152000 SCOPE=SPFILE;
(Значения указаны в байтах – 2 ГБ для каждого параметра. Корректируйте под свои ресурсы.)
Используйте
parallelвimpdp(см. п. 3.2) – это даёт наибольший прирост производительности.
Заключение: После выполнения всех шагов проверьте целостность данных и работоспособность приложения. Рекомендуется также сделать полный бэкап БД после успешного импорта и настройки.