Perl для системного администрирования

       

Наблюдение за свободным пространством



Наблюдение за свободным пространством

Если на мгновение вникнуть в технические тонкости, то сервер баз данных - это место для хранения разного добра. И если места для его хранения не остается, то это либо плохо, либо очень плохо. Так что программы, помогающие следить за свободным и занятым пространством на сервере, действительно очень полезны. Посмотрим на DBI-программу, созданную для наблюдения за дисковым пространством на сервере Sybase.

Вот отрывок вывода программы, которая в графическом виде показывает, как любая база данных использует место на сервере. В каждом разделе отражено, сколько процентов пространства занято данными и журналом. В следующей диаграмме d соответствует пространству, занятому данными, а 1 - журналам. Для каждой диаграммы указан объем занятого и доступного пространства (в процентах):

| ddddddd |15.23%/5MB

hpotter--------1 |

| |0.90%/5МВ

| ddddddd |15.23%/5MB

dumbledore-----1 |

| |1.52%/5МВ

(dddddddd |16.48%/5MB

hgranger------- |

| |1.52%/5МВ

Iddddddd |15.23%/5MB

rweasley-------1



1 |3.40%/5МВ

(ddddddddddddddddddddddddddd |54.39%/2MB hagrid---------1 |

I - no log I

Вот как генерировался этот вывод:

use DBI;

Sad.Tiin = 'sa':

print "Введите паролэ дл? $adn:r-:

cho'iip($ow = <'STOIN,.-).

$dbh = DBI->connect('dbi:Sybase:',$admin,$pw);

die "Невозможно соединиться: $DBI::errstr\n" unless (defined $dbh);

ft получаем имена баз данных на сервере

$sth = $dbh->prepare(q{SELECT name from sysdatabases}) or

die "Невозможно подготовить запрос к sysdatabases: ".$abh->errstr."\n": $sth->execute or

die "Невозможно выполнить запрос к sysdatabases: ".$dbh->errstr. "\n":

while ($aref = $sth->fetchrow_arrayref) { push(@dbs, $aref->[0]);

}

$sth->finish;

tt

получаем состояние для каждой из баз данных foreach $db (@dbs) {

ff получаем и суммируем значения из поля size для всех

ft сегментов, не относящихся к журналам регистрации

$size = &querysum(qq{SELECT size FROM master.dbo.sysusages

WHERE dbid = db_id(\'$db\')

AND segmap != 4});

ft получаем и суммируем значения из поля size для сегмента,

ft соответствующего журналам регистрации $logsize = &querysum(qq

{SELECT size FROM master.dbo.sysusages

WHERE dbid = db_id(\'$db\')

AND segmap =4}):

ft переходим к другой базе данных и получаем информацию об

ft используемом пространстве $dbh->do(q{use $db}) or

die "Невозможно изменить базу данных на $db: ".$dbh->errstr."\n":

ft мы использовали функцию reserved_pgs, чтобы вернуть

ft количество страниц, используемых под данные (doampg) и

индекс (ioampg)

$used=&querysum(q{SELECT reserved_pgs(id,doampg)+reserved_pgs(id.ioampg)

FROM sysindexes

WHERE id != 8});

ft то же самое, только на этот раз получаем информацию по

ft журналам регистрации

$logused=&querysum(q{SELECT reserved_pgs(id, doampg)

FROM sysindexes

WHERE id=8}):

ft выводим информацию в графическом виде

&graph($do,Ssize,Slogsize,$used,Slogused): } $dbh->disconnect:

ft готовим/выполняем запрос SELECT, получаем сумму результатов sub querysum

{

my($query) = shift; rm/($sth $aref, Ison);

$sth = $dbh->prepare($query) or

die "Невозможно подготовить запрос $que-~, .

Sdbn- -errstr.

$sth->execute or

die "Невозможно выполнить запрос Sqjery ".

while ($aref=$stn->fetcnrow_arrayref) {

$sum += $aref->[0]: } $sth->finish;

$sum; }

# выводим в виде диаграммы имя базы данных, ее размер, размер журнала

регистрации и информацию об использовании пространства sub graph

{

my($dbname,Ssize,Slogsize,Sused,Slogused) = @_;

в строка для информации об использовании пространства данными

tt

использованное пространство и общий обьем, отведенный под данные

printf("%.2f", ($used/$size-100)V,

print "%/". (($size * $pages)/1024)."MB\n";

print Sdbname.'-'x(14-length($dbname)).'-|'.(' 'x 49)."|\n";

if (defined Slogsize) { n строка для информации об

tt

использовании пространства под журналы регистрации

print ' 'х15 . "|- no log".(' 'х 41)."|\п": }

print "\n"; }

Читатель, разбирающийся в SQL, вероятно, удивится, зачем использовать специальную подпрограмму для суммирования данных из одного столбца вместо того, чтобы применить отличный оператор SUM из SQL. querysum() придумана только в качестве примера того, что можно сделать на лету из Perl. Подпрограмма на Perl подходит, скорее, для более сложных задач. Например, если нужно отдельно просуммировать данные, выбирая их по регулярному выражению, лучите это сделать из Perl, чем обращаться к серверу и просить его составить таблицы (даже если это можно сделать).



Содержание раздела