Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление
minLevel2

Информация

Проверялось на версии Orcale 12, 19.

Ввиду того, что опыта подобной миграции не имею, не исключены ошибки.

Пожалуйста по возможности проконсультируйтесь со специалистом по БД Oracle.

И при необходимости внесите изменения в сценарий выполнения и прилагаемые скрипты.


Предупреждение

Ниже приведены примеры команд и скриптов, конечный синтаксис будет отличаться.

Перед выполнением нужно внести соответствующие изменения описывающие параметры подключения и другие атрибуты базы данных и ее состава данных.


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

Исходная БД должна иметь кодировку CL8MSWIN1251

Получаем дамп БД (только данные). 

Опции указанные в команде, четко указывают на то, что снимается не полный дамп, а только данные схемы supermag

create or replace directory dir as 'C:\BASE';

expdp system/qqq@sbis58 directory=dir schemas=supermag content=DATA_ONLY dumpfile=supermag.dmp logfile=supermag.log


Получаем дамп БД (только метаданные).

...

Опции указанные в команде, четко указывают на то, что снимается не полный дамп, а только экспортировали дамп с метаданными пользователей, ролей и привилегий.

...

(Вариант №1)

Можно использовать, если количество пользователей в БД - небольшое. В противном случае, получившееся значение не уместится в скрипте.

Установить кодовую страницу таким образом, чтобы русские имена пользователя выводились в читаемом виде.


set nls_lang=russian_cis.ru8pc866
или так:
chcp 65001
set NLS_LANG=AMERICAN_AMERICA.AL32UTF8
sqlplus

...

system/qqq@sbis58

SET

...

PAGESIZE

...

0

...

FEEDBACK

...

OFF

...

VERIFY

...

OFF

...

HEADING

...

OFF

...

LINESIZE

...

1000
SELECT

...

'INCLUDE=USER:"IN

...

('''

...

||

...

LISTAGG(username,

...

''',

...

''')

...

WITHIN

...

GROUP

...

(ORDER

...

BY

...

username)

...

||

...

''')"'
FROM

...

dba_users
WHERE

...

username

...

NOT

...

IN

...

('SYS','SYSTEM','ORACLE_OCM','DBSNMP','OUTLN','XDB','APPQOSSYS')
 

...

AND

...

username

...

LIKE

...

'%'

...

--

...

сюда

...

можно

...

добавить

...

условие,

...

например,

...

для

...

имён

...

с

...

кириллицей
/

Скрипт

...

вернет

...

список

...

пользователей:

INCLUDE=USER:"IN

...

('ANONYMOUS',

...

'AUDSYS',

...

'DBSFWUSER',

...

'DIP',

...

'GGSYS',

...

'GSMADMIN_INTERNAL',

...

'GSMCATUSER',

...

'GSMUSER',

...

'REMOTE_SCHEDULER_AGENT',

...

'SUPERMAG',

...

'SUPERMAG_SYS',

...

'SYS$UMF',

...

'SYSBACKUP',

...

'SYSDG',

...

'SYSKM',

...

'SYSRAC',

...

'WMSYS',

...

'XS$NULL',

...

'ИВАНОВ',

...

'ПЕТРОВ',

...

'СИДОРОВ')"

Создать

...

файл:

...

export.par
Опции указанные в команде, четко указывают на то, что снимается не полный дамп, а только экспортировали дамп с метаданными пользователей, ролей и привилегий.

FULL=Y
CONTENT=METADATA_ONLY
INCLUDE=USER:"IN ('ANONYMOUS', 'AUDSYS', 'DBSFWUSER', 'DIP', 'GGSYS', 'GSMADMIN_INTERNAL', 'GSMCATUSER', 'GSMUSER', 'REMOTE_SCHEDULER_AGENT', 'SUPERMAG', 'SUPERMAG_SYS', 'SYS$UMF', 'SYSBACKUP', 'SYSDG', 'SYSKM', 'SYSRAC', 'WMSYS', 'XS$NULL', 'ИВАНОВ', 'ПЕТРОВ', 'СИДОРОВ')"
INCLUDE=ROLE
INCLUDE=ROLE_GRANT
INCLUDE=SYSTEM_GRANT
INCLUDE=OBJECT_GRANT
INCLUDE=DEFAULT_ROLE
INCLUDE=TABLESPACE_QUOTA
INCLUDE=PROFILE
DIRECTORY=dir
DUMPFILE=supermag_metadata.dmp
LOGFILE=supermag_metadata.log
VERSION=19.0

