我正在调查使用pt-online-schema-change来协助某些迁移,其中ALTER TABLE命令会导致长维护窗口。据我所知,pt-online-schema-change将创建表的空副本以执行ALTER TABLE命令,然后将批处理的行从旧表迁移到新表,并创建触发器以管理临时数据更改。
但是当新表与旧表交换时,是否可以在此时暂停,以便我们可以使用新的代码库部署来计时?我在文档中没有看到这个问题。显然,我们的新版本(使用Symfony)的PHP ORM(学说)将期望某个模式到位,如果在代码库部署之前或之后发生交换,将导致问题。
一个相关的问题是我理解必须在所有子表上更新外键约束,否则它们仍将引用旧表。这是否意味着这个阶段是在维护窗口后完成的?如果我们计算数据迁移的时间与特定代码库的发布时间一致,我不知道如何提前做到这一点。
答案 0 :(得分:3)
您可以将暂停逻辑的代码编写到运行before_swap_tables
。
例如(未经测试,但这应该给你基本的想法):
package pt_online_schema_change_plugin
sub new() {
open HANDLE, ">>pause_please.txt" or die "$!";
close HANDLE;
}
sub before_swap_tables() {
print "Pausing until you rm pause_please.txt...\n";
while (-f "pause_please.txt") {
sleep(1);
}
}
然后当你准备好了,打开另一个shell窗口来发送文件,然后继续pt-online-schema-change。
有关详细信息,请参阅documentation中的“PLUGIN”部分。
重新评论:
看起来好像每个人都必须遇到你当前面临的问题。但是你是我听过第一个要求这个功能的人。
大多数人编写的代码可以在架构更改之前和之后读取和写入表。例如,如果您要添加列,请避免使用SELECT *
和INSERT ... VALUES()
语句,因此当出现新列时,应用程序不会让应用程序感到惊讶。因此,没有必要对模式更改进行时间代码推送。
但有时,架构更改的性质需要更改代码。例如,重命名列。对于这些情况,如果有必要,可以接受几分钟的停机时间。
答案 1 :(得分:0)
从版本pt-online-schema-change 2.2.20
开始,有选项--pause-file
documentation但是这只会更新架构并等待复制数据,直到文件被删除。
我创建了这个plugin来复制数据。