Das Dienstprogramm sqlldr von Oracle wird zum Laden von Dateien in Tabellen verwendet sqlldr gibt den folgenden Fortschritt an die Standardausgabe aus, sodass Sie den Ausführungsstatus überprüfen können. Wenn jedoch die Anzahl der Lasten groß ist, ist es nicht möglich zu wissen, wie lange es dauern wird, bis die Ladung fertig ist.
SQL*Loader: Release 12.1.0.2.0 -Produktion am Do 23. Januar 14:36:14 2020
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
Pfad verwenden:Konventioneller Typ
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 64
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 128
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 192
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 256
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 320
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 384
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 448
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 512
Sie haben den Festschreibungspunkt erreicht.-Anzahl der logischen Datensätze 576
Also fragte ich mich, ob ich den Ausführungsstatus mit dem Linux-Befehl pv überwachen könnte.
Der Pv-Befehl ist unter Linux verfügbar Der Befehl pv ist ein praktisches Tool, das zwischen Piping-Befehlen ausgeführt werden kann und den aktuellen Status und die geschätzte Zeit bis zur Fertigstellung aus der Gesamtdatenmenge und der durch die Pipe übertragenen Datenmenge anzeigt.
Zum Beispiel, wenn Sie eine große Datei mit dem Befehl gzip komprimieren möchten
$ gzip bigfile
Erstellt eine komprimierte bigfile.gz Während der Ausführung wird jedoch keine Nachricht ausgegeben, sodass ich nicht weiß, wann sie enden wird.
Verwenden Sie also den Befehl pv,
$ pv bigfile | gzip -c > bigfile.gz
Wenn Sie ausführen
$ pv bigfile | gzip -c > bigfile.gz
129MB 0:00:15 [92.8MB/s] [===========> ] 36% ETA 0:00:31
Der Gesamtbetrag, die verstrichene Zeit, die verstrichene Menge pro Sekunde, der aktuelle Ausführungsstatus (Messgerät und%) und die verbleibende Zeit werden als angezeigt
Wie Sie sehen können, ist pv sehr praktisch, überwacht jedoch die Datenmenge, die durch die Pipe geleitet wird, sodass nur das durch die Pipe verbundene Befehlsformat unterstützt wird.
Wie bereits erwähnt, schreibt sqlldr derzeit in die Standardausgabe, wie viele Ladevorgänge geladen wurden. Wenn nur diese Anzahl von Fällen herausgenommen und per Pipe an pv weitergeleitet werden kann, ist es ganz so.
Die Anzahl der Datensätze ist ausreichend, nicht die Anzahl der zu ladenden Bytes, solange Sie den Ausführungsstatus kennen. Erstellen wir also ein Shell-Skript, das eine einfache awk ausführt, die Standardausgabe von sqlldr liest und die Anzahl der Zeichen ausgibt, die der Anzahl der Fälle entspricht.
loadcount
#!/bin/bash
awk -F'Nummer' '
BEGIN { SV = 0; }
NF==2{
for (i = 0; i < $2 - SV; i++) {
printf("1");
}
SV = $2;
}'
Dieses Skript muss ausführbar sein. Geben Sie ihm daher die Ausführungsberechtigung, nachdem Sie es im Editor gespeichert haben
$ chmod +x loadcount
Der Verarbeitungsinhalt ist wie folgt -Wenn die Anzahl der Felder (NF) 2 (= xxx Nummer JJJ) mit der Zeichenfolge "Nummer" als Trennzeichen ist, wird die "Nummer" Extrahieren Sie die letzte Zeichenfolge ($ 2) -Das 1-Byte-Zeichen "1" wird für die Anzahl der Unterschiede zur Anzahl der zuletzt abgerufenen Elemente ausgegeben. Mit anderen Worten, wenn sqlldr 1000 Datensätze lädt, werden 1000 "1" ausgegeben.
Wenn die Eingabe eine Pipe ist, kennt der Befehl pv den Gesamtbetrag nicht. In diesem Fall können Sie den Gesamtbetrag mit der Option -s angeben. In diesem Fall entspricht der Gesamtbetrag der Anzahl der Datensätze in der zu ladenden Datei. Die Anzahl der Datensätze (Anzahl der Zeilen) kann mit dem Befehl wc ermittelt werden.
$ wc -l Dateiname
Die endgültige Form ist wie folgt
$ sqlldr USER/PASS@SID control=t1.ctl | ./loadcount | pv -p -t -e -s `cat t1.csv|wc -l` > /dev/null
0:00:20 [========> ] 17% ETA 0:01:33
-USER / PASS @ SID ist ein Deskriptor für die Verbindung zu Oracle -T1.ctl ist eine Eingabesteuerungsdatei für sqlldr -T1.csv ist die zu ladende Datendatei
Ich konnte den Ausführungsstatus von sqlldr erfolgreich überwachen
Recommended Posts