Jörg: Datenbank Cleanup Script

Beitrag lesen

Hallo Forum,

ich muss mal aufgrund der Datenmenge in meinen Datenbanken ein wenig aufräumen und habe mir das wie nachfolgend gedacht.

Habt Ihr Verbesserungsvorschläge oder seht Ihr irgendwelche "NoGos"?

Jörg

#!/bin/bash
### Code in utf-8

# MySQL-Verbindungsinformationen
host="localhost"
port="3306"
user=""
passwort=""

# Schemas, die nicht berücksichtigt werden sollen
schemasName="databases"
nodump="Database|information_schema|mysql|performance_schema|sys"

# Tabellensuffix (der Teil des Tabellennamens ohne Präfix)
table_suffix="test"

# Assoziatives Array: Datenbankname -> Präfix
declare -A db_prefixes

# Liste von Datenbanken, die nicht bearbeitet werden sollen (durch Leerzeichen getrennt)
exclude_databases=("excluded_db1" "excluded_db2" "excluded_db3")

# Datei für Fehlermeldungen
error_log="cleanup_errors.log"

# Funktion zum Überprüfen, ob eine Datenbank ausgeschlossen werden soll
is_excluded() {
  local db="$1"
  for excluded_db in "${exclude_databases[@]}"; do
    if [[ "$db" == "$excluded_db" ]]; then
      return 0  # Datenbank ist in der Ausschlussliste
    fi
  done
  return 1  # Datenbank ist nicht in der Ausschlussliste
}

# Datenbanken auslesen und filtern
databases=$(echo "SHOW ${schemasName};" | mysql --host="${host}" --port="${port}" --user="${user}" --password="${passwort}" --column-names=FALSE 2>> "$error_log" | grep -vP "${nodump}")

# Überprüfen und hinzufügen von Präfixen zu den Datenbanken
for db in $databases
do
  # Überprüfe, ob die Datenbank ausgeschlossen werden soll
  if is_excluded "$db"; then
    echo "Datenbank $db ist ausgeschlossen, wird nicht bearbeitet." >> "$error_log"
    continue
  fi

  # Tabellen in der Datenbank auslesen, die das bekannte Suffix haben
  tables=$(mysql -u $user -p$passwort -h $host -D $db -e "SHOW TABLES LIKE '%${table_suffix}%';" --batch --skip-column-names 2>> "$error_log")

  # Tabellen durchlaufen und Präfixe ermitteln
  for table in $tables
  do
    # Extrahiere Präfix
    prefix=$(echo "$table" | sed "s/${table_suffix}//")

    # SQL-Befehle ausführen (beispielsweise TRUNCATE, UPDATE, DELETE)
    # Leere Tabellen
    mysql -u $user -p$passwort -h $host -D $db -e "TRUNCATE TABLE ${prefix}edit;" 2>> "$error_log"

    # Löschen von Daten
    mysql -u $user -p$passwort -h $host -D $db -e "DELETE FROM ${prefix}logs WHERE Erstelldatum < NOW() - INTERVAL 30 DAY;" 2>> "$error_log"

    # UPDATE
    mysql -u $user -p$passwort -h $host -D $db -e "UPDATE ${prefix}logs2 SET IP ='', post='', get='' WHERE Erstelldatum < NOW() - INTERVAL 3 DAY;" 2>> "$error_log"

    # Optimierung der Tabellen
    mysql -u $user -p$passwort -h $host -D $db -e "OPTIMIZE TABLE ${prefix}logs;" 2>> "$error_log"
    mysql -u $user -p$passwort -h $host -D $db -e "OPTIMIZE TABLE ${prefix}logs2;" 2>> "$error_log"
    mysql -u $user -p$passwort -h $host -D $db -e "OPTIMIZE TABLE ${prefix}edit;" 2>> "$error_log"

    # Ausgabe von Datenbankname und Präfix
    echo "Datenbank: $db -> Präfix: $prefix"
  done
done