Hilfe! Problem mit der Aggregation?

Ich habe ein großes Problem mit Gladys.
Die Weboberfläche ist nicht erreichbar und nichts funktioniert mehr.
Ich bin auf einem rpi4 mit SSD. Keine aktuelle Konfiguration.

> gladys-server@ start:prod /src/server
> cross-env NODE_ENV=production node index.js

2021-10-25T20:31:09+0200 <error> index.js:15 (process.<anonymous>) unhandledRejection catched: Promise {
  <rejected> DatabaseError [SequelizeDatabaseError]: SQLITE_ERROR: duplicate column name: last_monthly_aggregate
      at Query.formatError (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:415:16)
      at Query._handleQueryResponse (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:72:18)
      at afterExecute (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:246:27)
      at Statement.errBack (/src/server/node_modules/sqlite3/lib/sqlite3.js:14:21) {
    parent: [Error: SQLITE_ERROR: duplicate column name: last_monthly_aggregate] {
      errno: 1,
      code: 'SQLITE_ERROR',
      sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;'
    },
    original: [Error: SQLITE_ERROR: duplicate column name: last_monthly_aggregate] {
      errno: 1,
      code: 'SQLITE_ERROR',
      sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;'
    },
    sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;',
    parameters: undefined
  }
}
2021-10-25T20:31:09+0200 <error> index.js:16 (process.<anonymous>) DatabaseError [SequelizeDatabaseError]: SQLITE_ERROR: duplicate column name: last_monthly_aggregate
    at Query.formatError (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:415:16)
    at Query._handleQueryResponse (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:72:18)
    at afterExecute (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:246:27)
    at Statement.errBack (/src/server/node_modules/sqlite3/lib/sqlite3.js:14:21) {
  parent: [Error: SQLITE_ERROR: duplicate column name: last_monthly_aggregate] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;'
  },
  original: [Error: SQLITE_ERROR: duplicate column name: last_monthly_aggregate] {
    errno: 1,
    code: 'SQLITE_ERROR',
    sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;'
  },
  sql: 'ALTER TABLE `t_device_feature` ADD `last_monthly_aggregate` DATETIME DEFAULT NULL;',
  parameters: undefined
}

Bearbeitung: + Logs

Ist das tot? Muss ich den Container neu installieren?
In den Logs läuft dieselbe Nachrichtenserie in einer Endlosschleife…
MQTT funktioniert und der Rest des Pi auch. Ein Neustart hat nichts geändert.

Wie bist du in diese Situation geraten? Was hast du gemacht?

Bearbeitung: Ich habe den Eindruck, dass deine Basismigration beim Update schiefgelaufen ist. Ich hoffe, du bist der Einzige, dem das passiert ist (bei mir ist alles gut gelaufen).

@GBoulvin sind wir uns einig, hattest du beim letzten Update schon mal ein Problem? Warst du nicht derjenige, der Probleme mit dem Speicherplatz auf Gladys hatte?

Jedenfalls keine Panik, es gibt immer einen Weg, deine Daten zu migrieren, also lösche bitte nichts :grinning_face_with_smiling_eyes:

Bist du dir ganz sicher, dass dein SSD von Gladys verwendet wird, dass genug Platz vorhanden ist und dass alles in Ordnung ist?

Genau dieselbe Frage wie @VonOx, hast du nichts Besonderes an deiner Instanz gemacht? Hast du keine speziellen Builds auf deiner Produktions-DB installiert?

Nein nein, ich habe nichts angefasst und das letzte Update ist ohne ein Wort durchgelaufen
Ich bin mir sicher, dass ich auf dem SSD (sda1) bin:

pi@Gladys:~ $ sudo df
Dateisystem 1K-Blöcke Benutzt Verfügbar Ben% Eingehängt auf
/dev/root           18648328   6273352   11404636  36% /
devtmpfs             1708700         0    1708700   0% /dev
tmpfs                1873564         0    1873564   0% /dev/shm
tmpfs                1873564     18096    1855468   1% /run
tmpfs                   5120         4       5116   1% /run/lock
tmpfs                1873564         0    1873564   0% /sys/fs/cgroup
/dev/sda3          230719828 120039832  110679996  53% /media/Musique
/dev/sda1             252045     49242     202804  20% /boot
/dev/sdb4          975166564 513400624  461765940  53% /media/Films
/dev/sdc2         676424856 477706312  198718544  71% /media/Musique-Photos
/dev/sdc1          788711143 490094216  298616927  63% /media/Dessins_Animes
overlay             18648328   6273352   11404636  36% /var/lib/docker/overlay2/9db439ce3a564d9009ea1df484823e8f86d5222b2afb65d10d20ffc62cad1e54/merged
overlay             18648328   6273352   11404636  36% /var/lib/docker/overlay2/09164130445af755c153cf14fa034d3772ec72d7555f82efc08205e756141865/merged
overlay             18648328   6273352   11404636  36% /var/lib/docker/overlay2/1d0db2d20feb3e8ccab10febdf27997763a82a14735f58926c11631f66a6e44c/merged
tmpfs                 374712         0     374712   0% /run/user/1000

