MySQL checksum tables 비교 쉘스크립트



DB Replication 이 잘 되고 있는지 Master 와 Slave의 테이블 체크섬으로 비교하는 shell script 입니다.


리플리케이션을 하더라도 sysdate 처럼 서버 종속적인 데이터는 값이 다르게 들어가니깐 이점 유의해서 감안하셔야 합니다.


동일하게 행단위로 들어가면 참 좋을텐데 아쉽군요.


그리고 마스터가 mysql 이고 슬래이브가 mariadb 라면 null 값인 경우 check sum 값이 다르게 나옵니다.


#!/bin/sh


M_DB_HOST="example.com"

M_DB_USER="root"

M_DB_PASS="비밀번호"

S_DB_HOST="localhost"

S_DB_USER="root"

S_DB_PASS="비밀번호"


M_DATABASES=(`mysql -h$M_DB_HOST -u$M_DB_USER -p$M_DB_PASS -e "show databases" | grep -v "Database\|information_schema\|mysql\|performance_schema"`)


DB_CNT=${#M_DATABASES[*]}

for ((i=0; i<$DB_CNT; i++)) ; do

DATABASE=${M_DATABASES[$i]}

TABLES=(`mysql -h$M_DB_HOST -u$M_DB_USER -p$M_DB_PASS -D$DATABASE -e "show tables" | grep -v "Tables_in_"`)

TB_CNT=${#TABLES[*]}

for ((j=0; j<$TB_CNT; j++)) ; do

TABLE=${TABLES[$j]}

M_CHECKSUMS=(`mysql -h$M_DB_HOST -u$M_DB_USER -p$M_DB_PASS -D$DATABASE -e "checksum tables $TABLE" | grep "$DATABASE." | awk -F " " '{print $1"-"$2}'`)

S_CHECKSUMS=(`mysql -h$S_DB_HOST -u$S_DB_USER -p$S_DB_PASS -D$DATABASE -e "checksum tables $TABLE" | grep "$DATABASE." | awk -F " " '{print $1"-"$2}'`)

CS_CNT=${#M_CHECKSUMS[*]}

for ((k=0; k<$CS_CNT; k++)) ; do

if [ "${M_CHECKSUMS[$k]}" != "${S_CHECKSUMS[$k]}" ] ; then

echo "${M_CHECKSUMS[$k]} != ${S_CHECKSUMS[$k]}"

#mysqldump -h$M_DB_HOST -u$M_DB_USER -p$M_DB_PASS $DATABASE $TABLE --opt | gzip > $DATABASE.$TABLE.$TODAY.sql.gz

#gunzip < $DATABASE.$TABLE.$TODAY.sql.gz | mysql -h$S_DB_HOST -u$S_DB_USER -p$S_DB_PASS $DATABASE 

fi

done

done

done


위에서 마스터와 슬래이브의 호스트, 아이디, 비밀번호를 자신에 맞게 값을 넣으시면 됩니다.


echo 라인 아래 두줄은 테이블을 복사해주는 부분인데 필요하면 주석을 풀어주면 됩니다.


반응형
블로그 이미지

영은파더♥

가상서버호스팅 VPS 리눅스 서버관리 윈도우 IT

,