This article is in English Working with the DB Dumps
Для работы с дампами БД следует пользоваться специальным скриптом dump.sh
, который располагается, как правило, в директории /opt/hydra/oracle/scripts
. Скрипт обязательно следует вызвать под пользователем oracle с инициализированным окружением. Инициализировать окружение для пользователя oracle с помощью sudo можно выполнить следующим образом:
sudo -u oracle -i
У скрипта для работы с дампами БД существуют следующие варианты запуска:
- export — снятие дампа. Дамп снимается в директорию для дампов, установленную в БД (как правило, это
/var/oradata/dumps
). - drop — очистка. Перед очисткой следует обязательно убедиться, что БД не является промышленной.
- import — загрузка дампа в БД. Перед загрузкой дампа обязательно следует выполнить очистку. Дамп поднимается из директории для дампов, установленной в БД (как правило, это
/var/oradata/dumps
). После импортирования флаг «Признак промышленной базы данных» сбрасывается.
Дополнительные параметры вызова скрипта:
- -i — название БД
- -o — название схемы
- -p — пароль пользователя AIS_NET
- -f — название дампа (файла с дампом)
- -s — отказ от предупреждающего сообщения при очистке БД
Пример вызова скрипта для переноса дампа БД с hydra на hydra2:
Снятие дампа с hydra:
/opt/hydra/oracle/scripts/dump.sh -i hydra -p password -f hydra_dump export
Очистка hydra2:
/opt/hydra/oracle/scripts/dump.sh -i hydra2 -p password drop
Поднятие дампа на hydra2:
/opt/hydra/oracle/scripts/dump.sh -i hydra2 -p password -f hydra_dump import
Во время импорта дампа в новую базу возможны ошибки следующего вида:
Failing sql is: GRANT SELECT ON "AIS_NET"."SR_V_GOOD_SERVS" TO "NET_GOODS" ORA-39083: Object type OBJECT_GRANT failed to create with error: ORA-01917: user or role 'NET_GOODS' does not exist
Эти ошибки не являются критичными, т.к. скрипт экспорта выгружает только схему AIS_NET. Отсутствующие роли создаются в БД отдельным скриптом в завершающей части импорта.
Примечание
Так как процедура снятия резервных копий с помощью утилиты expdp (скрипт dump.sh
) является достаточно ресурсоемкой, снимать резервные копии БД рекомендуется в ночное время в часы наименьшей нагрузки на сервер (как правило, с 2-х до 4-х часов ночи).
Примечание 2
При выполнении любого drop (даже отдельных схем) все открытые соединения с базой будут принудительно завершены
Примечание 3
После выполнения поднятия дампа необходимо проверить лог импорта (файл с суффиксом _impdp.log в каталоге с дампом) на наличие ошибок
Отменить процесс экспорта/импорта дампа можно с помощью CTRL-C
и команды kill_job
:
... . . exported "AIS_NET"."SS_JOB_LOGS" 635.2 MB 1550063 rows . . exported "AIS_NET"."SD_PROCESSING_REQUESTS_T" 563.8 MB 7204 rows . . exported "AIS_NET"."SD_MV_DOCUMENTS" 479.7 MB 3247473 rows ^C Export> kill_job Are you sure you wish to stop this job ([yes]/no): yes
Возможная ошибка при импорте дампа
Импорт дампа может завершиться следующей ошибкой:
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options SP2-0734: unknown command beginning "-- ======..." - rest of line ignored. DECLARE * ERROR at line 1: ORA-04063: package body "AIS_NET.SS_IMP_DUMP_PKG" has errors ORA-06508: PL/SQL: could not find program unit being called: "AIS_NET.SS_IMP_DUMP_PKG" ORA-06512: at line 3 ORA-06512: at line 16 Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options
В таком случае необходимо проверить выполнилась ли первая часть импорта, а именно: impdp. Если с этим все хорошо, то скорее всего проблема с синонимами в исходных пакетах.
Проверить это можно в net_Imp_Dump.sql той версии Гидры, дамп которой импортировался. Проблемная часть может выглядеть следующим образом:
PROCEDURE RESET_JOB_STATES IS BEGIN UPDATE SS_JOBS SET N_JOB_STATE_ID = CONST.JOB_STATE_Waiting WHERE N_JOB_STATE_ID IN (CONST.JOB_STATE_Running, CONST.JOB_STATE_ToStart) AND C_FL_TEMPLATE = 'N' AND C_ACTIVE = 'Y'; END RESET_JOB_STATES;
Ее необходимо исправить следующим образом (Заменить CONST на SS_CONTSTANTS_PKG_S)
PROCEDURE RESET_JOB_STATES IS BEGIN UPDATE SS_JOBS SET N_JOB_STATE_ID = SS_CONTSTANTS_PKG_S.JOB_STATE_Waiting WHERE N_JOB_STATE_ID IN (SS_CONTSTANTS_PKG_S.JOB_STATE_Running, SS_CONTSTANTS_PKG_S.JOB_STATE_ToStart) AND C_FL_TEMPLATE = 'N' AND C_ACTIVE = 'Y'; END RESET_JOB_STATES;
После этого прогоняем исправленный пакет на БД, на которой импортировался дамп. Сделать это можно прогнав этот пакет в SQL Developer, или создав файл net_Imp_Dump.sql с исправленным скриптом, после чего прогнать его под Oracle:
#Использовать вместо hydra2 наименование того инстанса, на котором импортировался дамп sudo -u oracle -i sqlplus ais_net@hydra2 @net_Imp_Dump.sql
После этого осталось завершить работу используемого ранее dump.sh, для этого необходимо прогнать следующе SQL скрипты:
#Использовать вместо hydra2 наименование того инстанса, на котором импортировался дамп sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Alter_Dump.sql; sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Activate_After_Logon_Trigger.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Remove_Job_Queue_Processes.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/ReInit_Consts.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Setup_Grants.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Unset_Prom_DB_Flag.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Drop_Deny_Logon_Trigger.sql sudo -u oracle -i sqlplus ais_net@hydra2 @/opt/hydra/oracle/sql/Activate_Before_DDL_Trigger.sql
Ранее эта проблема возникала в AIS-3790 и AIS-6293, на проверку этого пакета создана внутренняя заявка: - AIS-8010Getting issue details... STATUS