Программа RMAN появилась в версии 8 СУБД Oracle как единое для всех платформ
средство организации резервного копирования и восстановления данных на физическом
уровне. По отношению к традиционным базовым возможностям резервирования и восстановления
в Oracle, у программы RMAN есть некоторые преимущества, делающие ее в некоторых
ситуациях (например, при больших объемах данных) практически незаменимой. К
сожалению, наличие этих преимуществ не лишает RMAN и ряда существенных недостатков:
собственной системы понятий, собственного командного языка и интерфейса общения
с администратором. И то, и другое, и третье выполнено в плохих традициях разработчиков
Oracle – не вполне логично, запутано и непоследовательно, – что затрудняет
освоение этой программы. Назначение этой статьи – помочь перешагнуть через
эти недостатки ради выгод, которые можно извлечь из RMAN.
Возможности RMAN включают следующее:
- |
выполнение полного резервирования и резервирования изменений |
- |
выполнение холодного/горячего резервирования, причем во втором случае
табличные пространства не переводятся в режим backup, что позволяет избежать
дополнительной нагрузки на журнал |
- |
обнаружение поврежденных блоков |
- |
параллельное выполнения операций ввода/вывода |
- |
автоматическое протоколирование операций копирования и восстановления |
Уровни выполнения резервного копирования/восстановления с помощью RMAN:
- база данных
- табличные пространства
- файлы табличных пространств
- служебные файлы БД (контрольные, архивные)
Основные понятия
В число основных понятий RMAN входят следующие:
- |
Канал (channel). Серверный процесс, возникающий при установлении
связи с устройством ввода/вывода (диск или магнитная лента) для записи
или чтения файлов резервирования |
- |
Целевая БД (target database). БД, для которой снимается резервная копия,
или которая восстанавливается по ранее снятой копии |
- |
Каталог (recovery catalog). Отдельная схема в БД (чаще в отдельной БД),
которую можно заводить для хранения служебная информации о целевых базах,
снятых копиях и процедурах восстановления. Альтернативой каталогу является
индивидуальная работа с каждой целевой БД, когда служебная информация помещается
в контрольный файл этой БД. |
- |
Копия (RMAN backup). Резервная копия какого-нибудь элемента БД, получаемая
командой RMAN backup. |
- |
Резервный набор (backup set). Логически именует набор файлов, сформированных
во время резервного копирования. |
- |
Резервный файл (backup piece). Двоичный файл с резервной информацией. |
Синтаксис командного языка RMAN в версии 9 имеет определенные отличия от версии
8, но все основные конструкции сохранены. Кроме этого, в RMAN для версии 9
допускается целый ряд упрощений записи команд.
Возможность работы с RMAN включена также в последние версии OEM без необходимости
знания командного языка.
В тексте ниже для лаконичности предпочтение будет отдаваться синтаксису версии
9. Кроме этого для простоты рассматривается работа без каталога RMAN.
Простейший пример снятия резервной копии (холодное копирование – вся БД –
работа без каталога) иллюстрируется следующей последовательностью команд (здесь
команда CONNECT TARGET соединяет RMAN с СУБД версии 8):
RMAN NOCATALOG
RMAN> CONNECT TARGET internal/oracle
RMAN> SHUTDOWN IMMEDIATE
RMAN> STARTUP MOUNT
RMAN> RUN {
2> ALLOCATE CHANNEL d1 TYPE DISK;
3> BACKUP FULL FORMAT 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%U.bus'
4> DATABASE;
4> }
RMAN>
В каталоге D:\ORACLE\ORADATA\TEACHER\RMAN-BACKUP появился файл RMAN_ TEACHER
_02DGA6F0_1_1.BUS (реальное имя может варьироваться). Теперь можно удалить
файлы с табличными пространствами и выполнить восстановление:
RMAN> RUN {
2> ALLOCATE CHANNEL d1 TYPE DISK;
3> RESTORE DATABASE;
4> RECOVER DATABASE;
5> ALTER DATABASE OPEN;
6> }
База восстановлена и открыта.
В версии RMAN для версии 9 описанное выше резервирование можно было бы выполнить
так:
RMAN> BACKUP DATABASE FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%U.bus';
а восстановление так:
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE;
RMAN> ALTER DATABASE OPEN;
Здесь подразумевается использование неявного канала по умолчанию, так что
объявлять его стало необязательно.
Кроме этого в версии 9 появилась команда CONFIGURE, с помощью которой (помимо
прочего) можно связать с каналом направление и маску имени файлов для резервного
набора:
RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%U.bus';
В этом случае команда снятия резервной копии может выглядеть еще проще:
RMAN> BACKUP DATABASE;
Горячее резервирование
- |
может выполняться в состоянии СУБД OPEN |
- |
может выполняться только при включенном режиме архивирования журналов |
Если выполнено и то, и другое, сами действия по резервированию выглядят как
обычно. Пример в синтаксисе версии 9.0:
RMAN> BACKUP DATABASE FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%t_%U.bus';
Пример в синтаксисе версии 9.0:
RMAN> BACKUP TABLESPACE system, users FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%t_%U.bus';
Пример в синтаксисе версии 9.0:
RMAN> BACKUP DATAFILE 1, 2;
или
RMAN> BACKUP FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%d_%t_%U.bus'
3> 'd:\oracle\oradata\teacher\system01.dbf’,
4> 'd:\oracle\oradata\teacher\users01.dbf’;
Если временное табличное пространство локально управляемо, оно автоматически
не резервируется. Восстанавливать (воссоздавать) при необходимости его придется
самостоятельно.
Обычное резервирование контрольного файла приходится выполнять отдельно. Пример
явного резервирования в синтаксисе версии 9.0:
RMAN> BACKUP CURRENT CONTROLFILE;
В версии 9 можно, однако, перевести RMAN в режим, когда копии контрольного
файла будут сниматься автоматически при всякой выдаче команд BACKUP или COPY:
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
Оперативные (онлайновые) файлы журнала автоматически не резервируются. Для
сохранения либо следует их
а) копировать отдельно, либо
б) перед полным резервированием БД отправлять в архив.
Файлы архивных копий журнала резервируются всегда в отдельные от прочих файлы
резервного набора и в общем случае их нужно резервировать отдельной командой.
Пример в синтаксисе версии 9.0:
RMAN> BACKUP ARCHIVELOG ALL;
Пример того, как в версии 9.0 архивные файлы можно включить в состав резервного
набора БД:
RMAN> BACKUP DATABASE FORMAT
2> 'd:\oracle\oradata\teacher\rman-backup\rman_%U.bus' PLUS ARCHIVELOG;
Для резервирования изменений в Oracle используется традиционная многоуровневая
модель с конкретным числом уровней копии 5 (от 0 до 4). Точкой отсчета для
копирования изменений обязана стать снятая ранее полная копия БД уровня 0.
Пример резервирования блоков, изменившихся со времени резервирования на уровнях
3, 2, 1 и 0 (разностное, «дифференциального» резервирование) в синтаксисе версии
9:
RMAN> BACKUP INCREMENTAL LEVEL 3 DATABASE;
Пример резервирования блоков, изменившихся со времени последнего резервирования
на уровнях 2, 1 и 0 (разностно-накопительное, «кумулятивное» резервирование)
с пропуском табличных пространств, закрытых для записи (синтаксис версии 9):
RMAN> BACKUP INCREMENTAL LEVEL 3 CUMULATIVE DATABASE
2> SKIP READONLY;
Разностно-накопительное (кумулятивное) резервирование уровня N отличается
от разностного (дифференциального) тем, что резервирует изменения произошедшие
после выполнения резервирования всех уровней < N, в то время как просто
разностное – изменения, произошедшие после резервирования уровней <= N.
Выполняется специальными командами LIST и REPORT, а также разновидностью команды
RESTORE. Примеры приводятся ниже.
Выдача подробного списка всех снятых копий:
RMAN> LIST BACKUP;
Выдача списка резервных наборов, содержащих табличное пространство SYSTEM:
RMAN> LIST BACKUP OF TABLESPACE system;
Вариант выдачи того же самого, но в обобщенном виде (версия 9):
RMAN> LIST BACKUP OF TABLESPACE system SUMMARY;
Выдача информации о копиях, снятых с архивов журналов:
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
Выдача резервных копий, оказавшихся устаревшими:
RMAN> REPORT OBSOLETE;
Выдача файлов с данными БД, для восстановления которых потребуются архивы
журналов 2-х дневной давности и более:
RMAN> REPORT NEED BACKUP DAYS 2 DATABASE;
Те же сведения, но только для пространства SYSTEM:
RMAN> REPORT NEED BACKUP DAYS 2 TABLESPACE system;
Выдача информации о том, годны ли файлы резервного набора для восстановления:
RMAN> RUN {ALLOCATE CHANNEL d1 TYPE DISK;
2> RESTORE DATABASE VALIDATE; }
Выполняется командой DELETE. В простейшем варианте удаление устаревших копий
может выглядеть так:
RMAN> DELETE OBSOLETE;
Обратите внимание, что RMAN удалил ненужные файлы резервных наборов. Вам не
нужно автоматизировать удаление старых файлов, как раньше!
Файлы резервных наборов могут оказаться испорченными или поврежденными. Это
можно отметить в справочнике (в контрольном файле или в каталоге RMAN) с помощью
команды CROSSCHECK, в результате чего они будут помечены там как EXPIRED. Последующая
команда DELETE EXPIRED удалит ставшие ненужными из-за этого файлы:
RMAN> CROSSCHECK BACKUP;
…
RMAN> DELETE EXPIRED BACKUP OF DATABASE;
…
RMAN> DELETE BACKUP OF DATABASE;
Более сложный пример удаления устаревших резервных копий:
RMAN> DELETE OBSOLETE RECOVERY WINDOW OF 14 DAYS;
- |
Для восстановления данных целевая БД должна находиться в состоянии NOMOUNT/
MOUNT/ OPEN в зависимости от характера восстановления, например |
- |
NOMOUNT: для восстановления контрольных файлов БД (фактически – СУБД)
|
- |
MOUNT: для восстановления БД целиком или табличного пространства SYSTEM
|
- |
OPEN: для восстановление табличных пространств, помимо SYSTEM (в этом
случае перед процедурой восстановления само табличное пространство потребуется
перевести в состояние OFFLINE).
|
- |
Восстановление файлов (с данными и служебных) выполняется в RMAN командой
RESTORE. |
- |
Восстановление данных выполняется либо в RMAN, либо в SQL*Plus командами
RECOVER при условии наличия восстановленных файлов. |
Некоторые примеры восстановления:
RMAN> RECOVER DATABASE;
RMAN> RECOVER TABLESPACE users;
RMAN> RECOVER DATAFILE 'd:\oracle\oradata\teacher\users01.dbf’;
RMAN> RESTORE CONTROLFILE;
RMAN> RUN {
2> SET ARCHIVELOG DESTINATION TO ‘d:\oracle\oradata\archive’;
3> RESTORE ARCHIVELOG ALL; }
Восстановление пространств, закрытых на запись:
RMAN> SQL "ALTER TABLESPACE lookup_data OFFLINE";
RMAN> RECOVER TABLESPACE lookup_data;
RMAN> SQL "ALTER TABLESPACE lookup_data ONLINE";
БД, работающую в режиме архивирования журнала, можно восстанавливать до определенного
указанного момента с помощью фраз UNTIL {TIME … | SCN … | SEQUENCE … THREAD…}.
Пример:
RMAN> RESTORE DATABASE; # восстановили файлы
RMAN> RECOVER DATABASE UNTIL SCN 375831; # восстановили БД
RMAN> ALTER DATABASE OPEN RESETLOGS; # сбросили журнал
Восстановление БД (вторая и третья строчки выше) можно выполнить и в SQL*Plus:
SQL > RECOVER DATABASE UNTIL CANCEL;
SQL> ALTER DATABASE OPEN RESETLOGS;
При таком восстановлении необходимо сбросить онлайновый журнал. После этого,
как и при традиционном восстановлении со сбросом журналов (RESETLOGS), необходимо
снять полную копию БД, так как с этого момента восстановление с более ранних
резервных копий станет невозможным из-за того, что история журнальных записей
прерывается.
Автоматизировать выполнение задач с RMAN можно как внешними средствами (язык
командной оболочки), так и внутренними. Внутренние средства RMAN допускают
указание файла сценария при вызове этой программы, а также организацию хранимого
сценария.
Пусть в файле listbackup.rcm находятся строки:
CONNECT TARGET /
LIST BACKUP;
EXIT
Тогда следующие два эквивалентные по результату обращения в ОС приведут ко
входу в RMAN, выполнению этого сценария и выходу:
RMAN CMDFILE=listback.rcm NOCATALOG
RMAN @listback.rcm NOCATALOG
При использовании каталога RMAN возможно к тому же использование хранимого
сценария:
RMAN> REPLACE SCRIPT reportobsolete { REPORT OBSOLETE; }
Пример обращения в хранимому в каталоге сценарию:
RMAN> RUN { EXECUTE SCRIPT reportobsolete; }