Добрый день!

Подскажите, пожалуйста, как можно из дампа БД Oracle восстановить одну таблицу? Команда imp tables="tbl_TaskGroup" не проходит, говорит что таблица TBL_TASKGROUP не найдена. Я понимаю что Оракл криво работает с объектами в названии которых присутствуют не только прописные буквы. Но как есть, так есть. Есть ли выход из сложившейся ситуации кроме полного импорта?

Нравится

4 комментария

Попробуйте взять в скобки
imp tables=("tbl_TaskGroup")

К сожалению, не помогло. Еще есть варианты?

Есть решение.
Попробуйте это :wink:
imp tables=\"\""\""tbl_TaskGroup\""\""\""

Мощно! Спасибо, помогло. Один и два раза \" использовать пытался

Показать все комментарии

Добрый день, участники сообщества!
По многочисленным просьбам сегодня я расскажу как можно создать и поднять бэкап Terrasoft на СУБД Oracle.
Сделать это очень просто, все делается автоматически -- нужно лишь  запустить командный файл и ввести названия базы данных.

Создание бэкапа

  1. Распаковываем содержимое архива Backup.zip на сервер, где установлен сервер Oracle.
  2. Запускаем BackupDatabase.cmd.
  3. Указываем: название схемы, ее пароль (схемы-пользователя) и название файла дампа базы.
  4. В результате получаем два файла: Grant.sql -- скрипт по созданию розданных прав и собственно сам дамп базы Oracle.

Поднятие бэкапа

  1. Распаковываем содержимое архива Restore.zip на сервер, где установлен сервер Oracle.
  2. Сюда же обязательно подкладываем два файла (Grant.sql и дамп), которые были созданы при создании бэкапа.
  3. Запускаем RestoreDatabase.cmd.
  4. Указываем: пароль пользователя SYS, название файла дампа базы (backup db file name), старое название схемы с которой делался дамп (old user schema), название новой схемы (new user schema) и пароль пользователя новой схемы (new user password).
  5. Дальше все выполнится автоматически: создастся новая схема, раздадутся нужные права, создадутся нужные типы,  подымется бэкап базы под указанной схемой, заменятся завязки объектов в системных таблицах Terrasoft на новые, раздадутся нужные права ролям на таблицы и представления.
     

В инсталляции Terrasoft уже идут в комплекте похожие скрипты, но там все завязано на то, что база создавалась со схемы TSAUTOBUILD. Мои скрипты дополнительно запрашивают название старой схемы.

  Описал коротко, только самое нужное. Если будут вопросы - с удовольствием отвечу.

Отмечу, что выложенную информацию необходимо рассматривать как пример, который каждый можете менять под свои потребности. Эти скрипты применимы для Oracle установленного на ОС Windows и запуск командного файла нужно производить на самом сервере. Для всех остальных вариантов (другая ОС, запуск с клиентской машины) можете дописать сами.

Ключевым моментом при создании бекапа является скрипт Grant.sql (см. Backup.zip), который создает "слепок" розданных прав для модели, которая применена в Terrasoft CRM.

UPD: Спасибо Саше Котенко за найденный недочет в файле BackupDatabase.cmd. Исправил.

Нравится

Поделиться

13 комментариев

Большое спасибо, Саша.

Саша, спасибо за удобный инструмент! С твоего позволения беру в эксплуатацию!
И да +1 :wink:

Саша, огромное спасибо! Данная инструкция и материал очень помогут всем, кто сталкивается с Oracle-версией продукта.

Указывайте пожалуйста требования к использованию скриптов.
Здесь:
1. скрипт для Windows (чаще для поддержки Oracle используются другие ОС),
2. вне скрипта определена переменная среды ORACLE_SID.
Согласно документации рекомендованно:
1. формат авторизации sqlplus из командной строки (например BackupDatabase.cmd строка 12) определяется как sqlplus login/password@sid, а в Вашем случае (без указания сида) получим ERROR: ORA-12560: TNS:ошибка адаптера протокола
2. Использование команды без логирования тоже не лучший вариант.

