11. Онлайн валидация базы данных
Проверка базы данных позволяет выполнять низкоуровневые проверки согласованности данных на диске и даже исправлять некоторые незначительные повреждения. Это рекомендуемая процедура для любой ценной базы данных, и администратор базы данных должен время от времени проверять базу, чтобы убедиться в ее работоспособности. Но процесс проверки требует монопольного доступа к базе данных, т.е. он запрещает любой параллельный доступ к базе данных во время выполнения проверки. В некоторых случаях, когда база данных велика, это может стать проблемой, т.к. проверка занимает заметное количество времени.
Проверка в режиме онлайн — это новая функция, которая позволяет выполнять некоторые проверки согласованности без монопольного доступа к базе данных.
11.1. Возможности проверки в режиме онлайн
Онлайн-проверка может делать следующее:
проверять некоторые (или все) пользовательские таблицы в базе данных; системные таблицы не проверяются;
проверять некоторые (или все) индексы;
другие проверки ODS, такие как Страницы заголовка (Header), PIP, TIP, Страницы генераторов (Generators pages) не выполняются.
11.2. Защита во время онлайн проверки
Пока таблица (и/или её индекс) проходит проверку, пользователи могут только читать данные
из этой таблицы. Любая попытка изменить данные INSERT/UPDATE/DELETE будет ждать окончания
проверки или, в зависимости от таймаута блокировки пользовательской транзакции, вернет ошибку
выполнения операции по таймауту блокировки.
Пока идёт проверка любой вид сборки мусора в таблице или её индексах отключается:
фоновая и совместная сборка мусора просто пропустят эту таблицу;
принудительная сборка мусора, т.е. работа утилиты
"gfix -sweep db.fdb"будет завершена с ошибкой.
После начала онлайн проверки таблицы для предотвращения одновременных изменений её данных на неё накладываются два вида блокировок:
блокировка таблицы в режиме PR (protected read - защищённое чтение);
Новая блокировка сбора мусора в режиме PW (protected write - защищённая запись).
Обе блокировки используют определенный пользователем тайм-аут блокировки. Если какой-либо запрос на блокировку завершается неудачно, сообщается об ошибке и таблица пропускается.
Как только блокировки вступают в действие, таблица и её индексы будут проверены так же, как и и при полной проверке. После завершения проверки блокировки снимаются и вся процедура повторяется для следующей таблицы.
11.3. Команда для запуска онлайн проверки
Онлайн-валидация реализована в виде сервиса Firebird и доступна через Services API командой
isc_action_svc_validate. Поэтому утилита gfix не может запустить онлайн-проверку. Утилита
rdbsvcmgr имеет полную поддержку нового сервиса. Её синтаксис:
rdbsvcmgr [host:]service_mgr [user <...>] [password <...>]
action_validate dbname <файл БД>
[val_tab_incl <шаблон>]
[val_tab_excl <шаблон>]
[val_idx_incl <шаблон>]
[val_idx_excl <шаблон>]
[val_lock_timeout <число>]
где:
val_tab_incl– шаблон для таблиц, включенных в проверку. По умолчанию все пользовательские таблицы включены, системные таблицы не проверяются;val_tab_excl– шаблон для таблиц, исключенных из проверки;val_idx_incl– шаблон для индексов, включенных в проверку. По умолчанию%– все индексы включены;val_idx_excl– шаблон для индексов, исключенных из проверки;val_lock_timeout– тайм-аут ожидания блокировки на таблицу (в секундах). По умолчанию 10 секунд, -1 - бесконечное ожидание.
Примечание
Шаблоны - это регулярные выражения, обрабатываемые по тем же правилами, что и выражения типа
SIMILAR TO;Независимо от диалекта базы данных все шаблоны чувствительны к регистру;
Если пропущен шаблон для таблиц, то будут проверены все пользовательские таблицы;
Если пропущен шаблон для индексов, то будут проверены все индексы назначенных таблиц;
Системные таблицы не проверяются;
Для указания списка таблиц или индексов:
необходимо разделять имена символом
"|";не добавляйте пробелы, т.е. шаблон
"TAB1 | TAB2"является неверным;весь список должен быть заключен в двойные кавычки, чтобы интерпретатор команд его правильно обработал.
11.4. Примеры
Этой командой включается онлайн-проверка в базе данных
/home/test/db.fdbтаблиц, названия которых начинается с буквы"A"; индексы не проверяются; ожидание блокировки не выполняется:rdbsvcmgr service_mgr user SYSDBA password masterkey action_validate dbname /home/test/db.fdb val_tab_incl A% val_idx_excl % val_lock_timeout 0
Эта команда проверит таблицы
TAB1иTAB2и все их индексы. Тайм-аут ожидания блокировки составляет 10 секунд.rdbsvcmgr service_mgr user SYSDBA password masterkey action_validate dbname /home/test/db.fdb val_tab_incl "TAB1|TAB2"