5 апреля 2013 г.

Останов во время online ORACLE backup


Как вы знаете, мы можем делать резервную копию базы данных ORACLE с остановом работы пользователей (оффлайн резервная копия, холодный бэкап БД) и без останова (онлайн резервная копия, горячий бэкапа БД). Я про это упоминал в этом посте.

Напомню, что когда мы выполняем онлайн резервную копию, то процесс резервного копирования производит с табличными пространствами БД следующие операции:
  1. Табличное пространство переводится в специальный режим BEGIN BACKUP.
  2. Производится копирование дата-файлов табличного пространства.
  3. Табличное пространство переводится в нормальный режим работы (END BACKUP).
Когда табличное пространство находится в режиме BEGIN BACKUP, ORACLE как бы "замораживает" его дата-файлы (не изменяет SCN и не записывает изменения), выполняя для пользовательских процессов только чтение из дата-файлов. Запись идет в буфер и журнальные файлы.

То есть, во время выполнения онлайн бэкапа дата-файлы базы данных имеют разные SCN - те которые в данный момент находятся в режиме BEGIN BACKUP, имеют более старый SCN, чем база данных (контрольные файлы и остальные дата-файлы).

И если в процессе бэкапа произойдет останов базы данных (в случае сбоя или вынужденной корректной остановки), то при попытке старта и открытия базы данных мы получим следующую ошибку:
ORA-1113 signalled during: alter database open
Эта ошибка означает, что часть дата-файлов находится в режиме BEGIN BACKUP, имеет более низкий номер SCN, чем вся БД и, в данном случае, без восстановления, база данных не может быть открыта. То есть база данных поднимается только до уровня MOUNT.

Решение в данной ситуации следующее:
  1. Войти в SQLPLUS, поднять (если еще не поднята) базу до уровня MOUNT:
    > sqlplus /nolog 
    SQL> connect /as sysdba 
    SQL> startup mount 
  2. Определить какие дата-файлы находятся в режиме BEGIN BACKUP. Для этого получить из ORACLE view V$BACKUP команды возврата в нормальный режим, которые ORACLE не успел сделать из-за вынужденной остановки:
    SQL> select 'ALTER DATABASE DATAFILE '''||name||''' END BACKUP;' 
      2  from v$backup b, v$datafile f 
      3  where b.file#=f.file# 
      4  and b.status='ACTIVE'; 
  3. Выполнить команды вида
    SQL> ALTER DATABASE DATAFILE '''||name||''' END BACKUP; 
    для всех дата-файлов, которые выдаст команда из пункта 2.
  4. Открыть базу данных командой:
    SQL> ALTER DATABASE OPEN; 
 И не забудьте удалить файл блокировки процесса BRBACKUP.


Автор: Шиболов Вячеслав Анатольевич


2 комментария:

  1. Еще может пригодиться вывести tablespace из режима резервного копирования.

    ALTER TABLESPACE PSAPSR3 END BACKUP; (где PSAPSR3 - имя нужного tablespace)

    ОтветитьУдалить
    Ответы
    1. Да, этой командой было бы проще, но, к сожалению, в ORACLE 8i точно, не работает такая команда в MOUNT режиме. А выше база не поднимается из-за вышеуказанной ошибки.

      Удалить