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

如何备份MySQL数据库? 当备份一个有数百万条目的数据库时,我需要考虑什么?有什么工具(可能与MySQL服务器捆绑在一起)我可以使用吗?,mysql,database,backup,database-backups,Mysql,Database,Backup,Database Backups,我认为这是正确的方法。根据您的要求,我一直在使用几个选项: 如果不需要热备份,请关闭db服务器并在文件系统级别进行备份,即。E使用tar、rsync或类似工具 如果确实需要数据库服务器保持运行,可以从工具(一个perl脚本)开始,该工具锁定正在备份的表,并允许您选择单个表和数据库 如果您希望备份是可移植的,您可能希望使用,这会创建SQL脚本来重新创建数据,但比mysqlhotcopy慢 如果您在某个时间点有db的副本,您也可以将Binlog(从该时间点开始)保存在安全的地方。这很容易做到,并且

我认为这是正确的方法。

根据您的要求,我一直在使用几个选项:

  • 如果不需要热备份,请关闭db服务器并在文件系统级别进行备份,即。E使用tar、rsync或类似工具
  • 如果确实需要数据库服务器保持运行,可以从工具(一个perl脚本)开始,该工具锁定正在备份的表,并允许您选择单个表和数据库
  • 如果您希望备份是可移植的,您可能希望使用,这会创建SQL脚本来重新创建数据,但比mysqlhotcopy慢
  • 如果您在某个时间点有db的副本,您也可以将Binlog(从该时间点开始)保存在安全的地方。这很容易做到,并且不会干扰服务器的操作,但可能不是最快的恢复速度,您必须确保不会丢失部分日志
我没有尝试过的方法,但对我来说有意义:

  • 如果您有一个像ZFS这样的文件系统,或者正在LVM上运行,那么最好通过文件系统快照来对数据库进行快照,因为它们非常、非常快。只需记住,在整个操作过程中,确保数据库的状态一致即可。G通过执行
    使用读取锁定刷新表
    (当然,之后不要忘记
    解锁表
此外:

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

如果使用MyISAM存储引擎在大型表上使用mysqldump,请小心;当转储在每个表上运行时,它会阻止选择,在某些情况下,这会使繁忙的站点停机5-10分钟

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


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

Mysqlhotcopy描述得很糟糕-它只有在使用MyISAM时才起作用,而且不热

mysqldump的问题是恢复备份所需的时间(但如果您拥有所有InnoDB表,则可能会使备份变热,请参阅--single transaction)

我建议使用热备份工具,如XtraBackup中提供的工具:

使用phpMyAdmin中的导出选项卡。phpMyAdmin是一个用于管理MySQL的免费、易于使用的web界面。

是否应该将其移动到serverfault.com?@Kimvais:是的,我想是这样。答案也在动吗?我发现自己经常提到这个问题的答案,包括我自己的答案。外部存储器:你可以简单地使用这个工具进行定时备份。实际上没有“正确”的方法。正如Flubba正确指出的那样,mysqldump锁定了表,这在生产中可能会令人不快。它也比mysqlhotcopy慢。这个评论对我帮助很大。我不知道--single-transaction选项,如果您为大型数据库添加--quick选项,它将非常有用!谢谢。是的,这是一个很好的解决方案,但严格来说,它不是一个备份解决方案!他也可以通过编写备份脚本并重复执行来实现。同意,但phpMyAdmin是一个流行的工具,我的回答更适合观众,而不是问问题的人(可能正在使用该工具)。