전문 프로그램이 있다면 그것 사용하면 되지만 소소하게 운영하고 있는데 갑작스런 사건이 생긴다면 DB 시작 시키기전에 테이블 체크를 하고 올리는것이 정신건강 측면에 좋습니다. 다소 시간이 걸린다 해도 말입니다.
그리고 mysqli 쿼리는 아래처럼 직접적인 함수를 사용하는 것보다는 별도의 mysqli_query 함수를 호출 하는 별도의 함수를 만들어 그것을 호출하는 것이 좋습니다.
(객체 지향에서 다형성이 왜? 있는지 생각해 보면 간단 합니다. 확장성에 관한 부분인데요 객체 지향의 장점이죠)
그러면 통로의 단일화가 이루어져 어느 프로그램에서 어떤 쿼리가 실행되는지 찾아 낼 수 있어 유지 보수에 유리 합니다.
객체지향에서 캡슐화도 보면 통로의 단일화에요.
$oMysqli = mysqli_connect($host, $user, $passwd, $dbname, $port);
// 아래는 체크 해야 된다면 공백처리
$pass_db = 'mysql,information_schema,performance_schema';
$aPassDB = explode(',', $pass_db);
$sqlQuery = "SHOW DATABASES";
$oResDB = mysqli_query($oMysqli, $sqlQuery);
foreach ($oResDB AS $aRs)
{
// print_r($aRs);
extract($aRs);
if (in_array($Database, $aPassDB)) {
echo "$Database 체크 제외 \n";
continue;
}
# DB 이동
$sqlQuery = "USE $Database";
$oDbUse = mysqli_query($oMysqli, $sqlQuery); // print_r($oDbUse); exit;
echo "$Database DB 이동: $oDbUse \n";
if ( $oDbUse )
{
$sqlQuery = "SHOW TABLES";
$oResTBL = mysqli_query($oMysqli, $sqlQuery);
/*
[current_field] => 0
[field_count] => 1
[lengths] =>
[num_rows] => 26
[type] => 0
*/
//print_r($oResTBL);
foreach ($oResTBL AS $aRs2)
{
// [Tables_in_DB] => tablename
// print_r($aRs2); exit;
// extract($aRs2);
/*
+-----------------------------+-------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+-----------------------------+-------+----------+----------+
| xxxxxxxxxx.xxxxxxxxxxxxxxxx | check | status | OK |
+-----------------------------+-------+----------+----------+
1 row in set (0.055 sec)
[Table] => xxxxxxxxxx.xxxxxxxxxxxxxxxx
[Op] => check
[Msg_type] => status
[Msg_text] => OK
*/
$tableName = $aRs2["Tables_in_$Database"];
$sqlQuery = "CHECK TABLE $Database.$tableName"; echo $sqlQuery . "\n";
$aRsChkTBL = mysqli_fetch_assoc(mysqli_query($oMysqli, $sqlQuery));
// print_r($aRsChkTBL); exit;
if ($aRsChkTBL['Msg_text'] != 'OK' ) {
//리페어 테이블 추가실행
}
else {
// 간혹 check table 정상인데 select 안되는 경우가 있어 select 1개만 가져와 본다.
// 위 select 가져올때 오류 발생하면 repair table 실행
}
}
mysqli_free_result($oResTBL);
}
// endif $oDbUse
}
mysqli_free_result($oResDB);
이노디비의 경우는 또 다릅니다. 둘다 넣는것이 가장 좋겠습니다.
서버 노후화로 자동 재부팅 되는 재미 없는 상황이 발생 하거나 집에서 테스트용 있는데 갑자기 전기가 나가거나 하는 재미 없는 상황이 있는 경우 이런게 필요 합니다.
테이블의 전체 컬럼을 가져와서 array_keys 를 이용하면 되겠네요. 관리자에서 최근 데이터만 쉽게 보는 방법도 있습니다.