Motivation
Große Mengen an Bewegungsdaten sollen nach der Archivierung dauerhaft aus der Datenbank gelöscht werden. Auf Grund der Datenmenge ist das mit klassischen SQL Statements wegen hoher Laufzeiten schlecht zu bewältigen. Es ist günstiger, in solchen Fällen entsprechende Tabellen direkt zu droppen, dabei muss natürlich sichergestellt werden, dass nur bereits archivierte Daten gelöscht werden und problematische Daten erneut vom Benutzer bearbeitet werden können. Außerdem sollte dieser Prozess automatisiert in bestimmten Zeiträumen stattfinden (Scheduling) und entsprechend konfigurierbar sein.
Annahmen:
Es wird in diesem Beispiel von einer Oracle Datenbank ausgegegangen. Zudem wird festgelegt, dass Daten, die älter sind als 2 Monate, gelöscht werden sollen.
Funktionsweise
Hier ist eine Klartextbeschreibung mit den oben genannten Rahmenbedingungen (Löschzeitpunkt: Älter als 2 Monate):
Es sind 2 Monate vergangen. Alles was älter ist als zwei Monate wird bereinigt (Clearing) und anschliessend gelöscht, wenn keine nicht archivierten Daten vorhanden sind. Alles was zwischen 2 Monaten und dem Ausführungsdatum liegt, wird in den Offline- Bereich verschoben. Alles was nach dem Ausführungszeitpunkt liegt, ist der neue Active Bereich.
Es gibt also drei Bereiche, die auf entsprechende Tabellen (und Indices) abgebildet werden können:
Offline:
Beinhaltet alle Daten, die bei der Nächsten Ausführung des SwitchPartitionJob- Service gedroppt werden sollen
Clearing:
Beinhaltet alle Daten, die bei der Nächsten Ausführung des SwitchPartitionJob- Service von Offline nach Clearing verschoben worden sind,
weil Sie entweder nicht archiviert wurden oder anderweitig nicht ein definiertes Löschschema passen.
Active:
Das ist die aktuelle Tabelle mit dem aktuellem Datenbestand.
Folgendes Schaubild verdeuticht den Prozess:

Interne Funktionsweise
Der eigentliche Vorgang der Partitionierung geschieht über den SwitchPartitionJob.
Die Abfolge der internen Abläufe ist wie folgt:
- Partition-Lock: Ein anwendungsweiter Partition-Switch-Lock wird gesetzt. Falls der Lock nicht erlangt werden kann, bricht der Job ab.
- Ausführbarkeit prüfen: Der Job prüft, ob
B3P_PARTITION_DATABASE = trueist und ob seit dem letzten Switch (B3P_LAST_SWITCH_DATE) der überB3P_SWITCH_SPANdefinierte Zeitraum vergangen ist. - Recovery-Check: Fehlende Active-, Offline- und Clearing-Tabellen werden automatisch nacherstellt (Recovery), um einen konsistenten Ausgangszustand sicherzustellen.
- Clearing: Nicht archivierte Nachrichten werden aus den Offline-Tabellen in die Clearing-Tabellen verschoben. Die Selektion
erfolgt standardmäßig über
state = 'ERR', kann aber perB3P_CLEARING_WHERE_CLAUSEangepasst werden. - Nachrichtenverarbeitung stoppen: Alle dynamischen Locks, der Crawler-Lock, die Queue und die Archivierung werden gesperrt. Dabei wartet der Job pro Lock bis zu 10 Versuche (je 5 s).
- Bis zu 50 Sekunden abwarten, dass die Queue leer ist.
- Warten auf laufende Verarbeitung: Der Job wartet in einer Schleife (Polling alle 5 s), bis keine aktiven Workflow-Threads mehr in der Queue laufen.
- Pre-Switch-Checks: Optional wird eine über
B3P_PRESWITCH_CHECK_CLASSkonfigurierte Prüfklasse ausgeführt. Zusätzlich wird bei gesetzterB3P_MESSAGE_ID_IN_ARCHIVEgeprüft, ob diese Message-ID im Archiv existiert. - Offline-Tabellen droppen: Die bisherigen Offline-Tabellen und deren Indizes werden entfernt.
- Active nach Offline umbenennen: Die aktiven Tabellen und Indizes werden nach Offline umbenannt. Direkt nach dem Rename wird
B3P_LAST_SWITCH_DATEaktualisiert. - Neue Active-Tabellen erstellen: Leere Tabellen und Indizes für den neuen Active-Bereich werden erstellt.
- Application Lock freigeben: Alle Locks (dynamische Locks, Crawler, Queue, Archiv) werden wieder freigegeben.
- Global Properties aktualisieren:
B3P_LAST_SWITCH_DATEwird mit dem Ausführungszeitpunkt beschrieben undDELETE_FULL_TEXT_INDEX_TOwird anhand des Switch-Span berechnet und gespeichert.
Daten-Zustand nach einem Switch:
Die Offline und Clearing Tabellen beinhalten Daten, auf die normal zugegriffen werden kann.
Im Initialdurchlauf der Partitionierung werden alle Daten, die älter sind als der eingestellte Wert, in die Offline Tabellen verschoben ( durch Umbenennen). Erst beim zweiten Start des SwitchPartitionJobs werden diese Daten tatsächlich gedroppt.
Es werden ständig die Daten aus dem Offline Bereich vorgehalten (z.B. >= 2 Monate) sowie die aktuellen Daten bis zum nächsten Switch (2 Monate). Insgesamt sind also mindestens die Daten aus dem einfachen, maximal aus dem doppelten Zeitraum verfügbar, der angegegeben worden ist, plus die Daten, die nebenläufig im Clearing Bereich liegen.
Gesondertes Clearing
Da auch der Clearing-Prozess bei entsprechenden Datenmengen aufwendig sein kann, kann über den
SwitchPartitionCopyClearingJob auch zwischenzeitlich die
Verschiebung der Daten von Offline nach Clearing erfolgen.
Konfiguration
Die Konfiguration besteht aus mehreren Einstellungen und Services. Die Services sind hier verlinkt und gesondert unter Services in der B2B
Dokumentation zu finden.
Um die „Application Partitions“ einzurichten, müssen folgende Einstellung in B2B by Practice geändert werden. Aktuell ist die Einrichtung für folgende Datenbanken möglich:
- MS SQL Server ab 2008
- Oracle ab 11g
- Derby ab 10.11
- Sap DB / MaxDB
Berechtigungen Datenbank Benutzer
Für die Ausführung der verschiedenen Befehle benötigt der Benutzer für die B2B Datenbank erweiterte Berechtigungen: DROP, CREATE, RENAME. Zusätzlich für einzelne Datenbanken:
- MS SQL Server 2008: sp_rename()
Tabellenprüfung
Da bei den Application Partitions häufiger komplette Bereiche von Tabellen für die Bewegungsdaten neu Angelegt werden müssen, muss die Ausgangssituation ebenfalls diesem Umfang an Tabellen entsprechen.
Folgende Tabellen müssen existieren, bevor die Application Partitions genutzt werden können.
- B2BBP_DATA_MESSAGE
- B2BBP_DATA_ACTION
- B2BBP_DATA_ATTRIBUTE
- B2BBP_DATA_ATTRIBUTE_ARCHIVE
- B2BBP_DATA_ERROR
- B2BBP_DATA_CLEARING
- B2BBP_DATA_CLEARING2
- B3P_DATA_STATES_HISTORY
Bei Oracle müssen folgende Indices vorhanden sein:
- IDX_MESSAGE_STARTED_ID
- IDX_MESSAGE_REFERENCE_ID
- IDX_CORR_ALTERID_DIRECT_SENDER
- IDX_ATTRIBUTE_ACTIONID_TYPE
- IDX_ATTRIBUTE_MESSAGEID_TYPE
- IDX_ATTRIBUTE_MESSAGEID
- IDX_ATTRIBUTE_ARC_ACTION_TYP
- IDX_ATTRIBUTE_ARC_MESSAGE_TYP
- IDX_ATTRIBUTE_ARC_MESSAGEID
- IDX_ERROR_ACTION_ID
- IDX_ACTION_MESSAGE_ID
- IDX_ACTION_STARTED_MESSAGE_ID
- IDX_B3P_STATES_HIST_1
Einrichtung der Application Partition Services
Links (siehe auch oben):
Extensions für zusätzliche Indexe