ihmo статья скорее вредна, очень удивили оставленные комментарии :(

to alexk
Ничего удивительного в этом нет. Для кого-то информация полезна, например для тех, кто не часто сталкивается с Oracle. А для того, кто имеет больше опыта работы с Oracle, что-то может показаться очевидным. В любом случае, спасибо за комментарии. Внесем необходимые корректировки.

Здравствуйте.У меня возник вопрос.Мне предстоит установить сервер Terrasoft и интегрировать террасофт в существующую структуру.но никогда не работал с базой даннх оракл.
Как я понимаю пункт 1 надо делать, если существует старая база данных?Или как? В руководстве описано по другому.Но в руководстве как я понял предполагается что сервер базы данных оракл и сервер террасофт это один физический компьютер.А мне надо разнести их по разным ролям.в руководстве написано:
Для восстановления БД на сервере необходимо:
1. Запустить файл RestoreDatabase.cmd, который находится в
директории \DB>, нажав
на клавишу [Enter].
Какой сервер иммется ввиду?Наверно сервер баз данных оракл?Но там этого пути не будет если сам софт будет стоять отдельно!Помогите разобраться пожалуйста!

Здравствуйте.

Такого понятия как "сервер Террасофт" - не существует. Вы устанавливаете БД Oracle на машине, которую назначите в роли сервера БД. Далее Вы устанвливаете клиентские приложения Террасофт и соединение с БД соглагласно руководству.

Terrasoft Support Team.

Есть ли изменения в инструкции(по созданию/поднятию бекапа) для версий 3.4.0+ ?

Немного подкорректировал скрипт SysGrants.sql из инструментария восстановления бекапа версии 3.3.2.

Ранее там было указано:

GRANT SELECT ON TSAUTOBUILD.TS_CONS_COLUMNS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_CONSTRAINTS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_IND_COLUMNS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_INDEXES TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_TAB_COLS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_TAB_COLUMNS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_TABLES TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_TRIGGERS TO PUBLIC;
GRANT SELECT ON TSAUTOBUILD.TS_VIEWS TO PUBLIC;

В результате чего приходилось вручную заменять TSAUTOBUILD на имя вашей схемы, откуда происходил экспорт. Теперь это название будет автоматически подтягивать имя из введенной вами информации при запуске RestoreDatabase.cmd.

Исправленный restore_3_3_2.zip обновлен.

Клиенты часто спрашивают, почему при поднятии резервной копии Oracle выдает предупреждения, а также почему некоторые объекты после импорта в невалидном состоянии.

Попытаюсь ответить на эти вопросы.

Тип объекта "SCHEMA_NAME"."t_FieldInfo" уже существует с другим идентификатором

В нашей системе используются объектные типы БД Oracle, OBJECT TYPE.

Дело в том, что Oracle жестко связывает объектные типы с их идентификаторами, OID.

При этом если на сервере был однажды восстановлен бекап схемы Terrasoft, там создадутся все используемые типы ("t_GetLoginInfo", "tbl_GetLoginInfo" и др.).
Но из-за жесткой привязки к OID, эти типы создадутся с OID, который прописан в дампе.

Первый раз все будет нормально. Но при поднятии того же, либо другого бекапа схемы Terrasoft на том же сервере, он опять будет создавать типы с теми же OID – в результате возникнет ошибка: объект с таким OID уже существует. В результате после поднятия бекапа ни один из типов не создастся.

Из-за этой особенности Oracle, мы сделали в скриптах поднятия наших схем обходное решение:

  1. Перед поднятием бекапа скриптом CreateTypes.sql явно создаются все необходимые типы, при создании Oracle сгенерирует им новые OID.
  2. При поднятии Oracle пытается создать типы из бекапа c их старыми OID, при этом выдается ошибка IMP-00061: Внимание: Тип объекта "Схема"."Тип" уже существует с другим идентификатором

При возникновении такой ошибки, создание типа пропускается.

Но в нашем случае это не является ошибкой, т.к. это сделано специально в качестве обходного решения. Все необходимые объектные типы создадутся нашим скриптом непосредственно перед поднятием бекапа.

Подробнее об этом в документации Oracle.

После поднятия бекапа некоторые объекты невалидны

Это также не является ошибкой, а просто предупреждением.

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

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

Переходим от теории к практике. В нашей системе у многих таблиц есть строчный триггер BEFORE INSERT OR UPDATE, например такой:

CREATE OR REPLACE TRIGGER "tr_tbl_Activity_BI"
BEFORE INSERT ON "tbl_Activity" REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
BEGIN
  IF (:NEW."ID" IS NULL) THEN
    :NEW."ID" := "fn_CreateGUID"();
  END IF;
END "tr_tbl_Activity_BI";
/

Как видим по коду, этот триггер вызывает функцию fn_CreateGUID, которой на момент переноса триггера просто нет. Она создастся позже, со всеми остальными ХП. Из-за этого триггер остается невалидным.

Но это абсолютно нормальная ситуация. Дело в том, что любой объект БД Oracle, находящийся в невалидном состоянии будет автоматически скомпилирован СУБД "на лету", при первом обращении кнему. В этот момент уже будут доступны и валидны все зависимые объекты (ХП, Типы и т.д.) и триггер скомпилируется корректно и станет валидным.
Подробнее об этом в документации Oracle.

Система администрирования Oracle в версии 341 существенно изменилась. В связи с этим, изменился также и механизм создания и восстановления резервных копий.

Что изменилось в новых скриптах работы с бекапами для 341

  • Появилась возможность указывать инстанс Oracle для разворачивания бекапа
  • Можно указать отдельное табличное пространство для разворачивания схемы
  • Исправлена ситуация с экспортом пустых таблиц (Oracle 11)

В новой системе администрирования практически все права пользователю назначаются через роли. Поэтому при восстановлении резервной копии появилось 3 опции - режимы переноса прав пользователей. Остановлюсь на этом более подробно.

Опция № 0 - Перепривязать пользователей в новую схему (по умолчанию)

При этом все пользователи Terrasoft, создадутся и им будут розданы и назначены по-умолчанию роли для доступа к новой схеме (к той которую вы разворачиваете). У пользователей автоматически заберется доступ на старую схему. Этот вариант подходит для первоначального поднятия бекапа на новом инстансе либо для перенос боевой схемы в новую схему.

Опция № 1 - Создать пользователей с перименованием

Этот вариант предполагает, что все пользователи Terrasoft будут созданы как новые пользователи Oracle c префиксами 'U' и им будет розданы все соответствующие права. Например в старой схеме был пользователь User1, после поднятия резервной копии новый пользователь будет User1U. Таким образом старый пользователь User1 будет продолжать нормально работать со старой схемой, а новый будет иметь все те же права в отношении новой схемы на одном инстансе. Этот вариант удобен при поднятии тестовой схемы на том же инстансе, где уже работает боевая схема. При этом пользователи будут абсолютно независимы.

Опция № 2 - Не создавать пользователей

В этом случае, при восстановлении резервной копии создастся только пользователь-схема Terrasoft. Ему назначаются права администратора Terrasoft и под ним нужно зайти для самостоятельного заведения нужных пользователей и заказа лицензий для них.

И самое главное, скрипты в прикрепленном архиве.

А кто-то по этой инструкции восстанавливался из бекапа? Расскажу свою историю: все восстановилось и заработало, все права пользователи получили. Но при создании нового пользователя возникли проблемы http://www.community.terrasoft.ua/forum/topic/8609, а при создании новой таблицы возникли такие проблемы http://www.community.terrasoft.ua/forum/topic/8611.

Это только у меня такие проблемы или всё-таки скрипт не совсем корректно восстанавливает права на объекты? Может кто-то проверить на вновь созданой БД, а не в другой схеме?

Здравствуйте.
Этот вопрос обсуждался в рамках Вашего обращения №0122356 в службу технической поддержки.
С уважением Terrasoft Support Team.

Показать все комментарии