如何备份MySQL数据库?

5

当备份具有数百万条目的数据库时,我需要考虑什么?是否有任何工具(可能与MySQL服务器捆绑在一起)可供使用?


这个问题应该移动到serverfault.com吗? - Kimvais
@Kimvais:是的,我认为是这样。回答也会被移动吗? - Hanno Fietz
我经常会参考这个问题的答案,包括我的答案。外部存储。 :P - Hanno Fietz
可能是如何在MySQL中进行备份?的重复问题。 - martin clayton
你可以简单地使用这个工具 http://mysqlbackupftp.com/ 进行定期备份。 - user6155322
5个回答

7
根据您的需求,我自己使用了几个选项:
  • 如果您不需要热备份,请关闭数据库服务器并在文件系统级别上进行备份,例如使用tar、rsync或类似工具。
  • 如果您需要数据库服务器继续运行,可以使用mysqlhotcopy工具(一个perl脚本),它锁定正在备份的表并允许您选择单个表和数据库。
  • 如果您希望备份是可移植的,您可能需要使用mysqldump,它创建用于重新创建数据的SQL脚本,但比mysqlhotcopy慢。
  • 如果您在某个时间点有一个数据库副本,也可以将binlog(从该时间点开始)保存在安全位置。这样做非常容易,不会干扰服务器的操作,但恢复速度可能不是最快的,并且您必须确保不会错过日志的任何部分。

我还没有尝试过但对我来说有意义的方法:

  • 如果您有像ZFS这样的文件系统或正在运行LVM,则通过进行文件系统快照来对数据库进行快照可能是一个好主意,因为它们非常快速。只需记住在整个操作期间确保db处于一致状态,例如通过执行FLUSH TABLES WITH READ LOCK(当然,在此之后不要忘记UNLOCK TABLES

另外:

  • 您可以使用主从设置将生产服务器复制到不同的机器或同一台机器上的第二个实例,并对复制的副本执行上述任何操作,使生产机器保持不变。您也可以定期启动从服务器,让它读取binlog,然后再关闭它。
  • 我认为,MySQL集群和企业版许可证版本具有更多工具,但我从未尝试过。

6

Mysqlhotcopy的描述不够准确 - 它只能在使用MyISAM时才能工作,而且它并不是热备份。

使用mysqldump的问题在于恢复备份所需的时间(但如果您有所有InnoDB表,则可以使其成为热备份,请参见--single-transaction)。

我建议使用热备份工具,例如XtraBackup中提供的工具: http://www.percona.com/docs/wiki/percona-xtrabackup:start


这个评论对我帮助很大。我之前不知道有 --single-transaction 选项,如果针对大型数据库加上 --quick 选项,它的效果非常好!谢谢你。 - KSolo

3

如果使用 MyISAM 存储引擎备份大型表时,要小心使用 mysqldump;在每个表上运行备份时,它会阻塞选择操作,并且在某些情况下可能会使繁忙的站点停机 5-10 分钟。

相比之下,使用 InnoDB 可以获得非阻塞备份,因为它具有行级锁定功能,因此这不是一个问题。

如果需要使用 MyISAM,常见策略是复制到第二个 MySQL 实例并对复制副本进行 mysqldump 备份。


2

使用phpMyAdmin中的导出选项卡。phpMyAdmin是用于进行MySQL管理的免费易于使用的Web界面。


是的,这是一个不错的解决方案,但它并不严格属于备份解决方案!他也可以通过编写备份脚本并定期执行来实现。 - nickhar
同意,但phpMyAdmin是一种流行的工具,我的回答更多是针对观众而非提问者(可能正在使用该工具)。 - ForumLeech

1

实际上并没有“正确的”方式。正如Flubba所指出的,mysqldump会锁定表格,在生产过程中可能会不太愉快。这也比例如mysqlhotcopy慢。 - Hanno Fietz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接