где,

...

строка

...

INCLUDE=USER:...

...

повторяет

...

результат

...

выше

...

выполненного

...

скрипта.

Image Modified

Пример

...

файла

...

-

...

export.par

Произвести

...

экспорт

...

данных:
expdp

...

system/qqq@sbis58

...

PARFILE=C:\export.par

Получаем дамп БД (только метаданные). (Вариант №2)

Создать файл: export2.par
Опции указанные в команде, четко указывают на то, что снимается не полный дамп, а только экспортировали дамп с метаданными пользователей, ролей и привилегий.


DIRECTORY=dir
DUMPFILE=users_and_roles_only.dmp
LOGFILE=export_users.log
FULL=Y
CONTENT=METADATA_ONLY
EXCLUDE=SCHEMA:"='SYS'"
EXCLUDE=SCHEMA:"='SYSTEM'"
EXCLUDE=SCHEMA:"='ORACLE_OCM'"
EXCLUDE=SCHEMA:"='DBSNMP'"
EXCLUDE=SCHEMA:"='OUTLN'"
EXCLUDE=SCHEMA:"='XDB'"
EXCLUDE=SCHEMA:"='APPQOSSYS'"


Произвести экспорт данных:
expdp system/qqq@sbis58 PARFILE=C:\export2.par


Подготовка БД для импорта.

Создание новой БД. 

Обязательно, при создании выбрать (указать):

  • кодировка AL32UTF8 
  • установить параметр: NLS_LENGTH_SEMANTICS = CHAR  
  • установить параметр: MAX_STRING_SIZE = EXTENDED

После создания БД. Необходимо синхронизировать перечень табличных пространств между созданной и экспортируемой базой. Чаще всего нужно будет завести недостающие пространства, и файлы для них. Например, табличное пространство INDX и его файлы.

Размер файлов табличных пространств, и их количество указываются таким образом, чтобы данные которые мы будем загружать - уместились.

Инициализация БД.

Провести инициализацию БД с помощью программы "Модуль генерации БД".

Вариант инициализации - подчиненная база, без заполнения начальными данными. (3-й пункт меню).

Отключение триггеров и ограничений.

Можно использовать скрипты, которые выполнят данную операцию. Но, автору данной инструкции удобнее использовать программу TOAD. В которой для схемы supermag - отбираются (поочередно) все ограничения и триггеры - и производится их отключение.


Информация

Скрипт для отключения всех включённых ограничений в схеме supermag. Он отключает ограничения в безопасном порядке: сначала внешние ключи (чтобы не зависеть от родительских ограничений), затем первичные/уникальные ключи, потом проверочные.


sql


SET
SERVEROUTPUT ON;
DECLARE v_sql VARCHAR2(4000); BEGIN FOR c IN (SELECT table_name, constraint_name, constraint_type FROM user_constraints WHERE status = 'ENABLED' ORDER BY CASE constraint_type WHEN 'R' THEN 1 -- сначала внешние ключи WHEN 'P' THEN 2 -- затем первичные WHEN 'U' THEN 3 -- уникальные WHEN 'C' THEN 4 -- проверочные ELSE 5 END) LOOP BEGIN v_sql := 'ALTER TABLE "' || c.table_name || '" DISABLE CONSTRAINT "' || c.constraint_name || '"'; EXECUTE IMMEDIATE v_sql; DBMS_OUTPUT.PUT_LINE('Отключено ограничение: ' || c.constraint_name || ' на таблице ' || c.table_name); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Ошибка отключения ' || c.constraint_name || ': ' || SQLERRM); END; END LOOP; END; /

Что делает скрипт:

  • Находит все включённые (status = 'ENABLED') ограничения в текущей схеме.

  • Отключает их в порядке: внешние ключи → первичные ключи → уникальные ограничения → проверочные. Это позволяет избежать ошибок из-за зависимостей (например, отключение первичного ключа, на который ссылается включённый внешний ключ, невозможно; сначала нужно отключить внешний ключ).

  • Выполняет ALTER TABLE ... DISABLE CONSTRAINT ... без дополнительных параметров.

  • Выводит результат или ошибку.

 

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

create or replace directory dir as 'C:\BASE';

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

Опции указанные в команде, четко указывают на то, что ,будет загружен не полный дамп, а только данные таблиц.

