使用 Read_Master_Log_Pos 作为从 master 继续的位置意味着您最终可能会丢失数据。
Read_Master_Log_Pos 变量是从 IO 线程到的主二进制日志文件中的位置。
这里的问题是,即使在停止从属 SQL 线程和检索 Read_Master_Log_Pos 之间的一小段时间内,IO 线程也可能已经从主服务器接收到更多数据,而这些数据尚未被已停止的 SQL 线程应用。
这导致 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