Datensicherung
manuelle Sicherung im SQLite Format
Über die grafische Oberfläche des Adminclients kann sehr komfortabel eine Datensicherung im SQLite Format angelegt werden. Der Admin-Client 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 gescriptet aufgerufen werden.
curl --user "rootUsername:MYSQLROOTPW" -k -X "GET" "https://SERVERNAME:PORT/db/SCHEMA/export/sqlite" -H "accept: application/json"
Hier bitte die Variablen rootUsername, MYSQLROOTPW, SERVERNAME, PORT und SCHEMA 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
mysqldump --user=USERNAME --password=PASSWORD DATABASENAME /path/to/mysql_dump.sql
Sichert die Datenbank einmalig unter dem angegebenen path. Dies kann mit Crontab sinnvoll automatisiert werden.
automysqlbackup
Das Linux Tool automysqlbackup
ist für regelmäßige Sicherungen sehr komfortabler und einfach. Es richtet unter /var/lib/automysqlbackup
in entsprechenden Ordnern daily, weekly und monthly .sql
Sicherungen ein.
apt install automysqlbackup
In der config /etc/default/automysqlbackup
kann ggf. das Backupverzeichnisse definiert oder die Zeiten bzw. Exklusionen editiert werden.
Regelmäßige Backups müssen dann per cronjob eingerichtet werden. z.B:
0 1 * * * /usr/sbin/automysqlbackup
Aktuell muss unter Debian 12 in /etc/mysql/debian.cnf
das rootpasswort für den Datenbankzugang eingetragen werden. Dazu bitte die beiden Variablen in dieser Datei ergänzen:
USERNAME=root
PASSWORD="the root password"
Dann in der Datei /etc/mysql/debian.cnf
die folgenden Zeilen aktivieren:
...
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 Spalten namen allgAdrAnsprechpartner
dann im zurückgespielten System ein allgadransprechpartner
. Dies kann dann weder von Schild3 noch vom SVWS-Server sauber verwertet werden.
Hier ein Script, 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 wird beim Mac LC_ALL=C
aufgrund der Anführungszeichen gesetzt sein.
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:
// 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);