Alte Journalempfänger können schnell zu einem der größten Speicherplatzverschwender auf jeder IBM i-Partition werden. Für das Entfernen dieser Journalempfänger ist meistens ein gewisser Programmieraufwand erforderlich. In IBM i 7.6 und 7.5 TR6 kommt eine neue SQL-Prozedur, die es einfach macht, die alten Empfänger zu löschen. Im aktuellen Artikel wird diese Prozedur beschrieben und auch gezeigt, wie diese auch auf IBM i-Systemen mit einem niedrigeren Releasestand übernommen und eingesetzt werden kann.
Was sind „alte“ Journalempfänger
Zunächst sollte festgelegt werden, was unter “alten Empfängern” zu verstehen ist. Ein “alter” Journalempfänger wurde von seinem Journal gelöst und gesichert. Im allgemeinen Verständnis kann ein Journalempfänger gelöscht werden, wenn er gelöst und gesichert wurde. Wenn die darin enthaltenen Informationen benötigt werden, können sie wiederhergestellt werden.
Um eine Übersicht über die vorhandenen Journalempfänger zu erhalten, verwende ich die SQL-View JOURNAL_RECEIVER_INFO in der Bibliothek QSYS2. Diese liefert mir Daten, die ich dann für die Ermittlung von „alten“ Empfängern verwenden kann.
Select *
From Qsys2.Journal_Receiver_Info
Limit 10;
Die Ergebnismenge dieser SQL-Anweisung liefert neben dem Namen des Journalempfängers auch jeweils einen Timestamp dafür, wann der Empfänger angehängt, abgehängt oder gelöst und wann er gesichert wurde. Bei der folgenden SQL-Anweisung werden nur die relevanten Spalten verwendet und die Timestamp-Spalten in Datums-Spalten umgewandelt:
-- Nur die wichtigsten Spalten von QSYS2.JOURNAL_RECEIVER_INFO
SELECT JOURNAL_RECEIVER_LIBRARY As "Rcvr lib",
JOURNAL_RECEIVER_NAME AS "Rcvr name",
JOURNAL_LIBRARY AS "Jrn lib",
JOURNAL_NAME AS "Jrn name",
DATE(ATTACH_TIMESTAMP) AS "Attach",
DATE(DETACH_TIMESTAMP) AS "Detached",
DATE(SAVE_TIMESTAMP) AS "Saved"
FROM QSYS2.JOURNAL_RECEIVER_INFO
ORDER BY ATTACH_TIMESTAMP ;
Diese Empfänger können nun nicht einfach gelöscht werden, da viele davon immer noch an ihre Journale angehängt sind. Daher muss ich meine SQL-Anweisung verfeinern.
Die folgende SQL-Anweisung wählt nur Zeilen aus, in denen der Speicherzeitstempel größer ist als der Detach-Zeitstempel, d.h. der Empfänger wurde nach dem Trennen gespeichert. Es werden nur Empfänger ausgewählt, die vor mehr als 30 Tagen getrennt wurden.
SELECT JOURNAL_RECEIVER_LIBRARY As "Rcvr lib",
JOURNAL_RECEIVER_NAME AS "Rcvr name",
JOURNAL_LIBRARY AS "Jrn lib",
JOURNAL_NAME AS "Jrn name",
DATE(ATTACH_TIMESTAMP) AS "Attach",
DATE(DETACH_TIMESTAMP) AS "Detach",
DATE(SAVE_TIMESTAMP) AS "Saved"
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE DETACH_TIMESTAMP < SAVE_TIMESTAMP
AND DETACH_TIMESTAMP < CURRENT_DATE - 30 DAYS
ORDER BY ATTACH_TIMESTAMP;
Wenn Sie noch wissen möchten, wie viele „alte“ Empfänger ermittelt wurden, können Sie die folgende SQL-Anweisung verwenden:
SELECT TO_CHAR(COUNT(*),'999G999') AS "Count"
FROM QSYS2.JOURNAL_RECEIVER_INFO
WHERE DETACH_TIMESTAMP < SAVE_TIMESTAMP
AND DETACH_TIMESTAMP < CURRENT_DATE - 30 DAYS;
Die SQL-Prozedur SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS
Die SQL-Pozedur DELETE_OLD_JOURNAL_RECEIVERS löscht abgehängte Journalempfänger nach Filterkriterien. Optional kann eine Vorschau der Journalempfänger erfolgen, die die Filterkriterien erfüllen, ohne den Löschvorgang durchzuführen. Wenn die Option “Löschen” ausgewählt ist, wird eine Ergebnismenge zurückgegeben, die Informationen über die gelöschten Journalempfänger enthält. Zusätzlich zur Ergebnismenge werden diese Ergebnisse in eine temporäre Tabelle, geschrieben: QTEMP.QDLTJRNRCV .
Der Aufruf der Prozedur mit fünf Parametern erfolgt mit:
/*--------------------------------------------------------------------*/
-- Aufruf der Prozedur
/*-------------------------------------------------------------------*/
CALL SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS (
DELETE_OLDER_THAN => ?, /* IN TIMESTAMP Kein Standardwert timestamp - Default: none */
JOURNAL_RECEIVER_LIBRARY => DEFAULT, /* IN VARCHAR(1000) Standard: '*ALL' *ALL or list of names separated by commas - Default: *ALL */
JOURNAL_RECEIVER => DEFAULT, /* IN VARCHAR(10) Standard: '*ALL' name, *ALL - Default: *ALL */
DELETE_UNSAVED => DEFAULT, /* IN VARCHAR(3) Standard: 'NO' NO, YES - Default: NO */
PREVIEW => DEFAULT /* IN VARCHAR(3) Standard: 'YES' NO, YES - Default: YES */
);
Die Prozedur hat fünf Parameter:
- DELETE_OLDER_THAN: Startzeitstempel für das Löschen der alten Empfänger.
Dies ist ein Zeitstempel und hat keinen Standardwert. - JOURNAL_RECEIVER_LIBRARY: Name der Bibliothek, in der sich die Empfänger befinden. Der Standardwert ist ‘*ALL’.
- JOURNAL_RECEIVER: Name des Journalempfängers. Der Standardwert ist ‘*ALL’.
- DELETE_UNSAVED: Mit “YES” werden Empfänger gelöscht, die nicht gespeichert wurden.
Mit ‘NO’ werden nur Empfänger gelöscht, die auch gespeichert sind.
Der Standardwert ist ‘NO’. - PREVIEW: ‘YES’ – Es erfolgt kein Löschen, es werden nur die Ergebnisse angezeigt.
Mit “NO” werden alle Empfänger gelöscht, die den ausgewählten Kriterien entsprechen.
Der Standardwert ist ‘YES’.
Wenn Sie alle getrennten Empfänger löschen möchte, die älter als 30 Tage sind, können Sie folgende SQL-Anweisung verwenden:
CALL SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS(
DELETE_OLDER_THAN => CURRENT_DATE - 30 DAYS,
PREVIEW => 'YES'); -- nur Anzeige
-- PREVIEW => 'NO'); -- ausgewählte Receiver löschen
STOP;
Weitere Informationen zu der SQL-Prozedur finden Sie in der IBM-Dokumentation:
DELETE_OLD_JOURNAL_RECEIVERS procedure – IBM Documentation
Hier ist noch ein Beispiel, das zeigt, wie aufwändig das Löschen alter Journalempfänger ist ohne die Prozedur SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS:
How To Delete Old Journal Receivers (*JRNRCV) » Nick Litten [IBM I AS400 ISeries] Software Developer
Wie aber kann diese SQL-Prozedur, die für 7.6 und 7.5 (auch für 7.4) verfügbar ist, auch bei IBM-Systemen mit dem Releasestand 7.3 eingesetzt werden?
SQL-Prozedur SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS auch für 7.3 verfügbar machen
Wenn Sie IBM i ACS im Einsatz haben und Zugriff auf eine IBM i mit 7.5 oder 7.6 haben, können Sie die Übertragung der Prozedur auf ein System mit 7.3 einfach selbst durchführen.
- Wählen Sie im Hauptportal von ACS das System mit dem Release 7.5 oder 7.6 aus.
- Danach wählen Sie in der Kategorie „Datenbank“ den Menüpunkt „Schema“.
- Aus der Liste der angezeigten Schemata (= Bibliotheken) wählen Sie „SYSTOOLS“
und darunter „Prozeduren“ - Jetzt sollte auch die Prozedur „DELETE_OLD_JOUNAL_RECEIVERS angezeigt werden.
- Über das Kontextmenü (= rechte Maustaste) wählen Sie SQL generieren à DDL
(siehe folgende Abbildung).
Quelle: Theo Bär- Kopieren Sie das gesamte Skript und führen dieses auf der IBM i mit 7.3 aus.
- Danach können Sie die Prozedur wie oben beschrieben auf der IBM mit 7.3 nutzen.
Hinweis:
Bei mir hat das bisher immer funktioniert. Für die Vermeidung von irgendwelchen Problemen oder Fehlern kann ich leider keine Gewähr bieten.
-- SQL generieren
-- Version: V7R6M0 160422
-- Generiert am: 21.06.25 18:06:32
-- Relationale Datenbank: S062314T
-- Standardauswahl: Db2 for i
SET PATH "QSYS","QSYS2","SYSPROC","SYSIBMADM","TB" ;
CREATE PROCEDURE SYSTOOLS.DELETE_OLD_JOURNAL_RECEIVERS (
IN DELETE_OLDER_THAN TIMESTAMP ,
IN JOURNAL_RECEIVER_LIBRARY VARCHAR(1000) FOR SBCS DATA DEFAULT '*ALL' ,
IN JOURNAL_RECEIVER VARCHAR(10) FOR SBCS DATA DEFAULT '*ALL' ,
IN DELETE_UNSAVED VARCHAR(3) FOR SBCS DATA DEFAULT 'NO' ,
IN PREVIEW VARCHAR(3) FOR SBCS DATA DEFAULT 'YES' )
DYNAMIC RESULT SETS 1
LANGUAGE SQL
…..
….
INSERT INTO SESSION . QDLTJRNRCV (
DELETE_JOURNAL_RECEIVER_RESULT ,
JOURNAL_RECEIVER_LIBRARY , JOURNAL_RECEIVER_NAME ,
DESCRIPTIVE_TEXT , JOURNAL_RECEIVER_ASP_NUMBER ,
JOURNAL_RECEIVER_ASP_NAME , JOURNAL_LIBRARY ,
JOURNAL_NAME , THRESHOLD , SIZE , STATUS ,
NUMBER_OF_JOURNAL_ENTRIES , FIRST_SEQUENCE_NUMBER ,
LAST_SEQUENCE_NUMBER ,
MAXIMUM_ENTRY_SPECIFIC_DATA_LENGTH ,
MAXIMUM_NULL_VALUE_INDICATORS , ATTACH_TIMESTAMP ,
DETACH_TIMESTAMP , SAVE_TIMESTAMP ,
PREVIOUS_JOURNAL_RECEIVER_LIBRARY ,
PREVIOUS_JOURNAL_RECEIVER ,
NEXT_JOURNAL_RECEIVER_LIBRARY ,
NEXT_JOURNAL_RECEIVER , RECEIVER_MAXIMUM_SIZE )
VALUES ( V_RESULT , JOURNAL_RECEIVER_LIBRARY ,
JOURNAL_RECEIVER_NAME , DESCRIPTIVE_TEXT ,
JOURNAL_RECEIVER_ASP_NUMBER ,
JOURNAL_RECEIVER_ASP_NAME , JOURNAL_LIBRARY ,
JOURNAL_NAME , THRESHOLD , SIZE , STATUS ,
NUMBER_OF_JOURNAL_ENTRIES , FIRST_SEQUENCE_NUMBER ,
LAST_SEQUENCE_NUMBER ,
MAXIMUM_ENTRY_SPECIFIC_DATA_LENGTH ,
MAXIMUM_NULL_VALUE_INDICATORS , ATTACH_TIMESTAMP ,
DETACH_TIMESTAMP , SAVE_TIMESTAMP ,
PREVIOUS_JOURNAL_RECEIVER_LIBRARY ,
PREVIOUS_JOURNAL_RECEIVER ,
NEXT_JOURNAL_RECEIVER_LIBRARY ,
NEXT_JOURNAL_RECEIVER , RECEIVER_MAXIMUM_SIZE ) ;
END FOR ;
OPEN DELETE_RESULT_CURSOR ;
END ;
Aus Platzgründen kann ich leider nicht das komplette Skript hier eintragen. Falls Sie keinen Zugriff auf eine IBM i mit 7.5 oder 7.6 haben, können Sie mich gerne kontaktieren unter der unten angegebenen E-Mail-Adresse.
Nun wünsche ich viel Spaß beim Arbeiten mit der SQL-Prozedur und beim Löschen von Journalempfängern.
Vorschau:
Im nächsten Artikel werde ich weitere Features von IBM i ACS beschreiben.
Bis dahin wünsche ich Ihnen weiterhin viel Spaß beim Vermehren Ihrer Fertigkeiten.
Den Autor Theo Bär erreichen Sie unter EDV-Beratung Theo Bär – Ringmauerweg 1 – 69250 Schönau – Tel. (+49) 6228 912 630 – e-Mail info@edv-baer.com
