ALKIS-Daten einlesen: Unterschied zwischen den Versionen

Aus kvwmap
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
Dies ist ein Vorschlag für den Ablauf einer automatischen Fortführung der ALKIS-Daten.
 
  
 +
'''ToDo''': Auch den Start- und Endzeitpunkt aus der info.txt auswerten und ggf. das Einlesen verhindern!
  
'''UPDATE''': Auch den Start- und Endzeitpunkt aus der info.txt auswerten und ggf. das Einlesen verhindern!
+
Zum Einlesen der NAS-Daten kann das Shell-Skript '''import_nas.sh''' im Ordner plugins/alkis/tools verwendet werden. Mit dem Skript werden die NAS-Daten transaktional in die PostGIS-DB eingelesen.
  
 +
== Skript-Konfiguration ==
  
Es gibt "irgendwo" auf dem Server einen Ordner mit folgendem Inhalt:
+
Das Skript erwartet eine Konfigurationsdatei '''config.sh''' im Ordner plugins/alkis/config. Diese kann auf Basis der '''config-default.sh''' im selben Ordner erstellt werden.
 +
In der config.sh müssen insbesondere 4 Pfad-Variablen gesetzt werden:
  
:/eingang
+
DATA_PATH="/var/www/data/alkis/ff/eingang"                      # der Daten-Eingangsordner; hier werden die Zip-Dateien mit den NAS-Daten abgelegt
:/eingelesen
+
IMPORT_PATH="/var/www/data/alkis/ff/import"                    # der Import-Ordner; hier befinden sich die ausgepackten NAS-Dateien und die zu importierende SQL-Datei
:/postprocessing
+
LOG_PATH="/var/www/data/alkis/ff/logs"                          # der Logs-Ordner; hier findet das Error-Logging statt
:/sicherung
+
POSTPROCESSING_PATH="/var/www/data/alkis/ff/postprocessing";    # in diesem Ordner können Postprocessing-SQL-Skripte aubegelegt werden, die nach jedem Einlesevorgang ausgeführt werden sollen
:/temp
+
 
:start_ff.sh
+
 
:ff.log
+
== Skript-Ablauf ==
:ff.err
+
  
 
Im Ordner "eingang" werden die gezippten NAS-Fortführungsdaten, die eingelesen werden sollen, abgelegt (Katalog- und Objektdaten). Dies sollte am besten auch automatisiert ablaufen.
 
Im Ordner "eingang" werden die gezippten NAS-Fortführungsdaten, die eingelesen werden sollen, abgelegt (Katalog- und Objektdaten). Dies sollte am besten auch automatisiert ablaufen.
  
Wenn das Shell-Skript "start_ff.sh" ausgeführt wird, guckt es im Ordner "eingang" nach, ob dort Zip-Dateien liegen. Diese werden nacheinander abgearbeitet. Jede Zip-Datei wird im Ordner "temp" ausgepackt und die enthaltenen NAS-Dateien werden über ogr2ogr in die PostGIS-DB eingelesen. Das Einlesen wird als Transaktion durchgeführt (kein -skipfailures) und in der Datei "ff.log" geloggt.
+
Wenn das Shell-Skript "import_nas.sh" ausgeführt wird, prüft es zunächst, ob der Ordner "import" leer ist. Wenn ja, guckt es im Ordner "eingang" nach, ob dort Zip-Dateien liegen. Alle vorhandenen Zip-Dateien werden in den Ordner "import" ausgepackt und danach gelöscht. Jede NAS-Datei im Ordner "import" wird mit ogr2ogr zunächst in eine temporäre SQL-Datei konvertiert. Wenn diese Konvertierung erfolgreich war, wird der Inhalt der SQL-Datei zu einer SQL-Datei "import_transaction.sql" im Ordner "import" hinzugefügt und die NAS-Datei sowie die entstandene SQL-Datei gelöscht. In SQL-Datei "import_transaction.sql" werden die SQL-Befehle aller NAS-Dateien gesammelt um sie am Ende transaktional ausführen zu können. Wenn alle NAS-Dateien erfolgreich konvertiert wurden, wird die SQL-Datei "import_transaction.sql" ausgeführt und die Daten in die PostGIS-DB eingelesen. Wenn dies erfolgreich war, wird der Ordner "import" geleert.
 +
 
 +
