Как запустить скрипт операционной системы из Oracle или Не совсем традиционный способ снятия бэкапаИсточник: habrahabr
Некоторое время назад потребовалось сделать бэкап базы данных на RAC. Задача, на самом деле, вполне тривиальная, если бы не несколько но: у заказчика паранойя по поводу безопасности (не удивительно и понятно), у заказчика нет своего DBA (ну так уж вышло) и у меня есть доступ только к консоли сервера с базой данных. Таким образом, пришлось отказаться от использования красивого и удобного Enterprise Manager и придумать банальные консольные скрипты. И вот тут-то и возникла загвоздка. Стандартное решение: написать скрипты бэкапа, настроить cron, который будет их вызывать по расписанию, и на этом успокоиться до тех пор, пока база таки не упадёт. Но поскольку мы имеем дело с кластером из нескольких нод, встал вопрос, на которой из них дёргать бэкап. На всех - как-то многовато. На одной - а что, если именно она-то и упадёт, а все остальные останутся в строю? По очереди - а что, если упадёт именно та, чья очередь делать бэкап как раз и наступила? На каком-нибудь третьем сервере - нету лишней железки для дополнительной базы данных. Тогда вспомнилась одна любопытная штука, которая появилась в версии 11.2 и с которой, кроме прочего, давно хотелось разобраться. А именно, внешние таблицы с возможностью предобработки подключаемого файла. Понятно, что изобретённое решение - это нецелевое использование любопытной фичи. Но получилось забавно. Сначала - скрипты (скрипт RMAN может быть любым, для примера пускай такой). /u01/app/oracle/rman_backup/backup.rmn RUN { /u01/app/oracle/rman_backup/run_backup.sh Скрипты бэкапа (run_backup.sh и backup.rmn) должны быть сложены на все имеющиеся ноды кластера по одинаковому пути (в данном примере - /u01/app/oracle/rman_backup/). И путь к утилите rman должен быть указан полностью. После чего начинается интересное. Предоставляем базе доступ к каталогу, в котором живут скрипты бэкапа. Создаём пользователя, который будет дёргать скрипты бэкапа, и предоставляем ему необходимые привилегии. Создаём внешнюю таблицу, основной смысл которой - запускать бэкап. SQL> connect bkp/rmanbkp Затем - хранимку, которая будет дёргаться по расписанию (во второй части, где проверка успешности и оповещение DBA о результатах, можно, например, сообщение отправить на нужный адрес, но это немножко другая история). SQL> create or replace procedure run_backup is Ну и, наконец, job, который будет нашу хранимку дёргать. SQL> begin Такая вот штука. Oracle, оказывается, и так умеет. |