Шрифт:
Мониторинг состояния сервера
Любители исследовать исходный код InterBase б часто говорят, что в нем скрыта масса интереснейших идей, которые были не доведены до конца по каким-либо причинам. Одной из таких идей, извлеченных и реализованных в InterBase 7, является мониторинг внутреннего состояния сервера.
В InterBase предыдущих версий сервер производил постоянный мониторинг своего состояния — отслеживал выполняющиеся запросы, подключенных пользователей и т. д. Но все эти данные были для внутреннего использования - пользователи не могли получить к ним доступ. Теперь ситуация изменилась - в InteiBase 7 появился удобный интерфейс для доступа к данным о мгновенном состоянии сервера.
InterBase 7 предоставляет механизм "временных системных таблиц" для доступа к данным о своем состоянии. Не надо путать эти временные таблицы с временными таблицами в других СУБД, которые используются для оптимизации выполнения SQL-запросов.
В данном случае временные системные таблицы лишь представление мгновенного снимка состояния сервера и баз данных. Чтобы избавить разработчиков приложений баз данных от необходимости использовать специальные вызовы API для получения (и даже изменения') информации о состоянии сервера, в семерке создан SQL-интерфейс для этих целей. Не правда ли, очень удобно - формируете стандартными средствами SQL-запрос и получаете нужную статистику в виде привычного набора данных.
Выполняя запросы к временным таблицам, можно получить свежие (на момент выполнения запроса) данные о том, какие запросы выполняет конкретный подключенный пользователь, какие таблицы использует Чтобы обновить полученные данные, надо подтвердить транзакцию, в рамках которой выполнялся запрос к временным системным таблицам, и выполнить запрос снова.
Можно также узнать, какие запросы в данный момент выполняются на сервере и какой из этих запросов самый длительный. Помимо этого, существует еще множество видов информации, которую можно извлечь из системных таблиц.
Вот список временных системных таблиц для мониторинга в InterBase 7 с краткими описаниями, взятый с сайта www.ibase.ru:
Табл 2. Системные таблицы для мониторинга в InterBase 7
Доступные системные временные таблицы | |
Название таблицы | Что содержит |
TMPSATTACHMENTS | По записи на каждое соединение к базе данных |
TMP$DATABASE | По записи на каждую базу данных, к которой вы подсоединились |
TMP$POOL_BLOCKS | По записи на каждый блок памяти в каждом пуле |
TMP$POOLS | По записи на каждый пул памяти |
TMP$PROCEDURES | По записи на каждую выполненную в данном соединении процедуру |
TMP$RELATIONS | По записи на каждую таблицу, к которой было обращение в данном соединении |
TMPSSTATEMENTS | По записи на каждый выполняемый в данный момент запрос, для всех соединений |
TMP$TRANSACTIONS | По записи на каждую активную (или в состоянии limbo) транзакцию |
Модификация системных таблиц
Помимо чтения статистики, есть ряд случаев, когда системные таблицы можно менять! Прежде всего, это тот важный случай, когда необходимо снять очень длительный, зависший запрос.
Чтобы влиять на состояние запросов, транзакций, соединений и т.д., нужно изменить столбец TMP$STATE в соответствующей временной системной таблице. Например, вы можете произвести следующие изменения:
* Отключить соединение.
UPDATE TMP$ATTACHMENTS SET TMP$STATE = 'SHUTDOWN' WHERE (TMP$ATTACHMENT_ID = 12345)
* Принудительно отменить активную в данный момент или "застрявшую" 2РС (т. е. в состоянии in limbo) транзакцию.
UPDATE TMP$TRANSACTION SET TMP$STATE = 'ROLLBACK' WHERE (TMP$TRANSACTION_ID = 12345)
* Остановить выполняемый в данный момент запрос.
UPDATE TMP$STATEMENTS
SET TMP$STATE = 'CANCEL'
WHERE (TMP$STATEMENT_ID = 12345)
Примеры получения статистики
Примерами использования системных таблиц для получения полезной статистики могут являться следующие запросы:
* 10 самых длительно выполняющихся запросов.
SELECT a.tmp$user, s.tmp$timestamp/ s.tmp$sql, s.tmp$quantum
FROM tmp$statements s, tmp$attachments a
WHERE a.tmp$attachment_id = s.tmp$attachment_id
ORDER BY s.tmp$quantum DESC
ROWS 10;
* Активность пользователя SYSDBA.
SELECT TMP$USER, TMP$USER_IP_ADDR,
TMP$TIMESTAMP, TMP$STATE, TMP$TRANSACT10NS, TMP$RECORD_SELECTS, TMP$RECORD_INSERTS,
TMP$RECORD_UPDATES, TMP$RECORD_DELETES FROM TMP$ATTACHMENTS WHERE TMP$USER = 'SYSDBA'
Безопасность временных таблиц
Чтобы предотвратить возможность использования мощных возможностей временных таблиц в неблаговидных целях, на них введены ограничения прав доступа - по умолчанию таблицы видимы и могут изменяться только владельцем базы данных или SYSDBA. В случае необходимости можно выдать права на чтение (и только на чтение) для других пользователей - обычным образом, с помощью оператора GRANT и отобрать их с помощью REVOKE.