Почему дефрагментатор необходим?
Подобно другим файловым системам, разделы Informix могут содержать много экстентов, которые являются смежными блоками хранилища. В Informix разделы находятся в пространствах БД. После некоторого времени обновления данных пространство БД может быть сильно фрагментировано и следующий экстент необходимой длины может быть недоступен, тогда будет использован более короткий экстент неоптимальной длины. Поиск длинного экстента во фрагментированном пространстве БД может занять значительное время, т.к. пространство БД может содержать множество маленьких свободных экстентов, которые будут проверяться в ходе поиска; это время может быть существенным. Короткие экстенты заставляют сервер преждевременно останавливаться, в случае операций ввода-вывода над большими блоками (например, во время выполнения облегченного сканирования "light scans"). Кроме того, операции преобразования логических адресов в физические потребляют значительные ресурсы ЦП и время. Для максимальной эффективности, часто используемые таблицы должны иметь как можно меньшее число экстентов. Операции требующие больше времени с короткими экстентами: нахождение экстентов, преобразование логических адресов в физические, "light scans", архивация, опережающее считывание и сброс буферов при создании контрольной точки.
Слияние экстентов для сокращения их числа (дефрагментация) является выгодным для клиентов, имеющих большое количество экстентов в разделах и сталкивающихся с вероятной проблемой переполнения страницы раздела. В Informix 11.70 вводятся страницы с картой переполнения экстентов, таким образом максимальное число экстентов достигает 32767, однако использование страниц с картой переполнения экстентов снижает эффективность.
Пользователи знающие версию 7.3x могут вспомнить утилиту oncheck -me. oncheck -me утилита являлась ограниченной версией дефрагментатора для серверов версии 7.3x, которая имела ряд недостатков. Основной недостаток заключается в том, что для ее работы требовалась эксклюзивная блокировка таблицы. Кроме того, oncheck -me не может восстанавливаться после сбоя сервера. С дефрагментатором версии 11.70 экстенты соединяются пока раздел используется для чтения или обновления данных, а также доступно полное восстановление на случай сбоя. Архивация, чтение и обновление данных может работать параллельно с новым дефрагментатором.
Дефрагментатор соединяет множество коротких экстентов в более длинные в разделе, уменьшая тем самым общее число экстентов в разделе. Если доступен непрерывный экстент подходящего размера, то после завершения работы дефрагментатора, раздел всегда будет иметь один экстент в конце, при том, что вы не добавляли экстенты к разделу во время работы дефрагментатора. Раздел может содержать данные или индексы. Операция дефрагментации - онлайн операция. Дефрагментатор не получает эксклюзивную блокировку в ходе своей работы, поэтому раздел доступен для других операций.
Informix 11.70 также обеспечивает компрессию, переупаковку и уплотнение. Так как же дефрагментатор в версии 11.70 отличается от вышеперечисленных операций?
- Компрессия уменьшает размер хранимых данных, тем самым создавая неиспользованное пространство в разделе.
- Переупаковка перемещает записи из конца раздела в доступное свободное пространство в верхней части раздела.
- Уплотнение освобождает экстенты которые были очищены и возвращены обратно в пространство БД.
Таким образом, компрессия, переупаковка и уплотнение могут уменьшить общее число экстентов в разделе, также как и дефрагментатор. Однако, компрессия, переупаковка и уплотнение оперируют на уровне записей, а дефрагментатор на уровне экстентов.
Когда вызывается дефрагментатор для раздела, вначале выполняется проверка того, что раздел подходящего типа и отсутствуют конфликтующие операции работающие параллельно, такие как компрессия. (Дефрагментатор вернет код ошибки в случае присутствия работающих конфликтующих операций.) Затем выполняется проверка того что дефрагментация действительно необходима. Если в разделе не более одного экстента, то нет возможности выполнить дефрагментацию; в этом случае дефрагментатор завершится успешно без кода ошибки.
Когда операция дефрагментации начинается, в таблице создается запись, см. команду onstat -g defragment. Тогда раздел помечается как "frozen" (другими словами только текущее число экстентов предполагается дефрагментировать). Экстенты добавленные в ходе работы дефрагментатора будут исключены из обработки. Причем на данный момент возможно выполнять только одну операцию дефрагментации над каждым пространством баз данных.
Далее дефрагментатор входит в цикл, в котором, во-первых, пытается найти непрерывное свободное пространство в пространстве баз данных, которое бы вмещало два и более экстентов раздела, и затем закрепляет это место за разделом и после этого перемещает данные из старых экстентов в новый. В идеале должен быть большой непрерывный кусок хранилища который может покрыть все экстенты в разделе. В этом случае результатом будет один единственный экстент. Добавление чанка к пространству баз данных до запуска дефрагментатора может помочь достичь вышесказанного. Если наибольший свободный экстент не покрывает два и более существующих экстента в разделе, то дефрагментатор возвращает код ошибки и завершает свою работу.
Свободное пространство в конце раздела рассматривается как пространство, которое будет использовано дефрагментатором. Если это нежелательно, тогда воспользуйтесь уплотнением перед использованием дефрагментатора.
Как только дефрагментатор находит свободный экстент, который может покрыть два и более экстента раздела, он сразу же перемещает страницы из старого экстента в новый. Дефрагментатор использует буферный пул для перемещения страниц для того чтобы поддерживать данные в целостности относительно других операций. Если дополнительная нагрузка на буферный пул не желательна, тогда лучше запускать дефрагментатор во время отсутствия нагрузки на сервер. После перемещения очередной страницы, раздел доступен для других операций, например, обновление. Время блокировки сведены к минимуму, так что пользователи даже не замечают что выполняется дефрагментация. После перемещения страницы записывается короткая запись в журнал. Когда изначальный экстент очищен полностью, транзакция завершается и перемещение считается завершенным. Транзакции дефрагментатора короткие, соответственно нет вероятности возникновения длинной транзакции. Дефрагментатор не блокирует создание контрольных точек.
Раздел может также содержать пустые страницы, что обычно встречается в конце раздела, но эти страницы не копируются.
При каждом запуске дефрагментатора в online.log записывается соответствующее сообщение.
Сбой в момент работы дефрагментатора вызовет лишь отмену последней транзакции. В большинстве случаев, нет необходимости повторно что-либо выполнять. Дефрагментатор не запускается автоматически после сбоя в работе сервера. Во время процесса быстрого восстановления, все совершенные транзакции выполняются повторно, неполностью совершенные - отменяются, и целостность пространства баз данных восстанавливается. Команда oncheck -ce позволяет убедится в том, что пространство баз данных не содержит так называемых "дырок", т.е. неиспользованных мест между экстентами.
Воспользуйтесь командой oncheck -pt для проверки числа экстентов в разделе после дефрагментации.
Специальные операции с разделами которые конфликтуют с дефрагментатором версии 11.70 включают в себя: компрессию, переупаковку, уплотнение, изменение параметров раздела, создание индекса в режиме онлайн, усечение и удаление раздела. Дефрагментатор не может быть запущен для раздела разделов, на вторичном сервере или для временной таблицы.
Примеры использования дефрагментатора
Дефрагментатор можно запустить используя execute function синтаксис базы данных dbadmin или посредством интерфейса OAT. Указав имя таблицы, все ее фрагменты будут дефрагментированы. Вы также можете указать номер раздела (partnum), в таком случае только этот раздел будет дефрагментирован. В версии 11.70 UC2 и старше, вы можете указать непосредственно имя индекса. В версии 11.70 UC1, вы также можете дефрагментировать индексы, но вам необходимо указать их номер раздела.
Синтаксис execute function доступен из dbaccess, ESQL C или Java программы.
Давайте используем для примера таблицу "sales" из демонстрационной базы данных, которая поставляется вместе с Informix. Вы можете создать эту демонстрационную базу с помощью скрипта dbaccessdemo_ud из каталога sqldist bin. (Дополнительная информация по настройке находится в руководстве пользователя по IBM Informix DB Access) К сожалению, таблицы созданные скриптом dbaccessdemo_ud короткие и иногда имеют всего один экстент. Чтобы посмотреть количество экстентов для данной таблицы воспользуемся командой:
oncheck -pt sales_demo:sales |
Как видно, всего 3 экстента в этой таблице. Если бы был 1 экстент, то дефрагментатор бы ничего не сделал и просто завершил свою работу без ошибок. Например, в результатах выполнения oncheck -pt, должно быть примерно следующее, как показано в листинге 1:
Листинг 1. Список экстентов
Extents
Logical Page Physical Page Size Physical Pages
0 1:186118 8 8
8 1:186132 8 8
16 1:186168 16 16
|
Это означает, что таблица "sales" содержит 3 экстента. Первый экстент длиной 8 страниц начинается на странице 186118. Давайте дефрагментируем этот раздел используя команду dbadmin. В dbaccess выберите базу данных sysadmin и запустите команду:
Листинг 2. Дефрагментация раздела
execute function task ('defragment', 'sales_demo:sales');
или если вы хотите дефрагментировать индекс или один
фрагмент таблицы выполните: execute function task
('defragment partnum', '1049104');
Вы можете найти номер раздела (partnum) в результатах oncheck -pt.
После дефрагментации еще раз выполните команду oncheck -pt,
чтобы проверить количество экстентов раздела.
В этом примере вы должны увидеть один экстент.
Extents Logical Page Physical Page Size Physical Pages
0 1:186184 32 32
|
Как осуществлять мониторинг дефрагментации
Вы можете осуществлять мониторинг дефрагментации с помощью команды onstat -g defragment. Эта команда должна быть выполнена во время работы дефрагментатора с разделом чтобы показать протекание процесса дефрагментации. Поскольку операция дефрагментации может занимать очень небольшой период времени, особенно для небольших таблиц, поэтому информация о ходе выполнения может быть доступна в течение короткого промежутка времени.
Результат выполнения команды выглядит следующим образом:
Листинг 3. Результат выполнения
onstat -g defragment
onstat -g defragment
Defrag info
id table name id dbsnum partnum status substatus errnum
62 test:informix.tab1 55 3 3145730 SEARCHING_FOR_EXTENT 0 0
62 test:informix.tab1 55 3 3145730 MERGING_EXTENTS 0 0
Различные типы статуса: SEARCHING_FOR_EXTENT, MERGING_EXTENTS,
DEFRAG_COMPLETED, DEFRAG_FAILED В случае DEFRAG_FAILED-
возвращается номер ошибки (errnum). Во всех остальных случаях код
ошибки будет 0.
|
Пожалуйста примите во внимание следующие ограничения:
- Одновременно возможна только одна операция дефрагментации раздела.
- Одновременно возможна только одна операция дефрагментации пространства базы данных.
- Операция дефрагментации прерывается, если хотя бы одна из следующих операций над разделом уже выполняется:
- Усечение
- Удаление
- Компрессия, переупаковка, уплотнение
- Распаковка
- Построение индекса в режиме онлайн
- Обновление
Сервер Informix 11.70 содержит полный набор инструментов, работающих совместно для оптимизации использования хранилища и обеспечивающих наилучшую эффективность доступа. Эти инструменты включают в себя: компрессию, упаковку, уплотнение и дефрагментацию. Дефрагментатор является одним компонентом из этого набора и в частности полезен для перемещение разделов в частообновляемых пространствах баз данных. Если таблица часто и много обновляется, то вам необходимо принять решение о ее периодической дефрагментации.
Научиться
-
Оригинал статьи: "Understand the Informix Server V11.7 defragmenter" (EN).
- Информационный центр IBM Informix 11.70: Узнайте больше о последней версии Informix (EN)
- Страница Informix на сайте developerWorks: Узнайте больше об Informix и улучшите свои навыки. (EN)
- Оставайтесь в курсе developerWorks технические события и вэб-трансляции. (EN)
Получить продукты и технологии
- Создайте свой следующий проект с использованием пробного программного обеспечения IBM, доступного для загрузки непосредственно с developerWorks. (EN)
Обсудить
- Примите участие в обсуждении материала на форуме.
- Участвуйте в блогах developerWorks и вступайте в Моё сообщество на developerWorks; со своим собственным профилем и пользовательской домашней страницей, вы можете приспособить developerWorks для своих интересов и взаимодействовать с другими пользователями developerWorks. (EN)

