PX : code

MySQL Database Monitor by Philip Gatt
Download this code


#!/usr/bin/php -q
<?

##############################################################################
#
#    MySQL Maintainer v0.9
#
#    Author: Philip Gatt <pxg@hotmail.com>
#    Version: 0.9
#    Date Created: Aug 15, 2000
#    Last Modified: Aug 15, 2000
#
#    Requires: MySQL v. 3.23.21 or higher (it may work on earlier versions of
#        3.23, but it hasn't been tested)
#
#    What it does: It checks every table in your mysql database, if the table
#        has a problem, it tries to repair it and sends a warning to the emails
#        in the $warning_emails variable. If it cannot repair the table, it sends
#        an alert to the emails in the $alert_emails variable. I recommend putting
#        your cell phone / pager's email address in the alert_emails, and your
#        regular address in the warning_emails.
#
#    Rights: Use this program as you see fit, alter it, do whatever you like, 
#        as long as this message, including the author info, remains unchanged. 
#        Also, please notify me if you are using this, just so I know my work 
#        was appreciated.
#
#    Additional Note: If you need any custom programming, I am available to
#        write custom scripts / programs. No project is too large or small.
#        Please contact me at pxg@hotmail.com. 
#
##############################################################################


######## SCRIPT CONFIGURATION ################################################
#
#    Please carefully read and set all of these options.

#    SKIP_DATABASES is an array of databases not to process
$SKIP_DATABASES = array("skipdatabase1", "skipdatabase2", "skipdatabase3");        // don't check these databases

#
#    Set SILENT_MODE to 1 for silent mode (good for cron jobs), and to 0 to get output to the screen
$SILENT_MODE = 0;

#
#    ALERT_EMAILS and WARNING_EMAILS contain a list of email addresses to send 
#        alerts and warnings to (respectivly)
$ALERT_EMAILS = array("you@youremail.com", "0000000000@messaging.sprintpcs.com");
$WARNING_EMAILS = array("you@youremail.com");

#
#    ALERT_SUBJECT and WARNING_SUBJECT are the message subjects for warning and alert
#        emails
$ALERT_SUBJECT = "MySQL Maintainer Alert";
$WARNING_SUBJECT = "MySQL Maintainer Warning";

#
#    Set your mysql server info here, root is a good account to use because it has
#        access to modify all tables in the database
$MYSQL_SERVER = "localhost";
$MYSQL_USER = "root";
$MYSQL_PASS = "";

#
######## END OF CONFIGURATION ################################################





mysql_connect ($MYSQL_SERVER, $MYSQL_USER, $MYSQL_PASS) or die (PG_fatal(mysql_error()));

#-- get a list of databases
$databasesres = mysql_query ("show databases") or die (PG_fatal(mysql_error()));

#-- cycle through the list of databases
while ($dar = mysql_fetch_array($databasesres))
{
    $dbname = $dar[0];

    #-- if the database is not in the skip array, process it
    if (!PG_in_array($SKIP_DATABASES, $dbname))
    {
    
        PG_screen_display ($dbname . "\n");

        #-- switch to the database
        mysql_select_db ($dbname);

        #-- get a list of tables in this database
        $tablesres = mysql_query ("show tables") or die (PG_fatal(mysql_error()));

        #-- cycle through the list of tables and check them
        while ($tar = mysql_fetch_array($tablesres))
        {
            $tablename = $tar[0];

            #-- display some info
            PG_screen_display (PG_print_sp (" | " . $tablename, 50, " "));
            flush();

            #-- check the table
            $res = mysql_query ("check table $tablename") or die (PG_fatal(mysql_error()));
            $ar = mysql_fetch_array($res);

            #-- if we didn't get an OK as a response, try to fix it
            if ($ar[Msg_text] != "OK")
            {
                $checkerr = $ar[Msg_text];
                PG_screen_display ("ERROR $checkerr --- ");
                flush();
                
                #-- try to fix the table
                $res = mysql_query ("repair table $tar[0]") or die (PG_fatal(mysql_error()));
                $ar = mysql_fetch_array($res);

                #-- if we got an error trying to fix it, send an alert
                if ($ar[Msg_text] != "OK")
                {
                    PG_screen_display ("UNABLE TO REPAIR ($ar[Msg_text]) !!!!");
                    register_alert ("Database: $dbname\nTable: $tablename\nError: $checkerr\nStatus: $ar[Msg_text]\n\n");
                }
                else
                {    
                    PG_screen_display ("REPAIRED");
                    register_warning ("Database: $dbname\nTable: $tablename\nError: $checkerr\nStatus: Repaired\n\n");
                }    
            }
            else
                PG_screen_display ("OK");
            
            PG_screen_display ("\n");
        }
        PG_screen_display ("\n");
    }
}
send_warnings_and_alerts();
exit();


function PG_fatal($str)
{
    register_alert ("\n\nFatal Error: $str\n");
    send_warnings_and_alerts();
    exit;
}


function send_warnings_and_alerts ()
{
    global $alertstr;
    global $warningstr;
    global $WARNING_EMAILS;
    global $ALERT_EMAILS;
    global $WARNING_SUBJECT;
    global $ALERT_SUBJECT;
    
    if ($warningstr != "")
    {
        reset ($WARNING_EMAILS);
        while (list ($trash, $email) = each ($WARNING_EMAILS))
        {    
            mail ($email, $WARNING_SUBJECT, $warningstr);
            echo "Sending warning to $email\n";
        }    
        echo $warningstr;
    }    
    if ($alertstr != "")
    {
        reset ($ALERT_EMAILS);
        while (list ($trash, $email) = each ($ALERT_EMAILS))
        {
            mail ($email, $ALERT_SUBJECT, $alertstr);
            echo "Sending warning to $email\n";
        }    
        echo $alertstr;    
    }    
}

function register_alert ($str)
{
    global $alertstr;
    $alertstr .= $str;
    return 1;
}

function register_warning ($str)
{
    global $warningstr;
    $warningstr .= $str;
    return 1;
}

function PG_screen_display ($string)
{
    # displays message to standard output (the screen) if not running in silent mode
    global $SILENT_MODE;
    if (!$SILENT_MODE)
        echo $string;
    return 1;    
}

function PG_in_array ($array, $value)
{
    # this function returns true if $value is found in $array
    $found = 0;
    for ($i = 0; $i < count($array); $i++)
        if ($array[$i] == $value)
        {
            $found = 1;
            break;
        }
    return $found;    
}

function PG_print_sp ($str, $len, $delim = " ")
{
    $res = $str;
    for ($i = strlen($str); $i < $len; $i++)
            $res .= $delim;
    return $res;
}

?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.