快速复制 MySQL 大数据库进行测试

Posted

技术标签:

【中文标题】快速复制 MySQL 大数据库进行测试【英文标题】:Quickly copy big MySQL database for testing 【发布时间】:2015-06-16 13:46:22 【问题描述】:

在运行我们的验收测试套件时,我们希望在定义的数据库状态上执行每一个测试。如果其中一项测试将写入数据库(如创建用户或其他),它当然不能影响以后的测试。

我们已经考虑了几个选项来实现这一点,但是在每次测试之前复制整个数据库似乎并不是最好的解决方案(考虑到可能的性能问题)。

另一个想法是使用 mysql 事务,但我们的一些测试会导致许多 HTTP 请求,因此会产生不同的 php 进程,并且它们会过早丢失事务而无法在完整测试完成后进行干净回滚。

有没有更好的方法来保证我们的每个验收测试的定义数据库状态?我们希望它比 aufsbtrfs 在系统级别解决它的解决方案更简单。

【问题讨论】:

关闭mysql,物理复制db文件,重启mysql。稍后,冲洗,重复。 技术上不是最有吸引力的解决方案,因为我们必须在每个测试用例的每个测试方法之后执行此操作,但也许这是必要的!?感谢您的意见! 【参考方案1】:

您可以使用 PhpUnit 解决这个问题。

它用于 PHP 的自动化测试。不是唯一的库,而是扩展最多的库之一。

您也可以将它用于数据库测试 (https://phpunit.de/manual/current/en/database.html)。基本上,它可以让你准确地完成你正在寻找的东西。最初导入整个数据库,然后在每个测试套件中,加载您需要的内容,然后恢复到以前的状态。例如,您可以暂时保存表 A 的当前状态,并在完成套件的所有测试后,简单地恢复它。而不是重新加载整个数据库。

顺便说一句,拥有一个仅包含测试所需信息的最小数据库也会有很大帮助。在这种情况下,您不必处理大的性能问题,您可以在每个测试套件之后简单地恢复它。

【讨论】:

我明白你的意思,我们实际上已经在使用 PHPUnit 进行单元测试。对于验收测试夹具和最小数据库似乎没有那么有用。我们更愿意对(几乎)真实数据采取行动,只是在测试时不通过永久写入数据库来编辑它们。可重复性是我们的关键需求…… 那么如果你不能使用最小的数据库(虽然你应该能够在你的表中重现所有可能的情况),然后查看我写的关于将部分数据库恢复到以前状态的内容.根据具体情况,恢复一个或两个表是可行的。显然,如果您有一张巨大的桌子,您将不得不等待。我现在看不到其他解决方案。 在 MySQL 中恢复之前数据库状态的最佳方法是什么? 我无法获得部分还原的示例,尽管看起来 Doctrine 有它自己的方式来做到这一点phpunit.de/manual/current/en/…你能解释一下为什么你不能有一个最小的数据库吗?我设法从 11GB 的生产数据库中提取了 7MB 的最小数据库。

以上是关于快速复制 MySQL 大数据库进行测试的主要内容,如果未能解决你的问题,请参考以下文章

如何利用docker快速构建MySQL主从复制环境

MySQL复制异常大扫盲:快速溯源与排查错误全解

mysql-蠕虫复制--快速插入数据

MySQL中快速复制数据表方法汇总

MySQL中快速复制数据表方法汇总

骚操作:巧用MySQL主从复制延迟拯救误删数据