четверг, 22 декабря 2011 г.

OAT Health Advisor

В Informix OpenAdminTool появился модуль HealthAdvisor, который позволяет производить мониторинг сервера баз данных и отправляет уведомления если происходят определенные события. Кроме того сам OAT теперь включен в ClientSDK и его не надо скачивать отдельно!
Данная статья сопровождается картинками, но я не знаю как сделать чтобы при нажатии на картинку появлялось увеличенное изображение. Поэтому пока оставляю так как есть.
HealthAdvisor конфигурируется для каждого экземпляра Informix отдельно. Всего для конфигурации представлено 4 вкладки:

Конфигурация HealthAdvisor Profile
На вкладке Profile отображаются доступные профили. Всегда есть профиль default, можно добавить свои профили, которые настраиваются.


Health Advisor Alarms
На вкладке Alarms можно просмотреть предупреждения, которые сгруппированы по категориям. Порог для каждого предупреждения можно сконфигурировать, а само предупреждение можно отключить.


Health Advisor Schedule

Вкладка Shedule позволяет настроить расписание запуска задачи для данного профиля. Не забыть поставить флажок "Enable Task".


Health Advisor Notification
На вкладке Notification конфигурируются почтовые адреса для отправки уведомлений и уровни оповещения (поле When).
Также указана команда (почтовый клиент) которая будет срабатывать на сервере где находится экземпляр Informix при отправке оповещения. Если у вас Informix находится на Windows, то возможно придется изменить эту команду.
Отдельно надо обратить внимание на поле заголовка (subject) письма: гораздо удобнее будет если сделать его как '$INFORMIXSERVER [SUBJECT]' подставив вместо $INFORMIXSERVER имя экземпляра Informix. Тогда в почтовом клиенте будет сразу видно от какого сервера пришло письмо, если у вас их несколько.
Можно сделать рассылку одновременно нескольким адресатам, либо через перечисление адресов в поле "To" на вкладке Notification, или указать адресата informix, а список адресов сделать через файл /home/informix/.forward по одному адресу в каждой строке файла.

После того как Health Advisor настроен, жмем кнопку Run Health Advisor. Здесь есть небольшой баг: время ожидания работы скрипта может быть превышено, и после запуска может появится сообщение об таймауте. Если такое происходит, надо увеличить параметр max_execution_time в файле %PATH_TO_OAT%\PHP_5.2.4\php.ini (этот файл находится на сервере где установлен OAT), например сделать 120 секунд.

четверг, 1 декабря 2011 г.

Мониторинг свободного пространства в dbspace

Всем хорош мониторинг состояния сервера с помощью alarmprogram.sh, но он к сожалению не позволяет устанавливать пороги оповещения о свободном пространстве в dbspace. Параметр STORAGE_FULL_ALARM позволяет задать уровень оповещения и срабатывание когда dbspace оказывается уже полностью занят.
Написал небольшую процедуру на SPL с помощью которой можно осуществлять мониторинг свободного пространства в dbspace. Пороги срабатывания задаются для каждого dbspace отдельно. При уменьшении размера свободного места ниже установленного порога, процедура в момент очередного запуска обнаруживает это и высылает email с подробной информацией. Для работы необходимо наличие на сервере клиента mailx. Думаю что не проблема переписать процедуру если почтовый клиент другой.

Исходный код проекта как выложил на GoogleCode проект idsmon.

Установка:
- зайти на сайт проекта и скачать исходный код процедуры и таблицы
- создать в базе sysadmin таблицу и заполнить ее значениями alarm levels для каждого dbspace;
- создать в базе sysadmin процедуру проверки и оповещения;
- создать в планировщике informix расписание для запуска процедуры;

Схема работы:



Процедура протестирована и работает на версии 11.50.UC8. В ней используется тип row, поэтому думаю что будет работать и с предыдущими версиями, где есть данный тип. Конечно должна работать и на более новых версиях :)
Расписание запуска процедуры можно установить например 1 раз в каждые полчаса.

