Django 挂在应用巨大的迁移上
Django hangs on applying huge migration
我在 Postgres 9.5 中有一个 table,大约有 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。
它正在执行 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 ...
根本没有改变它的状态,它只是保持"running"没有变化(我已经等了大约 2 小时)。
我尝试重新启动 postgres 服务,如果我这样做,它会回滚事务(我认为),释放一些磁盘 space,但迁移管理命令仍然挂起。它甚至对 Ctrl-C 没有反应,我只能用 -9 杀死它。
我还注意到大约 1-2 GB 的可用磁盘 space 在每次尝试后都会消失。
那么,我该如何解决这个问题?
我无法发表评论,因为声誉太低,所以它必须是一个答案。
我没有解决方案,但有解决方法。您可以键入 python manage.py sqlmigrate
,这将显示它执行的 SQL,然后手动 运行 它到数据库。如果这能成功,您需要在数据库中添加一个条目-table django_migrations
带有迁移名称和迁移的应用程序。
我不知道这是否可行,但您可以查明 SQL 语句中的错误并对其进行一些优化。
我在 Postgres 9.5 中有一个 table,大约有 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。
它正在执行 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 ...
根本没有改变它的状态,它只是保持"running"没有变化(我已经等了大约 2 小时)。
我尝试重新启动 postgres 服务,如果我这样做,它会回滚事务(我认为),释放一些磁盘 space,但迁移管理命令仍然挂起。它甚至对 Ctrl-C 没有反应,我只能用 -9 杀死它。
我还注意到大约 1-2 GB 的可用磁盘 space 在每次尝试后都会消失。
那么,我该如何解决这个问题?
我无法发表评论,因为声誉太低,所以它必须是一个答案。
我没有解决方案,但有解决方法。您可以键入 python manage.py sqlmigrate
,这将显示它执行的 SQL,然后手动 运行 它到数据库。如果这能成功,您需要在数据库中添加一个条目-table django_migrations
带有迁移名称和迁移的应用程序。
我不知道这是否可行,但您可以查明 SQL 语句中的错误并对其进行一些优化。