Tengo una tabla en Postgres 9.5 con aproximadamente 7KK filas. La versión de Django es 1.10.5. La base de datos y la aplicación son servidores diferentes con Ubuntu 16.04.2 dentro de una red local.
El servidor gunicorn de Django está detenido, por lo que no se ejecuta ninguna otra operación. Voy a agregar un campo allí:
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), ),
Y luego lo estoy aplicando:
$ ./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...
Y monitoreando Postgres con pg_top.
Está haciendo ALTER durante unos 15 minutos, luego veo esto:
34567 postgres 20 0 401M 39M sleep 2:17 0.10% 0.00% postgres: *** *** ip(45200) idle in transaction
Esto no cambia durante unos 10 minutos (solo WCPU cambia de 0 % a aproximadamente 0,1 % y viceversa).
Luego, este registro desaparece (creo que esto significa que el cliente está desconectado), pero ./manage.py migrate ...
no cambia su estado en absoluto, simplemente permanece "ejecutándose" sin cambios (he esperado alrededor de 2 horas).
Intenté reiniciar el servicio de postgres, si hago esto, revierte la transacción (creo), libera algo de espacio en el disco, pero el comando de administración de migración aún se bloquea. Ni siquiera reacciona con Ctrl-C, solo puedo matarlo con -9.
También noté que alrededor de 1-2 GB de espacio libre en el disco desaparecen después de cada intento.
Entonces, ¿cómo puedo solucionar este problema?
No puedo hacer comentarios debido a la poca reputación, por lo que tendrá que ser una respuesta.
No tengo una solución, pero una idea para una solución alternativa. Puede escribir python manage.py sqlmigrate
que mostrará el SQL que realiza y luego ejecutarlo manualmente hacia la base de datos. Si esto puede funcionar, debe agregar una entrada en la tabla de la base de datos django_migrations
con el nombre de la migración y la aplicación para la migración.
No tengo idea de si esto funcionará, pero es posible que pueda identificar el error en la declaración SQL y optimizarlo un poco.