306 lines
8.5 KiB
Bash
Executable File
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
|
|
|