Диагностика состояния БД


НАЧАЛО >> Руководство пользователя >> Диагностика состояния БД📄 Скачать в DOCX


Диагностические операции доступны из карточки базы данных через кнопку Управление БД.... Они предназначены для чтения служебного состояния БД и не должны изменять записи, словарь или полнотекстовую базу.

1. Информация о состоянии БД

Окно Управление БД сразу показывает отчет Database/DbInfo; повторное чтение выполняется командой Состояние -> Обновить. Для больших БД можно использовать команду Состояние -> Обновить в фоне, которая запускает тот же отчет через очередь с прогрессом. Для провайдера DP_Irbis64Native отчет соответствует команде irbistool dbinfo.

В отчет входят:

Подсчет выполняется последовательным проходом по XRF основной и полнотекстовой БД и хранит только счетчики, поэтому не требует загрузки записей или индексов целиком в оперативную память. На очень больших БД запуск может занять заметное время; фоновый режим обновляет прогресс по MFN основной и полнотекстовой БД.

2. Диагностика MFN

Команда Состояние -> Диагностика MFN... в окне Управление БД запускает read-only задачу Database/DiagMfn. Для провайдера DP_Irbis64Native она соответствует базовому режиму irbistool diagmfn -mf ... -mt ...: последовательно читает XRF выбранного диапазона и сверяет номер MFN в MST-лидере по адресу из XRF.

Операция не читает тела записей целиком, не открывает словарь и не изменяет MST/XRF. В отчете возвращаются диапазон, число проверенных MFN, признак ok, количество ошибок, несовпадений MFN, ошибок чтения, нулевых ссылок XRF без признака физического удаления, физически удаленных нулевых ссылок, сведения о размере MST/XRF и ограниченный список подробных ошибок.

Параметры:

Параметр Назначение
Первый MFN Начало диапазона. Если не задано, используется 1.
Последний MFN Конец диапазона. Если не задано или больше максимального MFN, используется последний MFN БД.
Лимит ошибок в отчете Максимальное число подробных ошибок в результате queue-задачи. Счетчик errors продолжает учитывать все найденные ошибки.

Для больших БД диагностика выполняется линейно по XRF и не требует загрузки всей БД в память, но полная проверка может занять значительное время. Если задача нашла ошибки, перед любыми исправляющими режимами нужно подготовить snapshot или файловую копию БД и повторить диагностику на копии.

2.1. Параллельная диагностика MFN

Команда Состояние -> Параллельная диагностика MFN... запускает Database/DiagMfnParallel. Это read-only режим для больших БД: полный диапазон MFN делится на независимые части, каждая часть выполняется отдельной задачей Database/DiagMfnRange, а родительская задача агрегирует счетчики после успешного завершения всех дочерних задач.

Параллельный режим не изменяет MST/XRF и не использует контекст провайдера за пределами модуля Database. Он требует, чтобы очередь могла выполнять несколько задач одновременно: параметр Queue::MaxStarted должен быть не меньше 2. Если одна из дочерних задач завершается ошибкой, родительская задача завершается ошибкой и возвращает failedTasks вместо успешного агрегированного отчета.

Параметр Число параллельных диапазонов задает количество частей, на которые будет разбит полный диапазон MFN. Значение нужно выбирать с учетом числа доступных рабочих потоков очереди, нагрузки на диск и размера БД. Для очень больших БД не следует задавать число диапазонов намного больше реального параллелизма очереди: лишние задачи увеличат накладные расходы планирования и ожидания.

Время wallSeconds в отчете параллельного режима включает ожидание очереди и polling родительской задачи, поэтому его нельзя напрямую сравнивать с чистым временем выполнения метода провайдера. Для сравнения скорости с irbistool.exe нужно отдельно учитывать время дочерних задач и фактическую доступность worker-потоков очереди.

3. Диагностика MST/XRF

Команда Состояние -> Диагностика MST/XRF в окне Управление БД запускает read-only задачу Database/DiagMstXrf. Для провайдера DP_Irbis64Native она соответствует безопасной части irbistool diagmstxrf без параметра -r: последовательно проходит MST, фиксирует фактическое смещение каждой найденной записи и сверяет эти смещения со ссылками XRF.

Команда Состояние -> Исправить XRF по MST... запускает тот же action с параметром Repair=true и соответствует режиму irbistool diagmstxrf -r. Этот режим меняет только XRF: если ссылка XRF отличается от фактического смещения записи в MST, в XRF записывается фактический offset и ставится признак неактуализированной записи; если MFN есть в XRF, но не найден в MST, XRF-запись помечается физически удаленной.

Исправление XRF требует права EDIT и подтверждения наличия актуальной резервной копии или запуска на тестовой копии БД. Серверная задача не запускает repair без BackupConfirmed=1. Запись XRF выполняется через transaction manager: при ошибке чтения, ошибке записи или отмене транзакция откатывается, при успешном проходе фиксируется commit.

