i formulate infinity and store it deep inside of me

Powered by Astir.News engine

Еженощная проверка таблиц Mysql

05 августа 2008, 13:49

Скрипт для ночного crontab плюс удаление старых логов (mysql считаем standalone сервером, не нуждающимся в репликации, для которой и нужны бинарные логи).

#!/usr/bin/perl -w
use DBI;
$dbase="database";
$dbh = DBI->connect("DBI:mysql:database=$dbase;host=127.0.0.1","user","password") || die $DBI::errstr;
print "Starting checking tables ".`date`;
#берем список таблиц
$mquery="show tables in $dbase;";
$mresult=$dbh->prepare("$mquery");
$mresult->execute();
while ($ln = $mresult->fetchrow_hashref()) {
$table=$ln->{'Tables_in_database'};
#проверка таблиц
$cresult=$dbh->prepare("check table $table extended;");
$cresult->execute();
$cn = $cresult->fetchrow_hashref();
$cres=$cn->{'Msg_text'};

#если битая таблица - чиним
if ($cres ne "OK") {
$rquery="repair table $table extended;";
$rresult=$dbh->prepare("$rquery");
$rresult->execute();
$rn = $rresult->fetchrow_hashref();
$rres=$rn->{'Msg_text'};
} else {$rres="was clean";}

#после проверки и починки оптимизируем
$oquery="optimize table $table extended;";
$oresult=$dbh->prepare("$oquery");
$oresult->execute();
$on = $oresult->fetchrow_hashref();
$ores=$on->{'Msg_text'};

print "table $table: CHECK $cres, REPAIR $rres, OPTIMIZE $ores ";

}

print "Done! ".`date`;


$sqldir="/usr/local/mysql/var";
chdir $sqldir;
opendir(LOG,"$sqldir"); @logs=grep/^host-bin.d+$/,readdir(LOG); closedir(LOG);
$count=@logs;

print "$count logs in /usr/local/mysql/var ";
foreach $log(sort @logs) {
chomp $log;
last if $count==1;
print "old log $log detected ";
print "deleting $log log ";
unlink ("$sqldir/$log");
$count--;
}

Tags: db , mysql , perl