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