4

使用 innodb 表导出/导入 mysql 数据库的最快方法是什么?

我有一个生产数据库,我需要定期将其下载到我的开发机器上以调试客户问题。我们目前这样做的方式是下载我们的常规数据库备份,这些备份是使用“mysql -B dbname”生成的,然后被 gzip 压缩。然后我们使用“gunzip -c backup.gz | mysql -u root”导入它们。

从阅读“mysqldump --help”中我可以看出,mysqldump 默认使用 --opt 运行,看起来它打开了一堆我能想到的可以加快导入速度的东西,例如关闭索引并将表作为一个庞大的导入语句导入。

有没有更好的方法来做到这一点,或者我们应该做进一步的优化?

注意:我主要想优化将数据库加载到我的开发机器(一个相对较新的 macbook pro,有很多内存)所花费的时间。备份时间和网络传输时间目前不是大问题。

更新:

要回答答案中提出的一些问题:

  • 生产数据库架构每周最多更改几次。我们正在运行 rails,因此在陈旧的生产数据上运行迁移脚本相对容易。

  • 我们需要每天或每小时将生产数据放入开发环境中。这完全取决于开发人员正在做什么。我们经常遇到特定的客户问题,这些问题是某些数据分布在数据库中的多个表中的结果,需要在开发环境中进行调试。

  • 老实说,我不知道 mysqldump 需要多长时间。不到 2 小时,因为我们目前每 2 小时运行一次。然而,这不是我们想要优化的,我们想要优化到开发人员工作站的导入。

  • 我们不需要完整的生产数据库,但将我们需要和不需要的东西分开并不是一件容易的事(有很多表具有外键关系)。这可能是我们最终必须去的地方,但如果可以的话,我们想避免它更长一点。

4

2 回答 2

3

这取决于您如何定义“最快”。

正如 Joel 所说,开发人员的时间很昂贵。Mysqldump 可以工作并处理很多情况,否则您必须自己处理或花时间评估其他产品以查看它们是否处理它们。

相关问题是:

您的生产数据库模式多久更改一次?

注意:我指的是添加、删除或重命名表、列、视图等,即会破坏实际代码的东西。

您需要多久将生产数据放入开发环境中?

以我的经验,根本不经常。我通常发现一个月一次就足够了。

mysqldump 需要多长时间?

如果少于 8 小时,它可以作为 cron 作业在一夜之间完成。问题解决了。

你需要所有的数据吗?

另一种优化方法是简单地获取相关的数据子集。当然,这需要编写自定义脚本来获取实体子集和所有相关的相关实体,但会产生最快的最终结果。该脚本还需要通过模式更改来维护,因此这是一种耗时的方法,应该作为绝对的最后手段使用。生产样本应该足够大,以包含足够广泛的数据样本并识别任何潜在的性能问题。

结论

基本上,只使用 mysqldump 直到你绝对不能。花时间在另一个解决方案上的时间不是花在开发上的时间。

于 2009-04-26T01:32:41.680 回答
2

考虑使用复制。这将允许您实时更新您的副本,即使您必须关闭从属服务器,MySQL 复制也允许赶上。您还可以在普通服务器上使用并行 MySQL 实例,将数据复制到支持在线备份的 MyISAM 表中。只要表具有相同的定义,MySQL 就允许这样做。

另一个值得研究的选项是著名 MySQL 性能专家 Percona 的XtraBackup。这是 InnoDB 的在线备份解决方案。不过,我自己还没有看过它,所以我不会保证它的稳定性,或者它甚至是解决您问题的可行解决方案。

于 2009-04-26T01:41:57.257 回答