2010-10-30 10 views
5

Ich möchte eine konsistente Momentaufnahme einer Oracle-Datenbank erstellen, die ständig von einem TIBCO-DB-Adapter aktualisiert wird.Was ist der beste Weg, um einen "Schnappschuss" einer Oracle-Datenbank zu machen, die ständig aktualisiert wird?

Typischerweise aktualisiert TIBCO eine Reihe von Tabellen gleichzeitig und COMMITs. Wenn ich durch alle Tabellen gehe, einen Snapshot einmal am Tag mache, dann könnte ich Daten aus Tabelle A vor dem Commit und aus Tabelle B nach dem Commit holen - aber wenn A und B eine Beziehung haben, dann werden sie nicht mehr passen Sie richtig an.

Ist "SET TRANSACTION READ ONLY" der Weg zu gehen?
z.B.

COMMIT 
SET TRANSACTION READ ONLY 
SELECT * FROM A WHERE A.ADB_UPDATEDDATE > TODAY()-1 
SELECT * FROM B WHERE B.ADB_UPDATEDDATE > TODAY()-1 
etc. 
COMMIT 

(TODAY Syntax möglicherweise nicht richtig, nicht wichtig sein!)

Oder gibt es etwas besser, dass ich tun kann?

Antwort

4

Dies ist sehr einfach mit einer Oracle-Funktion namens Flashback zu tun. Solange Sie wissen, wann die vorherige Version war (time oder scn) und sich im Flashback-Fenster befindet, können Sie einfach danach suchen.

7

Wenn Sie mit "Snapshot" eine vollständige Kopie der Datenbank in einem konsistenten Modus meinen, dann würde ich die Datenbank aus einer Sicherung wiederherstellen und sie bis zum gewünschten Zeitpunkt wiederherstellen. Die Oracle-Wiederherstellungsprozesse kümmern sich um die Konsistenz (verfolgt durch System Change Number oder SCN).

Wenn Sie RMAN für Sicherungen und Wiederherstellung verwenden, gibt es einen Befehl "DUPLICATE DATABASE" mit einer Zeitklausel, die dies relativ schmerzlos macht.

Auf der anderen Seite, wenn Sie schauen, nur ein paar Tische in einem einheitlichen Modus zu extrahieren ich von zwei Möglichkeiten denken:

  • Export der Gruppe der Tabellen mit der konsistent = y Option das (ältere) exp Dienstprogramm
  • den neueren expdp-Dienstprogramm mit der flashback_time Option können
+3

Ich bin immer erstaunt, wie Menschen 'RMAN' vermeiden. In der Oracle-Welt ist es das Beste seit dem Schnittbrot. –

+0

+500 auf RMAN ... – REW

1

Neben Anregungen zu dpbradley des, wenn es nur ein paar nicht zu groß Tabellen, und Sie haben Rückblende Abfrage verfügbar Sie könnten eine Kopie der Tabellen erstellen, indem Sie eine Flashback-Abfrage mit demselben Zeitstempel verwenden.

0

Zunächst einmal, wie andere Jungs da gesagt hat, sind spezielle Werkzeuge für "snapshotting" in Oracle und es ist besser, es für die Aufgabe für mich zu verwenden. Aber wenn wir speziell auf das Problem schauen, werden wir sehen, dass es ein nicht wiederholbare liest & Phantom liest Problem [1], so ist es alles über Transaktion Isolationsstufen.Wir haben die SERIALISABLE Ebene in Oracle zu vermeiden (aber es bedeutet nicht, dass es gut für Ihre Aufgabe im allgemeinen Fall ist) diese Probleme [2], also wenn Sie nicht einige Überraschungen erhalten möchten und wollen erhalten Sie Ihre Datenbank in konsistenten Zustand auf bestimmten Zeitpunkt (Ihr Transaktionsstartpunkt Zeit), sollten Sie dies tun:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Links:

  1. https://en.wikipedia.org/wiki/Isolation_(database_systems)
  2. http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10005.htm#SQLRF01705