php를 이용한 MySQL, MariaDB DB 테이블 체크 프로그램 > PHP
PHP

php를 이용한 MySQL, MariaDB DB 테이블 체크 프로그램

조회 2,831회 댓글 0건

전문 프로그램이 있다면 그것 사용하면 되지만 소소하게 운영하고 있는데 갑작스런 사건이 생긴다면 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);


 


위는 누구나 사용할 수 있도록 기본 내장함수로 변경해 놓은 것입니다.

어떻게 처리 했는지 기본 흐름만 아시면 되며


실제 사용은 본인이 사용하고 있는 함수로 변경하여 사용하는 것을 권장 합니다.

(반드시 디비와 관련된것은 클래스나 함수로 만들어진것을 사용해야 뭔가 해야 할 때 통제가 가능 합니다.)



8ed8fbb31e6662a3e131442981b41650_1675945794_4.png
 


위에서 확인을 위한 select 를 전체 갯수를 가져와서 확인하는 방법도 있는데 이는 약간 다릅니다. 

MyISAM의 경우는 이미 처리된것을 가져오기 때문에 SELECT * FROM TABLE LIMIT 1 해서 가져오는것과는 다릅니다. 

이노디비의 경우는 또 다릅니다. 둘다 넣는것이 가장 좋겠습니다. 


서버 노후화로 자동 재부팅 되는 재미 없는 상황이 발생 하거나 집에서 테스트용 있는데 갑자기 전기가 나가거나 하는 재미 없는 상황이 있는 경우 이런게 필요 합니다.



● 기타 참고사항

더불어 아래 프로그램을 조금 더 수정하여 특정 테이블을 HTML 표 형태로 만들어 주는것도 있는데요. 

테이블의 전체 컬럼을 가져와서 array_keys 를 이용하면 되겠네요. 관리자에서 최근 데이터만 쉽게 보는 방법도 있습니다. 

(이 부분은 테이블 체크와 관련이 있는 부분은 아닙니다.)



  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 193건 1 페이지
  • profile_image 내장함수에 strip_tags 라는 것이 있습니다.HTML을 삭제하고 txt만 남기죠. 그리고 나서 공백이 2개 이상이거나 줄바꿈이 필요 없거나 탭 같은것은 별도 삭제를 해줘야 합니다.여기서 다루는 함수는 자바스크립트등 몇가지를 더 삭제해 주는 기능입니다.결과 확인 후 본인에게 맞지 않으면 좀 더 추가 해야 될 수 있는데 요즘은 GPT4 이용하면 도움이 많이 됩니다.  /**   * html2txt    *    * @param mixed $d…
  • profile_image 사이트의 페이지를 소켓방식으로 수집할때 많이 사용하는 curl 클래스 입니다.본인의 상황에 따라서 좀더 조건을 줘서 처리를 하면 되며 쿠키를 저장해서 다시 보내줘야 한 다면 이 부분에 대한 주석 처리 된것을 풀어서 테스트 해보면 됩니다.중요한것은 HTTP 프로토콜에 대한 명확한 이해가 가장 중요합니다.원리를 모르는 상태에서 사용을 하다보면 헛발질을 많이 할 수 밖에 없기 때문이죠~코딩을 잘 한다는 것은 깔끔하게 재사용가능하게 하는 것도 중요하지…
  • profile_image AWS SES API를 활용하면서 PEAR 라이브러리 활용할 필요가 있을 때 사용하면 되지만 일반적으로는 사용할 필요는 없습니다.하지만 필요한 분이 있을 수 있어 예전 소스중에 있어 올립니다. 1) PEAR 설치 사용하는 PHP 버전의 경로를 지정해서 설치 해야 한다. wget https://pear.php.net/go-pear.phar /usr/local/php82/bin/php go-pear.phar /usr/local/php82/bin/p…
  • profile_image AWS에서 메일을 발송하는 방법에는 SMTP 설정을 통한 방법이 있고 다른 하나는 API를 이용한 방법이 있는데여기에선 API를 이용한 방법에 대한 예 입니다.보통 간단하게 조금 보낼때는 관계 없는데 많이 보내게 되면 AWS 비용이 비싸고 반송 메일에 따라 좋지 않으면 패널티도 받기 때문에 AWS 이용은 많이 안하는 편입니다.대량메일 발송서비스만 전문으로 해주는곳을 이용하거나 직접 구축하여 발송을 하게 됩니다.한달 몇 천건 정도면 이것 이용해도…
  • profile_image 간혹 PHP만 설치해서 사용하고 최대한 라이브러리 설치 하지 않게 사용하면서 간단하게 암호화할 필요가 있을 경우 사용 합니다. 가능하면 OpenSSL 라이브러리 사용하는 암호화 방식을 추천 합니다.  그리고 어떤 방식이든 대칭형 암호화에서 키는 가능하면 길게 만들고 여기선 md5 사용 했지만 sha512 같은것 사용하면 더 좋고 시간, 또는 일마다 같은 문자도 암호화 결과가 다르게 만드는것이 좋습니다. 그 부분은 개인의 상황에 맞게 별도의 메소…
  • profile_image 다른 언어에선 셀레리움을 많이 사용하는듯 한데 PHP에서 페이스북에서 만든 웹드라이브를 사용합니다.설치는 어렵지 않으며 여기선 윈도우용 PHP가 이미 설치 되어 있다고 가정하고 웹드라이브 설치 하는것 부터 진행 합니다.▷ 윈도우용 컴포저 다운로드https://getcomposer.org/Composer-Setup.exe▷ 필요한 라이브러리 설치composer require php-webdriver/webdrivercomposer require …
  • profile_image 객체를 생성하는 각 방법은 사용하는 상황과 개발자의 선호도에 따라 다를 수 있는데 생성 하는 방법에는 아래와 같은 것들이 있습니다.  $obj = new stdClass();   // 기본 클래스  $obj = (object) null;    // (object) 변환  $obj = (object)[];       // 빈 배열을 object로 변환  $obj = new class {};     // 익명클래스 - php7 이상 new stdC…