У нас есть база данных Oracle 11gR2 RAC на двух узлах. У нас также есть сценарий резервного копирования RMAN, который отлично работает, используя базу данных каталога восстановления, расположенную в городе в 20 км от центра обработки данных. Скрипт для резервного копирования базы данных работает нормально и запускается из задания crontab или из Oracle dbconsole (пока он работает из crontab). Процедура восстановления проверена и все работает исправно.
Проблема в том, что сценарий запускается с первого узла в кластере, и если узел выключен, резервное копирование не может быть выполнено. Как мы можем гарантировать, что у нашего скрипта есть резервная версия для переключения при отказе. Мы также пытались сделать резервную копию через dbconsole, но это работает только в том случае, если узел, с которого запускается задание, был запущен.
По сути, вопрос заключается в следующем: «Как гарантировать, что наша резервная копия работает, независимо от того, активны ли оба узла».
В простом, хорошо написанном сценарии RMAN нет ничего, что могло бы помешать его использованию в другом экземпляре той же базы данных, поэтому я предполагаю, что вопрос действительно в том, чтобы избавиться от единой точки отказа (SPOF) при вызове таких Скрипт RMAN.
При планировании crontab, чтобы избежать SPOF, вам нужно иметь два (или более) crontab.
Грубый способ - всегда выполнять резервное копирование на каждом узле, но это тратит время и ресурсы.
Лучшее решение - иметь собственный сценарий, который всегда выполняет резервное копирование на первом узле, а на втором узле - только тогда, когда он обнаруживает через crsstat, что первый узел находится в автономном режиме.
Если вы умеете писать сценарии, я бы устроил это так (простите за псевдокод):
this_host = hostname -s
alphabetical_good_hosts = ` crsstat -t | grep 'inst *ONLINE *ONLINE' | cut the hostname | sort `
if this_host != first_element_of( alphabetical_good_hosts ) ; then
echo Silently exiting, we are not the preferred node for backup
exit 0
endif
rman target / catalog someone@rman
Подключитесь к базе данных через службу базы данных. Служба должна управляться пулом серверов, и оба узла должны быть частью пула. Тогда услуга всегда предлагается, и скрипт будет запущен, если какой-либо из двух узлов работает. Службу можно определить с помощью команды srvctl.