#!/bin/bash # # TSData Migration Script # Migriert Daten von DSpace (MySQL 5.5) nach Tools (MariaDB 10.5) # # Verwendung: # 1. Skript auf DSpace ausführen: ./migrate_tsdata.sh export # 2. SQL-Datei auf Tools kopieren # 3. Skript auf Tools ausführen: ./migrate_tsdata.sh import /pfad/zur/datei.sql # set -e # Konfiguration DB_NAME="TSData" DB_USER="root" BACKUP_DIR="/tmp/tsdata_migration" TIMESTAMP=$(date +%Y%m%d_%H%M%S) EXPORT_FILE="${BACKUP_DIR}/TSData_export_${TIMESTAMP}.sql" # Farben für Output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # Verzeichnis erstellen mkdir -p "$BACKUP_DIR" ####################################### # EXPORT (auf DSpace ausführen) ####################################### do_export() { log_info "Starte Export auf DSpace..." # Prüfen ob Datenbank existiert if ! mysql -u "$DB_USER" -p -e "USE $DB_NAME" 2>/dev/null; then log_error "Datenbank $DB_NAME nicht gefunden!" exit 1 fi log_info "Erstelle Daten-Export (ohne Struktur)..." # Export mit vollständigen INSERT-Statements mysqldump -u "$DB_USER" -p "$DB_NAME" \ --no-create-info \ --complete-insert \ --skip-triggers \ --single-transaction \ --quick \ --lock-tables=false \ --set-charset \ --default-character-set=utf8 \ > "$EXPORT_FILE" # Wrapper für SQL-Mode hinzufügen TEMP_FILE="${EXPORT_FILE}.tmp" cat > "$TEMP_FILE" << 'HEADER' -- TSData Migration Export -- Erstellt am: TIMESTAMP_PLACEHOLDER -- Quelle: DSpace Server SET @OLD_SQL_MODE=@@SQL_MODE; SET SQL_MODE='NO_AUTO_VALUE_ON_ZERO,ALLOW_INVALID_DATES'; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS; SET FOREIGN_KEY_CHECKS=0; SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS; SET UNIQUE_CHECKS=0; -- DateModified '0000-00-00' Werte korrigieren (für MariaDB Strict Mode) -- Dies geschieht nach dem Import HEADER sed -i "s/TIMESTAMP_PLACEHOLDER/$(date)/" "$TEMP_FILE" cat "$EXPORT_FILE" >> "$TEMP_FILE" cat >> "$TEMP_FILE" << 'FOOTER' SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; -- Export Ende FOOTER mv "$TEMP_FILE" "$EXPORT_FILE" # Statistiken anzeigen log_info "Export abgeschlossen: $EXPORT_FILE" log_info "Dateigröße: $(du -h "$EXPORT_FILE" | cut -f1)" echo "" log_info "Datensätze pro Tabelle:" mysql -u "$DB_USER" -p -N -e " SELECT 'Anchor', COUNT(*) FROM $DB_NAME.Anchor UNION ALL SELECT 'Entry', COUNT(*) FROM $DB_NAME.Entry UNION ALL SELECT 'EntryNew', COUNT(*) FROM $DB_NAME.EntryNew UNION ALL SELECT 'IDSynonym', COUNT(*) FROM $DB_NAME.IDSynonym UNION ALL SELECT 'Linking', COUNT(*) FROM $DB_NAME.Linking UNION ALL SELECT 'Synonyms', COUNT(*) FROM $DB_NAME.Synonyms UNION ALL SELECT 'Treeview', COUNT(*) FROM $DB_NAME.Treeview; " 2>/dev/null | column -t echo "" log_info "Nächster Schritt: Datei auf Tools-Server kopieren:" echo " scp $EXPORT_FILE user@tools.bibb.de:/tmp/" } ####################################### # IMPORT (auf Tools ausführen) ####################################### do_import() { IMPORT_FILE="$1" if [ -z "$IMPORT_FILE" ]; then log_error "Keine Import-Datei angegeben!" echo "Verwendung: $0 import /pfad/zur/export_datei.sql" exit 1 fi if [ ! -f "$IMPORT_FILE" ]; then log_error "Datei nicht gefunden: $IMPORT_FILE" exit 1 fi log_info "Starte Import auf Tools..." # Backup der bestehenden Daten erstellen BACKUP_FILE="${BACKUP_DIR}/TSData_backup_tools_${TIMESTAMP}.sql" log_info "Erstelle Backup der bestehenden Daten: $BACKUP_FILE" mysqldump -u "$DB_USER" -p "$DB_NAME" \ --single-transaction \ --quick \ > "$BACKUP_FILE" log_info "Backup erstellt: $(du -h "$BACKUP_FILE" | cut -f1)" # Bestätigung anfordern echo "" log_warn "ACHTUNG: Alle bestehenden Daten in $DB_NAME werden gelöscht!" read -p "Fortfahren? (ja/nein): " CONFIRM if [ "$CONFIRM" != "ja" ]; then log_info "Abgebrochen." exit 0 fi # Tabellen leeren log_info "Leere bestehende Tabellen..." mysql -u "$DB_USER" -p "$DB_NAME" << 'EOF' SET FOREIGN_KEY_CHECKS=0; TRUNCATE TABLE Synonyms; TRUNCATE TABLE Linking; TRUNCATE TABLE EntryNew; TRUNCATE TABLE Entry; TRUNCATE TABLE Anchor; TRUNCATE TABLE IDSynonym; TRUNCATE TABLE Treeview; SET FOREIGN_KEY_CHECKS=1; EOF # Daten importieren log_info "Importiere Daten aus $IMPORT_FILE..." mysql -u "$DB_USER" -p "$DB_NAME" < "$IMPORT_FILE" # DateModified '0000-00-00' Werte korrigieren log_info "Korrigiere ungültige Datumswerte..." mysql -u "$DB_USER" -p "$DB_NAME" << 'EOF' UPDATE Entry SET DateModified = DateCreated WHERE DateModified = '0000-00-00 00:00:00' OR DateModified IS NULL; EOF # Verifizierung echo "" log_info "Import abgeschlossen. Verifizierung:" mysql -u "$DB_USER" -p -N -e " SELECT 'Anchor', COUNT(*) FROM $DB_NAME.Anchor UNION ALL SELECT 'Entry', COUNT(*) FROM $DB_NAME.Entry UNION ALL SELECT 'EntryNew', COUNT(*) FROM $DB_NAME.EntryNew UNION ALL SELECT 'IDSynonym', COUNT(*) FROM $DB_NAME.IDSynonym UNION ALL SELECT 'Linking', COUNT(*) FROM $DB_NAME.Linking UNION ALL SELECT 'Synonyms', COUNT(*) FROM $DB_NAME.Synonyms UNION ALL SELECT 'Treeview', COUNT(*) FROM $DB_NAME.Treeview; " 2>/dev/null | column -t echo "" log_info "Migration erfolgreich abgeschlossen!" log_info "Backup liegt unter: $BACKUP_FILE" } ####################################### # VERIFY (Datenintegrität prüfen) ####################################### do_verify() { log_info "Prüfe Datenintegrität..." mysql -u "$DB_USER" -p "$DB_NAME" << 'EOF' -- Prüfe ob alle Linking-Einträge gültige Anchor-IDs haben SELECT 'Linking -> Anchor (fehlend)' AS Check_Type, COUNT(*) AS Anzahl FROM Linking l LEFT JOIN Anchor a ON l.IDAnchor = a.ID WHERE a.ID IS NULL UNION ALL -- Prüfe ob alle Linking-Einträge gültige Entry-IDs haben SELECT 'Linking -> Entry (fehlend)', COUNT(*) FROM Linking l LEFT JOIN Entry e ON l.IDEntry = e.ID WHERE e.ID IS NULL UNION ALL -- Prüfe auf ungültige Datumswerte in Entry SELECT 'Entry mit ungültigem DateModified', COUNT(*) FROM Entry WHERE DateModified = '0000-00-00 00:00:00'; EOF log_info "Integritätsprüfung abgeschlossen." } ####################################### # ROLLBACK (Backup wiederherstellen) ####################################### do_rollback() { BACKUP_FILE="$1" if [ -z "$BACKUP_FILE" ]; then log_info "Verfügbare Backups:" ls -la ${BACKUP_DIR}/TSData_backup_tools_*.sql 2>/dev/null || echo "Keine Backups gefunden." echo "" echo "Verwendung: $0 rollback /pfad/zum/backup.sql" exit 1 fi if [ ! -f "$BACKUP_FILE" ]; then log_error "Backup-Datei nicht gefunden: $BACKUP_FILE" exit 1 fi log_warn "Stelle Backup wieder her: $BACKUP_FILE" read -p "Fortfahren? (ja/nein): " CONFIRM if [ "$CONFIRM" != "ja" ]; then log_info "Abgebrochen." exit 0 fi mysql -u "$DB_USER" -p "$DB_NAME" < "$BACKUP_FILE" log_info "Rollback abgeschlossen." } ####################################### # MAIN ####################################### case "$1" in export) do_export ;; import) do_import "$2" ;; verify) do_verify ;; rollback) do_rollback "$2" ;; *) echo "TSData Migration Script" echo "" echo "Verwendung: $0 {export|import|verify|rollback} [optionen]" echo "" echo "Befehle:" echo " export Daten aus DSpace exportieren" echo " import Daten in Tools importieren" echo " verify Datenintegrität prüfen" echo " rollback Backup wiederherstellen" echo "" echo "Workflow:" echo " 1. Auf DSpace: ./migrate_tsdata.sh export" echo " 2. Kopieren: scp /tmp/tsdata_migration/TSData_export_*.sql user@tools:/tmp/" echo " 3. Auf Tools: ./migrate_tsdata.sh import /tmp/TSData_export_*.sql" echo " 4. Prüfen: ./migrate_tsdata.sh verify" exit 1 ;; esac