我们设置了MySQL(5.1版本)与主从设置。 我们需要提出备份策略,我们将使用mysqldump
。MySQL:备份策略 - 主或从?
我们打算使用flushlogs
,master-date=2
和single-transaction
选项。
我只想知道从哪个节点更好地运行Master或Slave备份?
我们设置了MySQL(5.1版本)与主从设置。 我们需要提出备份策略,我们将使用mysqldump
。MySQL:备份策略 - 主或从?
我们打算使用flushlogs
,master-date=2
和single-transaction
选项。
我只想知道从哪个节点更好地运行Master或Slave备份?
以下是我如何很久以前解决这个问题:
#!/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;"
在从属服务器(S):使用show从状态命令来验证您是在与主机同步。如果你想重新同步到主运行:
slave stop;
reset slave;
slave start;
您可能需要停止MySQL中,删除从斌的日志文件,然后重新启动并运行以上(这是对我们很重要,因为我们有一个流氓应用程序镦从站上的mysql配置)。
这个策略对我们的目的非常有益。确保并测试以确保它符合您的需求。
您应该在从设备上运行备份,以便主设备不会以任何方式中断,并且主设备可以保持生产模式。
下面是一个脚本来备份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,则可以使用MYSQLDUMP_OPTIONS
中的--dump-slave
来捕获主设备的二进制日志和SHOW SLAVE STATUS\G
的位置。您将在转储的第23行找到--dump-slave
的输出。
如果您希望继续使用MySQL 5.1和你想记录从主坐标,使用此
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
如果你想在主自转二进制日志,只是在主
配置此[mysqld]
expire-logs-days=7
+1实际回答问题,并感谢您的备份脚本。 – greg0ire
好的,但你应该在前面添加一些代码,在你备份之前验证slave是否实际同步。 有些人将从服务器设置为您所选择的服务器,并只将更新发送给主服务器。如果这是您的情况,除非您需要全天候更新功能,否则无需担心主设备。 我只是从不同的角度回答了你的问题。 – DTecMeister
也许,上面5.1的脚本的“SHOW SLAVE”部分应该是'mysql $ {MYSQL_CONN} -AE -e“SHOW SLAVE STATUS \ G”> /tmp/SSS.txt',对不对? –
这是如何回答大师与奴隶的问题? – greg0ire
它在主设备上运行。我认为“重置主”命令使其隐含。 – DTecMeister
我知道你建议从备份中进行备份。问题是:为什么? – greg0ire