== Logging der eingelesenen NAS-Dateien ==
  
 
Im Schema "alkis" gibt es eine Tabelle "import" mit folgender Struktur:
 
Im Schema "alkis" gibt es eine Tabelle "import" mit folgender Struktur:
Zeile 33: Zeile 36:
 
  );
 
  );
  
Hier wird jeder Einlesevorgang registriert und das Ergebnis (ok oder Fehler) im Feld "status" abgelegt.
+
Hier wird jede eingelesene NAS-Datei registriert. Diese Tabelle dient einerseits als Übersicht, was alles eingelesen wurde und andererseits wird durch das Einlese-Skript vor der Abarbeitung jeder NAS-Datei auch überprüft, ob eine Datei schon mal eingelesen wurde.
  
Diese Tabelle dient einerseits als Übersicht, was alles eingelesen wurde und andererseits kann damit verhindert werden, dass eine Datei doppelt eingelesen wird.
+
== Fehlerbehebung ==
  
Tritt bei einer Datei ein Fehler auf (ff.err), wird nicht weiter eingelesen, sondern eine "Meldung"(?) an den Administrator gesendet.
+
Wenn bei der Konvertierung einer NAS-Datei ein Fehler aufgetreten ist, bricht das Einlese-Skript ab. Die Fehlermeldung von ogr2ogr steht in der Datei logs/error.log. Der Fehler kann in der fehlerhaften NAS-Datei behoben werden. Danach kann das Einlese-Skript einfach nochmal gestartet werden. Es beginnt mit der Konvertierung der zuvor fehlerhaften NAS-Datei. Alternativ kann auch der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.
  
Wenn ein Fehler aufgetreten ist, muss dieser in der fehlerhaften NAS-Datei behoben werden oder bei Bedarf evtl. auch im PostNAS-Schema. Danach muss die Error-Logdatei ff.err gelöscht und das Skript erneut gestartet werden. Bereits eingelesene NAS-Dateien werden übersprungen.
+
Wenn bei der Ausführung der SQL-Datei "import_transaction.sql" ein Fehler auftritt, kann dieser entweder in dieser Datei behoben werden oder evtl. auch durch Änderungen am Datenbestand in der Datenbank. Alternativ kann auch hier der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.
  
Wenn alle NAS-Dateien der Zip-Datei fehlerfrei eingelesen wurden, wird die Zip-Datei in den Ordner "eingelesen" verschoben.
+
== Post-Processing ==
  
Nachdem alle Zip-Dateien im Ordner "eingang" fehlerfrei eingelesen wurden, werden alle Skripte, die sich im Ordner "postprocessing" befinden, nacheinander ausgeführt.
+
Wenn die SQL-Datei "import_transaction.sql" erfolgreich eingelesen wurde, wird die Funktion "'''alkis.postprocessing()'''" aufgerufen. Diese Funktion füllt die PP-Tabellen im Alkis-Schema. Eigene Post-Processing-Skripte können im Ordner postprocessing abgelegt werden. Diese werden am Ende nacheinander ausgeführt.
  
Optional kann das Skript "start_ff.sh" vor jedem Einlesen auch eine Sicherung des Schemas "alkis" im Ordner "sicherung" ablegen.
 
  
Das Skript "start_ff.sh" wird per Cron-Job einmal täglich automatisch ausgeführt, kann bei Bedarf aber auch händisch gestartet werden.
+
Das Skript "import_nas.sh" wird per Cron-Job einmal täglich automatisch ausgeführt, kann bei Bedarf aber auch händisch gestartet werden.

Version vom 28. August 2017, 15:04 Uhr

ToDo: Auch den Start- und Endzeitpunkt aus der info.txt auswerten und ggf. das Einlesen verhindern!

Zum Einlesen der NAS-Daten kann das Shell-Skript import_nas.sh im Ordner plugins/alkis/tools verwendet werden. Mit dem Skript werden die NAS-Daten transaktional in die PostGIS-DB eingelesen.

Skript-Konfiguration

Das Skript erwartet eine Konfigurationsdatei config.sh im Ordner plugins/alkis/config. Diese kann auf Basis der config-default.sh im selben Ordner erstellt werden. In der config.sh müssen insbesondere 4 Pfad-Variablen gesetzt werden:

