您通常如何备份数据库?


8

我正在使用mysql

您多久备份一次数据库?

您通常如何备份数据库?

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

Answers:


11

如果要正确地进行MySQL备份,而不会造成任何停机,则应将数据库复制到备用服务器上。它不需要强大,只需应付您的master数据库的写负载。您不应该在生产中使用此服务器。如果复制无法跟上步伐,则需要功能更强大的服务器。您可以通过比较日志文件和输出位置来进行检查

 > SHOW MASTER STATUS\G

在主人和

 > SHOW SLAVE STATUS\G

在奴隶上。我认为MySQL5将显示出滞后性SHOW SLAVE STATUS

当您高兴自己的奴隶跟上来时,您可以通过执行以下操作来进行备份

  1. SLAVE STOP;在从属服务器上停止复制
  2. 做一个mysqldump --opt从服务器上。
  3. SLAVE START;在从属服务器上再次开始复制

如果执行此操作,则将拥有数据库的一致备份。此方法可防止不同的数据库,甚至更糟的是,同一数据库中的不同表不同步,并通过在执行备份时锁定表进行写操作来防止停机。

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

几个随机提示:

  • 不要试图对mysql数据文件进行基于文件的备份。它比价值更麻烦,并且MySQL转储更加灵活。
  • 在转储过程中要当心mysqldump锁定表。
  • 当心转储中的不一致,除非您在转储期间锁定了每个表
  • 使用mysqldump --opt,因为它通常是导入结果SQL的最快方法
  • 尽可能多地转储。我们每天都进行转储,因为我们有40GB以上的数据。
  • 偶尔在备用服务器上测试转储,以确保它们可以正常工作。

2
SHOW SLAVE STATUS中的Seconds_Behind_Master在4.1.9及更高版本中可用。
丹·卡利

+1复制和常规转储。我发现第一次上班相对比较容易(没有很多以前的mysql经验)。我对文件备份并不完全同意,如果您有足够的空间做这两个工作,那么如果您的数据库服务器扩展,基于文件的备份将更容易重建新服务器,每个数据库的单独sql转储会更多如果您需要恢复某人丢失的数据,则很有用。
theotherreceive

3

我使用一个脚本,该脚本用于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

1

通常,如果必须停止数据库,则每天备份一次,然后将备份转移到存储区域以进行合并,然后将其转到磁带。

大多数情况下,数据库备份是使用数据库引擎随附的本机工具完成的。

万一发生硬件故障,备份和数据将不保留在服务器上。

强烈建议在可能的情况下拥有最新的数据库服务器副本,更好地为生产数据库提供故障转移机制。

对于软件,您可以例如查看baculazmanda


1

我们的标准设置是一个HA集群,其中有两个数据库是只读的,两个数据库相互复制。

我们每天进行一次完整备份,然后按照客户的政策淘汰旧备份,通常我们会在一个月内保留4个最近的每日备份(以维持周末;),4个最后的星期日和4个最后的第一个星期日。之后,一年或一年的转储将永久保存到存档中。

我们还将复制日志保留很长时间,只要我们有足够的能力来保留磁盘空间即可。它们作为调试工具也非常有用,因为它们可以准确记录谁在何时何地进行了更改。

从理论上讲,您只需要一个完整备份和所有复制日志即可进行时间点还原,但是更频繁的完整备份将加快还原速度。

备份的一个巧妙技巧是对mysql dump使用innodb表和--single-transaction参数,这样备份就不会在数据库运行时阻塞数据库。



1

备份的全部目的是为了能够还原。

我不会提倡使用CSV转储作为备份解决方案。它只会给您原始数据。除此之外,还有很多其他功能,尤其是对于数据库。您可以对表说明,视图,存储的过程进行命名。如果您还没有这些,那么您将无法成功将其恢复。还有RDBMS应用程序和配置要考虑。您可能需要安装大量补丁程序,还需要在恢复环境中安装补丁程序才能使其达到相同的水平。您可能正在根据应用程序的要求运行某些特殊的配置。您甚至可能需要一组特定的OS设置,数据库才能最佳运行。所有这些都需要恢复,除非您有能够做到这些的备份解决方案,否则将进一步延迟恢复时间,

对于数据库备份(以及一般的备份),我总是更喜欢使用可以处理所有这些的“真实”备份软件。


0

最近,我在EC2中管理MySQL服务器。我们在15分钟的cron作业中设置了EBS快照,保留了3-5个快照。

当我们做“传统的” MySQL服务器时,我们每天通过MySQl-ZRM进行备份。备份本质上是mysqldump,根据客户的需求将其发送到磁带,SAN等。

两种方法都可以完成而无需停止数据库。



0

我们每天进行两次备份,并且每10-15分钟运行一次日志备份。

此方法的优点是,您可以从每天两次的备份之一还原,然后将日志文件应用到最晚的最后15分钟。这样,您将丢失的数据量降至最低。

但是,备份数据的频率取决于您。您对丢失多少数据感到满意?如果您有能力丢失一天的数据,那么请每天备份一次。数据永不改变?然后,您只需要一份!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.