首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL:备份策略-主还是从?

问MySQL:备份策略-主还是从?
EN

Stack Overflow用户
提问于 2014-03-13 16:28:24
回答 2查看 2K关注 0票数 1

我们有一个带有主从式设置的MySQL (版本5.1)。我们需要提出一个备份策略,我们将使用mysqldump。

我们打算使用flushlogs、master-date=2和single-transaction选项。

我只想知道从哪个节点运行备份更好,Master还是Slave?

EN

回答 2

Stack Overflow用户

发布于 2014-09-03 04:05:52

您应该在Slave上运行备份,以便Master不会以任何方式中断,并且Master可以保持在生产模式。

以下是备份从机上的mysql数据并仅保留最后7个备份的脚本

代码语言:javascript
复制
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,因为备份来自Slave而不是Master。如果升级MySQL 5.5,可以在MYSQLDUMP_OPTIONS中使用--dump-slave从SHOW SLAVE STATUS\G捕获主服务器的二进制日志和位置。您将在转储的第23行找到--dump-slave的输出。

如果您希望继续使用MySQL 5.1,并且想要记录主文件中的坐标,请使用以下命令

代码语言:javascript
复制
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

如果要在主服务器上自动轮询二进制日志,只需在主服务器上进行配置即可

代码语言:javascript
复制
[mysqld]
expire-logs-days=7

试一试吧!

票数 5
EN

Stack Overflow用户

发布于 2014-09-02 12:16:26

下面是我几个月前解决这个问题的方法:

代码语言:javascript
复制
#!/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命令验证您是否与主服务器同步。如果要重新同步到主服务器,请运行:

代码语言:javascript
复制
slave stop;
reset slave;
slave start;

您可能需要停止mysql,删除从属bin日志文件,然后重新启动并运行上述操作(这对我们很重要,因为我们有一个恶意应用程序扰乱了从属服务器上的mysql配置)。

这个策略非常好地满足了我们的目的。一定要进行测试,以确保它符合您的需求。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22372950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档