Skip to content

Datensicherung

Manuelle Sicherung im SQLite Format

Über die grafische Oberfläche des Adminclients kann sehr komfortabel eine Datensicherung im SQLite Format angelegt werden.

Der AdminClient kann i.d.R. unter https://URLdesSVWS-Servers/admin aufgerufen werden.

Weitere Informationen dazu befinden sich im Handbuch des AdminClients.

Automatisierte SQLite Backups

Automatisierte SQLite Backups können z.B. crontab geskriptet aufgerufen werden:

bash
curl --user "MARIADBUSER:MYSQLROOTPW" -k -X 'GET' \
  "https://SERVERNAME:PORT/api/schema/export/SCHEMA_NAME/sqlite" \
  -H 'accept: application/vnd.sqlite3' \
  -OJ

Selbstüberschreibende Backups oder Backups unter spezielle Namen (hier z.B. BACKUP.sqlite) können so angelegt werden:

bash
curl --user "MARIADBUSER:MYSQLROOTPW" -k -X 'GET' \
  "https://SERVERNAME:PORT/api/schema/export/SCHEMA_NAME/sqlite" \
  -H 'accept: application/vnd.sqlite3' \
  --output BACKUP.sqlite

Für eine höhere Geschwindigkeit kann, je nach Netzwerk, ein Aufruf direkt auf localhost erfolgen.

Hier bitte die Variablen MARIADBUSER, MYSQLROOTPW, SERVERNAME, PORT und SCHEMA_NAME ersetzen bzw. vorher im Skript oder Terminal definieren.

Backup mit Mariabackup