impdp system/qqq@sbis58 directory=dir schemas=supermag content=DATA_ONLY dumpfile=supermag.dmp logfile=supermag_import.log   table_exists_action=TRUNCATE

Импорт метаданных.

Опции указанные в команде, четко указывают на то, что ,будет загружен не полный дамп, а только метаданные.

impdp system/qqq@ORAUNI4 DIRECTORY=dir DUMPFILE=supermag_metadata.dmp LOGFILE=import.log FULL=Y CONTENT=METADATA_ONLY

Скрипты выдачи прав.

Выполнить скрипты выдачи прав.

Не уверен, что это необходимый список, возможно он избыточен.

Но, на практике - решение работоспособно. Хотя возможно предоставляет прав больше, чем требуется.


  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;

...

Перекомпиляция процедур и функций.

Желательно выполнить несколько раз. (3-5 раз).

@c:\oracle\ORA12\RDBMS\ADMIN\utlrp.sql;

Активация триггеров и ограничений.

Можно использовать скрипты, которые выполнят данную операцию. Но, автору данной инструкции удобнее использовать программу TOAD. В которой для схемы supermag - отбираются (поочередно) все ограничения и триггеры - и производится их активация (включение).


Информация

Ниже представлен PL/SQL-скрипт для включения всех отключённых ограничений в схеме supermag (Oracle 19) без проверки уже существующих данных (опция ENABLE NOVALIDATE).

Скрипт предполагает выполнение от имени владельца схемы supermag. Если вы подключаетесь под другим пользователем, замените user_constraints на all_constraints с фильтром по owner = 'SUPERMAG'.


sql


SET SERVEROUTPUT ON;
DECLARE
   v_sql VARCHAR2(4000);
BEGIN
   FOR c IN (SELECT table_name, constraint_name, constraint_type
             FROM user_constraints 
             WHERE status = 'DISABLED'
             ORDER BY CASE constraint_type 
                        WHEN 'P' THEN 1   -- первичные ключи
                        WHEN 'U' THEN 2   -- уникальные
                        WHEN 'R' THEN 3   -- внешние ключи
                        WHEN 'C' THEN 4   -- проверочные
                        ELSE 5
                      END)
   LOOP
      BEGIN
         v_sql := 'ALTER TABLE "' || c.table_name || '" ENABLE NOVALIDATE CONSTRAINT "' || c.constraint_name || '"';
         EXECUTE IMMEDIATE v_sql;
         DBMS_OUTPUT.PUT_LINE('Включено ограничение: ' || c.constraint_name || ' на таблице ' || c.table_name);
      EXCEPTION
         WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('Ошибка включения ' || c.constraint_name || ': ' || SQLERRM);
      END;
   END LOOP;
END;
/

Промышленная эксплуатация.

Можно перейти к тестовой эксплуатации. После чего принять решение о начале продуктивной работы.


Что делает скрипт:

  • Находит все отключённые (status = 'DISABLED') ограничения в текущей схеме.

  • Упорядочивает их по типу: сначала первичные и уникальные ключи, затем внешние, затем проверочные. Это позволяет избежать ошибок при включении внешних ключей (для них необходимо, чтобы родительский ключ уже был активен).

  • Для каждого ограничения выполняет ALTER TABLE ... ENABLE NOVALIDATE CONSTRAINT ..., что включает констрейнт без проверки соответствия существующих данных.

  • Выводит в консоль результат (успех или ошибку).

Важные замечания:

  • ENABLE NOVALIDATE гарантирует, что все новые операции DML будут проверяться ограничением, а старые данные остаются нетронутыми (даже если они нарушают ограничение). Вы указали, что данные заведомо корректны, поэтому никаких проблем не возникнет.

  • Для первичных и уникальных ключей при включении будет создан уникальный индекс (если он был удалён при предыдущем отключении). Поскольку данные уникальны, операция пройдёт успешно.

  • Если какой-то внешний ключ ссылается на ограничение в другой схеме или таблице, убедитесь, что родительское ограничение уже активно (наш порядок включения минимизирует риск, но при кросс-схемных ссылках может потребоваться отдельная обработка).

  • Скрипт не требует дополнительных привилегий, если выполняется от владельца схемы.

 

Промышленная эксплуатация.

Начинаем этап опытно-промышленную эксплуатацию. Затем можно принять решение о запуске в штатном режиме.


Image Added


Дополнение инструкции не исключается, все зависит от дополнительных проверок и опытной экплуатцииэксплуатции....