НАЧАЛО >> Руководство пользователя >> Диагностика состояния БД📄 Скачать в DOCX
Диагностические операции доступны из карточки базы данных через кнопку Управление БД.... Они предназначены для чтения служебного состояния БД и не должны изменять записи, словарь или полнотекстовую базу.
Окно Управление БД сразу показывает отчет Database/DbInfo; повторное чтение выполняется командой Состояние -> Обновить. Для больших БД можно использовать команду Состояние -> Обновить в фоне, которая запускает тот же отчет через очередь с прогрессом. Для провайдера DP_Irbis64Native отчет соответствует команде irbistool dbinfo.
В отчет входят:
DB NAME - имя базы данных;DB MAXMFN - максимальный MFN основной БД;DB LOCK - признак блокировки БД;RECORDS LOCKED - количество заблокированных записей;RECORDS LOGICALLY DELETED - количество логически удаленных записей;RECORDS PHYSICALLY DELETED - количество физически удаленных записей;RECORDS UNACTUAL - количество неактуализированных записей основной БД;FT RECORDS UNACTUAL - количество записей с признаком неактуализированного полного текста;INV FILE FRAGMENTED - признак фрагментированного инвертированного файла;MST FILE FRAGMENTED - признак фрагментации MST по управляющей записи;FT DB MAXMFN - максимальный MFN встроенной полнотекстовой БД;FT RECORDS LOGICALLY DELETED - количество логически удаленных записей в полнотекстовой БД;FT RECORDS PHYSICALLY DELETED - количество физически удаленных записей в полнотекстовой БД.Подсчет выполняется последовательным проходом по XRF основной и полнотекстовой БД и хранит только счетчики, поэтому не требует загрузки записей или индексов целиком в оперативную память. На очень больших БД запуск может занять заметное время; фоновый режим обновляет прогресс по 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 или файловую копию БД и повторить диагностику на копии.
Команда Состояние -> Параллельная диагностика MFN... запускает Database/DiagMfnParallel. Это read-only режим для больших БД: полный диапазон MFN делится на независимые части, каждая часть выполняется отдельной задачей Database/DiagMfnRange, а родительская задача агрегирует счетчики после успешного завершения всех дочерних задач.
Параллельный режим не изменяет MST/XRF и не использует контекст провайдера за пределами модуля Database. Он требует, чтобы очередь могла выполнять несколько задач одновременно: параметр Queue::MaxStarted должен быть не меньше 2. Если одна из дочерних задач завершается ошибкой, родительская задача завершается ошибкой и возвращает failedTasks вместо успешного агрегированного отчета.
Параметр Число параллельных диапазонов задает количество частей, на которые будет разбит полный диапазон MFN. Значение нужно выбирать с учетом числа доступных рабочих потоков очереди, нагрузки на диск и размера БД. Для очень больших БД не следует задавать число диапазонов намного больше реального параллелизма очереди: лишние задачи увеличат накладные расходы планирования и ожидания.
Время wallSeconds в отчете параллельного режима включает ожидание очереди и polling родительской задачи, поэтому его нельзя напрямую сравнивать с чистым временем выполнения метода провайдера. Для сравнения скорости с irbistool.exe нужно отдельно учитывать время дочерних задач и фактическую доступность worker-потоков очереди.
Команда Состояние -> Диагностика 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.
В отчете возвращаются:
ok - признак отсутствия ошибок;maxMfn - максимальный MFN БД;recordsScanned - число лидеров записей, найденных последовательным проходом MST;xrfScanned - число проверенных записей XRF;offsetMismatches - число расхождений между фактическим смещением MST и ссылкой XRF;missingInMst - число XRF-ссылок на записи, которые не найдены при проходе MST;physDeleted - число XRF-записей с признаком физического удаления;readErrors - ошибки чтения или структуры MST/XRF;reportedErrors - ограниченный список подробных ошибок.repair - признак запуска исправляющего режима;repairedOffsets - число XRF-ссылок, исправленных по MST;markedPhysDeleted - число XRF-записей, помеченных физически удаленными при отсутствии записи в MST;committed / rolledBack - результат транзакции исправляющего режима.Для больших БД метод использует ограниченную бинарную карту MFN -> MST offset, а при превышении лимита переходит на временный файл вместо загрузки карты в оперативную память. Размер временного файла зависит от числа MFN, поэтому на full-size стендах нужно заранее проверить свободное место во временном каталоге. Фрагментированные MST/XRF пока не исправляются и не проверяются полностью: если у БД есть несколько MST-фрагментов, задача возвращает явное ограничение unsupported.
Команда Состояние -> Диагностика записей... в окне Управление БД открывает окно параметров и запускает 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 МБ, запись считается ошибочной и не загружается целиком в память. Полная проверка терабайтной БД может выполняться долго, поэтому запуск должен идти через очередь с прогрессом и последующим анализом файлов отчета.
Команда Состояние -> Диагностика 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-записям и должна запускаться через очередь.
Команда Состояние -> Диагностика 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-запуск через очередь на тестовом стенде завершился успешно; проверка на большой корректной БД остается отдельным этапом.
Для проверки реализации используется 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-запуск через очередь на тестовом стенде завершился успешно.