通过pt-online-schema-change,可以暂停" swap"代码库部署的阶段?

时间:2014-08-15 18:07:29

标签: php mysql percona

我正在调查使用pt-online-schema-change来协助某些迁移,其中ALTER TABLE命令会导致长维护窗口。据我所知,pt-online-schema-change将创建表的空副本以执行ALTER TABLE命令,然后将批处理的行从旧表迁移到新表,并创建触发器以管理临时数据更改。

但是当新表与旧表交换时,是否可以在此时暂停,以便我们可以使用新的代码库部署来计时?我在文档中没有看到这个问题。显然,我们的新版本(使用Symfony)的PHP ORM(学说)将期望某个模式到位,如果在代码库部署之前或之后发生交换,将导致问题。

一个相关的问题是我理解必须在所有子表上更新外键约束,否则它们仍将引用旧表。这是否意味着这个阶段是在维护窗口后完成的?如果我们计算数据迁移的时间与特定代码库的发布时间一致,我不知道如何提前做到这一点。

2 个答案:

答案 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来复制数据。