在Heroku上运行的Postgres支持的Rails应用程序上,我尝试添加一个布尔列,默认设置为false,null设置为false (非NULL)。
迁移需要几个小时才能运行(实际上大约有15个这样的字段需要添加)。内存使用量达到顶峰(5-6 6gb或更高)。我认为这是因为Postgres将迁移包装在一个事务中,并试图将整个表加载到内存中,以便在失败时可以回滚。
如果没有字段default或NOT NULL,该列很快就会被添加。
作为临时解决方案,我在没有任何限制的情况下添加新列,以1000条记录为一批更新所有具有错误缺省值的记录,最后将列更改为具有default和NOT NULL要求。
现在,迁移大约需要3-4个小时来运行,并且只使用大约100mb的RAM。
有没有更好的解决方案?
发布于 2011-09-13 18:01:08
从您的时间安排来看,我希望您通过RoR执行“升级”,这可能意味着“一次处理一行”。我刚刚用一个主键和3个外键在一个300K行的表上进行了测试,添加一个布尔值大约需要5秒(对我来说,太短了,无法对其进行准确的基准测试):
ALTER TABLE mine.trivally
ADD COLUMN the_bool boolean NOT NULL DEFAULT 'True' ;
这表明您的框架生成的代码不是最优的。至少可以这么说。
发布于 2011-09-13 08:22:42
查看large-hadron-migrator。它声称是一个执行大规模单表迁移的方案的实现。它比简单的迁移复杂得多,因为它使用几个背景表和一组触发器来完成迁移,要么完全在线,要么停机时间最短。
https://stackoverflow.com/questions/7395485
复制相似问题