Mit den Extensions:
- SWITCH_PARTITION_RENAME_ACTIVE_INDEXES
- SWITCH_PARTITION_CREATE_ACTIVE_INDEXES
- SWITCH_PARTITION_CREATE_OFFLINE_INDEXES
- SWITCH_PARTITION_CREATE_CLEARING_INDEXES
Können zusätzliche (vom B2B Standard abweichende) Index angegeben werden welche bei der Application-Partition berücksichtigt werden sollen. Bei 1.) muss ein Rename Statement angegeben werden z.B. alter index “IDX_TEST_ACTION_NAME” rename to “IDX_TEST_ACTION_NAMEO”.
Bei 4.) ein create Statment z.B. CREATE INDEX IDX_TEST_ACTION_NAMEC ON B2BBP_DATA_ACTIONC (NAME)
Aktivierung der Application Partitions
Damit die Application Partitions auch aktiv werden, muss noch folgende Global Property gesetzt werden.
B3P_PARTITION_DATABASE = true
Ist diese Eigenschaft auf false gesetzt, oder gar nicht vorhanden, dann sind die Application Partitions in B2B by Practice nicht aktiv.
Relevante Global Properties
| Global Property | Beschreibung |
|---|---|
B3P_PARTITION_DATABASE |
Aktiviert (true) oder deaktiviert (false) die Application Partitions. Default: false. |
B3P_LAST_SWITCH_DATE |
Zeitstempel des letzten erfolgreichen Switches im Format yyyy.MM.dd HH:mm:ss. Wird automatisch vom Job geschrieben. |
B3P_SWITCH_PARTITION_NODE_ID |
Cluster-Node-ID des Knotens, auf dem der letzte Switch ausgeführt wurde. Wird automatisch gesetzt. |
DELETE_FULL_TEXT_INDEX_TO |
Berechneter Cutoff-Zeitstempel für die Löschung von Volltextindizes. Wird vom SwitchPartitionJob automatisch aus B3P_LAST_SWITCH_DATE minus B3P_SWITCH_SPAN berechnet. |
SWITCH_PARTITION_DO_POST_SECURITY_LEVEL |
Steuert das Verhalten eingehender DoPost-Anfragen während des Switches (siehe unten). |
Zeitpunktberechnung
Der SwitchPartitionJob schreibt nach der erfolgreichen Ausführung einen Zeitstempel in B3P_LAST_SWITCH_DATE. Bei jedem Lauf vergleicht der
Job die aktuelle Zeit mit diesem Zeitstempel unter Berücksichtigung des B3P_SWITCH_SPAN-Werts. Die Formel lautet:
<Aktuelles Datum> - <B3P_SWITCH_SPAN> > <B3P_LAST_SWITCH_DATE>
Die GP B3P_LAST_SWITCH_DATE ist optional und bei Inbetriebnahme nicht verpflichtend.
Anbindung B2B-Message-Service
Falls Sie den B2B-Message-Service einsetzen, muss dieser ebenfalls für Switch Partition konfiguriert werden. Weitere Details entnehmen Sie der Doku des B2B-Message-Service.
SWITCH_PARTITION_DO_POST_SECURITY_LEVEL
Diese Global Property steuert, wie eingehende DoPost-Anfragen während der Laufzeit des SwitchPartitionJob behandelt werden:
| Wert | Verhalten |
|---|---|
| (nicht angelegt) | DoPost-Anfragen werden während des Switches mit einer Exception beantwortet. |
normal |
DoPost-Anfragen werden gepuffert, bis der SwitchPartitionJob durchgelaufen ist. |
high |
DoPost-Anfragen werden ebenfalls gepuffert, allerdings über ein sichereres Verfahren mit geringerer Performance. Erfordert die zusätzliche Tabelle B2BBP_DATA_LOCKTAB_PARTITION. |
Relevante Jobs einrichten:
Die Archivierung, SwitchPartition und SwitchPartitionCopyClearing müssen abgestimmt ablaufen, damit der Switch sauber abläuft. Vor dem Switch sollte der CopyClearing-Job optimalerweise die Offline-Partition vollständig abgearbeitet und nicht archivierte Nachrichten in die Clearing-Partition verschoben haben. Dann wird der Switch besonders schnell durchgeführt. Der CopyClearing-Job seinerseits sollte nur den Zeitraum betrachten, der durch den ArchivJob archiviert wurde.
Deshalb bietet sich folgende Konfiguration der Jobs, as Beispiel für den Switch-Intervall von 60 Tagen:
- Zwei ArchiveJobs archivieren Nachrichten älter als 55 Tage in der Aktiven und Offline-Partitionen. Sie laufen zu unterschiedlichen Tageszeiten.
- SwitchPartitionCopyClearingJob verschiebt nicht archivierte Nachrichten älter als 59 Tage in die Clearing-Partition. Das gibt den Archivjobs im Fehlerfall bis zu vier Tage Zeit, um die Nachrichten zu archivieren.
- SwitchPartitionJob macht einen Switch jede 60 Tage, dabei sollte die Offline-Partition keine relevanten Nachrichten mehr haben, weil sie zuvor archiviert bzw. in die Clearing-Partition verschoben wurden.
B2BBP_DATA_LOCKTAB_PARTITION
Folgende Tabelle muss erstellt werden wenn das SWITCH_PARTITION_DO_POST_SECURITY_LEVEL auf high ist.
CREATE TABLE
B2BBP_DATA_LOCKTAB_PARTITION
(
LOCKID VARCHAR2(40) NOT NULL,
NODENR INTEGER
);
Nacharbeiten
Nach der Einrichtung der Partitionierung sind folgende Punkte zu beachten:
- Die Archivierung muss den Offline Bereich berücksichtigen, bei Wunsch auch die Active- und Clearing-Bereiche
- Vorhandene Delete Jobs sind unter Umständen überflüssig
- Nach dem ersten Lauf des SwitchPartitionJobs müssen die Views in der Datenbank geändert werden, damit die Nachrichen im Nachrichtenmonitor
angezeig werden können. Diese Views sollen gelöscht und mit neuen Definitionen angelegt werden:
- b2bbp_data_message_view
- b2bbp_data_action_view
- b2bbp_data_attribute_view
- b2bbp_data_error_view
Die neuen Definitionen der Views sind in der Datei create_tables_b2b_special_oracle.sql zu finden.
Monitoring
Der SwitchPartitionJob protokolliert seinen Fortschritt im MessageMonitor als einzelne Nachricht mit mehreren Actions. Folgende Informationen werden als Action-Einträge geschrieben:
| Action | Inhalt |
|---|---|
| Info1 | Dauer und Anzahl der verschobenen Clearing-Nachrichten (z.B. „Clearing Nachrichten (42) kopieren: 3.5s”) |
| Info2 | Dauer des Application-Lock-Setzens |
| Info3 | Dauer des Wartens auf Verarbeitungsende |
| Info4 | Dauer des Offline-Tabellen-Droppens |
| Info5 | Dauer des Tabellen-Renames (Active → Offline) |
| Info6 | Dauer der Neuanlage der Active-Tabellen |
Zusätzlich werden die Actions „Aktuelle Aktion” und „Abgeschlossene Aktion” laufend aktualisiert, so dass der aktuelle Fortschritt im MessageMonitor sichtbar ist.
Erstmalige Inbetriebnahme (Erster Switch)
Der erste Switch unterscheidet sich vom regulären Betrieb, da noch keine Offline- und Clearing-Tabellen existieren und alle Bewegungsdaten in den aktiven Tabellen liegen. Dieser Abschnitt beschreibt die Vorbereitung und die Nachkontrolle.
Vorbereitung (Checkliste)
Folgende Punkte müssen vor dem Setzen von B3P_PARTITION_DATABASE = true erfüllt sein:
1. Datenbank-Berechtigungen prüfen
Der DB-Benutzer der B2B-Anwendung benötigt die Rechte CREATE TABLE, DROP TABLE und RENAME (bzw. sp_rename() bei MS SQL Server). Ohne
diese Rechte schlägt der Switch mit einer SQL-Exception fehl.
2. Basistabellen prüfen
Alle 8 Bewegungsdaten-Tabellen müssen in der Datenbank vorhanden sein (siehe Tabellenprüfung). Die Spalten-Typen sollen ebenfalls mit den Standard-Skripten abgeglichen werden.
3. Indizes prüfen (Oracle / SAP DB)
Bei Oracle müssen alle Standard-Indizes existieren (siehe Tabellenprüfung). Zusätzliche kundenspezifische Indizes müssen über die entsprechenden Extensions registriert sein (siehe Extensions für zusätzliche Indexe).
4. SwitchPartitionJob als Service einrichten aber noch nicht aktivieren
Der Service muss konfiguriert und geplant sein, bevor die Partitionierung aktiviert wird. Mindestens die Service Property
B3P_SWITCH_SPAN muss gesetzt sein (z.B. 0 2 0 0 0 0 für 2 Monate).
Die Property B3P_PRESWITCH_CHECK_CLASS und die Extension B3P_PRESWITCH_CHECK_SQL sollen unbedingt zumindest wie in der SwitchPartitionJob-Doku beschrieben konfiguriert werden!
Wir empfehlen den ersten und zweiten Switch manuell anzustoßen und den Ablauf zu kontrollieren. Ein Switch dauert normalerweise wenige Sekunden bis Minuten.
5. SWITCH_PARTITION_DO_POST_SECURITY_LEVEL festlegen
Entscheiden Sie, wie eingehende Nachrichten während des Switches behandelt werden sollen (
siehe SWITCH_PARTITION_DO_POST_SECURITY_LEVEL). Bei high muss die Tabelle
B2BBP_DATA_LOCKTAB_PARTITION vorab erstellt werden.
6. Foreign-Key-Constraints auf nicht-partitionierten Tabellen entfernen
Die Tabellen B2BBP_OUTBOX und B2BBP_DATA_ADDITIONAL_COLUMNS besitzen
standardmäßig einen FK-Constraint auf B2BBP_DATA_MESSAGE. Da diese Tabellen beim Switch nicht partitioniert werden, müssen die Constraints
vor dem ersten Switch entfernt werden. FK-Constraints sind nicht mit der Partitionierung kompatibel.
Oracle SQL zum Löschen der Constraints:
ALTER TABLE B2BBP_OUTBOX DROP CONSTRAINT <constraint_name>;
ALTER TABLE B2BBP_DATA_ADDITIONAL_COLUMNS DROP CONSTRAINT <constraint_name>;
Zum Bereinigen der Tabelle B2BBP_DATA_ADDITIONAL_COLUMNS kann DeleteJobUseTemplate benutzt werden.
7. Archivierung und CopyClearingJob einplanen
Die Archivierungs- und CopyClearingJobs sollten bereits konfiguriert sein, auch wenn sie beim ersten Switch noch keine Rolle spielen. Für den zweiten Switch ist es entscheidend, dass diese Jobs im konfigurierten Intervall laufen ( siehe Relevante Jobs einrichten).
8. B3P_PARTITION_DATABASE = true setzen
B3P_PARTITION_DATABASE = true gesetzt wird, führt der SwitchPartitionJob beim nächsten geplanten
Lauf sofort den ersten Switch aus.Prüfungen nach dem ersten Switch
| Prüfpunkt | Wie prüfen | Erwartetes Ergebnis |
|---|---|---|
| Switch erfolgreich | MessageMonitor: Nachricht des SwitchPartitionJob | Status SUCCESS, Info-Actions zeigen Zeitdauern |
B3P_LAST_SWITCH_DATE |
Global Properties | Enthält den Zeitstempel des Switches |
| Active-Tabellen | Datenbank: SELECT COUNT(*) FROM B2BBP_DATA_MESSAGE |
0 (oder nur Nachrichten, die nach dem Switch eingegangen sind) |
| Offline-Tabellen | Datenbank: SELECT COUNT(*) FROM B2BBP_DATA_MESSAGE[O/OFFLINE] |
Alle bisherigen Nachrichten |
| Clearing-Tabellen | Datenbank: SELECT COUNT(*) FROM B2BBP_DATA_MESSAGE[C/CLEARING] |
0 |
| Views aktualisiert | Datenbank-Views prüfen | Views müssen nach dem ersten Switch neu angelegt werden (siehe Nacharbeiten) |
| Nachrichtenverarbeitung | Nachrichtenmonitor-Suche | Neue Nachrichten landen in der Active-Partition |
| Services laufen | Lock-Table in der Admin-UI | Alle Locks sind entlockt und die Zeit der letzten Änderungen ist aktuell |
b2bbp_data_message_view, b2bbp_data_action_view,
b2bbp_data_attribute_view, b2bbp_data_error_view) gelöscht und mit den Definitionen aus create_tables_b2b_special_oracle.sql neu
angelegt werden. Ohne diese Anpassung werden Nachrichten im MessageMonitor nicht korrekt angezeigt.Zweiter Switch (erstmaliges Löschen von Daten)
Beim zweiten Switch werden zum ersten Mal tatsächlich Bewegungsdaten aus der Datenbank gelöscht. Die Offline-Tabellen aus dem ersten Switch — die alle ursprünglichen Nachrichten enthalten — werden gedroppt.
Voraussetzungen
Damit der zweite und folgende Switches erfolgreich ablaufen und korrekte Nachrichten gelöscht werden, soll das passende Clearing-Verhalten konfiguriert werden. Das bedeutet: Beim Switch soll die Offline-Partition möglichst nur noch Nachrichten enthalten, die gelöscht werden können. Das sind in der Regel archivierte Nachrichten, Job-Entries und eventuell Split-Nachricthen oder andere Nachrichten, die bewusst ohne Archivierung bleiben, aber auch gelöscht werden können. Andere Nachrichten sollten idealerweise bereits vor dem Switch in die Clearing-Partition verschoben werden.
Während des Switches verschiebt der SwitchPartitionJob maximal 1000 Nachrichten von Offline nach Clearing, dabei werden sie über die
B3P_CLEARING_WHERE_CLAUSE selektiert.
Wenn danach noch relevante Nachrichten in der Offline-Partition liegen, bricht der Switch mit einer Exception ab. Die Prüfung erfolgt über
das SQL-Statement, das in der Extension B3P_PRESWITCH_CHECK_SQL hinterlegt ist.
Wenn eine größere Anzahl von Clearing-Fällen zu erwarten ist, sollte der SwitchPartitionCopyClearingJob so konfiguriert werden, dass er jeden Tag läuft und die Offline-Partition bereinigt. Damit wird sichergestellt, dass die Offline-Partition vor dem nächsten Switch möglichst wenig relevante Nachrichten enthält und der Switch schnell durchläuft.
Die SQL-Statements in der Extension B3P_PRESWITCH_CHECK_SQL und den Service Properties B3P_CLEARING_WHERE_CLAUSE am SwitchPartitionJob
und SwitchPartitionCopyClearingJob sollen in ihrem Kern gleich sein und so formuliert sein, dass sie die relevanten Nachrichten selektieren,
die nicht gelöscht werden sollen.
Wenden Sie die SQL-Statements manuell in der Datenbank an und passen Sie sie gegebenenfalls an, damit sie die gewünschten Nachrichten selektieren.
Beispiel für Bewegungsdaten-Tabellen
Die folgenden Tabellen werden üblicherweise im Rahmen der Partitionierung erstellt und umbenannt. Je nach verwendeter Datenbank gibt es hier
Tabellen mit den Suffixen “O” (Oracle) oder “OFFLINE” (andere), bzw. “C” oder “CLEARING” für entsprechende Clearing Tabellen.
