Назад | Перейти на главную страницу

Могу ли я «очистить и заблокировать» базу данных Oracle, чтобы сделать резервную копию файловой системы?

Я использую ZFS для создания снимков запущенных контейнеров OpenVZ.

Для баз данных MySQL я могу использовать flush tables with read lock чтобы перевести их в очищенное и заблокированное состояние. Это переведет базовые файлы в согласованное состояние и будет удерживать все входящие запросы, пока я не завершу создание моментальных снимков, что займет не более пары секунд.

Вот пример сценария без проверки ошибок и другого служебного кода:

vz_root=/var/lib/vz/root/$veid
mysql_locked=/var/run/mysql_locked

# flush & lock MySQL, touch mysql_locked, and wait until it is removed
vzctl exec $veid mysql -NB <<-EOF &
    flush tables with read lock;
    delimiter ;;
    system touch $mysql_locked
    system while test -e $mysql_locked; do sleep 1; done
    exit
EOF

# wait for the preceding command to touch mysql_locked
while ! test -e $vz_root$mysql_locked; do sleep 1; done

# take a snapshot of the VZ filesystem, while MySQL is being held locked
zfs snapshot zpool/private/$veid@$(date +"%Y-%m-%d_%H:%M")

# unlock MySQL
rm -f $vz_root$mysql_locked

Могу ли я сделать то же самое для базы данных Oracle?

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

Я бы предпочел избежать перенастройки Oracle для использования ZFS напрямую в качестве серверной части хранилища, потому что мне очень подходят простые контейнеры OpenVZ. Фактически, я бы предпочел использовать не требующий особого обслуживания метод, без сложной настройки Oracle, если таковой существует.

Не существует «способа» остановить работу Oracle. Даже резервные копии - это фоновые неблокирующие процессы. Используйте RMAN для резервного копирования (которое возобновляется).

Другой способ - использовать очень старый подход.

  • создать резервный контрольный файл для резервного копирования (он создаст резервную копию контрольного файла Oracle - в нем будет старый SCN)
  • выполнять alter database begin backup. Это НЕ остановит операции ввода-вывода с файлами данных. Только SCN в них писать не будет
  • теперь вы можете создать снимок.
  • выполнять alter database end backup
  • Теперь у вас также есть резервные копии всех архивных редологов, созданных базой данных.

Восстановление работает как:

  • скопируйте файл управления резервной копией в нужное место
  • копировать файлы данных (или использовать снимок)
  • попробуйте запустить базу данных. база данных распознает, что SCN различаются, а файлы данных находятся в несогласованном состоянии. Таким образом, он повторно применит все изменения из редологов.
  • тогда вы можете ОТКРЫТЬ базу данных

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

ИМХО - ваш запрос не имеет большого смысла. MySQL не имеет разумной поддержки резервного копирования, и люди склонны обходить это ограничение с помощью различных хаков. Коммерческие базы данных имеют встроенную встроенную поддержку резервного копирования и предлагают больше функций, чем файловая система ZFS. Например, вы можете найти PITR (восстановление на определенный момент времени) очень полезным. Поэтому я действительно рекомендую вам использовать резервные копии RMAN для Oracle, особенно если вы не знакомы с архитектурой Oracle.

PS: SCN означает номер изменения системы. Это число увеличивается всякий раз, когда что-то изменяется в базе данных, и записывается в каждый файл данных Oracle.

PPS: Если вы хотите вернуть состояние базы данных, вы можете использовать команду FLASHBACK DATABASE.