Oracle Database Days 12c
Alle Details zum neuen Datenbank Release aus erster Hand
<Insert Picture Here>
Dezember 2013
Januar 2014
Februar 2014
Information Lifecycle Management
Database Application Development
Database Administration
Alle Termine und weitere Informationen:
tinyurl.com/ODD12c
Hochverfügbarkeit für den Anwendungsentwickler
Oracle Datenbank 12c
Sebastian Solbach, ORACLE Deutschland B.V. Co. KG
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Das Problem: “In-Flight” Work
Pre-12c Situation
Netzwerk / Datenbank Ausfall führt zu
einem ungewissen Transaktionsstatus
– Neustart der Mid-Tier
– Frustration der Benutzer
– Abgebrochene Arbeit
– Doppelte Buchungen
– Entwicklungsaufwand
Maximum Application Availability (MAA2)
Mehr als 1 Problem
Datenbank Ausfall konfrontiert Entwickler mit 5 Problemen:
1. Ausfall festestellen
2. Wiederaufnahme im vorgegebenen Zeitfenster
3. Exception Handling
4. Transaktionsstatus herausfinden
5. Weiterführung der aktuellen Transaktion
Pre-12c Situation
HA Mechanismen und Einschränkungen
Ausfall
‒ Fast Application Notification (FAN) / Fast Connection Failover
Recovery Zeitfenster? Abhängig von Ausfallzenario und Technologie
Exception Handling? Fehler & Reaktionen nicht vollständig formalisiert
Aktuelle Transaktion? Ungewiss…
Weiterführen aktueller Transaktion? Nicht verfügbar!
Ausfall feststellen: Fast Application Notification
Applikationen verlieren Zeit
FAN & FCF
• Warten auf TCP/IP Timeouts
Down – Service/Knoten down
<50ms für Failover
• Fehler bei geplanten Ausfällen
• Verbindungsabbrüche bei
Nichtverfügbarkeit des Services
• Keine Neu-Verbindungsversuche
bei Serviceverfügbarkeit
• Verbindungen auf überlastete
Knoten
Planned Down – Entleerung des
Connectionspools ohne
Verbindungsabbrüche
Up – Verteilung der Arbeitslast bei
Serviceverfügbarkeit
RLB % - Informationen zur
optimalen Verteilung
Affinity – Optimierung
Workload lokal zu halten
Alle 12c
Treiber
verwenden
FAN über
ONS
Datenbanklösungen für MAA
Real Application Cluster
– Automatische Fehlererkennung in <30 Sekunden
– Schnelles konfigurierbares Instanz Recovery
– Geplante Übernahme ohne Downtime
RAC One Node
– Automatische Fehlererkennung in <30 Sekunden
– Neustart der Datenbank & Instanz Recovery
– Geplante Übernahme ohne Downtime
Active Data Guard / Data Guard
– (Automatische) Fehlererkennung in <2 Minuten
– Neustart der Datenbank in Desaster Recovery Entfernung
– Geplante Übernahme mit Downtime
Exception Handling? “Recoverable Error”
Formalisiert:
– OracleException.IsRecoverable property
– JDBC throws SQLRecoverableException
Applikationen brauchen keine eigene Liste mit Fehlercodes (z.B.,
ORA-1033, ORA-1034, ORA-xxx)
Lösungen für Transaktionsstatus & Fortführung
Neu in Oracle Database 12c
Transaction Guard
Application Continuity
Verlässliches Protokoll und
API den Status der letzten
Transaktionen zu überprüfen
Automatische Wiederholung
(Replay) der Benutzertransaktion nach einem
Ausfall oder während einer
Wartung
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Verwenden eines eigenen Services !!!
... und das gilt nicht nur für RAC, Data Guard und Multitenant (PDB)
Oracle Datenbank 12c & Oracle Client 12c
srvctl modify service -db ORCL -service APPCON
-failovertype TRANSACTION -replay_init_time 300
-failoverretry 30 -failoverdelay 3
-notification TRUE -commit_outcome TRUE
Services in der Datenbank:
https://apex.oracle.com/pls/apex/GERMAN_COMMUNITIES.
SHOW_TIPP?P_ID=741
Service Konfiguration Transaction Guard
COMMIT_OUTCOME
– Werte : TRUE oder FALSE, Default: FALSE
– Greift sofort bei neuen Sessions
RETENTION_TIMEOUT
– Einheit: Sekunden, Default: 24 Stunden (86400)
– Maximalwert: 30 Tage (2592000)
AQ_HA_NOTIFICATIONS
– Werte: TRUE oder FALSE, Default: FALSE (noch)
– Auf TRUE setzen für FAN !!
Service Konfiguration Application Continuity
Zusätzlich für Application Continuity
FAILOVER_TYPE
– Werte : NONE, SESSION, SELECT, TRANSACTION, Default: NONE
– Für AC auf TRANSACTION setzen
REPLAY_INITIATION_TIMEOUT = 300
– Zeit in Sekunden nach der ein Replay abgebrochen wird
FAILOVER_RETRIES = 60
– Anzahl der Verbindungsversuche für einen Replay
FAILOVER_DELAY = 3
– Verzögerung in Sekunden zwischen den Verbindungsversuchen
Rechte & Datenbank Parameter
Applikationsbenutzer braucht Rechte auf das DBMS_APP_CONT
Package
GRANT EXECUTE ON DBMS_APP_CONT TO <app-name>;
REMOTE_LISTENERS muss alle Listener kennen, über die die Clients
sich initial verbinden (im Normalfall nur SCAN)
alter system set
REMOTE_LISTENERS='SCAN.domain.com:1521'
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Transaction Guard
Verlässliche Information über eine
Transaktion nach einem Ausfall
Mit Hilfe von Transaction Guard kann die
Applikation auf alle Fehler richtig reagieren
Verhindert “Logische Korruptionen” druch
Wiederholung
Application Continuity verwendet
Transaction Guard
Transaction Guard ist verfügbar mit JDBCthin, OCI/OCCI, ODP.NET
Herausforderung: Commit Ergebnis
Unterbrechung der Kommunikation während eines COMMIT
Java/JDBC Applikation bekommt eine Fehlermeldung :”Failed”
– Keine Information über das Ergebnis dieser “in-flight” Transaktion
Typisches Szenario
– t0: Applikation prüft Status der Transaktion und erhält “Not COMMITTED”.
Auf Basis dieser Information wird das weitere Vorgehen bestimmt
– t1: Transaktion wird doch noch abgeschlossen
– Es gibt (bis 12c) keinen verlässliche Möglichkeit den Status einer in-flight
Transaktion zu prüfen
Transaction Guard
Verlässliche Information des COMMIT Ergebnisses
1.
RDBMS assoziiert zu jeder “in-flight” Transaktion eine logische
TransaktionsID (LTXID)
LTXID wechselt NUR bei einem erfolgreichen COMMIT oder ROLLBACK
2.
3.
LTXID wird z.B. an JDBC kommuniziert
Falls die Verbindung abbricht
LogicalTransactionId ltxid = oldConn.getLogicalTransactionId();
OracleConnection newConn = getConnection();
CallableStatement cstmt = newConn.prepareCall(GET_LTXID_OUTCOME);
RDBMS: Falls GET_LTXID_OUTCOME weder Committed noch Rollback
zurückgibt, wird die Transaktion daran gehindert zu COMMITTEN
Transaction Guard – Schematische Darstellung
Applikation/Treiber - RDBMS Interaktion
Datenbank
Applikation/Treiber
getConnection()
Zeit
start transaction
SQL, PL/SQL, RPC
assign LTXID
Results
Txn.Commit();
get Last LTXID
COMMIT
Recoverable Error
<new session>
Commit outcome?
COMMIT/ROLLBACK
Get LTXID outcome
COMMIT?
Return & Preserve
COMMIT OUTCOME
TG in
Aktion
Transaction Guard
Der Komplette Java Code
...
boolean committed = false;
boolean call_completed = false;
try {
CallableStatement cstmt = conn.prepareCall(GET_LTXID_OUTCOME);
cstmt.setBytes(1, ltxid[i].getBytes());
cstmt.registerOutParameter(2, OracleTypes.BIT);
cstmt.registerOutParameter(3, OracleTypes.BIT);
cstmt.execute(); committed = cstmt.getBoolean(2);
call_completed = cstmt.getBoolean(3);
System.out.println("LTXID committed ? " + committed);
System.out.println("User call completed ? " + call_completed);
}
catch (SQLException sqlexc)
{
System.out.println("Calling GET_LTXID_OUTCOME failed");
sqlexc.printStackTrace();
}
Transaction Guard
Treiber Unterstützung mit 12.1.0.1
Supportete Commit Modelle
‒
‒
‒
‒
‒
Local TXN
Auto-commit, Commit on Success
Commit embedded in PL/SQL
DDL, DCL, Parallel DDL
Remote, Distributed
Ausgeschlossen
XA in 12.1
‒ R/W DBLinks von Active Data Guard / Read Only
‒
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Application Continuity
Maskiert ungeplante und geplante Ausfälle
“In-flight” Prozess läuft weiter
Wiederholt “in-flight” Prozess nach einem
Recoverable Error
Verbirgt viele Hardware, Software, Netzwerk,
Storage Fehler und Ausfälle
Unterstützt JDBC-Thin, UCP, WebLogic
Server und 3rd Party Java Applikationen
Oracle RAC, RAC One, & Active Data Guard
Die Einheit: “Datenbank Request”
Legt die Grenzen für die Wiederholung fest
Begin
Request
PoolDataSource pds = GetPoolDataSource();
Connection conn = getConnection(pds);
PreparedStatement pstmt = …
…
SQL, PL/SQL, local calls, RPC
…
conn.commit();
conn.close();
Request Body
schließt
gewöhnlich mit
COMMIT ab
End
Request
Phasen bei Application Continuity
1-Laufzeit Operationen
2-Reconnect
3-Replay
• Überwachung der
einzelnen Datenbank
Requests
• Prüft ob für den Request
Replay aktiviert wurde
• Wiederholung der
gespeicherten Aufrufe
• Verwaltung von Timeouts
• Ermittlung was / was nicht
wiederholt werden kann
• Eröffnet neue Verbindung
• Verifizierung der
Ergebnisse mit den
Vorhergehenden.
• Speichert den orginären
Aufruf inkl. Bind Variablen
und Validierung
• Validiert die
Zieldatenbank/Zielinstanz
• Verwendet Transaction
Guard zur Ermittlung des
COMMIT Ergebnisses
• Führt den Request
weiter, falls die
Wiederholung
erfolgreich ist
Konfiguration Application Continuity
JDBC / WLS
JDBC URL oder Property Datei
# Verwendung der neuen 12.1 Replay DataSource
datasource=oracle.jdbc.replay.OracleDataSourceImpl
WebLogic Console oder UCP/Weblogic Property Datei
# Auswählen der neuen 12.1
replay datasource=oracle.jdbc.replay.OracleDataSourceImpl
Setzen von ONS nicht mehr notwendig, da in 12c die ONS Server
automatisch konfiguriert werden (via. Listener)
Verwenden des Services in JDBC
Oracle Client 12c
jdbc:oracle:thin:@(DESCRIPTION =
(TRANSPORT_CONNECT_TIMEOUT=3)(CONNECT_TIMEOUT=5)
(RETRY_COUNT=3)(FAILOVER=ON)(ADDRESS=
(PROTOCOL=tcp)(HOST=SCAN.domain.com)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=APPCON))
Ausnahmen: Replay deaktiviert
Global
• Default Datenbank
Service oder Default PDB
Service
• XA in 12.1
• Verwendung einiger
JDBC-Klassen aus dem
Package oracle.sql
Request
• Eigentlich logisch
(restricted calls):
– Alter System
– Alter Database
• Active Data Guard mit
read/write Datenbanklinks
Target Database
• Nicht verfügbar bei
– Logical Standby
– Golden Gate
Restriktionen: Wann wird nicht wiederholt?
Normal Runtime
Reconnect
Aufrufe im selben Request nach
• Fehler ist nicht “recoverable”
• Einem erfolgreichen Commit
im dynamischen Modus
• Fehler beim erneuten
Verbindungsaufbau
• Auftreten eines “restricted
call”
•Zieldatenbank nicht für Replay
geeignet
• disableReplay API
• Letzter Aufruf erfolgreich
committed im dynamischen
Modus
Replay
•Validierung erkennt
Unterschied im Ergebnis
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Generell geeignet oder manuelle Anpassung?
Nein
WLS /
UCP
Ja
Return
Conn. to
Pool
Ja
Nein
Property
to
Return
Nein
Set Property
Application Continuity
möglich
Manuell:
begin &
endRequest
setzen
Ja
Was muss noch beachtet werden
Wenn
Dann
Kein Oracle Connection Pool
Markieren von Request Grenzen
oracle.sql JDBC-Klassen
Ersetzen durch Standard JDBC Interface (java.sql)
Unerwünschte Seiteneffekte
Verwenden der disable API, falls ein Aufruf nicht wiederholt werden
sollte
Mutable Funktionen
(Sysdate)
Ermöglichen (Grants) veränderliche Werte gleich zu belassen
(z.B. sequence.nextval)
Callbacks
Registrierung von Callbacks zur Änderung des Status einer
Applikation ausserhalb eines Requests
Bei WebLogic & UCP Labelling verwenden
Deaktiveren von Replay ?
Verwenden der disableReplay() API für Aufrufe, die nicht wiederholt
werden sollen/dürfen, insbesondere für Externe Aktionen:
– Autonome Transaktionen
– UTL_HTTP, UTL_URL
– UTL_FILE, UTL_FILE_TRANSFER
– UTL_SMPT, UTL_TCP
– UTL_MAIL
– DBMS_PIPE (nicht empfohlen bei RAC)
– DBMS_ALERT (Ebenfalls Vorsicht bei RAC: Community Tipp)
https://apex.oracle.com/pls/apex/
GERMAN_COMMUNITIES.SHOW_TIPP?P_ID=1621
Optinale Datenbank Konfiguration
„Mutables“ Rechte vergeben
Damit z.B. Sysdate bei einem Replay denselben Wert zurückgibt:
GRANT [KEEP DATE TIME | KEEP SYSGUID].. [to USER]
REVOKE [KEEP DATE TIME | KEEP SYSGUID][from USER]
GRANT KEEP SEQUENCE.. [to USER] on [sequence object];
REVOKE KEEP SEQUENCE [from USER] on [sequence object];
ALTER SEQUENCE.. [sequence object] [KEEP|NOKEEP];
CREATE SEQUENCE.. [sequence object] [KEEP|NOKEEP];
Agenda
HA in der Anwendungsentwicklung ?
Basis Setup (Datenbank)
Transaction Guard (OCI/ODP.NET/JDBC)
Application Continuity (nur JDBC)
Best Practices
Diverses
Kill Session
Was passiert, wenn der DBA eine Session killt?
Natürlich greift AC...
– ... nicht unbedingt immer gewollt!
SQL> alter system kill session 'sid, serial#, @inst' noreplay;
SQL> alter system disconnect session 'sid, serial#, @inst'
noreplay;
SQL> execute DBMS_SERVICE.DISCONNECT_SESSION(‘[service name]’,
DBMS_SERVICE.NOREPLAY) ;
Lizenzen für produktiven Einsatz
Transaction Guard: Enterprise Edition
Application Continuity: RAC oder Active Data Guard Option
Oracle® Database Licensing Information 12c Release 1 (12.1)
http://docs.oracle.com/cd/E16655_01/license.121/e176
14/editions.htm#DBLIC116
Links & weitere Informationen
DBA Community
https://blogs.oracle.com/dbacommunity_deutsch/
OTN
http://www.oracle.com/technetwork/products/clustering/ac-overview-1967264.html
Whitepapers
http://www.oracle.com/technetwork/database/database-cloud/private/transaction-guardwp-12c-1966209.pdf
http://www.oracle.com/technetwork/database/database-cloud/private/applicationcontinuity-wp-12c-1966213.pdf
Dokumentation
http://docs.oracle.com/cd/E16655_01/java.121/e17659/app_cont.htm#JJUCP8254