Answers:
如果要正确地进行MySQL备份,而不会造成任何停机,则应将数据库复制到备用服务器上。它不需要强大,只需应付您的master数据库的写负载。您不应该在生产中使用此服务器。如果复制无法跟上步伐,则需要功能更强大的服务器。您可以通过比较日志文件和输出位置来进行检查
> SHOW MASTER STATUS\G
在主人和
> SHOW SLAVE STATUS\G
在奴隶上。我认为MySQL5将显示出滞后性SHOW SLAVE STATUS
。
当您高兴自己的奴隶跟上来时,您可以通过执行以下操作来进行备份
SLAVE STOP;
在从属服务器上停止复制mysqldump --opt
从服务器上。SLAVE START;
在从属服务器上再次开始复制如果执行此操作,则将拥有数据库的一致备份。此方法可防止不同的数据库,甚至更糟的是,同一数据库中的不同表不同步,并通过在执行备份时锁定表进行写操作来防止停机。
此设置的一个很好的好处是您拥有数据库的副本,可以用来对它进行长时间的昂贵查询,而这不会影响实时服务。
几个随机提示:
mysqldump --opt
,因为它通常是导入结果SQL的最快方法我使用一个脚本,该脚本用于mysqldump
将数据/模式提取到每个数据库的文件中。数据通过普通的netbackup备份备份到磁带。您显然可以添加更多的花哨功能,但这会实现simpe基本转储。
#!/bin/sh
# Find out what databases are in mysql and back them up
# Delete old backups
STARTTIME=` date +%Y%m%d-%H%M `
#BACKUP_DIR="/usr/local/db_backups"
BACKUP_DIR="/var/local/db_backups"
LOGFILE="/var/log/db_backups.log"
USER="root"
PASSWD="<password>"
KEEP="7"
(
echo
echo " ---MySQL backups start ${STARTTIME} ---"
#delete any backup written more than ${KEEP} days ago
echo "Removing files over ${KEEP} days old from ${BACKUP_DIR}:"
/usr/bin/find ${BACKUP_DIR} -mindepth 1 -mtime +${KEEP} -print -delete
echo
echo "Performing today's dumps"
#find each database running in this instance of mysl
for DB in ` echo "show databases;"|mysql -u${USER} -p${PASSWD} mysql |awk " NR>1 {print $1} " `
do
#generate a backup file name based on the data base name
BACKUP_FILE="${BACKUP_DIR}/${DB}-${STARTTIME}.sql"
echo "Processing database ${DB} into file ${BACKUP_FILE}"
# dump the database data/schema into the backup file
mysqldump -u${USER} -p${PASSWD} --add-drop-table ${DB} > ${BACKUP_FILE}
gzip ${BACKUP_FILE}
done
ENDTIME=` date +%Y%m%d-%H%M `
echo
echo " ---MySQL backups complete ${ENDTIME} ---"
echo
) >> ${LOGFILE} 2>&1
我们的标准设置是一个HA集群,其中有两个数据库是只读的,两个数据库相互复制。
我们每天进行一次完整备份,然后按照客户的政策淘汰旧备份,通常我们会在一个月内保留4个最近的每日备份(以维持周末;),4个最后的星期日和4个最后的第一个星期日。之后,一年或一年的转储将永久保存到存档中。
我们还将复制日志保留很长时间,只要我们有足够的能力来保留磁盘空间即可。它们作为调试工具也非常有用,因为它们可以准确记录谁在何时何地进行了更改。
从理论上讲,您只需要一个完整备份和所有复制日志即可进行时间点还原,但是更频繁的完整备份将加快还原速度。
备份的一个巧妙技巧是对mysql dump使用innodb表和--single-transaction参数,这样备份就不会在数据库运行时阻塞数据库。
我正在使用Percona的Xtrabackup。它是InnoDB / XtraDB的不可阻止的备份解决方案
备份的全部目的是为了能够还原。
我不会提倡使用CSV转储作为备份解决方案。它只会给您原始数据。除此之外,还有很多其他功能,尤其是对于数据库。您可以对表说明,视图,存储的过程进行命名。如果您还没有这些,那么您将无法成功将其恢复。还有RDBMS应用程序和配置要考虑。您可能需要安装大量补丁程序,还需要在恢复环境中安装补丁程序才能使其达到相同的水平。您可能正在根据应用程序的要求运行某些特殊的配置。您甚至可能需要一组特定的OS设置,数据库才能最佳运行。所有这些都需要恢复,除非您有能够做到这些的备份解决方案,否则将进一步延迟恢复时间,
对于数据库备份(以及一般的备份),我总是更喜欢使用可以处理所有这些的“真实”备份软件。
对于MySQL,我使用automysqlbackup(http://sourceforge.net/projects/automysqlbackup/),因为我的备份软件(Backup Exec)不支持Linux系统上的快照。
它工作正常,但是我将监视此线程以获取建议:)