我正在使用MySQL
你通常如何备份你的数据库?
将所有数据导出为sql或cvs格式并保存在文件夹中?
如果您想正确执行MySQL备份,而没有任何停机时间,则应该将数据库复制到备用服务器。 它不需要非常强大,只需要处理主数据库的写入负载。 你不应该在生产中使用这个服务器。 如果复制永远不能保持,你需要一个更强大的服务器。 您可以通过比较日志文件和输出的位置来检查
> SHOW MASTER STATUS\G
在主人和
> SHOW SLAVE STATUS\G
在奴隶。 我认为MySQL5将显示从SHOW SLAVE STATUS的滞后。
当你感到高兴时,你的奴隶正在跟上,你可以通过做你的备份
SLAVE STOP;停止复制SLAVE STOP; 在奴隶 mysqldump --opt 。 SLAVE START;启动复制SLAVE START; 在奴隶 如果你这样做,那么你将有一个一致的数据库备份。 此方法可防止不同的数据库,甚至更糟糕的是,同一数据库中的不同表不同步,并通过在执行备份时locking写入表来防止停机。
这种设置的一个好处是,你有一个数据库的副本,您可以用它来运行长时间昂贵的查询,这不会影响您的实时服务。
几个随机提示:
mysqldump --opt ,因为它通常是导入结果SQL的最快方法 我使用一个使用mysqldump的脚本将数据/模式提取到每个数据库的文件中。 数据由正常的netbackup备份备份到磁带。 你可以明显地增加更多的花里胡哨的东西,但这是一个简单的基本转储。
#!/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
通常情况下,如果必须停止数据库,则每天备份一次数据库,然后将备份传输到存储区以进行整合,然后转到磁带。
数据库备份大部分时间都是使用数据库引擎提供的本地工具完成的。
在硬件故障的情况下,备份不应该保留在具有数据的服务器上。
build议尽可能使用最新的数据库服务器副本,更好地为生产数据库提供故障切换。
对于软件,你可以例如看看bacula或zmanda
我们的标准设置是HA集群,其中两个数据库一个复制到另一个只读。
我们每天做一次全面的备份,然后按照每客户的政策淘汰旧的备份,通常我们保留4个最后的每日备份(在周末生存),4个最后的星期天和4个最后的第一个星期天。 在那之后,一年或者两年的转储将永远存档。
我们还保留复制日志,不pipe多长时间,我们都可以节省磁盘空间。 作为debugging工具,它们也非常有用,因为它们logging了谁更改了什么和什么时候更改。
从理论上讲,所有你需要的是一个完整的备份和所有的复制日志,以便能够做一个时间点的恢复,但更频繁的完整备份将加速恢复。
备份的一个巧妙的技巧是使用innodb表和–sql转储的单一事务参数,这样备份将不会阻止数据库运行。
我正在使用Percona的Xtrabackup 。 它是InnoDB / XtraDB的非阻塞备份解决scheme
备份的全部目的是能够恢复。
我不会主张CSV转储作为备份解决scheme; 所有它会给你的是原始数据。 除此之外还有很多,特别是在数据库方面。 表格描述,视图,存储过程,你的名字。 如果你还没有这些,你将无法成功恢复。 还有RDBMS应用程序和configuration要考虑。 您可能会有大量的修补程序,您还需要将它们放在恢复环境中才能达到同一级别。 您可能正在运行由您的应用程序的要求决定的特殊configuration。 您甚至可能需要一组特定的操作系统设置,以使数据库以最佳方式运行。 所有这些都将需要回来,除非你有一个能够做到这一点的备份解决scheme,否则你的恢复时间会进一步延迟,更不用说不能保证你能够恢复到原来的状态。
对于数据库备份(和一般备份),我总是喜欢使用可以处理所有这些的“真实”备份软件。
最近,我pipe理EC2中的MySQL服务器。 我们在15分钟的cron工作中创build了EBS快照,保存了3-5个快照。
当我们做“传统”的MySQL服务器时,我们每天都通过MySQl-ZRM进行备份。 备份本质上是mysqldumps,根据客户的需要,备份发送到磁带,SAN等。
两种方法都可以不停止数据库。
对于MySQL我使用automysqlbackup( http://sourceforge.net/projects/automysqlbackup/ ),因为我的备份软件(Backup Exec)不支持Linux系统上的快照。
它工作正常,但我要监视此线程的build议:)
我们每天执行两次备份,并且每10-15分钟运行一次日志备份。
此方法的优点是,您可以从每天两次的备份之一进行还原,然后将日志文件最迟应用到最后15分钟。 这样您就可以最大限度地减less可能丢失的数据量。
但是,备份数据的频率取决于您。 你输了多less数据? 如果你能承受失去一天的数据,然后每天备份一次。 数据从不改变? 那么你只需要一个副本!