суббота, 26 ноября 2011 г.

MSL готовится к старту на Марс

Через полчаса произойдет историческое событие - старт миссии MSL на Марс. Прямую трансляцию можно смотреть здесь.

среда, 23 ноября 2011 г.

Informix SPL и тип запись

Прдолжение истории. Вкратце: в SPL (язык для создания хранимых процедур) приходится работать с многими полями из таблицы, или вообще со всей записью целиком. Это не проблема если в таблице немного полей, но если полей много - возможны ошибки, как синтаксические так и чисто логические. В некоторых СУБД можно объявлять переменную типа запись, основанную на записи таблицы, и работать с этой переменной (и отдельными полями из нее), например так:


define
  row_emp employees%rowtype;
...
  select * into row_emp from employees  where employee_id = Val1;
...
  insert into employees values row_emp
...

Причем тип row который есть в Informix, таких фокусов не допускает. Т.е. в нем можно обращаться к отдельным полям через точечную нотацию, но например выбрать всю запись из таблицы в переменную без перечисления отдельных полей не получится. Точно также не работает вставка в таблицу из переменной типа row без указания каждого поля. А еще при объявлении такого типа приходится указывать все поля, что ничуть не способствует сокращению размеров кода. 
Пообщался с техподдержкой, сказал что хочу такой синтаксис в SPL, что упрощает разработку процедур, уменьшает вероятность появления ошибок в коде, и вообще это удобно. Человек из техподдержки написал мне, что создаст запрос (видимо выше) для реализации новой функциональности. Может набраться наглости и попросить чтобы сделали реализацию PL/SQL в Informix ? :)

среда, 14 сентября 2011 г.

Защита данных при обновлении на новую версию

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

За использование этой возможности отвечают два параметра конфигурации: CONVERSION_GUARD (режимы работы) и RESTORE_POINT_DIR (расположение создаваемых при обновлении данных для быстрого отката).

По умолчанию в onconfig.std параметр CONVERSION_GUARD установлен в значение 2, что означает продолжить конвертацию даже в случае ошибки создания данных точки восстановления. В документации же указано значение по умолчанию 1, т.е. остановить конвертацию на новую версию в случае ошибки создания данных точки восстановления. Из-за таких нестыковок лучше выставить этот параметр в onconfig явно, причем в значение 1. Для параметра RESTORE_POINT_DIR следует выбрать каталог на ФС с достаточным кол-вом свободного места. Например, при обновлении с 11.50.FC5 до 11.50.FC8 было использовано примерно 500Мб для данных восстановления. Но эта цифра может зависеть от различных факторов.

четверг, 21 июля 2011 г.

Установка Informix 11.50 Innovator Edition на Linux

Если при запуске инсталлятора Informix 11.50 Innovator Edition на Linux в консольном режиме получаете ошибку

The wizard cannot continue because of the following error: could not load wizard specified in /wizard.inf (104)

можно попробовать в параметрах запуска инсталлятора указать флаг -javahome и в качестве значения путь к установленной Java Runtime Environment.

четверг, 24 марта 2011 г.

truncate и delete: что лучше и когда использовать


Когда требуется полностью удалить все данные из таблицы, прибегают к оператору delete. Его можно использовать в транзакции. Но если данных в таблице много то их удаление может занять продолжительное время, поскольку удаление каждой записи будет записываться в журнал транзакций. Кроме того, место занимаемое таблицей на диске, не будет освобождено: оно останется занято пустыми экстентами таблицы.
На помощь приходит оператор truncate. Он не записывает в журнал транзакций удаление каждой записи, выполняет удаление всех данных из таблицы практически моментально, и для него можно указать освободить занимаемое таблицей место на диске, или оставить с помощью опций drop storage или reuse storage. Однако минусом использования truncate является то что если в транзакции после truncate попытаться выполнить другие действия то получим ошибку: 26021: No operations allowed after truncate in a transaction. Т.е. truncate должен быть либо последним оператором в транзакции, либо выполнятся вне блока транзакции begin ... commit.

