我们有一套带有主从设置的 MySQL(5.1 版)。我们需要提出一个备份策略,并且我们将使用mysqldump
.
我们打算使用flushlogs
,master-date=2
和single-transaction
选项。
我只想知道从哪个节点运行备份更好,主节点还是从节点?
您应该在 Slave 上运行备份,以便 Master 不会以任何方式中断,并且 Master 可以保持在生产模式。
这是一个在 Slave 上备份 mysql 数据并仅保留最后 7 个备份的脚本
MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
BACKUP_HOME=/some/path/to/your/backups
BACKUP_TIME=`date +"%Y%m%d_%H%M%S"`
BACKUP_FILE=${BACKUP_HOME}/MySQLData_${BACKUP_TIME}.sql
BACKUP_GZIP=${BACKUP_FILE}.gz
MYSQLDUMP_OPTIONS="--single--transaction --routines --triggers"
#
# Stop Replication
# Dump the Data
# Resume Replication
#
mysql ${MYSQL_CONN} -ANe"STOP SLAVE"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -A | gzip > ${BACKUP_GZIP}
mysql ${MYSQL_CONN} -ANe"START SLAVE"
#
# Rotate Out Old Backups based on BACKUPS_TO_KEEP
#
cd ${BACKUP_HOME}
FILES_TO_DELETE=/tmp/BackupFilesToDelete.txt
BACKUPS_TO_KEEP=7
BACKUPS_ON_HAND=`ls MySQLData_*.gz | wc -l`
if [ ${BACKUPS_ON_HAND} -gt ${BACKUPS_TO_KEEP} ]
then
(( DIFF = BACKUPS_ON_HAND - BACKUPS_TO_KEEP ))
ls -l MySQLData_*.gz | head -${DIFF} > ${FILES_TO_DELETE}
for FIL in `cat ${FILES_TO_DELETE}` ; do rm -f ${FIL} ; done
fi
您不能使用--master-data=2
,因为备份来自从站而不是主站。如果你升级 MySQL 5.5,你可以使用--dump-slave
inMYSQLDUMP_OPTIONS
来捕获 Master 的二进制日志和位置SHOW SLAVE STATUS\G
。您将--dump-slave
在转储的第 23 行找到输出。
如果你想继续使用 MySQL 5.1 并且你想记录来自 Master 的坐标,使用这个
MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
BACKUP_HOME=/some/path/to/your/backups
BACKUP_TIME=`date +"%Y%m%d_%H%M%S"`
BACKUP_COOR=${BACKUP_HOME}/MySQLCoor_${BACKUP_TIME}.txt
BACKUP_FILE=${BACKUP_HOME}/MySQLData_${BACKUP_TIME}.sql
BACKUP_GZIP=${BACKUP_FILE}.gz
MYSQLDUMP_OPTIONS="--single--transaction --routines --triggers"
#
# Stop Replication
# Dump the Data
# Capture Master Coordinates
# Resume Replication
#
mysql ${MYSQL_CONN} -ANe"STOP SLAVE"
mysqldump ${MYSQL_CONN} ${MYSQLDUMP_OPTIONS} -A | gzip > ${BACKUP_GZIP}
mysql ${MYSQL_CONN} -Ae"SHOW SLAVE STATUS\G" > /tmp/SSS.txt
grep "Relay_Master_Log_File:" /tmp/SSS.txt > ${BACKUP_COOR}
grep "Exec_Master_Log_Pos:" /tmp/SSS.txt >> ${BACKUP_COOR}
mysql ${MYSQL_CONN} -ANe"START SLAVE"
#
# Rotate Out Old Backups based on BACKUPS_TO_KEEP
#
cd ${BACKUP_HOME}
FILES_TO_DELETE=/tmp/BackupFilesToDelete.txt
BACKUPS_TO_KEEP=7
BACKUPS_ON_HAND=`ls MySQLData_*.gz | wc -l`
if [ ${BACKUPS_ON_HAND} -gt ${BACKUPS_TO_KEEP} ]
then
(( DIFF = BACKUPS_ON_HAND - BACKUPS_TO_KEEP ))
ls -l MySQLData_*.gz | head -${DIFF} > ${FILES_TO_DELETE}
for FIL in `cat ${FILES_TO_DELETE}` ; do rm -f ${FIL} ; done
fi
如果要在 Master 上自动轮换二进制日志,只需在 Master 上配置即可
[mysqld]
expire-logs-days=7
以下是我在很多个月前解决这个问题的方法:
#!/usr/bin/ksh
date=`date +%y%m%d`
mysql -u root db_name -e "flush tables with read lock;"
mysqldump -u root -pYrPass --add-drop-table --add-locks natl_inv > /path/to/backup/db_name$date
mysql -u root -e "reset master;"
mysql -u root db_name -e "unlock tables;"
mysql -u root –pYrPass db_name < /path/to/backup/db_name$date
mysql -u root -e "flush logs;"
在从属设备上:使用 show slave status 命令验证您是否与主设备同步。如果要重新同步到主服务器,请运行:
slave stop;
reset slave;
slave start;
您可能需要停止 mysql,删除从属 bin 日志文件,然后重新启动并运行上述程序(这对我们很重要,因为我们有一个恶意应用程序扰乱了从属上的 mysql 配置)。
这个策略非常符合我们的目的。确保并进行测试以确保它符合您的需求。