Django坚持应用大规模迁移

时间:2017-04-19 22:22:16

标签: python django postgresql psycopg2

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

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...

用pg_top监控Postgres。

它正在做约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 个答案:

答案 0 :(得分:4)

我无法发表评论,因为名声太少,所以必须回答。

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

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