Ручное восстановление на заданный момент времени

Резервные копии СУБД Oracle, выполненные СРК RuBackup, можно использовать для восстановления на заданный момент времени (point in time recovery, PITR).

Момент времени определяется как сочетание инкарнации БД и метки времени.

Восстановление на заданный момент времени требует двух резервных копий.

Первая резервная копия должна быть сделана до желаемого момента восстановления. Эта резервная копия будет использована для восстановления до требуемого Oracle System Change Number (SCN), предшествующего желаемому моменту восстановления.

Вторая резервная копия должна быть сделана после желаемого момента восстановления. Архивные журналы из этой резервной копии будут использованы для восстановления до желаемого момента времени.

Восстановление в пределах текущей инкарнации отличается от восстановления на момент времени в другой инкарнации. Во втором случае потребуется:

  • сбросить базу данных до той инкарнации, которая соответствует требуемому Oracle System Change Number (SCN) (требуемый Oracle System Change Number (SCN) может отсутствовать в текущей инкарнации),

  • восстановить controlfile из резервной копии нужной инкарнации.

В примере предполагается, что сделаны две резервных копии:

  • полная (LEVEL 0) до желаемого момента восстановления,

  • инкрементальная (LEVEL 1) после.

  1. Определите желаемый момент (дату и время) для восстановления. Выберите резервные копии:

    • предшествующую требуемому моменту, и

    • выполненную позже требуемого момента.

  2. Восстановите цепочку РК без развертывания в произвольную папку (/home/restore_dir/).

    В папке появятся подпапки, каждая из которых соответствует номеру задачи резервного копирования: clientName_TaskID_*.

  3. Измените владельца восстановленного архива (oracle).

    Рекурсивная смена владельца файлов и папок
    sudo chown -R oracle /home/restore_dir/25.rest/
  4. Проанализируйте rman_label в каждой из подпапок.

    Пример 1. rman_label полной резервной копии
    stamp:1191637276 (1)
    count:131
    tag:RB_XE_1_88 (2)
    instance:XE
    level:0
    dbid:3069055493
    incarnation:7 (3)
    scn:6735182
    1 Дата и время (Unix timestamp)
    2 Тег полной резервной копии
    3 Инкарнация БД на момент снятия резервной копии
    Пример 2. rman_label инкрементальной резервной копии
    stamp:1191638650 (1)
    count:139
    tag:RB_XE_2_89 (2)
    instance:XE
    level:1
    dbid:3069055493
    incarnation:7 (3)
    scn:6736286
    1 Дата и время (Unix timestamp)
    2 Тег инкрементальной резервной копии
    3 Инкарнация БД на момент снятия резервной копии

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

    Конвертировать Unix timestamp в дату и время можно при помощи date -d @<timestamp>.

  5. Если восстанавливаемый экземпляр БД уже запущен, остановите его.

    RMAN> SHUTDOWN IMMEDIATE;

    При невозможности подключиться убейте процесс СУБД и проверьте это:

    ps -ef | grep pmon
    kill -9 <id_process>
    ps -ef | grep pmon
  6. Дождитесь полного завершения работы экземпляра БД. При входе в sqlplus появится сообщение Connected to an idle instance..

  7. (опционально) Если требуется восстановить БД к состоянию в другой инкарнации (целевой Oracle System Change Number (SCN) находится не в текущей инкарнации), то восстановите controlfile из восстановленной РК нужной инкарнации (из последнего инкремента). Запустите экземпляр в режиме NOMOUNT для восстановления controlfile.

    RMAN> STARTUP NOMOUNT;
    RMAN> RESTORE CONTROLFILE FROM '/home/restore_dir/25.rest/oracledb.localdomain_TaskID_89_<...>_31/bk_C_4a3gdtjo_1_1';
    Вывод команды восстановления controlfile
    Starting restore at 29-JAN-25
    using target database control file instead of recovery catalog
    allocated channel: ORA_DISK_1
    channel ORA_DISK_1: SID=743 device type=DISK
    
    channel ORA_DISK_1: restoring control file
    channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
    output file name=/opt/oracle/oradata/XE/control01.ctl
    output file name=/opt/oracle/oradata/XE/control02.ctl
    Finished restore at 29-JAN-25

    После восстановления controlfile потребуется перевести БД в режим MOUNT для продолжения восстановления.

  8. (опционально) Если целевой Oracle System Change Number (SCN) находится не в текущей инкарнации, откатите БД к предыдущей инкарнации. Oracle System Change Number (SCN) БД перед восстановлением должен быть меньше, чем Oracle System Change Number (SCN) в rman_label первой резервной копии.

    RMAN> list incarnation;
    RMAN> reset database to incarnation 6;
  9. Запустите rman. Запустите БД в режиме MOUNT.

    RMAN> STARTUP MOUNT;
  10. Обновите репозиторий rman информацией о резервных копиях (или архивных журналах) с указанием папки с восстановленной РК:

    RMAN> CATALOG START WITH '/home/restore_dir/25.rest/';
    cataloging files...
    cataloging done
    
    List of Cataloged Files
    =======================
    …
  11. Запустите процесс восстановления с указанием времени между полной и инкрементальной резервными копиями. Укажите теги резервных копий.

    RMAN> RUN
    {
      set until time "to_date('2025-01-29 07:15:00', 'yyyy-mm-dd hh24:mi:ss')"; (1)
      restore database from tag RB_XE_1_88; (2)
      recover database from tag RB_XE_2_89; (3)
      ALTER DATABASE OPEN RESETLOGS; (4)
    }
    1 Восстановить данные из резервной копии
    2 Задать момент восстановления
    3 Восстановить данные с помощью архивных журналов инкрементальной резервной копии
    4 Открытие БД с OPEN RESETLOGS создаст новую инкарнацию