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;

  • Независимо от диалекта базы данных все шаблоны чувствительны к регистру;

  • Если пропущен шаблон для таблиц, то будут проверены все пользовательские таблицы;

  • Если пропущен шаблон для индексов, то будут проверены все индексы назначенных таблиц;

  • Системные таблицы не проверяются;

  • Для указания списка таблиц или индексов:

    1. необходимо разделять имена символом "|";

    2. не добавляйте пробелы, т.е. шаблон "TAB1 | TAB2" является неверным;

    3. весь список должен быть заключен в двойные кавычки, чтобы интерпретатор команд его правильно обработал.

11.4. Примеры

  1. Этой командой включается онлайн-проверка в базе данных /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
    
  2. Эта команда проверит таблицы TAB1 и TAB2 и все их индексы. Тайм-аут ожидания блокировки составляет 10 секунд.

    rdbsvcmgr service_mgr user SYSDBA password masterkey
    action_validate dbname /home/test/db.fdb
    val_tab_incl "TAB1|TAB2"