Abfrage aus dem RMAN-Katalog täglich in Tabelle

Hallo,

ich habe folgendens Problem / Aufgabe und leider nur etwas Halbwissen von normalen SQL.
Es geht um foglendes…

Ich möchte eine Tabelle erstellen, welche sich täglich automatisch aktualisiert.
Die Daten, welche in die Tabelle geschrieben werden sollen, liegen im RMAN-Catalog (in der Tabelle RC_BACKUP_SET_DETAILS).
Hieraus möchte ich einige Spalten kopieren und in eine neu angelegte Tabelle schreiben.
Die Tabelle soll natürlich nicht immer wieder neu angelegt werden, sondern nur vom einen,
auf den anderen Tag abgeglichen / aktualisiert werden. Die Tabelle dient als Übersicht der gelaufenen Backups der Datenbanken.

Ich habe es jetzt schon mit SQL und PL/SQL (wo von in gar keine Ahnung habe?!) probiert.
Leider habe ich noch keine funktionierende Prozedur / Srkipt hin bekommen.

Die Tabelle habe ich schon, wie folgt angelegt:

CREATE TABLE BACKUP_JOB
(DB_NAME VARCHAR2(8) NOT NULL,
BACKUP_TYPE VARCHAR2(8),
INCREMENTAL_LEVEL VARCHAR2(3),
DURATION_IN_MIN NUMBER(2,2),
DATA_VOLUME_IN_GB NUMBER(5,2),
CONSTRAINT backup_job_pk
PRIMARY KEY (DB_NAME)
);

In diese Tabelle sollen dann einige Daten, aus dem RMAN - Catalog,
immer morgens, importiert werden.

Habe es schon mit einem Cursor versucht, aber dafür fehlt mir echt das Wissen :wink:

Versuch:

DECLARE

TYPE backup_curtype IS REF CURSOR RETURN rman.rc_backup_set_details%ROWTYPE;

backup_curvar backup_curtype;

backup_job rman.rc_backup_set_details%ROWTYPE;

BEGIN

OPEN backup_curvar FOR
SELECT *
FROM rman.rc_backup_set_details;

FETCH backup_curvar INSERT INTO backup_job;

CLOSE backup_curvar;

END;

/

Ich hatte auch schon mal versucht, etwas mit einem normalen SELECT zu importieren,
aber das war irgendwie nicht so das glebe vom Ei - langsam, zu viel Rechenleistung etc.

Idee (in dem Beispiel geht es noch um eine alte Abfrage, welche auch net soo dolle war,
aber so würde ich auch die neue, wie oben beschrieben, machen):

SELECT SESSION_KEY, DB_NAME, MIN(R.START_TIME) Start_RMAN, MIN(C.CHECKPOINT_TIME) Start_Controlfile, MIN(D.CHECKPOINT_TIME) Start_Datafile, MIN(A.FIRST_TIME) Start_Archivelog, MAX(A.NEXT_TIME) End_Archivelog, MIN(B.START_TIME) Start_Set, MAX(B.COMPLETION_TIME) End_Set, MIN(P.START_TIME) Start_Piece, MAX(P.COMPLETION_TIME) End_Piece
FROM rman.rc_backup_controlfile_details C
JOIN rman.rc_backup_datafile_details D
ON C.SESSION_KEY = D.SESSION_KEY
Join rman.rc_backup_archivelog_details A
ON C.SESSION_KEY = A.SESSION_KEY
JOIN rman.rc_backup_set_details B
ON C.SESSION_KEY = B.SESSION_KEY
JOIN rman.rc_backup_piece_details P
ON C.SESSION_KEY = P.SESSION_KEY
JOIN rman.rc_rman_backup_job_details R
ON C.SESSION_KEY = R.SESSION_KEY
WHERE DB_KEY = (SELECT DB_KEY
FROM rman.rc_database
WHERE NAME = ‚ALICE1‘)
AND C.CHECKPOINT_TIME >sysdate-14
AND D.CHECKPOINT_TIME >sysdate-14
AND R.START_TIME >sysdate-14
AND A.FIRST_TIME >sysdate-14
AND B.START_TIME >sysdate-14
AND P.START_TIME >sysdate-14
AND A.NEXT_TIME >sysdate-14
AND B.COMPLETION_TIME >sysdate-14
AND P.COMPLETION_TIME >sysdate-14
GROUP BY SESSION_KEY, DB_NAME;

