Django 坚持应用大规模迁移

int*_*_32 3 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),
        ),
Run Code Online (Sandbox Code Playgroud)

然后我正在应用它:

$ ./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...
Run Code Online (Sandbox Code Playgroud)

并使用 pg_top 监控 Postgres。

它做了大约 15 分钟的 ALTER,然后我看到了这个:

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

这在大约 10 分钟内不会改变(只有 WCPU 从 0% 变为大约 0.1% 并返回)。

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

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

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

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

小智 6

我无法发表评论,因为声誉太低,所以它必须是一个答案。

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

我不知道这是否行得通,但您也许能够查明 SQL 语句中的错误并对其进行一些优化。