mysql 슬레이브 쿼리 오류발생으로 멈췄을때 자동처리해주는 프로그램
대량 처리를 위해서 읽기전용 디비서버와 마스터가 있을때 마스터와의 연결은 문제 없어 로그파일 잘 업데이트 되고 있는데 슬레이브쪽 오류로 인하여 처리가 안되고 있을때 사용하는 프로그램 입니다.
자동으로 skip 하기 때문에 추가 적으로 데이터 확인할 필요가 있습니다.
이런 경우는 급하게 처리 해야 되는 경우 사용하면 유용합니다. 프로그램에서 디비 커넥션을 변경하기 곤란한 경우 데이터는 읽기전용 서버에서 가져오는데 데이터 갱신이 안되어 없다고 하고 마스터에는 있는데 읽어오지 못하는 그런 현상이 있을때 사용하면 좋습니다.
# ERROR 1061: Duplicate key name 'idx3' 인덱스명 중복
# ERROR 1062: Duplicate entry '1' for key 1 키 중복 오류
#1032: handler error HA_ERR_KEY_NOT_FOUND - 레코드를 찾을 수 없다.
그냥 넘기는 기능이기 때문에 반드시 추가적인 데이터 확인 작업 같은 것이 필요합니다.
그리고 어떤 테이블이냐에 따라 다른데 한두개 데이터 없어도 되는 그런 테이블의 경우는 무시 해도 되고 그렇지 않은 테이블만 분류하여 별도 조건을 줘서 처리 해주는 방법도 있겠습니다.
이런 경우는 사전에 사용하고 있는 테이블중 회원가입, 결제, 찜목록 중 반드시 중요한것을 별도 구분하고 웹로그 기록등 한두개 빠져도 큰 문제 안되는것은 그냥 넘겨 버리거나 하면 될것으로 보입니다.
# 정상처리의 횟수가 ?회 이상이면 루프를 나간다.
$BREAK_NUM = 20;
if ( $breakNum ) $BREAK_NUM = $breakNum;
$db_id = 'root';
$db_pw = '12354';
$port = '';
$oDbConSlave = mysqli_connect($slaveHost, $db_id, $db_pw, '', $port);
$not_error_num = 0;
while ( true )
{
$tblNum = 0;
$query = "show slave status";
$result = mysqli_query($oDbConSlave, $query);
$aRs = mysqli_fetch_assoc($result);
if ( $aRs )
{
extract($aRs);
echo "\$Last_Errno: $Last_Errno - $Last_Error \n";
// in_array() 형태로 변경하거나 위쪽에 오류 코드 종류를 널을 수 있도록 기능 추가 필요함.
if ( $Last_Errno == 1032 || $Last_Errno == 1046 || $Last_Errno == 1051 )
{
$not_error_num = 0;
// $Query_sql = "stop slave";
// $result = mysqli_query($oDbConSlave, $Query_sql);
$Query_sql = "set global sql_slave_skip_counter = 1";
$result = mysqli_query($oDbConSlave, $Query_sql);
echo date('Y-m-d H:i:s ') . "sql_slave_skip_counter = 1 실행 \n";
usleep(222333);
$Query_sql = "start slave";
$result = mysqli_query($oDbConSlave, $Query_sql);
echo date('Y-m-d H:i:s ') . "start slave 실행\n";
}
elseif ( !$Last_Errno ) {
$not_error_num++;
echo date('Y-m-d H:i:s ') . $not_error_num . "회 진행중 - {$BREAK_NUM}회 밖으로 나감." . "\n";
if ( $not_error_num > $BREAK_NUM ) {
break;
}
}
}
sleep(2);
}
* mysql 데이터베이스와 관련된 프로그램
공통으로 사용하는 php Mysql 함수 > PHP (pabburi.co.kr)
mysql 슬레이브 연결 끊어졌을때 자동으로 마스터 연결시켜 주는 프로그램 > PHP (pabburi.co.kr)