Выбрать главу

Удаленный доступ

Передает имя пользователя для доступа к базе данных. Для большинства операций gfix это должен быть пользователь SYSDBA, владелец базы данных или (для POSIX) пользователь с привилегиями root

-v[alidate]

Починка данных

Определяет и освобождает страницы, которые были выделены, ко не назначены никакой структуре данных. Также сообщает о разрушенных структурах

-w[rite] {sync | async}

Forced Writes

Включает или отключает Forced Writes (синхронную буферизованную запись), sync включает, async отключает

-z

Информация

Выводит версию gfix и сервера Firebird

Сообщения об ошибках gfix

В табл. 39.2 представлены исключения, которые могут появиться в командах gfix вместе с советами, как скорректировать ваши команды.

Таблица 39.2. Сообщения об ошибках gfix

Сообщение об ошибке

Причины и рекомендуемые действия

Database file name <string> already given (Имя файла базы данных <строка> уже указано)

Режим командной строки был интерпретирован как файл базы данных, потому что режим не начинался со знака минус (-) или наклонной черты (/). Исправьте синтаксис

Invalid switch (Неверный переключатель)

Режим командной строки не был распознан

Incompatible switch combinations (Несовместимая комбинация переключателей)

Вы задали, по меньшей мере, два режима, которые не работают вместе, либо вы указали режим, который не имеет смысла без другого режима (например, -full)

More limbo transactions than fit. Try again.

(Зависших транзакций больше допустимого. Попытайтесь снова.)

База данных содержит больше зависших транзакций, чем gfix может вывести в одной сессии. Подтвердите или отмените некоторые из зависших транзакций, а затем снова выполните операцию

Numeric value required (Требуется числовое значение)

Режим -housekeeping требует одного неотрицательного аргумента, задающего количество транзакций для чистки

Please retry, specifying <string> (Пожалуйста, повторите, задав <строка>)

Должно быть задано имя файла и по меньшей мере один режим

Transaction number or "all" required (Требуется номер транзакции или "all")

Вы указали -commit, -rollback или -two_phase без задания требуемого аргумента

-mode read only or read write -mode read only или read write

Режим -mode принимает в качестве переключателя read only или read write

"read_only" or "read_write" required (Требуется "read only" или "read write")

Режим -mode должен сопровождаться одним из этих аргументов

Пора дальше

В конце этой книги глава 40 представляет техническое описание наименее дружественной для пользователя утилиты Lock Print, а также подсистему блокировки ресурсов. Она включает объяснения связанных с блокировками установок в firebird.conf или isc config/ibconfig, которые иначе могли бы остаться для большинства из нас большой загадкой!

ГЛАВА 40. Менеджер блокировок.

Блокировки используются в многопользовательских средах для синхронизации работы и предотвращения разрушения целостности процессов работой других процессов. Firebird использует как средства блокировки операционной системы, так и собственный менеджер блокировок для координации доступа к базе данных.

Эта тема сложна для читателя, который является новичком в Firebird. Она погружает его в некоторые серьезные технические области, с которыми знакомят гуру[158] с блестящими глазами на конференциях. Пока утилиты Lock Print - довольно сырые сейчас- являются серьезным инструментом для сложных задач поиска ошибок при подходах, которые некоторые разработчики применяют в их интерфейсах приложений. В любом случае примите эту главу как возможный запасной вариант, который может спасти вас в один "прекрасный" день.

Вы можете спросить, почему мы должны интересоваться системой блокировки, которая ничего не блокирует? Параллельность и согласованность, видимые клиентам, основываются на транзакциях и управляются через версии записей. Однако ответ в том, что Firebird использует блокировки внутренне. Он поддерживает согласованность структуры на диске через блокировки и осторожную запись. В то же время он также использует сервисы блокировок операционной системы для управления доступом к файлам базы данных для предотвращения открытия Суперсервером дважды одного и того же файла под разными именами.

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

Firebird остерегается двухфазной блокировки для своего первичного управления параллельностью, поскольку она не может обеспечить адекватных уровней параллельности и соответствия, Firebird использует блокировки в процессе изменений для предотвращения записи двумя транзакциями на одну и ту же страницу в одно и то же время. Внутренняя блокировка управляется самой системой. Объекты в системе - называемые "владельцами блокировки" или просто "владельцами" - состязаются в блокировке множества ресурсов. Не удивительно, что эти ресурсы включают в себя и страницы, содержащие записи, отмеченные для обновления.

Когда транзакция получает блокировку страницы, она сохраняет эту блокировку, пока Менеджер блокировок не попросит ее освободить страницу; следовательно, транзакция может выполнить множество изменений на одной странице без ее освобождения и повторного чтения.

Менеджер блокировок Firebird

В Суперсервере о Менеджере блокировок можно думать как об отдельном "управляющем центре", с которым договариваются транзакции о приобретении прав на выполнение запросов. Менеджер блокировок включает в себя фрагмент памяти и некоторые подпрограммы для обработки запросов. Его память разделена на различные блоки: блоки блокировок, которые ссылаются на ресурсы; другие блоки, которые представляют транзакции и другие объекты, запрашивающие блокировки, и блоки истории. Его подпрограммы ответственны за получение и управление запросами владельцев на блокировки ресурсов, выделение блоков и их освобождение. Суперсервер также управляет "защелками" для координации изменений в параллельных транзакциях.

Классический сервер проще: владельцы запрашивают получение контроля над таблицей блокировок, так что каждый код процесса управления блокировкой может запрашивать, предоставлять и освобождать блокировки для их владельцев.

Состояния блока

Каждая операционная система предоставляет некий вид механизма использования/освобождения для синхронизации событий ресурсов. Поскольку для Firebird нужен управляющий механизм с множеством состояний, он реализует свою собственную систему управления блокировками с семью состояниями. На рис. 40.1 показано решение уровней блокировок.

* 0 - свободно (no lock).

* 1 - пустая блокировка (null lock), что соответствует интересу объекта, не накладывающего ограничений в использовании другими. Запрос пустой блокировки позволяет транзакции читать заблокированные данные.

* 2 - разделяемое чтение (shared read), что позволяет записывать. Разделяемое чтение является обычным режимом для блокировки таблицы, когда транзакция изменяет некоторые части таблицы.

* 3 - защищенное чтение (protected read), что позволяет другим читать, но не писать. Защищенное чтение является обычным режимом для блокировки страницы базы данных, которая находится в кэше и не была изменена.

вернуться

158

Для понимания темы Lock Print с благодарностью и признательностью отправляемся к Ann Harrison. Она была первой, кто подробно документировал этот полезный, но слабо освещенный инструмент поиска неисправностей, в официальном документе, написанный Ann для IBPhoenix. "Reading a Lock Print" можно найти в разделе документации на http://www.ibphoenix.com.