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
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