| example_docs | ||
| .gitignore | ||
| data.py | ||
| generate_testdata.py | ||
| README.md | ||
| schema.py | ||
MySQL Testdaten Generator für Archivdatenbanken
Dieses Script erzeugt realistisch wirkende Testdaten für ein Archivierungsszenario in MySQL. Es legt zwei Arten von Datenbanken an oder befüllt sie neu:
- Jahresdatenbanken mit dem Suffix
_YYYY, zum Beispielmysql_archiv_2018 - Typdatenbanken mit dem Suffix
_dokumententyp, zum Beispielmysql_archiv_bestellschein
In jeder Datenbank wird eine Tabelle ARCHIVED_FILES mit identischem Schema erstellt und mit Dummy Dokumenten befüllt. Zusätzlich erzeugt das Script CSV Dateien zur späteren Auswertung und Umbenennung.
Funktionen und Verhalten
-
Erzeugt oder befüllt Archivdatenbanken für eine angegebene Jahrspanne
-
Erzeugt oder befüllt je Dokumententyp eigene Datenbanken
-
Erzeugt Testdokumente mit zufälligen Dateinamen und BLOB Inhalten
-
Erzeugt unterschiedliche Dateinamenformate und ermöglicht später eine Vereinheitlichung
-
Erzeugt CSV Dateien:
renames.csv→ Mapping: ObjektID → Standarddateinamemetrics.csv→ Statistiken pro Datenbank (Einträge, Archivierungsstatus, Rename-Bedarf)
-
Alle CSV Dateien werden im Verzeichnis
generated_docs/abgelegt -
Setzt
archive_datein Jahresdatenbanken auf ein festes Datum -
Berechnet
archive_dateundarchive_date_realin Typdatenbanken anhand der Aufbewahrungsfristen -
Legt die Tabelle
ARCHIVED_FILESpro Lauf vollständig neu an -
Kann über einen Prefix vorhandene Archivdatenbanken löschen und neu erstellen
Erzeugte Dateien
Das Script erzeugt im Unterordner generated_docs/ folgende Dateien:
| Datei | Inhalt | Beispielpfad |
|---|---|---|
| renames.csv | ObjektID → Standarddateiname | generated_docs/renames.csv |
| metrics.csv | Statistiken pro Datenbank | generated_docs/metrics.csv |
Optional kannst du Beispiele wie folgt ablegen:
example_docs/
renames.example.csv
metrics.example.csv
Datenbankschema
Alle Datenbanken enthalten die Tabelle ARCHIVED_FILES. Das Schema wurde an die neuen Anforderungen angepasst und enthält unter anderem ein Feld für das spätere LZA Bestätigungskennzeichen.
Wichtig ist, dass archived_ack jetzt ein Textfeld ist und keine Zeitstempelspalte mehr.
CREATE TABLE `ARCHIVED_FILES` (
`filename` VARCHAR(255) NOT NULL,
`extension` VARCHAR(16) NOT NULL,
`size` BIGINT NOT NULL,
`created` DATETIME NOT NULL,
`scan_date` DATETIME NULL,
`archive_date` DATE NOT NULL,
`archive_date_real` DATE NULL,
`dokument_type_id` VARCHAR(32) NOT NULL,
`data` LONGBLOB NOT NULL,
`export_date` DATETIME NULL,
`blocking_date` DATETIME NULL,
`retention_period` INT NOT NULL,
`deletion_phase_code` VARCHAR(32) NULL,
`deletion_request_id` VARCHAR(64) NULL,
`archived_ack` VARCHAR(64) NULL,
PRIMARY KEY (`filename`),
KEY `idx_created` (`created`),
KEY `idx_type` (`dokument_type_id`),
KEY `idx_archive_date` (`archive_date`)
);
Besonderheiten der Felder
archive_dategibt an, wann die Aufbewahrungsfrist endetarchive_date_realbildet die tatsächliche Berechnung nach dem aktuellen Aufbewahrungsrecht abretention_periodist die zugehörige Aufbewahrungsfrist in Jahrenarchived_ackist leer und nimmt später eine UUID auf, wenn ein Datensatz erfolgreich im LZA System gespeichert wurde
Logik der Archivdaten
Jahresdatenbanken <prefix>_YYYY
- Alle Datensätze in einer Jahresdatenbank erhalten dasselbe archivierte Datum
- Dieses Datum lautet immer
01.01.(YYYY + 1)
Beispiel: In mysql_archiv_2018 lautet archive_date immer 2019-01-01.
Das reale Archivdatum wird dynamisch berechnet:
archive_date_real = archive_date + 3 Jahrealso immer01.01.(YYYY + 4)
Typdatenbanken <prefix>_<dokumententyp>
In Typdatenbanken wird archive_date individuell abhängig vom Erstellungsdatum berechnet:
archive_date = created + 10 Jahrearchive_date_real = created + 13 Jahre- beide immer auf den 1. Januar des Folgejahres gerundet
Dateinamenvarianten
Für jedes erzeugte Dokument wird einer von drei Dateinamensstilen verwendet.
- Standardformat:
<digit>_YYYYMMDD_ObjektID.ext - Variante mit Kennung:
<digit>_<fakeUser>_YYMMDD_ObjektID_<digit>.ext - UUID ähnliches Format:
<digit>_<uuid>.ext
In renames.csv wird immer der Standardname gespeichert.
Metrics
Die Datei metrics.csv enthält pro Datenbank:
- total_entries → Anzahl aller erzeugten Dokumente
- entries_need_rename → Anzahl der Dateinamen, die nicht dem Standardformat entsprechen
- entries_to_archive → Anzahl der Datensätze, die gemäß Archivierungslogik fällig wären
Diese Auswertung ist wichtig, um Migrationsläufe in Apache NiFi oder anderen ETL Prozessen vorzubereiten.
Voraussetzungen
- Python 3
- MySQL oder MariaDB
- Python Paket
mysql-connector-python
Installation:
pip install mysql-connector-python
Verbindung konfigurieren
Die Verbindung kann über Parameter oder Umgebungsvariablen gesetzt werden.
Unterstützte Variablen:
- MYSQL_HOST
- MYSQL_PORT
- MYSQL_USER
- MYSQL_PASSWORD
CLI Parameter überschreiben die Umgebungsvariablen.
Beispielaufruf
python generate_testdata.py \
--host 127.0.0.1 \
--port 3306 \
--user datamigration_archive \
--password 'DEIN_PASSWORT' \
--years 2017-2019 \
--per-db 20
Das Ergebnis umfasst:
- Jahresdatenbanken
mysql_archiv_2017,mysql_archiv_2018,mysql_archiv_2019 - Typdatenbanken für jeden Dokumententyp
- CSV Dateien im Ordner
generated_docs/
Optional: komplette Neuaufsetzung über Prefix
python generate_testdata.py \
--db_name_prefix archive_data \
--years 2017-2019 \
--per-db 20
Wenn ein Prefix gesetzt wird, löscht das Script alle Archivdatenbanken mit diesem Prefix und alle mit mysql_archiv_ beginnenden Datenbanken. Systemdatenbanken bleiben unberührt.
Prüfung der Ergebnisse
USE mysql_archiv_2018;
SELECT
filename,
extension,
archive_date,
archive_date_real,
dokument_type_id
FROM ARCHIVED_FILES;
Damit lässt sich kontrollieren:
- ob alle Datensätze das korrekte archivierte Datum besitzen
- ob die reale Aufbewahrungsfrist korrekt berechnet wurde
- ob die Dokumenttypen korrekt gesetzt sind
- ob die Dateinamen realistisch variieren