Das Tool mariabackup kann auch auf Windows per MSI-Paket installiert werden. Die [Anleitung von MariaDB.com] (https://mariadb.com/kb/en/full-backup-and-restore-with-mariabackup/) beschreibt, wie man mit kurzen Befehlen Backups anlegt und zurückspielt. Dies kann über einen Cronjob oder die Windows Aufgabenplanung regelmäßig ausgeführt werden.

Automatisiertes Backup per mysqldump

mysqldump per cronjob

bash
mysqldump --user=USERNAME --password=PASSWORD DATABASENAME /path/to/mysql_dump.sql

Sichert die Datenbank einmalig unter dem angegebenen Pfad. Dies kann mit Crontab automatisiert werden.

automysqlbackup

Das Linux Tool automysqlbackup ist für regelmäßige Sicherungen eine weitere Möglichkeit. Es richtet unter /var/lib/automysqlbackup in entsprechenden Ordnern daily, weekly und monthly .sql-Sicherungen ein:

bash
apt install automysqlbackup

In der Konfigurationsdatei /etc/default/automysqlbackup kann ggf. das Backupverzeichniss definiert oder die Zeiten bzw. Ausnahmen editiert werden.

Regelmäßige Backups müssen dann per cronjob eingerichtet werden. z.B:

bash
# der aktuelle Benutzer verwendet crontab -e als Aufruf zum Öffnen der cron-Vorgaben
0  1 * * * /usr/sbin/automysqlbackup

Aktuell muss unter Debian 12 in /etc/mysql/debian.cnf das root-Passwort für den Datenbankzugang eingetragen werden. Dazu bitte die beiden Variablen in dieser Datei ergänzen:

bash
USERNAME=root
PASSWORD="the root password"

Dann in der Datei /etc/mysql/debian.cnf die folgenden Zeilen aktivieren:

bash
#...
USERNAME=`grep user /etc/mysql/debian.cnf ...
#...
PASSWORD=`grep password /etc/mysql/debian.cnf

Bekannte Probleme

Veränderung der Groß- und Kleinschreibung nach Rückspielen der Datensicherung

In manchen Systemen tritt bei einem Dump und einem anschließenden Wiedereinspielen das Problem auf, dass die Groß- und Kleinschreibung der Tebellenspalten durch den Dump oder das Zurückspielen verändert wird. Z.B. wird aus dem ursprünglichen Spaltennamen allgAdrAnsprechpartner dann im zurückgespielten System ein allgadransprechpartner. Dies kann dann weder von SchILD-NRW 3 noch vom SVWS-Server sauber verwertet werden.

Hier ein Skript, welches für die Version 1.0.12 des SVWS-Servers die Tabellenspalten in dem SQL-Dump dump.sql wieder umbenennt. Der Parameter -i muss beim Mac gesetzt sein, ebenso muss unter macOS LC_ALL=C aufgrund der Anführungszeichen gesetzt sein:

bash
LC_ALL=C sed -i '' -e '
s/`allgadransprechpartner`/`AllgAdrAnsprechpartner`/g
s/`credentials`/`Credentials`/g
s/`credentialslernplattformen`/`CredentialsLernplattformen`/g
s/`eigeneschule`/`EigeneSchule`/g
s/`eigeneschule_abt_kl`/`EigeneSchule_Abt_Kl`/g
s/`eigeneschule_abteilungen`/`EigeneSchule_Abteilungen`/g
s/`eigeneschule_fachklassen`/`EigeneSchule_Fachklassen`/g
s/`eigeneschule_fachteilleistungen`/`EigeneSchule_FachTeilleistungen`/g
s/`eigeneschule_faecher`/`EigeneSchule_Faecher`/g
s/`eigeneschule_jahrgaenge`/`EigeneSchule_Jahrgaenge`/g
s/`eigeneschule_kaoadaten`/`EigeneSchule_KAoADaten`/g
s/`eigeneschule_kursart`/`EigeneSchule_Kursart`/g
s/`eigeneschule_merkmale`/`EigeneSchule_Merkmale`/g
s/`eigeneschule_schulformen`/`EigeneSchule_Schulformen`/g
s/`eigeneschule_teilstandorte`/`EigeneSchule_Teilstandorte`/g
s/`eigeneschule_texte`/`EigeneSchule_Texte`/g
s/`eigeneschule_zertifikate`/`EigeneSchule_Zertifikate`/g
s/`erzieherdatenschutz`/`ErzieherDatenschutz`/g
s/`erzieherlernplattform`/`ErzieherLernplattform`/g
s/`fach_gliederungen`/`Fach_Gliederungen`/g
s/`floskelgruppen`/`Floskelgruppen`/g
s/`floskeln`/`Floskeln`/g
s/`k_adressart`/`K_Adressart`/g
s/`k_allgadresse`/`K_AllgAdresse`/g
s/`k_ankreuzdaten`/`K_Ankreuzdaten`/g
s/`k_ankreuzfloskeln`/`K_Ankreuzfloskeln`/g
s/`k_beschaeftigungsart`/`K_BeschaeftigungsArt`/g
s/`k_datenschutz`/`K_Datenschutz`/g
s/`k_einschulungsart`/`K_EinschulungsArt`/g
s/`k_einzelleistungen`/`K_Einzelleistungen`/g
s/`k_entlassgrund`/`K_EntlassGrund`/g
s/`k_erzieherart`/`K_ErzieherArt`/g
s/`k_erzieherfunktion`/`K_ErzieherFunktion`/g
s/`k_fahrschuelerart`/`K_FahrschuelerArt`/g
s/`k_foerderschwerpunkt`/`K_Foerderschwerpunkt`/g
s/`k_haltestelle`/`K_Haltestelle`/g
s/`k_kindergarten`/`K_Kindergarten`/g
s/`k_lehrer`/`K_Lehrer`/g
s/`k_ort`/`K_Ort`/g
s/`k_ortsteil`/`K_Ortsteil`/g
s/`k_religion`/`K_Religion`/g
s/`k_schule`/`K_Schule`/g
s/`k_schulfunktionen`/`K_Schulfunktionen`/g
s/`k_schwerpunkt`/`K_Schwerpunkt`/g
s/`k_sportbefreiung`/`K_Sportbefreiung`/g
s/`k_staat`/`K_Staat`/g
s/`k_telefonart`/`K_TelefonArt`/g
s/`k_verkehrssprachen`/`K_Verkehrssprachen`/g
s/`k_vermerkart`/`K_Vermerkart`/g
s/`k_zertifikate`/`K_Zertifikate`/g
s/`kompetenzen`/`Kompetenzen`/g
s/`kompetenzgruppen`/`Kompetenzgruppen`/g
s/`kurse`/`Kurse`/g
s/`kurslehrer`/`KursLehrer`/g
s/`lehrerabschnittsdaten`/`LehrerAbschnittsdaten`/g
s/`lehreranrechnung`/`LehrerAnrechnung`/g
s/`lehrerdatenschutz`/`LehrerDatenschutz`/g
s/`lehrerentlastung`/`LehrerEntlastung`/g
s/`lehrerfotos`/`LehrerFotos`/g
s/`lehrerfunktionen`/`LehrerFunktionen`/g
s/`lehrerlehramt`/`LehrerLehramt`/g
s/`lehrerlehramtfachr`/`LehrerLehramtFachr`/g
s/`lehrerlehramtlehrbef`/`LehrerLehramtLehrbef`/g
s/`lehrerlernplattform`/`LehrerLernplattform`/g
s/`lehrermehrleistung`/`LehrerMehrleistung`/g
s/`lernplattformen`/`Lernplattformen`/g
s/`logins`/`Logins`/g
s/`nichtmoeglabifachkombi`/`NichtMoeglAbiFachKombi`/g
s/`personengruppen`/`Personengruppen`/g
s/`personengruppen_personen`/`Personengruppen_Personen`/g
s/`prfsemabschl`/`PrfSemAbschl`/g
s/`schild_verwaltung`/`Schild_Verwaltung`/g
s/`schildfilter`/`SchildFilter`/g
s/`schueler`/`Schueler`/g
s/`schueler_allgadr`/`Schueler_AllgAdr`/g
s/`schuelerabgaenge`/`SchuelerAbgaenge`/g
s/`schuelerabifaecher`/`SchuelerAbiFaecher`/g
s/`schuelerabitur`/`SchuelerAbitur`/g
s/`schuelerankreuzfloskeln`/`SchuelerAnkreuzfloskeln`/g
s/`schuelerbkabschluss`/`SchuelerBKAbschluss`/g
s/`schuelerbkfaecher`/`SchuelerBKFaecher`/g
s/`schuelerdatenschutz`/`SchuelerDatenschutz`/g
s/`schuelereinzelleistungen`/`SchuelerEinzelleistungen`/g
s/`schuelererzadr`/`SchuelerErzAdr`/g
s/`schuelerfehlstunden`/`SchuelerFehlstunden`/g
s/`schuelerfhr`/`SchuelerFHR`/g
s/`schuelerfhrfaecher`/`SchuelerFHRFaecher`/g
s/`schuelerfoerderempfehlungen`/`SchuelerFoerderempfehlungen`/g
s/`schuelerfotos`/`SchuelerFotos`/g
s/`schuelergsdaten`/`SchuelerGSDaten`/g
s/`schuelerkaoadaten`/`SchuelerKAoADaten`/g
s/`schuelerld_psfachbem`/`SchuelerLD_PSFachBem`/g
s/`schuelerleistungsdaten`/`SchuelerLeistungsdaten`/g
s/`schuelerlernabschnittsdaten`/`SchuelerLernabschnittsdaten`/g
s/`schuelerlernplattform`/`SchuelerLernplattform`/g
s/`schuelerliste`/`SchuelerListe`/g
s/`schuelerliste_inhalt`/`SchuelerListe_Inhalt`/g
s/`schuelermerkmale`/`SchuelerMerkmale`/g
s/`schuelerreportvorlagen`/`SchuelerReportvorlagen`/g
s/`schuelersprachenfolge`/`SchuelerSprachenfolge`/g
s/`schuelertelefone`/`SchuelerTelefone`/g
s/`schuelervermerke`/`SchuelerVermerke`/g
s/`schuelerwiedervorlage`/`SchuelerWiedervorlage`/g
s/`schuelerzuweisungen`/`SchuelerZuweisungen`/g
s/`schulecredentials`/`SchuleCredentials`/g
s/`stundentafel`/`Stundentafel`/g
s/`stundentafel_faecher`/`Stundentafel_Faecher`/g
s/`textexportvorlagen`/`TextExportVorlagen`/g
s/`usergroups`/`Usergroups`/g
s/`users`/`Users`/g
s/`versetzung`/`Versetzung`/g
s/`zuordnungreportvorlagen`/`ZuordnungReportvorlagen`/g
' dump.sql

Alternativ und etwas performanter kann dieses Skript unter node.js verwendet werden:

js
// Dieses Node-Script kann mit node entweder als Script ausgeführt werden:
// node diesesScript.js
// oder im Browser, in den Entwicklertools in der Console ausführen (Copy/Paste/Ausführen)
// oder in einem beliebigen anderen node-REPL
//
// Vor dem Ausführen müssen noch die Namen der Datenbanken angepasst werden:

// Namen der Datenbanken eingeben, deren Tabellen umbenannt werden sollen:
const dbs = ["schild_gym_sek1", "schild_gym_sek2", "schild_kbk", "schild_kbk2"];

// Die Ausgabe nach dem Ausführen dieses Scripts kann in der MySQL, bzw. MariaDB-Konsole ausgeführt werden und benennt alle Tabellen in das korrekte Format um.

const names = ["allgadransprechpartner", "credentials", "credentialslernplattformen", "eigeneschule", "eigeneschule_abt_kl", "eigeneschule_abteilungen", "eigeneschule_fachklassen", "eigeneschule_fachteilleistungen", "eigeneschule_faecher", "eigeneschule_jahrgaenge", "eigeneschule_kaoadaten", "eigeneschule_kursart", "eigeneschule_kursartallg", "eigeneschule_merkmale", "eigeneschule_schulformen", "eigeneschule_teilstandorte", "eigeneschule_texte", "eigeneschule_zertifikate", "eigeneschule_zertifikatsfaecher", "erzieherdatenschutz", "erzieherlernplattform", "fach_gliederungen", "fachklassen_schwerpunkte", "floskelgruppen", "floskeln", "k_adressart", "k_allgadresse", "k_ankreuzdaten", "k_ankreuzfloskeln", "k_beschaeftigungsart", "k_datenschutz", "k_einschulungsart", "k_einzelleistungen", "k_entlassgrund", "k_erzieherart", "k_erzieherfunktion", "k_fahrschuelerart", "k_foerderschwerpunkt", "k_haltestelle", "k_kindergarten", "k_klassenorgform", "k_lehrer", "k_ort", "k_ortsteil", "k_religion", "k_schule", "k_schulfunktionen", "k_schwerpunkt", "k_sportbefreiung", "k_staat", "k_telefonart", "k_verkehrssprachen", "k_vermerkart", "k_zertifikate", "kompetenzen", "kompetenzgruppen", "kurse", "kurskombinationen", "kurslehrer", "lehrer_imei", "lehrerabschnittsdaten", "lehreranrechnung", "lehrerdatenschutz", "lehrerentlastung", "lehrerfotos", "lehrerfunktionen", "lehrerlehramt", "lehrerlehramtfachr", "lehrerlehramtlehrbef", "lehrerlernplattform", "lehrermehrleistung", "lernplattformen", "logins", "nichtmoeglabifachkombi", "personengruppen", "personengruppen_personen", "prfsemabschl", "schild_verwaltung", "schildfilter", "schueler", "schueler_allgadr", "schuelerabgaenge", "schuelerabifaecher", "schuelerabitur", "schuelerankreuzfloskeln", "schuelerbkabschluss", "schuelerbkfaecher", "schuelerdatenschutz", "schuelereinzelleistungen", "schuelererzadr", "schuelererzfunktion", "schuelerfehlstunden", "schuelerfhr", "schuelerfhrfaecher", "schuelerfoerderempfehlungen", "schuelerfotos", "schuelergsdaten", "schuelerkaoadaten", "schuelerld_psfachbem", "schuelerleistungsdaten", "schuelerlernabschnittsdaten", "schuelerlernplattform", "schuelerliste", "schuelerliste_inhalt", "schuelermerkmale", "schuelerreportvorlagen", "schuelersprachenfolge", "schuelertelefone", "schuelervermerke", "schuelerwiedervorlage", "schuelerzuweisungen", "schulecredentials", "stundentafel", "stundentafel_faecher", "textexportvorlagen", "usergroups", "users", "versetzung", "zuordnungreportvorlagen"];

const namesNeu = ["AllgAdrAnsprechpartner", "AllgemeineMerkmaleKatalog_Keys", "Benutzer", "BenutzerAllgemein", "BenutzerEmail", "BenutzerKompetenzen", "Benutzergruppen", "BenutzergruppenKompetenzen", "BenutzergruppenMitglieder", "Berufskolleg_Anlagen", "Berufskolleg_Berufsebenen1", "Berufskolleg_Berufsebenen2", "Berufskolleg_Berufsebenen3", "Berufskolleg_Fachklassen_Keys", "Credentials", "CredentialsLernplattformen", "DavRessourceCollections", "DavRessourceCollectionsACL", "DavRessources", "DavSyncTokenLehrer", "DavSyncTokenSchueler", "EigeneSchule", "EigeneSchule_Abt_Kl", "EigeneSchule_Abteilungen", "EigeneSchule_Email", "EigeneSchule_FachTeilleistungen", "EigeneSchule_Fachklassen", "EigeneSchule_Faecher", "EigeneSchule_Jahrgaenge", "EigeneSchule_KAoADaten", "EigeneSchule_Kursart", "EigeneSchule_Logo", "EigeneSchule_Merkmale", "EigeneSchule_Schulformen", "EigeneSchule_Teilstandorte", "EigeneSchule_Texte", "EigeneSchule_Zertifikate", "EinschulungsartKatalog_Keys", "EnmLeistungsdaten", "EnmLernabschnittsdaten", "EnmTeilleistungen", "ErzieherDatenschutz", "ErzieherLernplattform", "FachKatalog", "FachKatalog_Keys", "FachKatalog_Schulformen", "Fach_Gliederungen", "Fachgruppen", "Floskelgruppen", "Floskeln", "Gost_Blockung", "Gost_Blockung_Kurse", "Gost_Blockung_Kurslehrer", "Gost_Blockung_Regeln", "Gost_Blockung_Regelparameter", "Gost_Blockung_Schienen", "Gost_Blockung_Zwischenergebnisse", "Gost_Blockung_Zwischenergebnisse_Kurs_Schienen", "Gost_Blockung_Zwischenergebnisse_Kurs_Schueler", "Gost_Jahrgang_Beratungslehrer", "Gost_Jahrgang_Fachkombinationen", "Gost_Jahrgang_Fachwahlen", "Gost_Jahrgang_Faecher", "Gost_Jahrgangsdaten", "Gost_Klausuren_Kalenderinformationen", "Gost_Klausuren_Kursklausuren", "Gost_Klausuren_NtaZeiten", "Gost_Klausuren_Raeume", "Gost_Klausuren_Raumstunden", "Gost_Klausuren_Raumstunden_Aufsichten", "Gost_Klausuren_Schuelerklausuren", "Gost_Klausuren_Schuelerklausuren_Termine", "Gost_Klausuren_SchuelerklausurenTermine_Raumstunden", "Gost_Klausuren_Termine", "Gost_Klausuren_Termine_Jahrgaenge", "Gost_Klausuren_Vorgaben", "Gost_Schueler", "Gost_Schueler_Fachwahlen", "Herkunft", "Herkunft_Keys", "Herkunft_Schulformen", "Herkunftsart", "Herkunftsart_Keys", "Herkunftsart_Schulformen", "ImpExp_EigeneImporte", "ImpExp_EigeneImporte_Felder", "ImpExp_EigeneImporte_Tabellen", "Jahrgaenge_Keys", "KAoA_Anschlussoption_Keys", "KAoA_Berufsfeld_Keys", "KAoA_Kategorie_Keys", "KAoA_Merkmal_Keys", "KAoA_SBO_Ebene4_Keys", "KAoA_Zusatzmerkmal_Keys", "K_Adressart", "K_AllgAdresse", "K_Ankreuzdaten", "K_Ankreuzfloskeln", "K_BeschaeftigungsArt", "K_Datenschutz", "K_EinschulungsArt", "K_Einzelleistungen", "K_EntlassGrund", "K_ErzieherArt", "K_ErzieherFunktion", "K_FahrschuelerArt", "K_Foerderschwerpunkt", "K_Haltestelle", "K_Kindergarten", "K_Lehrer", "K_Ort", "K_Ortsteil", "K_Religion", "K_Schule", "K_Schulfunktionen", "K_Schwerpunkt", "K_Sportbefreiung", "K_TelefonArt", "K_Textdateien", "K_Vermerkart", "K_Zertifikate", "Katalog_Aufsichtsbereich", "Katalog_Pausenzeiten", "Katalog_Raeume", "Katalog_Zeitraster", "Klassen", "KlassenLehrer", "KlassenartenKatalog_Keys", "Kompetenzen", "Kompetenzgruppen", "KursFortschreibungsarten", "KursLehrer", "Kurs_Schueler", "KursartenKatalog_Keys", "Kurse", "LehrerAbschnittsdaten", "LehrerAnrechnung", "LehrerDatenschutz", "LehrerEntlastung", "LehrerFotos", "LehrerFunktionen", "LehrerLehramt", "LehrerLehramtFachr", "LehrerLehramtLehrbef", "LehrerLeitungsfunktion_Keys", "LehrerLernplattform", "LehrerMehrleistung", "LehrerNotenmodulCredentials", "LehrerPersonaldatenLehramt", "LehrerPersonaldatenLehramtFachrichtung", "LehrerPersonaldatenLehramtLehrbefaehigung", "Lernplattformen", "Logins", "Nationalitaeten_Keys", "NichtMoeglAbiFachKombi", "Noten", "OrganisationsformenKatalog_Keys", "PersonalTypen", "Personengruppen", "Personengruppen_Personen", "Religionen_Keys", "Client_Konfiguration_Benutzer", "Client_Konfiguration_Global", "Schema_Core_Type_Versionen", "Schema_AutoInkremente", "Schema_Status", "SchildFilter", "Schild_Verwaltung", "Schueler", "SchuelerAbgaenge", "SchuelerAbiFaecher", "SchuelerAbitur", "SchuelerAnkreuzfloskeln", "SchuelerBKAbschluss", "SchuelerBKFaecher", "SchuelerDatenschutz", "SchuelerEinzelleistungen", "SchuelerErzAdr", "SchuelerFHR", "SchuelerFHRFaecher", "SchuelerFehlstunden", "SchuelerFoerderempfehlungen", "SchuelerFotos", "SchuelerGSDaten", "SchuelerKAoADaten", "SchuelerLD_PSFachBem", "SchuelerLeistungsdaten", "SchuelerLernabschnittsdaten", "SchuelerLernplattform", "SchuelerListe", "SchuelerListe_Inhalt", "SchuelerMerkmale", "SchuelerReportvorlagen", "SchuelerSprachenfolge", "SchuelerSprachpruefungen", "SchuelerStatus_Keys", "SchuelerTelefone", "SchuelerVermerke", "SchuelerWiedervorlage", "SchuelerZP10", "SchuelerZuweisungen", "Schueler_AllgAdr", "SchuleCredentials", "SchuleOAuthSecrets", "Schulbewerbung_Importe", "Schulformen", "Schuljahresabschnitte", "Schulleitung", "Stundenplan", "Stundenplan_Aufsichtsbereiche", "Stundenplan_Kalenderwochen_Zuordnung", "Stundenplan_Pausenaufsichten", "Stundenplan_PausenaufsichtenBereich", "Stundenplan_Pausenzeit", "Stundenplan_Pausenzeit_Klassenzuordnung", "Stundenplan_Raeume", "Stundenplan_Schienen", "Stundenplan_Unterricht", "Stundenplan_UnterrichtKlasse", "Stundenplan_UnterrichtLehrer", "Stundenplan_UnterrichtRaum", "Stundenplan_UnterrichtSchiene", "Stundenplan_Zeitraster", "Stundentafel", "Stundentafel_Faecher", "TextExportVorlagen", "TimestampsLehrerNotenmodulCredentials", "TimestampsSchuelerAnkreuzkompetenzen", "TimestampsSchuelerLeistungsdaten", "TimestampsSchuelerLernabschnittsdaten", "TimestampsSchuelerTeilleistungen", "Usergroups", "Users", "Versetzung", "Wiedervorlage", "ZuordnungReportvorlagen"];
namesNeu.push("K_Staat", "K_Verkehrssprachen", "PrfSemAbschl");

let out = "";

for (const db of dbs) {
    for (const n of names) {
        const nn = namesNeu.find(name => n.toLowerCase() === name.toLowerCase());
        if (nn === undefined)
            continue;
        out += `RENAME TABLE ${db}.${n} TO ${db}.${nn};`
    }
}

console.log(out);