SAP Tabellenreorg mit brspace

Drucken

Wir stecken in einer Klemme: In einem Kundensystem ist "DFKKOP" eine der wichtigsten zugleich auch größten Tabellen. Damit nicht genug, sie wird in fast allen Batch-Läufen verwendet und auch fleißig von den Anwendern im Dialog genutzt. Nach umfangreicher Belegarchivierung, wollen wir die Tabelle reorganisieren. Der frei werdende Platz wird voraussichtlich in Kürze vom Tabellenwachstum wieder aufgefressen, aber ab und zu mal eine Defragmentierung und ein Ausbalancieren der Indexe wird der Performance nicht schaden. Das Problem ist aber: ein Online-Reorg funktioniert nicht (mehr)!

Zwar kann Oracle prinzipiell eine Tabelle online reorganisieren indem die Tabelle intern "umkopiert" wird und es wird auch automatisch dafür gesorgt, dass zwischenzeitlich erfolgte Tabellenänderungen in die Kopie übernommen werden. Jedoch hat sich gezeigt, dass die Iteration "Änderungen prüfen, Änderungen in Kopie nachziehen, Änderungen prüfen, ..." zu einer Endlosschleife wird, wenn die Prüfung auf Grund der Systemaktivität und der Tabellengröße viel zu lange dauert und nicht sichergestellt werden kann, dass unsere "Lieblings"-Tabelle eine halbe Stunde nicht geändert wird. Die Situation ist sogar noch verzwickter, denn ein "Online"-Reorg bei heruntergefahrenem SAP-System dauert mit 12 Stunden inzwischen länger als die maximale Downtime, die der Kunde uns zugesteht.

Jetzt sind andere Ideen gefragt. Ich möchte möglichst wenig Aufwand in die Sache stecken und vor allen Dingen eine universelle Methode, die zügig und möglichst automatisch läuft. Daher verwerfe ich den Ansatz einen Export/Import mit Oracle Bordmitteln durchzuführen. Entweder müsste ich mir alle DDL-Statements zusammenbauen, um 14 Indexe zu erstellen oder nach dem Import der Tabelle ohne Indexe SAP starten und dann in DB14 einzeln "anlegen" klicken. Da verliere ich zu viel Zeit zwischen den Indexen und das System wird ohne die Indexe bei den wichtigsten Geschäftsprozessen gewaltige Performanceschwierigkeiten haben. Also müssen die BRTools her. Mit brspace bekomme ich schon ganz gute Unterstützung beim Export und Import. Ein erster Test bringt das erfreuliche Ergebnis, dass Export, Import und Indexe anlegen in ca. 4 Stunden bewerkstelligt werden können. Das ist deutlich weniger als die Hälfte der Zeit im Vergleich zum Online-Reorg.

Leider kann man dabei weder den Tablespace wechseln, noch für unsere Anforderung eine dringend notwendige Anpassung des INI_TRANS Parameter durchführen. Diese Optionen bieten die BRTools leider nur beim Online-Reorg:

brspace -u / -c force -f tbreorg -c ctabind -t SAPSR3.dfkkop 
-s psapreorg -n psapsr3  -SII 55 -STI 55 -p 16

Bei der Export/Import Variante muss man mit einem Trick arbeiten. Die Anpassung der INI_TRANS Werte erfolgt vor dem Export.

select ini_trans from dba_tables where table_name='DFKKOP';
select index_name, ini_trans from dba_indexes where table_name='DFKKOP';
alter table sapsr3.dfkkop initrans 55;
alter index sapsr3."DFKKOP~0"  initrans 55;

Das führ man für alle Indexe aus. Für die Erstellung der notwendigen Kommandos kann ein SQL Einzeiler helfen: 

select 'alter index sapsr3."' || index_name || '" initrans 55' from dba_indexes where table_name='DFKKOP;';

Tabellengröße abschätzen (für den Platz im Export-Verzeichnis und für den Ziel-Tablespace)

select sum(bytes)/1024/1024 from dba_extents where segment_name='DFKKOP';
select segment_name, sum(bytes)/1024/1024 from dba_extents where segment_name like 'DFKKOP~%' group by segment_name;

Freiplatz im Ziel-Tablespace ermitteln:

set pagesize 50000
set linesize 250
column free_MBytes format 999999999
column allocated_MBytes format 999999999
SELECT a.tablespace_name, a.allocated_Mbytes, b.free_Mbytes FROM ( select tablespace_name, sum(bytes)/1024/1024 allocated_MBytes from    dba_data_files group by tablespace_name ) a, ( SELECT tablespace_name, SUM(bytes)/1024/1024 free_Mbytes      FROM    dba_free_space GROUP BY tablespace_name ) b WHERE a.tablespace_name=b.tablespace_name ORDER BY a.tablespace_name;

Der Export benötigt etwas mehr Platz als Tabelle und alle Indexe zusammen. BRSPACE bietet die Möglichkeit der Komprimierung, der benötigte Platz beträgt dann nur noch ca. 20%, aber der Export dauert dafür etwa 2,5 Mal so lange. In meinem Beispiel 24 Minuten anstatt 10 Minuten:

brspace -u / -f tbexport -l expdp -t "DFKKOP" -u /tmp/export

---------------------------------------------------------------------
Additional options for export of tables: SAPSR3.DFKKOP

 1 # Use direct path (direct) ................ [yes]
 2 # Export buffer size in KB (buffer) ....... [10240]
 3 - Compress table extents/data (compress) .. [all]   <<< geändert
 4 - Consistent export (consistent) .......... [no]
 5 - Parallel degree (parallel) .............. [16]    <<< geändert
 6 - Max. size of dump file in MB (filesize) . [30000] <<< geändert
 7 - Force table export (force) .............. [no]
 8 - EXP/EXPDP command (command) ............. 
