2017-04-19 69 views
2

我在Postgres 9.5中有一张表,大约7KK行。 Django版本是1.10.5。数据库和应用程序是在一个本地网络内与Ubuntu 16.04.2不同的服务器。Django挂在应用巨大的迁移

Django的gunicorn服务器已停止,因此没有其他操作正在执行。我要补充有一个字段:

migrations.AlterField(
      model_name='balanceentry', 
      name='reason', 
      field=models.CharField(
       choices=[(b'default', b'Default'), (b'referral', b'Referral'), (b'referrer', b'Referrer'), 
         (b'random', b'Random'), (b'android_offer', b'Android Offer'), (b'ios_offer', b'iOS Offer'), 
         (b'offerwall', b'Offerwall'), (b'withdrawal', b'Withdrawal')], 
       default=b'default', db_index=True, max_length=32), 
     ), 

然后我将它:

$ ./manage.py migrate users 0026_auto_20170419_1758 
Operations to perform: 
    Target specific migration: 0026_auto_20170419_1758, from users 
Running migrations: 
    Applying users.0026_auto_20170419_1758... 

和监测的Postgres与pg_top。

它做ALTER约15分钟,然后我看到:

34567 postgres 20 0 401M 39M sleep 2:17 0.10% 0.00% postgres: *** *** ip(45200) idle in transaction 

这并不适用于大约10分钟变化(仅WCPU从0%变为约0.1%和背面)。

然后这个记录消失(我认为这意味着客户端断开连接),但./manage.py migrate ...根本没有改变它的状态,它只是保持“运行”而没有改变(我已经等了大约2个小时)。

我试着重新启动postgres服务,如果我这样做,它回滚事务(我认为),释放一些磁盘空间,但迁移管理命令仍然挂起。它甚至没有在Ctrl-C上作出反应,我只能用-9来杀死它。

我还注意到,每次尝试后都会消失大约1-2 GB的可用磁盘空间。

那么,我该如何解决这个问题?

回答

1

由于名誉太少,我无法发表评论,所以它必须是一个答案。

我没有解决方案,但想法解决方法。您可以键入python manage.py sqlmigrate,它将显示它执行的SQL,然后手动将其运行到数据库。如果这可以成功,则需要在数据库表django_migrations中添加一个条目,其中包含用于迁移的迁移名称和应用程序。

我不知道这是否可行,但您可能能够查明SQL语句中的错误并优化一下。

+0

我刚刚考虑过这样的解决方案:)谢谢,我会尝试。 – arts777

+0

是的,这有帮助。谢谢! – arts777