Thesaurus/migrate_tsdata.sh
2026-02-23 16:11:35 +01:00

306 lines
8.5 KiB
Bash
Executable File

#!/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 <datei> Daten in Tools importieren"
echo " verify Datenintegrität prüfen"
echo " rollback <backup> 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