슬레이브 서버 업데이트, 인서트, 삭제 금지시켜 잘못된 쿼리 사용하지 못하게
MySQL 사용시 마스터 슬레이브 구조로 가져갈때 실수로 슬레이브에 데이터 넣어 슬레이브 서버 멈추는 현상이 생기지 않도록 하기 위한 것입니다.
이 문제는 DB서버 설정으로도 가능 합니다.
다만 root 계정은 안됩니다. 우리 사실 root 사용하는것도 가끔 있지요~
그래서 실수 방지를 위한 약간의 방지책 입니다.
/**
* 슬레이브 서버에 실행되면 안되는 쿼리
* > 설정이 안되어 있거나 root 유저 사용해야 되는 경우 실수 방지를 위한 것
*/
function db_query_stopword_check( $dbQuery ) {
$is_stopWord = false;
$dbQuery = trim($dbQuery );
$aQueryStopWord = ['revoke', 'insert', 'drop', 'alter', 'grant', 'replace', 'update', 'delete', 'create'];
foreach( $aQueryStopWord as $aidx => $stopWord ) {
$stopWordLen = strlen($stopWord);
$chkQryStr = substr(strtolower($dbQuery), 0, $stopWordLen);
if ( $chkQryStr == $stopWord ) {
$is_write = db_query_stopword_check_log( $stopWordLen );
$is_stopWord = true;
break;
}
}
return $is_stopWord;
}
function db_query_stopword_check_log() {
$wrtSize = 0;
// $wrtFile = '/log/query_logfile.log';
// $wrtData = date('Y-m-d H:i:s') . "\t" . $_SERVER["HTTP_HOST"] . $_SERVER["PHP_SELF"] . '?' . $_SERVER['QUERY_STRING'] . "\n";
// $wrtSize = file_put_contents($wrtFile, $wrtData, FILE_APPEND);
// if( !$REMOTE_ADDR ) {
// $chgOwn = @chown($wrtFile, 'apache');
// $chgGrp = @chgrp($wrtFile, 'apache');
// }
return $wrtSize;
}
$dbQuery = "UPDATE TABLE SET test=1 WHERE .... ";
$is_stopWord = db_query_stopword_check( $dbQuery );
echo date('Y-m-d H:i:s') . ' $is_stopWord: ' . $is_stopWord . "<br>";
exit;
이렇게 사용하면 안되는 모든 쿼리를 체크하여 디비 처리 되지 않도록 합니다.
* 데이터 베이스 설정 참고
[MySQL] 서버에서 읽기만 가능하게 설정 하기 read_only