2017-04-19 4 views
2

Ich habe eine Tabelle in Postgres 9.5 mit etwa 7KK Zeilen. Djangos Version ist 1.10.5. Datenbank und App sind verschiedene Server mit Ubuntu 16.04.2 in einem lokalen Netzwerk.Django hängt an der Anwendung großer Migration

Djangos Gunicorn-Server wird gestoppt, daher werden keine anderen Operationen ausgeführt. Ich werde dort ein Feld hinzuzufügen:

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), 
     ), 

Und dann bin ich Anwendung:

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

und Überwachung Postgres mit pg_top.

Es ALTER für etwa 15 Minuten tut, dann sehe ich das:

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

Dies gilt nicht für etwa 10 Minuten ändern (nur WCPU von 0% bis etwa 0,1% zu ändern und zurück).

Dann verschwindet dieser Datensatz (ich denke, das bedeutet, Client ist getrennt), aber ./manage.py migrate ... ändert seinen Status überhaupt nicht, es bleibt nur "läuft" ohne Änderungen (ich habe etwa 2 Stunden gewartet).

Ich habe versucht, postgres-Dienst neu zu starten, wenn ich dies tue, Rollback-Transaktion (denke ich), gibt etwas Speicherplatz frei, aber Migrations-Management-Befehl bleibt immer noch hängen. Es reagiert nicht einmal auf Ctrl-C, ich kann es nur mit -9 beenden.

Ich bemerkte auch, dass etwa 1-2 GB freier Speicherplatz nach jedem Versuch verschwindet.

Also, wie kann ich dieses Problem beheben?

Antwort

1

Ich kann nicht kommentieren, wegen zu wenig Ruf, so muss es eine Antwort sein.

Ich habe keine Lösung, aber eine Idee zu einem Workaround. Sie können python manage.py sqlmigrate eingeben, die die SQL, die es ausführt, anzeigen und es dann manuell in Richtung der Datenbank ausführen. Wenn dies gelingen kann, müssen Sie einen Eintrag in der Datenbanktabelle django_migrations mit dem Migrationsnamen und der App für die Migration hinzufügen.

Ich habe keine Ahnung, ob das funktioniert, aber Sie könnten den Fehler in der SQL-Anweisung genau lokalisieren und ein wenig optimieren.

+0

Ich habe gerade über eine Lösung wie folgt nachgedacht :) Danke, ich werde es versuchen. – arts777

+0

Ja, das hat geholfen. Vielen Dank! – arts777