你通常如何备份你的数据库?

我正在使用MySQL

您多久备份一次数据库

你通常如何备份你的数据库?

将所有数据导出为sql或cvs格式并保存在文件夹中?

如果您想正确执行MySQL备份,而没有任何停机时间,则应该将数据库复制到备用服务器。 它不需要非常强大,只需要处理主数据库的写入负载。 你不应该在生产中使用这个服务器。 如果复制永远不能保持,你需要一个更强大的服务器。 您可以通过比较日志文件和输出的位置来检查

> SHOW MASTER STATUS\G 

在主人和

  > SHOW SLAVE STATUS\G 

在奴隶。 我认为MySQL5将显示从SHOW SLAVE STATUS的滞后。

当你感到高兴时,你的奴隶正在跟上,你可以通过做你的备份

  1. SLAVE STOP;停止复制SLAVE STOP; 在奴隶
  2. 在从服务器上执行mysqldump --opt
  3. 再次用SLAVE START;启动复制SLAVE START; 在奴隶

如果你这样做,那么你将有一个一致的数据库备份。 此方法可防止不同的数据库,甚至更糟糕的是,同一数据库中的不同表不同步,并通过在执行备份时locking写入表来防止停机。

这种设置的一个好处是,你有一个数据库的副本,您可以用它来运行长时间昂贵的查询,这不会影响您的实时服务。

几个随机提示:

  • 不要试图做一个基于文件的MySQL数据文件的备份。 这比它的价值更麻烦,MySQL转储更灵活。
  • 在转储过程中注意mysqldumplocking表。
  • 注意转储中的不一致,除非在转储期间locking每个表
  • 使用mysqldump --opt ,因为它通常是导入结果SQL的最快方法
  • 尽可能经常转储。 我们每天转储,因为我们有40GB的数据。
  • 偶尔在备用服务器上testing您的转储,以确保其正常工作。

我使用一个使用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数据? 如果你能承受失去一天的数据,然后每天备份一次。 数据从不改变? 那么你只需要一个副本!