Als PDF Downloaden!

Werbung
Tipps & Tricks: April 2016
Bereich:
DBA
Erstellung:
04/2016 EF
Versionsinfo:
10g, 11g, 12c
Letzte Überarbeitung:
04/2016 EF
Private strand flush not complete - was bedeutet das?
Wir reagieren bei der Überwachung des Alert.logs für unsere Kunden auf diverse Fehlermeldungen. Dabei trifft
man seit der Oracle Version 10g häufig auf Einträge, bei denen ein cannot allocate new log in Verbindung
mit der Meldung Private strand flush not complete auftaucht.
Beispiel:
Thread 1 cannot allocate new log, sequence 74377
Private strand flush not complete
Current log# 1 seq# 74376 mem# 0: /u02/app/oracle/oradata/redoA/redo_1a.rdo
Current log# 1 seq# 74376 mem# 1: /u02/app/oracle/oradata/redoB/redo_1b.rdo
Beginning log switch checkpoint up to RBA [0x12289.2.10], SCN: 4211564670
Thread 1 advanced to log sequence 74377 (LGWR switch)....
Ist das jetzt kritisch oder einfach nur Hintergrundrauschen ?
Was sind Private Strands ?
In Version 9i wurde für jede Transaktion in einer Session ein redo record in den Log Buffer geschrieben. Um dort
Platz für die Speicherung zu allokieren, benötigte die Session einen sog. redo allocation latch und um den gab es
natürlich Gerangel (vornehmer ausgedrückt: contention), wenn viele Daten in vielen Sessions geändert wurden.
Darüber hinaus mußten für die Übertragung der Daten aus der PGA der Sessions in den Log Buffer zusätzliche
redo copy latches angefordert werden, damit der Logwriter die Daten nicht in die Redo Logs schrieb, bevor der
Kopiervorgang abgeschlossen war.
Mit der Version 10g hat Oracle den Log Buffer in mehrere Untereinheiten aufgespalten, die sogenannten public
redo strands (Strand bedeutet hier Strang, die redo strands spiegeln also in etwa den Handlungsstrang einer
Transaktion wieder). Deren Größe wurde in 10g über den Parameter log_parallelism kontrolliert, in 11g über den
undokumentierten Parameter _log_parallelism_max. Bei weniger als 16 CPUs gibt es 2 public redo strands.
Das Vorhandensein mehrerer parallel nutzbarer Ressourcen verringert natürlich die Wartezeiten auf den
allocation latch. Noch mehr Erleichterung brachte die Einführung der sogenannten private redo strands. Diese
werden im Shared Pool allokiert (nicht in der PGA der Sessions), sind ebenfalls durch redo allocation latches
geschützt und wesentlich kleiner als die public redo strands. Die Redo Records werden von den Sessions direkt
in diese Speicherbereiche geschrieben. Jeder enthält die Informationen für eine Transaktion. Die private redo
strands sind allerdings nur für kleine Transaktionen nutzbar und in bestimmten Situationen (z. B. bei
RAC-Instanzen, beim Vorhandensein garantierter Restore Points und bei aktivem Supplemental Logging) nicht
nutzbar. Größere Transaktionen nutzen immer die public redo strands.
Gute Informationen zu diesem Thema liefern vor allem Jonathan Lewis (in seinem genialen Buch Oracle Core:
Essential Internals for DBAs and Developers oder in seinem Blog, z. B.
https://jonathanlewis.wordpress.com/2010/12/23/private-redo/) und Tanel Poder (z. B. in diesem PDF
Oracle_Performance_Scalability_10g_11g.pdf).
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 1 von 3
Diese Datei (selects für private strands etc.sql) enthält ein paar mehr Informationen und Selects für Interessierte.
Bei einem Commit werden die privaten Redostränge mit den öffentlichen vereinigt und vom Logwriter zusammen
in die Redo Logs geschrieben.
Wie entsteht die Meldung ?
Wenn eine Session noch aktiv ist und keinen Commit abgesetzt hat, trifft ein Log Switch auf Private Strands, die
ihre Redo entries noch nicht übertragen haben. Dann erscheint die Meldung private strand flush not complete im
Alert.log. Erst wenn alle Inhalte aus den Private Strands in die Redo Logs übertragen wurden, kann der Log
Switch stattfinden.
Beispiel:
-- Session 1 (scott)
UPDATE emp SET sal=sal*2;
-- kein Commit. Die Session bleibt aktiv
-- Session 2 als sysdba
ALTER SYSTEM SWITCH LOGFILE;
--Eintrag im Alert.log
Fri Apr 01 11:13:27 2016
Thread 1 cannot allocate new log, sequence 571
Private strand flush not complete
Current log# 6 seq# 570 mem# 0: C:\ORACLE\ORADATA\O11G\REDO06.LOG
Thread 1 advanced to log sequence 571 (LGWR switch)
Current log# 4 seq# 571 mem# 0: C:\ORACLE\ORADATA\O11G\REDO04.LOG
Fri Apr 01 11:13:28 2016
Archived Log entry 23 added for thread 1 sequence 570 ID 0x161e673d dest 1:
Dieser Umstand ist auch in einem MOS Dokument beschrieben (Doc ID 372557.1). Der wichtigste Satz dort ist:
These messages are not a cause for concern unless there is a significant time gap between the "cannot allocate
new log" message and the "advanced to log sequence" message.
Auswertung der Meldungen
Der folgende Select sorgt dafür, dass man bei der Auswertung der Alert.logs nicht ständig über diese Meldungen
stolpert, aber in kritischen Fällen eine Warnung erhält. Diese Lösung gilt nur für Oracle Versionen ab 11g. Hier
bietet die View v$diag_alert_ext (die auch für Inhaber der SELECT_CATALOG_ROLE zugänglich ist) einen sehr
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 2 von 3
Der folgende Select sorgt dafür, dass man bei der Auswertung der Alert.logs nicht ständig über diese Meldungen
stolpert, aber in kritischen Fällen eine Warnung erhält. Diese Lösung gilt nur für Oracle Versionen ab 11g. Hier
bietet die View v$diag_alert_ext (die auch für Inhaber der SELECT_CATALOG_ROLE zugänglich ist) einen sehr
komfortablen Blick auf im XML-Format gespeicherte Logfile.
Die innere Abfrage liefert alle Einträge mit Private strand flush not complete oder advanced to log sequence und
die jeweils darauffolgende Zeile (über die analytische Funktion LEAD, gruppiert nach adr_home und dem auf
Minutengenauigkeit gesetzten Timestamp).
Wichtig ist, dass man auch die Spalte adr_home mit einbezieht, da auf einem Server mehrere Datenbanken
laufen können (ADR steht für Automatic Diagnostic Repository und die Spalten adr_home enthält z. B. Einträge
wie diag/rdbms/o11g/o11g und diag/rdbms/o12c/o12c wenn 2 Instanzen mit den SIDs o11g und o12c
sich auf dem selben Host befinden).
Die äußere Abfrage filtert dann die Fälle, bei denen nach der Meldung Private strand flush not complete der Log
Switch länger als eine Minute auf sich warten lässt (Ich habe bis jetzt übrigens keine Instanz gesehen, bei der hier
Zeilen zurückkamen).
SET TRIMSPOOL ON SET LIN 400 SET PAGES 4000
COL adr_home FOR a30
SELECT adr_home, CASE WHEN COUNT(*) > 0
THEN 'Warnung: Logswitches wegen Private Strand Flush verzögert'
END auswertung
FROM (SELECT message_text,
adr_home,
LEAD(message_text)
OVER (PARTITION BY adr_home,
TRUNC(originating_timestamp, 'mi')
ORDER BY originating_timestamp) naechste_zeile,
originating_timestamp
FROM v$diag_alert_ext
WHERE TRIM(component_id)= 'rdbms'
AND (INSTR(message_text, 'Private strand flush not complete') > 0
OR INSTR(message_text, 'advanced to log sequence') > 0))
WHERE INSTR(message_text, 'Private strand flush not complete') > 0
AND INSTR(naechste_zeile, 'advanced to log sequence') = 0
GROUP BY adr_home;
Wenn Sie sich nicht selber die Mühe machen wollen, Ihre Datenbank auf Herz und Nieren zu untersuchen und
das Alert.log zu durchforsten: Wir erstellen Ihnen auch gerne einen Healthcheck und geben Ratschläge zur
Verbesserung der Performance und der Sicherheit, kontaktieren Sie uns einfach.
Muniqsoft GmbH
Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40
IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0
Seite 3 von 3
Herunterladen