Ich glaube nicht, dass das mit dem SSD zusammenhängt

Könnte es sein, dass dein System während der Migration neu gestartet wurde?

Was ist genau passiert? Plötzlich war Gladys nicht mehr erreichbar? Hast du versucht, Gladys in der Zwischenzeit neu zu starten? :slight_smile:

Keine Panik, in jedem Fall können wir das in Ordnung bringen!

Falls es dir nichts ausmacht (falls du sensible Daten hast und es dir unangenehm ist, musst du es nicht tun, ich schlage es nur vor), könntest du bitte folgendes ausführen:

docker stop gladys

Dann die Datenbankdatei gladys-production.db aus dem Volume holen, das du beim Starten des Gladys-Containers angegeben hast und das auf deine SSD zeigt.

Das ist der linke Teil dieses Teils in deinem docker run:

-v /var/lib/gladysassistant:/var/lib/gladysassistant \

Und falls es dir nichts ausmacht, könntest du mir die Datei privat im Forum schicken, damit ich sehen kann, was nicht stimmt (du kannst sie auf einen Dropbox/Drive stellen, was auch immer du möchtest). So können wir die Datenbankmigration eingrenzen.

Vielleicht kann ich dir die Datei korrigieren und du kannst sie dann in deine Instanz zurückintegrieren :slight_smile:

Ich weiß, es ist ein bisschen handwerklich, aber es interessiert mich wirklich zu wissen, warum es bei dir besonders nicht funktioniert hat, während es bei allen anderen anscheinend funktioniert hat (zumindest hat sich meine Instanz selbst aktualisiert ohne Probleme, @VonOx ebenfalls, und alle vorherigen Tester hatten keine Probleme).

Also, da ich am 21. ein Backup der DB gemacht hatte, dachte ich, ich könnte sie wiederherstellen (bevor ich deine Nachricht gesehen habe).
Und es hat nicht funktioniert, die Fehlermeldung ist dieselbe.
Ich kann dir also die betreffende DB nicht mehr geben, da ich, ein bisschen dumm, die ‹ fehlerhafte › überschrieben habe, ohne sie zu sichern (da sie ja fehlerhaft war).
Ich schicke dir trotzdem die gesicherte DB (700 MB), die durch Gladys gelaufen ist, da sie wohl auch fehlerhaft ist?
Danke für deine Unterstützung!

PS: Ich verspreche, dass ich während des Updates nichts Ungewöhnliches gemacht habe (gab es ein Update?)
Gladys hat einfach aufgehört zu funktionieren (‹ nicht erreichbar ›). Ich habe es gemerkt, als die Aquarien nicht ausgeschaltet wurden und es im Wohnzimmer 24 Grad wurden :wink:

Danke @GBoulvin! :folded_hands:

Ich schaue mir das später an.

Ach, wenigstens gibt es etwas Positives: Es ist ein echtes Problem mit deiner DB und kein zufälliges Problem (z. B. eine Instanz, die neu startet, so etwas). Das ist gut zu wissen!

Aus Neugier, wann hast du Gladys zum ersten Mal installiert (um zu wissen, wie alt diese DB ist)? Bei der Veröffentlichung der v4? Während der Beta? Während der Alpha?

In all dem Leben dieser DB, bestätigst du, dass du nie eine « Custom Build » installiert hast, die auf dieselbe DB zugreift?

Jedenfalls werde ich heute Abend, wenn ich die DB sehe, Gewissheit haben, ich halte dich auf dem Laufenden!

Ja, ich habe Gladys v4.6.0 mit der Kurvenanzeige auf dem Dashboard veröffentlicht. Ich hatte noch keine Zeit, darüber zu kommunizieren, ich werde das am Wochenende an meinen Gladys-Tagen machen :slight_smile: Die Idee war auch, die ersten Rückmeldungen abzuwarten, bevor ich darüber kommuniziere. Bisher hat sich außer dir niemand beschwert, also ist das eher positiv :smiley:

