Могу ли я создать страницу php для запуска проверки запросов к 30 базам данных mysql? - PullRequest
3 голосов
/ 22 октября 2011

Я размещаю на hostgator и имею около 30 баз данных mysql (все разные сайты, которые находятся на одном сервере). В течение последнего года ... никаких проблем, и внезапно, за последние 2 дня я видел 5-10 из этих баз данных, помеченных как "сбойные", и они не дают результатов ... так что мои сайты не отображают информацию. Мне нужно запустить «таблицу ремонта mytable», чтобы исправить это, и тогда они снова отлично работают.

Вместо того, чтобы входить в систему, чтобы просматривать базы данных 1: 1 каждое утро, есть ли способ настроить страницу php для подключения ко всем 30 базам данных и выполнить простой оператор выбора ... и, если он работает, вернуть "база данных db1 работает" "база данных db2 работает" а потом, когда не работает, вернуть "нет ответа от db3"

.... или что-то подобное?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 22 октября 2011

Нет причин, по которым у вас не может быть сценария, в котором перечислены все ваши имена баз данных и учетные данные для входа, и попробуйте подключиться по очереди к каждому:

$logins = array(
    array('dbname' => 'blah', 'user' => 'username1', 'password' => 'password1'),
    array('dbname' => 'yuck', ....)
    ...
);

$failures = array();

foreach ($logins as $login) {
    $con = mysql_connect('servername', $login['user'], $login['password']);
    if (!$con) {
       $failures[] = $login['dbname'] . " failed with " . mysql_error();
       continue;
    }
    $result = mysql_select_db($login['dbname']);
    if (!$result) {
       $failures[] = "Failed to select " . $login['dbname'] . ": " . mysql_error();
       continue;
    }
    $result = mysql_query("SELECT something FROM sometable");
    if (!$result) {
       $failures[] = "Faile to select from " . $login['dbname'] . ": " . mysql_error();
       continue;
    }
    if (mysql_num_rows($result) != $some_expected_value) {
       $failures[] = "Got incorrect rowcount " . mysql_num_rows($result) . " on " . $login['dbname'];
    }
     etc....
    mysql_close();
}

if (count($failures) > 0) { 
    echo "Failures found: "
    print_r($failures);
}
0 голосов
/ 22 октября 2011

Вы должны быть в состоянии сделать что-то вроде следующего:

<?php
//connect to database
mysql_connect('database','user','password');

//get all database names
$result = mysql_query("show databases;");

//iterate over all databases returned from 'show databases' query
while($row = mysql_fetch_array($result)) {
    //DB name is returned in the result set's first element. select that DB
    mysql_selectdb($row[0]);
    //get all tables in the database
    $query = "show tables;";
    $result2 = mysql_query($query);
    echo "Query: (".$row[0].")$query\n";
    echo mysql_error();
    //iterate over all tables in the current database
    while($row2 = mysql_fetch_array($result2)) {
            //the first element of the returned array will always be the table name, so:
            $query = "select * from ".$row2[0]." where 1=1;";
            $result3 = mysql_query($query);
            echo "Query:\t(".$row[0].'/'.$row2[0].")$query\n";
            //If mysql_query returns false (i.e., $result3 is false), that means that
            // the table is damaged
            if(!$result3) {
                    echo "***Error on table '".$row2[0]."' *** ... Fixing...";
                    //So, we repair the table
                    mysql_query("repair table ".$row2[0].";");
            }
        }
    }
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...