[/oracle/AKR/112_64/bin/expdp
parfile=/oracle/AKR/sapreorg/sesohajk/parfile.exp]

Der nächste Schritt hängt davon ab, wie vorsichtig man ist und wie viele Ressourcen man zur Verfügung hat. Entweder muss man nun den temporären Tablespace inkl. der Tabelle löschen und den Ziel-Tablespace erweitern - oder man kann es sich erlauben, die Tabelle umzubenennen und erst nach erfolgreichem Import zu löschen. Wählen wir den sicheren Weg und benennen Tabelle und Indexe um:

alter table sapsr3."DFKKOP" rename to  "DFKKOP_OLD";
alter index sapsr3."DFKKOP~0" rename to "DFKKOP~0_OLD";

Das für alle Indexe und auch hier wieder ein Einzeiler zur Hilfe: 

select 'alter index sapsr3."' || index_name || '" rename to "' || index_name || '_OLD";' from dba_indexes where table_name='DFKKOP_OLD';

Tabelle importieren. Es empfiehlt sich, die Importfiles im interaktiven Menü über die Auswahl des zugehörigen Exports-Laufs auszuwählen. Wollte man den brspace aus der Kommandozeile heraus vollständig definieren, müsste man alle Exportfiles mit Komma getrennt auflisten:

brspace -u / -f tbimport

Nach Auswahl des Laufs werden die Optionen aus dem Export automatisch übernommen.

Additional options for import from dump file /tmp/export/sesohajk.edd/expdat.dmp,..(16 dumps)

 1 # Import buffer size in KB (buffer) ....... [10240]
 2 # Commit after each array insert (commit) . [yes]
 3 # Ignore creation errors (ignore) ......... [no]
 4 - Table exists action (action) ............ [replace]
 5 - Parallel degree (parallel) .............. [16]
 6 # Max. size of dump file in MB (filesize) . []
 7 - Force table import (force) .............. [no]
 8 - IMP/IMPDP command (command) ............. [/oracle/AKR/112_64/bin/impdp parfile=/oracle/AKR/sapreorg/sesohrkz/parfile.imp]

(C)ontinue
BR0280I BRSPACE time stamp: 2016-02-21 14.12.31
BR1442I Import parameter file /oracle/AKR/sapreorg/sesohrkz/parfile.imp created
BR1172I Import of tables will be started with command line: /oracle/AKR/112_64/bin/impdp parfile=/oracle/AKR/sapreorg/sesohrkz/parfile.imp
BR0280I BRSPACE time stamp: 2016-02-21 14.12.31
BR0670I Enter 'c[ont]' to continue, 'b[ack]' to go back, 's[top]' to abort:

STOP! In einem weiteren Fenster muss nun die Parameterdatei, in diesem Beispiel also /oracle/AKR/sapreorg/sesohrkz/parfile.imp, editiert werden. Am Ende der Datei folgende Zeile anhängen.

REMAP_TABLESPACE=PSAPREORG:PSAPSR3

Das bedeutet, dass alle Tabellen, die aus dem PSAPREORG Tablespace kommen, in den PSAPSR3 importiert werden sollen. Danach den brspace einfach mit (C)ontinue fortsetzen. In meinem Beispiel mit komprimiertem Export wurde der Import der Tabelle in ca. 45 Minuten erledigt. Danach wurden sequentiell alle Indexe neu angelegt. Insgesamt war der komplette Vorgang nach 3 Stunden und 10 Minuten abgeschlossen.

Sofern man die alte Tabelle vorher umbenannt hat, kann sie nach dem erfolgreichen Import gelöscht werden (der Befehl löscht sogleich auch die Indexe):

drop table sapsr3."DFKKOP_OLD";

Der temporäre Tablespace kann dann auch weg:

drop tablespace PSAPREORG;

Hinweis 1: Falls man beim Anlegen des temporären Tablespace mit den BRTools gearbeitet hat, könnte man in eine Falle getappt sein. Die Funktion "-tscreate" ändert im SAP-System automatisch den Default-Tablespace für alle Tabellenarten, die im mit Option "-l" genannten Tablespace liegen, d.h. "brspace ... -tscreate -l PSAPSR3 -n PSAPREORG" legt einen neuen Tablespace PSAPREORG an und macht ihn zum Default-Tabelspace für alle Tabellenarten, die aktuell ihren Default in PSAPSR3 haben. Die aktuelle Zuordnung der Tabellenarten zum Default-Tablespace findet man in Tabelle TAORA (für Indexe in IAORA). Das Gemeine ist: wenn man Option "-l" weglässt, wird PSAPSR3 angenommen. Wenn man alle Tabellen in den neuen Tablespace umziehen will, ist das sicher eine gute Idee. Wenn man den temporären Tablespace wieder löscht, führt das zu Fehlern beim Anlegen von neuen Objekten (z.B. beim Transport). Verhindern kann man dies, indem man der Option "-l" einen unbekannten Tablespacenamen mitgibt. Wenn es schon passiert ist, muss man die Tabellen TAORA, IAORA und TSORA manuell patchen.

Hinweis 2: Eine Parallelisierung des Export ist nur mit privilegierten Rechten erlaubt. Eine Anmeldung mit dem SAP-Schema-Benutzer reduziert die Parallelität auf "1", ohne weitere Warn- oder Fehlermeldung. Bei der Wahl der Parallelität sollten man nicht mehr als das Doppelte der CPU-Anzahl einstellen und im Zusammenspiel mit der Dateigröße sollte man idealerweise im ersten Anlauf den Export komplett beenden.