我有一个大型数据库,需要每24小时重建一次。该数据库是使用服务器上的自定义脚本构建的,该脚本可对来自不同文件的数据进行处理。问题在于整个过程需要1分钟才能完成,因此停机时间为1分钟,因为我们需要删除整个数据库以重建它(除了删除它,别无其他方法)。
最初,我们计划建立一个临时数据库,删除原始数据库,然后将临时数据库重命名为原始名称,但是MySQL不支持数据库重命名。
第二种方法是从temp数据库中转储.sql文件并将其导入到main(原始)数据库中,但这也会导致停机。
做这个的最好方式是什么?
最佳答案
这是我要做的。它不会导致零停机,但可以在不到一秒钟的时间内完成。
创建一个仅包含与实际数据库的接口元素的数据库。就我而言,它仅包含视图定义,并且所有用户查询都通过该数据库。
每晚创建一个新的数据库。完成后,请更新视图定义以引用新数据库。我建议您在更新视图时关闭用户对包含视图的数据库的访问,或者删除所有视图并重新创建它们-这样可以防止部分访问旧数据库。因为创建视图的速度很快,所以这应该是非常快的操作。
我们通过一项工作来完成所有这些工作。实际上,在更改生产视图之前,我们在另一个数据库上测试视图创建以确保它们都可以正常工作。
显然,如果您使用alter view
而不是要求所有视图都保持一致,那么就不会出现停机时间,只是短暂的不一致时间。