我正在研究使用 pt-online-schema-change 来协助某些迁移,其中 ALTER TABLE 命令会导致较长的维护窗口。我知道 pt-online-schema-change 将创建表的空副本以执行 ALTER TABLE 命令,然后将行从旧表批量迁移到新表,并创建触发器来管理临时的数据更改。
但是,当新表与旧表交换时,是否可以在此时暂停,以便我们可以用新的代码库部署来计时?我在文档中没有看到这个问题。显然,我们新版本(使用 Symfony)的 PHP ORM(原则)将期望某个模式就位,并且如果交换发生在代码库部署之前或之后,将会导致问题。
一个相关的问题是我知道必须在所有子表上更新外键约束,因为否则它们仍然会引用旧表。这是否意味着此阶段是在维护窗口之后完成的?如果我们将数据迁移的时间安排与特定代码库的发布一致,我不知道如何提前做到这一点。
您可以将暂停逻辑的代码编写到运行的插件中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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,当您准备好时,打开另一个 shell 窗口来 rm 文件,然后 pt-online-schema-change 将继续。
有关详细信息,请参阅文档中的“插件”部分。
回复您的评论:
似乎每个人都一定有你目前面临的问题。但你是我听到的第一个要求此功能的人。
大多数人编写的代码可以在架构更改之前和之后读取和写入表。例如,如果您要添加列、避免SELECT *和INSERT ... VALUES()语句,那么当出现新列时,应用程序不会感到惊讶。因此,没有必要通过架构更改来安排代码推送的时间。
但有时架构更改的性质需要更改代码。例如,重命名列。对于这些必要的情况,几分钟的停机时间是可以接受的。