Hallo!
Die erste Installation war im Dezember '20 und ich denke, dass die DB aus dieser Zeit stammt.
Ich habe nicht mit Test- oder Beta-Versionen herumgespielt.
Allerdings hatte ich in letzter Zeit ein paar Stromausfälle. Vielleicht ein Hinweis?

Ich hatte schon gesehen, dass sie im Bau war, aber du hast uns überrascht… Für Halloween? :wink:

Ich habe nachgeschaut, deine Datenbank ist in der Tabelle t_device_feature_state beschädigt, es gibt beschädigte Zeilen.

Ich weiß nicht, ob du bisher darauf geachtet hast, aber wenn Gladys aktiv ist, gibt es nicht 1 Datenbankdatei, sondern 3 Dateien:

Diese Dateien erscheinen nur, wenn die Datenbank in Verwendung ist. Es handelt sich um temporäre Dateien, die es SQLite ermöglichen, „WAL“ (write-ahead-log) zu speichern, damit deine Datenbank wiederhergestellt werden kann, falls Gladys abstürzt.

Falls du eine Kopie/Sicherung deiner Datenbank machen möchtest, muss Gladys zwingend gestoppt werden / oder du musst das offizielle SQLite-Backup-Tool (sqlite3 .backup, glaube ich) verwenden. Andernfalls kannst du, wenn du einfach nur die .db-Datei kopierst, auf eine beschädigte Datei stoßen.

Hast du zufällig diese Datenbank bewegt, ohne ein offizielles Tool zu verwenden oder Gladys zu stoppen?

Deine Datei konnte ich reparieren, aber ich kann sie dir erst morgen im Coworking hochladen, meine Upload-Geschwindigkeit zu Hause ist nicht stark genug, um sie dir zu schicken :slight_smile:

In meinen Erinnerungen habe ich immer einen „Stop Gladys“ vor jedem DB-Backup gemacht, aber es ist nicht unmöglich, dass ich einen Fehler gemacht habe…
Ich nehme an, da die Daten nicht genutzt wurden, war es kein Problem, dass die DB beschädigt war.
Danach habe ich viel gesucht, um die Installation auf eine SSD zu übertragen, ich hatte eine beschädigte SD usw. So viele potenzielle Fehlerquellen!
Kurz gesagt, vielen Dank, dass du dir die Zeit genommen hast, es dir anzusehen.
Wenn es möglich ist und es dir passt, zögere nicht, die DB zu kürzen, um sie zu entlasten, ich habe keine lebenswichtigen Daten…

Hallo,

Ich erlaube mir, das von mir beobachtete Verhalten hinzuzufügen, ohne zu wissen, ob es einen Zusammenhang mit dem hier Dargestellten gibt?

In der Aufgabenliste stelle ich zwei Arten von Fehlern fest, die ständig auftreten (diese Seite wird sehr, sehr lang):

« Aggregation der Sensordaten monatlich/täglich/stündlich »:

Error: TypeError: Cannot read property '0' of undefined
    at calculateTriangleArea (/src/server/node_modules/downsample/index.js:69:26)
    at LTTBIndexesForBuckets (/src/server/node_modules/downsample/index.js:662:18)
    at /src/server/node_modules/downsample/index.js:690:34
    at /src/server/lib/device/device.calculcateAggregateChildProcess.js:119:27
    at Map.forEach (<anonymous>)
    at /src/server/lib/device/device.calculcateAggregateChildProcess.js:111:35

et (nur ein Auszug, da es viel länger ist), « Aggregation der Sensordaten stündlich »:

