Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Здесь nnnnnn - идентификатор транзакции.
Теневые копии
Концепция, создание и поддержка теневых копий базы данных подробно обсуждались в главе 15. Утилита gfix имеет средства для работы с теневыми копиями.
Активизация теневой копии
Ключ для активизации теневой копии, когда база данных "умерла", -ac[tivate]. Синтаксис:
gfix -ас <путь-к-первому-тому-оперативном-копии>
Предположим, что первым томом теневой копии является employee.shl. Находится в каталоге /opt/dbshadows. Вы можете активизировать ее следующей командой:
./gfix -ас /opt/dbshadows/employee.shl
Удаление недоступных теневых копий
Переключатель для удаления недоступных теневых копий -k[ill]. Синтаксис:
gfix -k[ill] база-данных
Для удаления недоступных теневых копий для базы данных employee.fdb введите:
./gfix -k /opt/firebird/examples/employee.fdb
Список переключателей gfix
Все доступные переключатели gfix описаны в табл. 39.1. Часто для одной задачи применимо несколько переключателей. Порядок переключателей не является важным, однако просмотрите предыдущие замечания в этой главе для определения подходящих комбинаций. Комбинации, не имеющие логического смысла, приведут к исключениям.
Таблица 39.1. Список переключателей gfix
Переключатель | Задача | Назначение |
– | файл-оперативной-копии | Оперативная копия |
Используется с путем к первичному файлу оперативной копии для активизации оперативного копирования | – at[tach] | Закрытие базы данных |
Используется с -shut для предотвращения новых подключений к базе данных за период времени ожидания в n секунд. Закрытие будет отменено, если все еще будут оставаться активные соединения по прошествии n секунд | – b[uffers] n | Буферы кэша |
Устанавливает размер буферов кэша базы данных по умолчанию в n страниц. Это рекомендованный способ установки размера кэша базы данных по умолчанию | – ca[che] n | Не используется |
– c[ommit] {ID | all} | Восстановление транзакций | |
Подтверждает зависшую транзакцию с идентификатором ID или подтверждает все зависшие транзакции | – f[orce] n | Закрытие базы данных |
Используется вместе с -shut для форсированного закрытия базы данных через n секунд - радикальное решение, которое должно быть использовано как последнее средство | – full | Починка данных |
Используется вместе с -v[alidate] для проверки структур записей и страниц; освобождает неназначенные фрагменты записей | – h[ousekeeping] | Чистка |
Изменяет порог автоматической чистки в n транзакций. Значение по умолчанию 20 000. Устанавливайте n в 0 для отключения автоматической чистки | – i[gnore] | Починка данных |
Игнорировать ошибки контрольных сумм при проверке или чистке | – k[ill] база-данных | Теневая копия |
Используется вместе с путем к файлу базы данных для уничтожения всех неиспользуемых теневых копий | – l[ist] | Восстановление транзакций |
Отображает идентификаторы всех зависших транзакций и указывает, что должно произойти, если будет задано -t [wo_phase] при автоматическом двухфазном подтверждении | – m[end] | Починка данных |
Отмечает разрушенные записи как неиспользуемые, следовательно, они будут пропущены при последующей проверке или копировании | – n[o update] | Починка данных |
Используется вместе с -v[alidate] для проверки разрушенных или неразмещенных структур, сообщая о них, но не исправляя их | – o[nline] | Закрытие базы данных |
Отменяет операцию -shut, которая была в списке, или отменяет выполняющееся в настоящий момент закрытие базы данных | – pa[ssword] пароль | Удаленный доступ |
Передает пароль для доступа к базе данных. Для большинства операций gfix это должен быть пароль пользователя SYSDBA, владельца базы данных или (для POSIX) пользователя с привилегиями root | – p[rompt] | Восстановление транзакций |
Используется вместе с -l[ist] для перехода в режим подсказок во время восстановления транзакций | – r[ollback] {ID | all} | Восстановление транзакций |
Выполняет откат зависшей транзакции с идентификатором ID или выполняет откат всех зависших транзакций | – s[weep] | Чистка |
Запускает немедленную чистку базы данных | – sh[ut] | Закрытие базы данных |
Закрывает базу данных. Требует указания | – at[ach], -f[orce], или -tr[an] n | – sql[dialect] n |
Миграция | n = 3. Изменяет SQL диалект базы данных с 1 на 3. Не изменяет данные и не преобразует существующие типы данных | – t[wo_phase] {ID | all} |
Восстановление транзакций | Выполняет автоматическое двухфазное восстановление либо транзакции с указанным идентификатором ID, либо всех зависших транзакций | Назначение |
– tr[an] n | Закрытие базы данных | Используется вместе с -shut для запрета запуска новых транзакций в процессе ожидания n секунд. Закрытие будет отменено, если все еще будут активные транзакции по прошествии n секунд |
– use {reserve | full} | Использование всего пространства | Включает или отключает использование полного пространства, отведенного для страниц базы данных. Режим по умолчанию reserve использует 80-процентное заполнение. При переключении на full будет использоваться все выделенное пространство |
– user пользователь | Удаленный доступ | Передает имя пользователя для доступа к базе данных. Для большинства операций gfix это должен быть пользователь SYSDBA, владелец базы данных или (для POSIX) пользователь с привилегиями root |
– v[alidate] | Починка данных | Определяет и освобождает страницы, которые были выделены, ко не назначены никакой структуре данных. Также сообщает о разрушенных структурах |
– w[rite] {sync | async} | Forced Writes | Включает или отключает Forced Writes (синхронную буферизованную запись), sync |
– 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 - довольно сырые сейчас- являются серьезным инструментом для сложных задач поиска ошибок при подходах, которые некоторые разработчики применяют в их интерфейсах приложений. В любом случае примите эту главу как возможный запасной вариант, который может спасти вас в один "прекрасный" день.
158
Для понимания темы Lock Print с благодарностью и признательностью отправляемся к Ann Harrison. Она была первой, кто подробно документировал этот полезный, но слабо освещенный инструмент поиска неисправностей, в официальном документе, написанный Ann для IBPhoenix. "Reading a Lock Print" можно найти в разделе документации на http://www.ibphoenix.com.
Вы можете спросить, почему мы должны интересоваться системой блокировки, которая ничего не блокирует? Параллельность и согласованность, видимые клиентам, основываются на транзакциях и управляются через версии записей. Однако ответ в том, что Firebird использует блокировки внутренне. Он поддерживает согласованность структуры на диске через блокировки и осторожную запись. В то же время он также использует сервисы блокировок операционной системы для управления доступом к файлам базы данных для предотвращения открытия Суперсервером дважды одного и того же файла под разными именами.
Блокировка, основанная на транзакциях, позволяет осуществлять блокировки в любой точке выполнения транзакции. Однако, однажды установленные, они могут быть сняты только в конце. Даже явная блокировка на уровне оператора, введенная в Firebird 1.5, не имеет "разблокирующего" оператора. Операторы выполняются в обычной транзакции; подтверждение или откат транзакции снимает блокировку как обычно.
Firebird остерегается двухфазной блокировки для своего первичного управления параллельностью, поскольку она не может обеспечить адекватных уровней параллельности и соответствия, Firebird использует блокировки в процессе изменений для предотвращения записи двумя транзакциями на одну и ту же страницу в одно и то же время. Внутренняя блокировка управляется самой системой. Объекты в системе - называемые "владельцами блокировки" или просто "владельцами" - состязаются в блокировке множества ресурсов. Не удивительно, что эти ресурсы включают в себя и страницы, содержащие записи, отмеченные для обновления.
Когда транзакция получает блокировку страницы, она сохраняет эту блокировку, пока Менеджер блокировок не попросит ее освободить страницу; следовательно, транзакция может выполнить множество изменений на одной странице без ее освобождения и повторного чтения.
Менеджер блокировок Firebird
В Суперсервере о Менеджере блокировок можно думать как об отдельном "управляющем центре", с которым договариваются транзакции о приобретении прав на выполнение запросов. Менеджер блокировок включает в себя фрагмент памяти и некоторые подпрограммы для обработки запросов. Его память разделена на различные блоки: блоки блокировок, которые ссылаются на ресурсы; другие блоки, которые представляют транзакции и другие объекты, запрашивающие блокировки, и блоки истории. Его подпрограммы ответственны за получение и управление запросами владельцев на блокировки ресурсов, выделение блоков и их освобождение. Суперсервер также управляет "защелками" для координации изменений в параллельных транзакциях.
Классический сервер проще: владельцы запрашивают получение контроля над таблицей блокировок, так что каждый код процесса управления блокировкой может запрашивать, предоставлять и освобождать блокировки для их владельцев.
Состояния блока
Каждая операционная система предоставляет некий вид механизма использования/освобождения для синхронизации событий ресурсов. Поскольку для Firebird нужен управляющий механизм с множеством состояний, он реализует свою собственную систему управления блокировками с семью состояниями. На рис. 40.1 показано решение уровней блокировок.