В отчете возвращаются:

Для больших БД метод использует ограниченную бинарную карту MFN -> MST offset, а при превышении лимита переходит на временный файл вместо загрузки карты в оперативную память. Размер временного файла зависит от числа MFN, поэтому на full-size стендах нужно заранее проверить свободное место во временном каталоге. Фрагментированные MST/XRF пока не исправляются и не проверяются полностью: если у БД есть несколько MST-фрагментов, задача возвращает явное ограничение unsupported.

4. Диагностика записей

Команда Состояние -> Диагностика записей... в окне Управление БД открывает окно параметров и запускает read-only задачу Database/DiagRec через очередь. Для провайдера DP_Irbis64Native она соответствует безопасной части irbistool diagrec: последовательно проходит выбранный диапазон MFN, читает ссылку XRF, MST-лидер и directory entries записи, проверяет базовую структуру записи и при необходимости выгружает отчеты.

Операция не изменяет MST/XRF и не удаляет записи. В текущем инкременте не реализованы исправляющий режим irbistool diagrec -c, который заменяет недопустимые символы и обновляет запись, и удаляющий режим irbistool diagrec -r, который помечает ошибочные записи удаленными. Эти режимы требуют отдельного сценария резервного копирования, restore-test и проверки отката.

Параметры задачи:

Параметр Назначение
MfnFrom Начало диапазона. Если не задано, используется первая запись.
MfnTo Конец диапазона. Если не задано или больше максимального MFN, используется последний MFN БД.
CheckCoding Дополнительно проверять текст полей как UTF-8 и фиксировать ошибки кодировки.
ExportInvalid Записывать проблемные записи в файл <db>_wrong_records.txt в каталоге отчета.
ExportValid Записывать корректные записи в файл <db>_records.txt в каталоге отчета.
ErrorLimit Максимальное число подробных ошибок, возвращаемых в результате задачи. Счетчики ошибок продолжают учитывать весь проход.
IncludeFullText При полном диапазоне для БД 2018+ дополнительно проверять встроенную полнотекстовую БД, если она открыта.

Отчеты записываются во внутренний рабочий каталог провайдера: irbistool-diagrec/<DB>/<DiagRunId>/. Основной протокол находится в файле <db>_protocol.txt; при включенных параметрах экспорта дополнительно создаются <db>_wrong_records.txt и <db>_records.txt.

Для больших БД DiagRec выполняется потоково и читает записи по одной, без загрузки всей БД или индексов в память. Для защиты от поврежденного MST-лидера установлен предохранитель на размер одной записи: если mfrl больше 100 МБ, запись считается ошибочной и не загружается целиком в память. Полная проверка терабайтной БД может выполняться долго, поэтому запуск должен идти через очередь с прогрессом и последующим анализом файлов отчета.

5. Диагностика FT-записей

Команда Состояние -> Диагностика FT-записей... в окне Управление БД открывает окно параметров и запускает read-only задачу Database/DiagRecFt. Для провайдера DP_Irbis64Native она соответствует irbistool diagrecft: диагностирует записи встроенной полнотекстовой БД без прохода по основной MST/XRF.

Операция доступна только для БД формата 2018+ со встроенным полнотекстовым пространством. Если полнотекстовая БД отсутствует, задача возвращает ошибку Database not plus format. Диагностика не изменяет FT-БД и не выполняет исправляющие действия.

Параметры задачи:

Параметр Назначение
MfnFrom Начало диапазона FT-записей. Если не задано, используется первая запись.
MfnTo Конец диапазона FT-записей. Если не задано или больше максимального MFN, используется последний MFN FT-БД.
ErrorLimit Максимальное число подробных ошибок, возвращаемых в результате задачи.

Отчеты записываются во внутренний рабочий каталог провайдера: irbistool-diagrecft/<DB>/<DiagRunId>/. Основной протокол находится в файле <db>--text_protocol.txt. Для больших полнотекстовых БД операция выполняется потоково по FT-записям и должна запускаться через очередь.

6. Диагностика LNK

Команда Состояние -> Диагностика LNK в окне Управление БД запускает read-only задачу Database/DiagLnk. Для провайдера DP_Irbis64Native она соответствует irbistool diaglnk: проверяет контрольную запись IFP, границы занятых блоков N01/L01, структуру блоков словаря и возможность прочитать цепочки IFP-постингов для каждого термина. Для БД 2018+ дополнительно проверяется full-text пространство, если оно открыто для базы.

