Repository zur Erstellung von Testdaten für das Projekt Migration_Digitalarchiv
Find a file
2025-11-21 17:05:23 +01:00
example_docs Added example files and updated README to incorporate changes 2025-11-20 13:45:04 +01:00
.gitignore Added features for change request #1 2025-11-20 10:46:18 +01:00
data.py Fixed bug in renames csv and added sums for metrics 2025-11-21 16:22:36 +01:00
generate_testdata.py Added more granular info for each db type in metrics 2025-11-21 16:59:28 +01:00
README.md Added example files and updated README to incorporate changes 2025-11-20 13:45:04 +01:00
schema.py Added old_filename to renames 2025-11-21 16:12:24 +01:00

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 Beispiel mysql_archiv_2018
  • Typdatenbanken mit dem Suffix _dokumententyp, zum Beispiel mysql_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 → Standarddateiname
    • metrics.csv → Statistiken pro Datenbank (Einträge, Archivierungsstatus, Rename-Bedarf)
  • Alle CSV Dateien werden im Verzeichnis generated_docs/ abgelegt

  • Setzt archive_date in Jahresdatenbanken auf ein festes Datum

  • Berechnet archive_date und archive_date_real in Typdatenbanken anhand der Aufbewahrungsfristen

  • Legt die Tabelle ARCHIVED_FILES pro 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_date gibt an, wann die Aufbewahrungsfrist endet
  • archive_date_real bildet die tatsächliche Berechnung nach dem aktuellen Aufbewahrungsrecht ab
  • retention_period ist die zugehörige Aufbewahrungsfrist in Jahren
  • archived_ack ist 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 Jahre also immer 01.01.(YYYY + 4)

Typdatenbanken <prefix>_<dokumententyp>

In Typdatenbanken wird archive_date individuell abhängig vom Erstellungsdatum berechnet:

  • archive_date = created + 10 Jahre
  • archive_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