IBM Informix: Long Transaction aborted umgehen und monitoren
(german content)
Wenn eine Transaktion soviel Prozent des gesamten Logical Logspaces benötigt, wie durch den onconfig-Parameter Long-Transaction High-Watermark (LTXHWM) definiert ist, wird diese Transaktion zurückgerollt. Überschreitet sie dabei die durch die Long-Transaction Exclusive High-Watermark (LTXEHWM) definierte Menge an Logical Logspace, werden nahezu alle anderen Datenbankaktionen zugunsten des Rollbacks eingefroren. Wie kann man sich davor schützen?
Der Rollback einer Transaktion aufgrund ihrer Länge ist zunächst einmal ein normaler Vorgang in einer Datenbank. Wann das passieren soll, lässt sich durch die LTXHWM einstellen. Ärgerlich wird es dann, wenn die Long Transaction die LTXEHWM erreicht: Das System steht quasi, und man weiß nicht, wie lange noch. Doch das lässt sich durchaus grob ermitteln, das folgende Beispiel zeigt, wie.
Eine Transaktion beginnt immer in einem bestimmten Logical Logfile. Diese lassen sich mit "onstat -l" ansehen:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line -- Up 01:08:18 -- 450456 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 0 64 42974 1617 26.58
phybegin physize phypos phyused %used
1:263 50000 5216 0 0.00
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-3 0 64 3547643 104146 1802 34.1 57.8
Subsystem numrecs Log Space used
OLDRSAM 3547643 209940824
address number flags uniqid begin size used %used
e15648b0 7 U---C-L 49 2:53 10000 6 0.06
e15648f8 8 U-B---- 38 2:10053 10000 10000 100.00
e1564940 9 U-B---- 39 2:20053 10000 10000 100.00
e1564988 10 U-B---- 40 2:30053 10000 10000 100.00
e15649d0 11 U-B---- 41 2:40053 10000 10000 100.00
e1564a18 12 U-B---- 42 2:50053 10000 10000 100.00
e1564a60 13 U-B---- 43 2:60053 10000 10000 100.00
e1564aa8 14 U-B---- 44 2:70053 10000 10000 100.00
e1564af0 15 U-B---- 45 2:80053 10000 10000 100.00
e1564b38 16 U-B---- 48 2:90053 9947 1 0.01
10 active, 10 total
Derzeit arbeitet das System im Logical Logfile mit der uniqid 49, zu sehen am "C"-Flag in der 3. Spalte ("current"). Das Beispielsystem arbeitet mit DYNAMIC_LOGS 2, was es dem Datenbankserver ermöglicht, bei einer für den Rollback nicht ausreichenden Menge von Logical Logfiles dynamisch neue hinzuzufügen. LTXHWM steht auf 70, LTXEHWM auf 80.
Es kommt nun ein update auf eine große Tabelle ins System, welchen man mit "onstat -x" beobachten kann:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line -- Up 01:12:58 -- 450456 Kbytes Transactions address flags userthread locks beginlg curlog logposit isol retrys coord e1554018 A---- e152a018 0 0 49 0x5200 COMMIT 0 e1554220 A---- e152a550 0 0 0 0x0 COMMIT 0 e1554428 A---- e152aa88 0 0 0 0x0 COMMIT 0 e1554630 A---- e152afc0 0 0 0 0x0 COMMIT 0 e1554838 A---- e152b4f8 0 0 0 0x0 COMMIT 0 e1554a40 A---- e152ba30 0 0 0 0x0 COMMIT 0 e1554c48 A---- e152bf68 0 0 0 0x0 COMMIT 0 e1554e50 A---- e152c4a0 0 0 0 0x0 COMMIT 0 e1555058 A---- e152c9d8 0 0 0 0x0 COMMIT 0 e1555260 A---- e152cf10 0 0 0 0x0 COMMIT 0 e1555468 A---- e152d448 0 0 0 0x0 COMMIT 0 e1555878 A---- e152e3f0 0 0 0 0x0 COMMIT 0 e1555a80 A-B-- e152deb8 340 49 49 0x255660 COMMIT 0 e1555c88 A---- e152e928 0 0 0 0x0 COMMIT 0 14 active, 128 total, 15 maximum concurrent
Das Update beginnt in Logical Logfile 49 (Spalte beginlg), und arbeitet derzeit auch in diesem Logfile (curlog).
Tip:
Die Spalte "address" aus "onstat -x" korrespondiert mit der Spalte "address" im onstat -u. So lässt sich leicht ein Zusammenhang zwischen dieser Transaktion und der zugehörigen Session-ID herstellen.
Bei erreichen des 57ten Logical Logiles wird die LTXHWM überschritten, und die Transaktion wird zurückgerollt:
onstat -l:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line (LONGTX) -- Up 01:30:21 -- 458648 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 0 64 62060 2030 30.57
phybegin physize phypos phyused %used
1:263 50000 24715 0 0.00
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-2 0 64 5729995 188670 3133 30.4 60.2
Subsystem numrecs Log Space used
OLDRSAM 5729995 380573600
address number flags uniqid begin size used %used
e15648b0 7 U-B---- 49 2:53 10000 10000 100.00
e15648f8 8 U-B---- 50 2:10053 10000 10000 100.00
e1564940 9 U-B---- 51 2:20053 10000 10000 100.00
e1564988 10 U-B---- 52 2:30053 10000 10000 100.00
e15649d0 11 U-B---- 53 2:40053 10000 10000 100.00
e1564a18 12 U-B---- 54 2:50053 10000 10000 100.00
e1564a60 13 U-B---- 55 2:60053 10000 10000 100.00
e1564aa8 14 U-B---- 56 2:70053 10000 10000 100.00
e1564af0 15 U---C-L 57 2:80053 10000 4530 45.30
e1564b38 16 U-B---- 48 2:90053 9947 1 0.01
10 active, 10 total
onstat -x:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line (LONGTX) -- Up 01:30:36 -- 458648 Kbytes Transactions address flags userthread locks beginlg curlog logposit isol retrys coord e1554018 A---- e152a018 0 0 57 0x11b1018 COMMIT 0 e1554220 A---- e152a550 0 0 0 0x0 COMMIT 0 e1554428 A---- e152aa88 0 0 0 0x0 COMMIT 0 e1554630 A---- e152afc0 0 0 0 0x0 COMMIT 0 e1554838 A---- e152b4f8 0 0 0 0x0 COMMIT 0 e1554a40 A---- e152ba30 0 0 0 0x0 COMMIT 0 e1554c48 A---- e152bf68 0 0 0 0x0 COMMIT 0 e1554e50 A---- e152c4a0 0 0 0 0x0 COMMIT 0 e1555058 A---- e152c9d8 0 0 0 0x0 COMMIT 0 e1555260 A---- e152cf10 0 0 0 0x0 COMMIT 0 e1555468 A---- e152d448 0 0 0 0x0 COMMIT 0 e1555878 A---- e152e3f0 0 0 0 0x0 COMMIT 0 e1555a80 A-R-- e152deb8 41754 49 57 0xb32774 COMMIT 0 e1555c88 A---- e152e928 0 0 0 0x0 COMMIT 0 14 active, 128 total, 15 maximum concurrent
beginlg zeigt nach wie vor 49 an, curlog zeigt 57, das aktuelle Logical Logfile.
Im online.log wird vermerkt:
15:10:12 Aborting Long Transaction: tx 0xe1555a80 username: informix uid: 104
Für den Rollback wird mehr Logical Logspace benötigt, das System wird geblocked, um ein neues Logical Logfile hinzuzufügen:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line (LONGTX) -- Up 01:33:19 -- 458648 Kbytes Blocked:DYNAMIC_LOG
Als nächstes wird die LTXEHWM überschritten, das System wird erneut geblocked, und steht quasi. Das neue Logical Logfile mit der Nummer 1 ist hinter dem aktuellen Logical Logfile 16 (uniqid 58) angelegt, und steht zur Verfügung:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line (LONGTX) -- Up 01:33:39 -- 458648 Kbytes
Blocked:LONGTX
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 29 64 69260 2216 31.25
phybegin physize phypos phyused %used
1:263 50000 32105 1019 2.04
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-1 39 64 6082860 195455 3240 31.1 60.3
Subsystem numrecs Log Space used
OLDRSAM 6082860 394297796
address number flags uniqid begin size used %used
e15648b0 7 U-B---- 49 2:53 10000 10000 100.00
e15648f8 8 U-B---- 50 2:10053 10000 10000 100.00
e1564940 9 U-B---- 51 2:20053 10000 10000 100.00
e1564988 10 U-B---- 52 2:30053 10000 10000 100.00
e15649d0 11 U-B---- 53 2:40053 10000 10000 100.00
e1564a18 12 U-B---- 54 2:50053 10000 10000 100.00
e1564a60 13 U-B---- 55 2:60053 10000 10000 100.00
e1564aa8 14 U-B---- 56 2:70053 10000 10000 100.00
e1564af0 15 U-B---- 57 2:80053 10000 10000 100.00
e1564b38 16 U---C-L 58 2:90053 9947 1315 13.22
e1f50fb8 1 A------ 0 1:58795 9973 0 0.00
11 active, 11 total
Der onstat -x läuft nun in der Spalte "curlog" rückwärts bis zur 49, da er alle bisherigen Aktionen zurückrollt:
IBM Informix Dynamic Server Version 10.00.HC6 -- On-Line (LONGTX) -- Up 01:37:55 -- 458648 Kbytes Blocked:LONGTX Transactions address flags userthread locks beginlg curlog logposit isol retrys coord e1554018 A---- e152a018 0 0 59 0x1dc4f0 COMMIT 0 e1554220 A---- e152a550 0 0 0 0x0 COMMIT 0 e1554428 A---- e152aa88 0 0 0 0x0 COMMIT 0 e1554630 A---- e152afc0 0 0 0 0x0 COMMIT 0 e1554838 A---- e152b4f8 0 0 0 0x0 COMMIT 0 e1554a40 A---- e152ba30 0 0 0 0x0 COMMIT 0 e1554c48 A---- e152bf68 0 0 0 0x0 COMMIT 0 e1554e50 A---- e152c4a0 0 0 0 0x0 COMMIT 0 e1555058 A---- e152c9d8 0 0 0 0x0 COMMIT 0 e1555260 A---- e152cf10 0 0 0 0x0 COMMIT 0 e1555468 A---- e152d448 0 0 0 0x0 COMMIT 0 e1555878 A---- e152e3f0 0 0 0 0x0 COMMIT 0 e1555a80 A-R-- e152deb8 41754 49 52 0x1daf658 COMMIT 0 e1555c88 A---- e152e928 0 0 0 0x0 COMMIT 0 14 active, 128 total, 15 maximum concurrent
Hier ist auch genau der Punkt, wo man ansetzen kann, um die Dauer für den Rollback anzuschätzen: "curlog" muss wieder "beginlg" erreichen, dann ist der Rollback abgeschlossen. Die Dauer für den Rollback eines Logfiles lässt sich mitstoppen, und dann auf die Anzahl der noch zu verarbeitetenden Logfiles hochrechnen. Man erhält allerdings nur einen groben Richtwert.
Um gar nicht erst in diesen Punkt hineinzulaufen, dass lange Transaktionen abbrechen oder sogar der Server für einen Rollback geblocked wird, bieten sich folgende Möglichkeiten an:
- Weitere Logical Logfiles hinzufügen.
- Transaktionen vorher in einem gleichwertigen Testsystem testen.
- Transaktionen verkleinern, und in "Häppchen" ausführen.
- Datenbank sichern, aus dem Logging nehmen, gewünschte Operationen ausführen, Logging wieder einschalten.
- Verwendung von Raw Tables (Tabellen ohne Logging). Ist mit Vorsicht zu genießen, weil es keine Möglichkeit des Rollback gibt.
- LTXHWM und LTXEHWM vergrößern. Ist jedoch nur dann zu empfehlen, wenn mit DYNAMIC_LOGS gearbeitet wird, da sonst die Gefahr besteht, dass das System keinen Protokollierplatz mehr zur Verfügung hat und hängen bleibt. Setzt man LTXHWM und LTXEHWM auf 100, werden lange Transaktionen niemals abgebrochen, und der Datenbankserver allokiert munter weitere Logical Logfiles nach. Sinnvoller ist es daher eventuell, wenn man LTXHWM auf einen Wert unter 100 setzt, und LTXEHWM auf 100. Transaktionen werden dann bei erreichen der LTXHWM abgebrochen, der Server aber nie beim Rollback blockiert, weil er durch das Nachallokieren von Logical Logfiles immer hinreichend Protokollierplatz zur Verfügung stehen hat.
- Bei eingeschaltetem Feature DYNAMIC_LOGS: Weitere Logical Logfiles hinzufügen, LTXHWM von 70 (Default) auf 50 verringern, und LTXEHWM auf 100 setzen. Der Server kommt somit vermutlich kaum in die Verlegenheit, dass er Logical Logfiles nachallokieren muss, läuft aber auch nicht in die Gefahr, dass er durch Erreichen von LTXEHWM geblocked wird.
Was man jedoch immer bedenken muss: Auch in einer Datenbank ohne Logging werden DDL-Statements wie "create table", "alter table", "create index" etc. geloggt. Hier gibt es nur die Möglichkeit, mit mehr Logspace bzw. mit höheren Werten für LTXHWM / LTXEHWM zu kontern.
Tipp:
Häufig möchte man nur einzelnen Aktionen erlauben, dass sie viel Logspace benutzen dürfen. "Normale" Sessions sollen viel früher in die LTXHWM laufen. Ich habe bei IBM einen Feature Request eingereicht, um dieses in zukünftigen Informix-Versionen zu ermöglichen.
- Malte Sukopp's blog
- Login or register to post comments
- 1079 reads
-
- Email this page
- Printer-friendly version
- Send to friend
- PDF version