Операция не перестраивает словарь и не исправляет индекс. В отчете возвращаются ok, fragments, fullText, terms, postings, n01Blocks, l01Blocks, seconds, peakMemory, а при ошибке - код и сообщение, близкое к сообщению irbistool (error in file N01, error in file L01, error if file IFP Key=..., inverted file error). Проверка постингов выполняется потоково по терминам и сегментам IFP, без загрузки всего словаря или всех постингов в память.

На очень больших БД DiagLnk является полной проверкой инвертированного файла и может выполняться долго. Задача обновляет прогресс очереди и должна запускаться как фоновая операция. Контрольный запуск на тестовой копии IBIS показал функциональное совпадение с irbistool, но native-реализация пока медленнее. Runtime-запуск через очередь на тестовом стенде завершился успешно; проверка на большой корректной БД остается отдельным этапом.

7. Проверка соответствия

Для проверки реализации используется tools/DP_Irbis64NativeDbInfoCompare.php. Скрипт создает тестовую копию БД, запускает irbistool.exe dbinfo, запускает native-метод DbInfo() и сравнивает ключевые поля отчета, время выполнения и монотонность вызовов progress callback. Контрольный запуск на IBIS показал DbInfo compare passed, irbistool.exe 0.047763 с, native 0.012428 с, progressCalls=205. Фоновый запуск через очередь проверен задачей 506500: задача завершилась со статусом state=2 и прогрессом 1.

Для diagmfn используется tools/DP_Irbis64NativeDiagMfnCompare.php: скрипт создает изолированную копию IBIS, запускает irbistool.exe diagmfn -mf 1 -mt 200, запускает native DiagMfn(1, 200) и сравнивает итоговый признак нормального состояния. Дополнительно скрипт создает поврежденные XRF-сценарии: ссылку MFN на чужой MST-лидер, нулевую ссылку без BIT_PHYS_DEL, допустимую нулевую ссылку с BIT_PHYS_DEL, некратный размер MST и некратный размер XRF. Контрольный запуск показал DiagMfn compare passed, tool=0.037342s, native=0.001262s, errors=0, mismatches=0, readErrors=0; для поврежденных сценариев irbistool.exe и native-метод одинаково определили ошибочные MFN и ошибку размера MST. Некратный размер XRF сам по себе не приводит к Have report в текущем wrapper irbistool diagmfn, поэтому native-метод сохраняет совместимое внешнее поведение.

Для diagmstxrf используется tools/DP_Irbis64NativeDiagMstXrfCompare.php: скрипт создает изолированную копию БД, запускает irbistool.exe diagmstxrf, запускает native DiagMstXrf() и сравнивает итоговый признак ok. Дополнительно создается поврежденный XRF-сценарий со смещенной ссылкой MFN и repair-сценарий: irbistool -r и native Repair=true должны после исправления дать чистую read-only диагностику. Последний контрольный запуск на ARCH показал DiagMstXrf compare passed: нормальная копия без ошибок, поврежденный XRF обнаружен обеими реализациями, repair дал nativeRepairedOffsets=1 и committed=yes. Отдельный restore-test tools/DP_Irbis64NativeDiagMstXrfRepairRestoreTest.php проверяет безопасный сценарий backup/restore: портит XRF только в рабочей копии, запускает repair, восстанавливает XRF из backup по SHA1 и повторяет read-only диагностику. Проверка прошла на малой ARCH и крупной RPC.

Для diaglnk используется tools/DP_Irbis64NativeDiagLnkCompare.php: скрипт создает изолированную копию IBIS, запускает irbistool.exe diaglnk, запускает native DiagLnk() и сравнивает итоговый признак ok. Дополнительно создается сценарий с поврежденным заголовком L01. Контрольный запуск показал DiagLnk compare passed: нормальная копия дала terms=12024, postings=40839, n01=10, l01=260; поврежденный L01 обнаружен обеими реализациями.

Для diagrec используется tools/DP_Irbis64NativeDiagRecCompare.php: скрипт создает изолированную копию IBIS, запускает irbistool.exe diagrec -mf 1 -mt 200, запускает native DiagRec(1, 200) и сравнивает итоговый признак нормального состояния. Дополнительно создается сценарий с поврежденным MST-лидером, где mfrl намеренно задается слишком большим. Контрольный запуск показал DiagRec compare passed: нормальный диапазон дал scanned=200, errors=0; поврежденный лидер обнаружен обеими реализациями, native вернул wrongRecords=1, readErrors=1. Runtime-запуск через очередь на тестовом стенде для диапазона 1-200 завершился успешно.

Для diagrecft используется tools/DP_Irbis64NativeDiagBenchmark.php diagrecft <DB>: скрипт запускает irbistool.exe diagrecft и native DiagRecFt() на существующей БД без копирования данных. Контрольный запуск на IBIS показал совпадение нормального результата: scanned=6465, errors=0. Runtime-запуск через очередь на тестовом стенде завершился успешно.