Read_Master_Log_Pos をマスターから継続する位置として使用すると、データが欠落する可能性があります。
Read_Master_Log_Pos 変数は、マスター バイナリ ログ ファイル内のスレーブ IO スレッドの位置です。
ここでの問題は、スレーブ SQL スレッドを停止してから Read_Master_Log_Pos を取得するまでのわずかな時間であっても、停止された SQL スレッドによって適用されていないデータを IO スレッドがマスターから受信した可能性があることです。
これにより、Read_Master_Log_Pos が mysqldump で返されたデータよりも先になり、インポートして別のスレーブで続行すると、データにギャップが残ります。
スレーブで使用する正しい値は Exec_Master_Log_Pos です。これは、スレーブ SQL スレッドが最後に実行したマスター バイナリ ログ ファイル内の位置であり、mysqldump と Exec_Master_Log_Pos の間にデータ ギャップがないことを意味します。
正しい使用法の上でロスのスクリプトを使用すると、次のようになります。
# MySQL executable location
mysql=/usr/bin/mysql
# MySQLDump executable location
mysqldump=/usr/bin/mysqldump
# MySQL Username and password
userpassword=" --user=<username> --password=<password>"
# MySQL dump options
dumpoptions=" --quick --add-drop-table --add-locks --extended-insert"
# Databases to dump
databases="db1 db2 db3"
# Backup Directory
# You need to create this dir
backupdir=~/mysqldump
# Stop slave sql thread
echo -n "Stopping slave SQL_THREAD... "
mysql $userpassword -e 'STOP SLAVE SQL_THREAD;'
echo "Done."
set `date +'%Y %m %d'`
# Get Binary Log Positions
echo "Logging master status..."
masterlogfile=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep '[^_]Master_Log_File'`
masterlogpos=`$mysql $userpassword -e 'SHOW SLAVE STATUS \G' | grep 'Exec_Master_Log_Pos'`
# Write log Info
echo $masterlogfile
echo $masterlogpos
echo $masterlogfile >> ${backupdir}/$1-$2-$3_info.txt
echo $masterlogpos >> ${backupdir}/$1-$2-$3_info.txt
# Dump the databases
echo "Dumping MySQL Databases..."
for database in $databases
do
echo -n "$database... "
$mysqldump $userpassword $dumpoptions $database | gzip - > ${backupdir}/$1-$2-$3_${database}.sql.gz
echo "Done."
done
# Start slave again
echo -n "Starting slave... "
$mysql $userpassword -e 'START SLAVE'
echo "Done."
echo "All complete!"
exit 0