понедельник, 21 марта 2011 г.

Статистика на уровне фрагментов и не только

Есть настолько очевидные вещи, 
что иногда удивляешься, 
почему их сделали 
совсем недавно

Как то я писал, что при работе с фрагментированными таблицами статистика обновляется целиком на всю таблицу. Получается что сервер делает лишнюю работу, если например новые данные добавляются в новые фрагменты, а старые данные, которые находятся в старых фрагментах не меняются. Если схема работы с данными в таблице такова, что данные добавляются и изменяются только в новом фрагменте, то в этом случае ясно, что статистика будет менятся только для этого фрагмента, а для старых фрагментов статистика не меняется. И вот в версии 11.70xC1 сделали статистику на уровне фрагментов. Для использования этой возможности надо при создании таблицы указать опцию STATLEVEL FRAGMENT. Непонятно только как делать обновление статистики по такой таблице, поскольку в UPDATE STATISTICS я не нашел как указывать что статистику надо обновлять на фрагмент. Возможно это делается автоматически, т.е. определяется процент измененных данных во фрагменте и после этого обновляется статистика по фрагментам где было много измененных данных.
Кстати сам процент изменений при которых статистика будет считаться устаревшей на таблице, можно определить при создании таблицы с помощью опции STATCHANGE (действует на уровне экземпляра и на уровне таблицы), и при запуске UPDATE STATISTICS AUTO статистика будет обновляться только для таблиц у которых она устарела. Это свойство относится не только к фрагментированным таблицам. Процент изменений по умолчанию равен 10, но его можно изменить при создании таблицы.

среда, 9 марта 2011 г.

Управляй дисками в Informix легко

В Информиксе начиная с версии 11.70 можно автоматизировать управление дисковым пространством. Теперь можно сконфигурировать Informix на автоматическое изменение размеров чанков или пространств данных, причем дисковое пространство будет браться из одного или нескольких заранее определенных дисковых пулов (storage pool). Чанки для которых разрешено автоматическое расширение, имеют в статусе флагов в 5-й позиции букву E (expanded ?), а для автоматических dbspace в поле flags в 5-й позиции будет стоять буква A (Automatic ?). Дисковый пул (их может быть несколько) может состоять из файлов, сырых устройств или каталогов, для него можно задавать приоритет по которому будет выделятся первоочередной пул.

По умолчанию все dbspace являются автоматически расширяемыми, за это отвечает параметр конфигурации сервера SP_AUTOEXPAND. Также можно настроить тип автоматического расширения: проактивный, при котором пространства расширяются заранее или реактивный, при котором расширение происходит только после полного заполнения пространства с данными, см. параметр SP_THRESHOLD. Эти два параметра действуют на уровне экземпляра Informix.
Также настраивается размер автоматически создаваемого чанка (параметр create size) и размер расширения (параметр extend size). Эти параметры действуют на уровне отдельного dbspace.

Для примера создадим дисковый пул размером 1 Gb в каталоге на файловой системе, размер каждого выделяемого чанка в нем сделаем 100 Мб, и приоритет пула 1:

execute function sysadmin:task('storagepool add', '/datafs/informixdata/storagepool/', '0 MB', '1 GB', '100 MB', '1');

Кстати для каталогов нельзя задать максимальный размер пула, если задать отличный от 0 размер то будет выдана ошибка.

Затем создадим dbspace размером 100 Мб и размером страницы 4 Кб который возьмет место для себя из этого пула:

execute function sysadmin:task ('create dbspace from storagepool', 'testdbs', '100 MB', 4, 0);

Посмотреть какие дисковые пулы есть в Informix можно в таблице sysadmin:storagepool

Более подробно об автоматизации управления дисками можно прочитать в этой статье на сайте developerWorks.
Также см. документацию