So, um nochmal auf den Puntk zu kommen - ich will

  • eine Tabelle mit den Spalten (DB_NAME, BACKUP_TYPE, INCREMENTAL_LEVEL, DURATION_IN_MIN, DATA_VOLUME_IN_GB)
  • in diese Tabelle sollen Daten aus dem RMAN-Catalog (Tabelle RC_RMAN_BACKUP_SET_DETAILS) geschrieben werden
  • das alles am besten in einem Skript, dass man nur noch ausführen brauch

Kann mir jemand helfen? HILFE!

Vielen Dank schon mal :smile:

Hallo,

hab gerade keinen rman hier :wink:.
Also: wie ist die Tabellenstruktur (unter SQL*Plus: desc RC_BACKUP_SET_DETAILS), und brauchst du nur Infos aus der einen Tabelle?
Dann wäre es einfach, so in der Art
INSERT INTO … As SELECT…
Aber formulier mal ganz genau, was du haben willst.

Gruß, muzel

Also, die Tabelle im RMAN sieht wie folgt aus:

desc rc_backup_set_details

Name Null? Type


SESSION_KEY NUMBER
SESSION_RECID NUMBER
SESSION_STAMP NUMBER
DB_KEY NUMBER
DB_NAME VARCHAR2(8)
BS_KEY NUMBER
RECID NUMBER
STAMP NUMBER
SET_STAMP NUMBER
SET_COUNT NUMBER
BACKUP_TYPE VARCHAR2(1)
CONTROLFILE_INCLUDED VARCHAR2(7)
INCREMENTAL_LEVEL NUMBER
PIECES NUMBER
START_TIME DATE
COMPLETION_TIME DATE
ELAPSED_SECONDS NUMBER
BLOCK_SIZE VARCHAR2
KEEP VARCHAR2(3)
KEEP_UNTIL DATE
KEEP_OPTIONS VARCHAR2(10)
DEVICE_TYPE VARCHAR2(255)
COMPRESSED VARCHAR2(3)
NUM_COPIES NUMBER
OUTPUT_BYTES NUMBER
ORIGINAL_INPUT_BYTES NUMBER
COMPRESSION_RATIO NUMBER
STATUS CHAR(1)
ORIGINAL_INPRATE_BYTES NUMBER
OUTPUT_RATE_BYTES NUMBER
ORIGINAL_INPUT_BYTES_DISPLAY VARCHAR2(4000)
OUTPUT_BYTES_DISPLAY VARCHAR2(4000)
ORIGINAL_INPRATE_BYTES_DISPLAY VARCHAR2(4000)
OUTPUT_RATE_BYTES_DISPLAY VARCHAR2(4000)

Aus dieser Tabelle benötige ich folgende Spalten, in meiner Tabelle:

DB_KEY NUMBER
DB_NAME VARCHAR2(8)
BACKUP_TYPE VARCHAR2(1)
CONTROLFILE_INCLUDED VARCHAR2(7)
INCREMENTAL_LEVEL NUMBER
START_TIME DATE
COMPLETION_TIME DATE
OUTPUT_BYTES_DISPLAY VARCHAR2(4000)

Ok klar, meine Tabelle muss ich noch entsprechend anpassen. Das ist ja kein Problem. Es ist ebenfalls kein Problem, die Datensätze einzufügen. Womit ich nur meine Probleme habe, ist folgendes:

  1. Wie bekomme ich es hin, dass die Tabelle täglich aktualisiert und abgeglichen wird?
  2. Kann mir das jemand in eine Prozedur o.ä. packen, die ich dann einfach in einen Job stecke, der immer Morgens läuft?

Danke

  1. Wie bekomme ich es hin, dass die Tabelle täglich
    aktualisiert und abgeglichen wird?

– Job

  1. Kann mir das jemand in eine Prozedur o.ä. packen, die ich
    dann einfach in einen Job stecke, der immer Morgens läuft?

– Entweder lösche (oder truncate) den Inhalt der Tabelle vor jedem Update oder verwende das MERGE Statement. Diese Procedur kannst du anschliessend im JOB-Manager eintragen.