Was tun bei Fehlermeldungen beim Indexservice zum Primary-Key / Insert into osftslog?

Was tun bei Fehlermeldungen beim Indexservice zum Primary-Key / Insert into osftslog?

Im services.log des Servicemanagers mit Indexservice und auch im enaio Server-Err-Log kann einer der nachfolgenden Meldungen zu finden sein: 

  • "Cannot insert duplicate key in object 'osftslog'. The duplicate key value is (45840900)"

  • "[SQL Fehler] Eine Zeile mit doppeltem Schlüssel kann in das OSFTSLOG-Objekt mit dem eindeutigen Schlüssel ... nicht eingefügt werden"

  • "indexservice.8045         : oxjobado (line: 473): 0xc1d9000c - COM-Ausnahme aufgetreten. Quelle: Microsoft OLE DB Provider for ODBC Drivers, Beschreibung: [Microsoft][ODBC SQL Server Driver][SQL Server]Violation of PRIMARY KEY constraint 'PK__osftslog__5242E349489AC854'.

  • Cannot insert duplicate key in object 'enaioP.osftslog'. The duplicate key value is (45807502)., Meldung: IDispatch error #3092, Code: -2147217900"

 

Das bedeutet, dass der Indexservice versucht einen Eintrag in die Tabelle OSFTLOG einzufügen, aber das kann es nicht, weil es die Object-ID schon gibt. Grund: Die Object-ID darf nur einmal vorkommen. Es gibt extra einen Index für diese Tabelle, der dies nicht zulässt.

Dieses Problem kann auftreten, da pro Object-ID mehrere Jobs in der CPQueue vorhanden sein können. Wenn ein oder mehrere Indexservices parallel in der gleichen ms diese Jobs verarbeiten, stellen sie fest, dass der Eintrag in der Datenbank fehlt und versuchen ihn einzufügen. Aufgrund des Primary-Key (es darf nur einen geben) schlägt das bei einem Indexservice fehl. Abhilfe schafft in diesem Fall die nachfolgende Anleitung. 
OS-interner Link für Details (extern nicht aufrufbar): DB-7318

Schritt-für-Schritt-Anleitung

  1. Über die Servicemanager-Adminseite ermitteln, auf welchem Server der/die Indexservices laufen.  URL: http://127.0.0.1:7273 
    Beispiel:

  2. In das config-Verzeichnis dieses Servicemanagers wechseln und die index-prod.yml heraussuchen. 

  3. Es empfiehlt sich index-prod.yml zu sichern in einem Verzeichnis eigener Wahl, z. Bsp. D:\_Install\<datum der Anpassung>. 

  4. Dann diese Zeile hinzufügen (1:1):
    sqls.mssql.insertEntry: "MERGE INTO %s AS TGT USING (VALUES(%d, %d, %d, %d, %d, %d, '%s')) AS SRC(osid, ostype, date1, date2, flag1, flag2, instance) ON SRC.osid = TGT.osid WHEN MATCHED THEN UPDATE SET TGT.date1 = SRC.date1, TGT.date2 = SRC.date2, TGT.flag1 = SRC.flag1, TGT.flag2 = SRC.flag2, TGT.instance = SRC.instance WHEN NOT MATCHED THEN INSERT VALUES(SRC.osid, SRC.ostype, SRC.date1, SRC.date2, SRC.flag1, SRC.flag2, SRC.instance);"

    Beispiel: 

  5. Nach dem Speichern den Indexservice neu laden über die Servicemanager-Admin-Seite. 

  6. Sind mehrere Indexservices vorhanden, dies bei allen index-prod.yml anpassen

  7. Im Service.log prüfen, ob die neue Konfiguration geladen werden kann und ob der Indexservice wieder läuft. 

 

Download:

 

Bitte auf keinen Fall den Primary-Key in der Tabelle OSFTSLOG entfernen. Besser die index-prod.yml anpassen, wie beschrieben. 

Sollte die Tabelle OSFTSLOG mehrere Einträge für eine Object-ID haben, bitte Kontakt mit dem Support aufnehmen. Die Tabelle muss bereinigt werden und der Primary-Index muss gesetzt werden.

 

Verwandte Artikel