Error: TimeoutError [SequelizeTimeoutError]: SQLITE_BUSY: database is locked
    at Query.formatError (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:412:16)
    at Query._handleQueryResponse (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:72:18)
    at Statement.afterExecute (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:246:27) {
  parent: [Error: SQLITE_BUSY: database is locked] {
    errno: 5,
    code: 'SQLITE_BUSY',
    sql: "INSERT INTO `t_device_feature_state_aggregate` (`id`,`type`,`device_feature_id`,`value`,`created_at`,`updated_at`) VALUES

Bei mir genauso

Ich habe das gleiche Problem. Es scheint, als würde der Gladys Plus-Backup die Datenbank sperren und wenn die Aggregation gleichzeitig startet (beispielsweise beim Hochfahren), erhalte ich diese Fehlermeldung.

Zusätzlich habe ich Fehler dieser Art nach einigen Minuten im Aggregationsteil
stündlich.
Ich habe den Raspberry Pi mehrmals neu gestartet, aber er bleibt bei 52% hängen. Ich möchte darauf hinweisen, dass ich eine SD-Karte und keinen SSD verwende :frowning:

2021-10-28T10:37:51+0200 <info> device.calculateAggregate.js:38 (DeviceManager.calculateAggregate) Berechnung der Aggregatgerätezustände für das Intervall stündlich
2021-10-28T10:37:51+0200 <info> index.js:63 (Server.<anonymous>) Server hört auf Port 80
2021-10-28T10:44:47+0200 <warn> device.calculateAggregate.js:95 (Socket.<anonymous>) device.calculateAggregate stderr: RangeError: Maximum call stack size exceeded
    at chunk (/src/server/utils/chunks.js:11:26)
    at /src/server/lib/device/device.calculcateAggregateChildProcess.js:147:22
2021-10-28T10:44:47+0200 <warn> device.calculateAggregate.js:101 (ChildProcess.<anonymous>) device.calculateAggregate: Beenden des Child-Prozesses mit Code 1
2021-10-28T10:44:47+0200 <error> device.onHourlyDeviceAggregateEvent.js:22 (DeviceManager.onHourlyDeviceAggregateEvent) Error: RangeError: Maximum call stack size exceeded
    at chunk (/src/server/utils/chunks.js:11:26)
    at /src/server/lib/device/device.calculcateAggregateChildProcess.js:147:22
    at ChildProcess.<anonymous> (/src/server/lib/device/device.calculateAggregate.js:102:23)
    at ChildProcess.emit (events.js:400:28)
    at maybeClose (internal/child_process.js:1058:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:293:5)

Hallo !!
Bei mir ist es genauso, die Fehler treten immer mal wieder auf, aber nicht dauerhaft. Ich dachte, du hättest das bereits erledigt @pierre-gilles, aber ich habe das Gefühl, dass es sich um einen anderen Fehler handelt:

Error: TimeoutError [SequelizeTimeoutError]: SQLITE_BUSY: Datenbank ist gesperrt
at Query.formatError (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:412:16)
at Query._handleQueryResponse (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:72:18)
at Statement.afterExecute (/src/server/node_modules/sequelize/lib/dialects/sqlite/query.js:246:27) {
parent: [Error: SQLITE_BUSY: Datenbank ist gesperrt] {
errno: 5,
code: 'SQLITE_BUSY',
sql: 'UPDATE `t_device_feature` SET `last_monthly_aggregate`=$1,`updated_at`=$2 WHERE `id` = $3'
},
original: [Error: SQLITE_BUSY: Datenbank ist gesperrt] {
errno: 5,
code: 'SQLITE_BUSY',
sql: 'UPDATE `t_device_feature` SET `last_monthly_aggregate`=$1,`updated_at`=$2 WHERE `id` = $3'
},
sql: 'UPDATE `t_device_feature` SET `last_monthly_aggregate`=$1,`updated_at`=$2 WHERE `id` = $3',
parameters: undefined
}

Ich habe dir deine korrigierte Datenbank per PN geschickt :slight_smile:

Danke für das Feedback! :folded_hands: Ich werde mich darum kümmern :slight_smile:

Ah tatsächlich möglich! Daran habe ich nicht gedacht, man müsste die Aggregation vielleicht sogar verhindern, wenn ein Backup läuft :thinking:

In jedem Fall ist es im Moment nicht « schlimm » im Sinne, dass die nächste Aggregation das Problem beheben wird.

Aus Neugier, wie viele deviceFeatureState hast du in Gladys? Und wie viele pro deviceFeature?

Du musst sehr viele haben, mehr als @Terdious, denn wir hatten diesen Bug während der Tests gar nicht gesehen :smiley:

Ich dachte, die Installation von @Terdious wäre die größte, offensichtlich nicht!

Zu den « Nan »:

Das macht mich verrückt, ich weiß, dass @lmilcent sie auch während der Entwicklung hatte, aber ich habe es nie geschafft, es zu reproduzieren… Vielleicht könntest du mal schauen, was die API dir zurückgibt, @cicoub13?

das könnte am Gladys Plus-Backup liegen, das gleichzeitig startet, ich werde versuchen, die Aggregation zu verhindern, wenn das Backup läuft.