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

,