DATA_PATH="/var/www/data/alkis/ff/eingang"                      # der Daten-Eingangsordner; hier werden die Zip-Dateien mit den NAS-Daten abgelegt
IMPORT_PATH="/var/www/data/alkis/ff/import"                     # der Import-Ordner; hier befinden sich die ausgepackten NAS-Dateien und die zu importierende SQL-Datei
LOG_PATH="/var/www/data/alkis/ff/logs"                          # der Logs-Ordner; hier findet das Error-Logging statt
POSTPROCESSING_PATH="/var/www/data/alkis/ff/postprocessing";    # in diesem Ordner können Postprocessing-SQL-Skripte aubegelegt werden, die nach jedem Einlesevorgang ausgeführt werden sollen


Skript-Ablauf

Im Ordner "eingang" werden die gezippten NAS-Fortführungsdaten, die eingelesen werden sollen, abgelegt (Katalog- und Objektdaten). Dies sollte am besten auch automatisiert ablaufen.

Wenn das Shell-Skript "import_nas.sh" ausgeführt wird, prüft es zunächst, ob der Ordner "import" leer ist. Wenn ja, guckt es im Ordner "eingang" nach, ob dort Zip-Dateien liegen. Alle vorhandenen Zip-Dateien werden in den Ordner "import" ausgepackt und danach gelöscht. Jede NAS-Datei im Ordner "import" wird mit ogr2ogr zunächst in eine temporäre SQL-Datei konvertiert. Wenn diese Konvertierung erfolgreich war, wird der Inhalt der SQL-Datei zu einer SQL-Datei "import_transaction.sql" im Ordner "import" hinzugefügt und die NAS-Datei sowie die entstandene SQL-Datei gelöscht. In SQL-Datei "import_transaction.sql" werden die SQL-Befehle aller NAS-Dateien gesammelt um sie am Ende transaktional ausführen zu können. Wenn alle NAS-Dateien erfolgreich konvertiert wurden, wird die SQL-Datei "import_transaction.sql" ausgeführt und die Daten in die PostGIS-DB eingelesen. Wenn dies erfolgreich war, wird der Ordner "import" geleert.

Logging der eingelesenen NAS-Dateien

Im Schema "alkis" gibt es eine Tabelle "import" mit folgender Struktur:

CREATE TABLE alkis.import
(
 id serial NOT NULL,
 datum timestamp without time zone DEFAULT now(),
 datei text,
 status text
)
WITH(
 OIDS=TRUE
);

Hier wird jede eingelesene NAS-Datei registriert. Diese Tabelle dient einerseits als Übersicht, was alles eingelesen wurde und andererseits wird durch das Einlese-Skript vor der Abarbeitung jeder NAS-Datei auch überprüft, ob eine Datei schon mal eingelesen wurde.

Fehlerbehebung

Wenn bei der Konvertierung einer NAS-Datei ein Fehler aufgetreten ist, bricht das Einlese-Skript ab. Die Fehlermeldung von ogr2ogr steht in der Datei logs/error.log. Der Fehler kann in der fehlerhaften NAS-Datei behoben werden. Danach kann das Einlese-Skript einfach nochmal gestartet werden. Es beginnt mit der Konvertierung der zuvor fehlerhaften NAS-Datei. Alternativ kann auch der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.

Wenn bei der Ausführung der SQL-Datei "import_transaction.sql" ein Fehler auftritt, kann dieser entweder in dieser Datei behoben werden oder evtl. auch durch Änderungen am Datenbestand in der Datenbank. Alternativ kann auch hier der Ordner "import" geleert werden und eine neue, korrigierte Zip-Datei in den Ordner "eingang" gelegt werden.

Post-Processing

Wenn die SQL-Datei "import_transaction.sql" erfolgreich eingelesen wurde, wird die Funktion "alkis.postprocessing()" aufgerufen. Diese Funktion füllt die PP-Tabellen im Alkis-Schema. Eigene Post-Processing-Skripte können im Ordner postprocessing abgelegt werden. Diese werden am Ende nacheinander ausgeführt.


Das Skript "import_nas.sh" wird per Cron-Job einmal täglich automatisch ausgeführt, kann bei Bedarf aber auch händisch gestartet werden.