mysqldump getrennt nach Tabellen ausführen
Hallo, mein cron macht des Nächtens täglich einen mysqldump über die gesamte Datenbank. Das Ergebnis ist eine 500 MB große sql-Datei. (Wird natürlich gegzipt und getart, dann sinds nur noch 50 MB.) Da es beim Wieder-Einspielen eines Backups aber darauf ankommt, dass ich meistens nur die Daten einer einzigen Database brauche (weil irgendso ein Heini irgendwo seine Daten zerstört hat), mache ich vor dem tar und gzip ein csplit -k mysql_dump.sql /^CREATE\ DATABASE/ {100} Dadurch bekomme ich pro Database eine eigene Datei. Diese werden dann alle getart, gezippt und weggesichert. Nachteil: Die Einzeldateien heißen xx01, xx02 usw. Im Ernstfall muss ich also kurz in jede einzelne Datei reinschauen, welche Database da erzeugt wird... Jetzt meine Frage: Wie löse ich diese Aufgabenstellung eleganter? Also der Gedanke wäre: Einen mysql-Befehl absetzen, der alle DATABASEs auflistet, und dann per for-Schleife in bash jeweils für diese Database einen mysqldump ausführen. Aber irgendwie werde ich da nicht fündig... Hat jemand einen entscheidenden Hinweis für mich? -- Michael Herrmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Hallo Michael und Liste, so ähnliche Dumps mach ich auch jede Nacht. Allerdings nicht eine DB in ne Datei, sondern pro Tabelle in ne Datei. Halte ich persönlich für flexibler. Landet alles im selben Verzeichnis, aber das pro DB in unterschiedliche Verzeichnisse zu packen sollte kein Thema sein. Bei Interesse kann ich gerne mal das script posten. Michael Herrmann schrieb:
Hallo,
mein cron macht des Nächtens täglich einen mysqldump über die gesamte Datenbank. Das Ergebnis ist eine 500 MB große sql-Datei. (Wird natürlich gegzipt und getart, dann sinds nur noch 50 MB.) Da es beim Wieder-Einspielen eines Backups aber darauf ankommt, dass ich meistens nur die Daten einer einzigen Database brauche (weil irgendso ein Heini irgendwo seine Daten zerstört hat), mache ich vor dem tar und gzip ein csplit -k mysql_dump.sql /^CREATE\ DATABASE/ {100} Dadurch bekomme ich pro Database eine eigene Datei. Diese werden dann alle getart, gezippt und weggesichert. Nachteil: Die Einzeldateien heißen xx01, xx02 usw. Im Ernstfall muss ich also kurz in jede einzelne Datei reinschauen, welche Database da erzeugt wird...
Jetzt meine Frage: Wie löse ich diese Aufgabenstellung eleganter? Also der Gedanke wäre: Einen mysql-Befehl absetzen, der alle DATABASEs auflistet, und dann per for-Schleife in bash jeweils für diese Database einen mysqldump ausführen.
Aber irgendwie werde ich da nicht fündig... Hat jemand einen entscheidenden Hinweis für mich?
- -- Gruß Horst - -- Computer sind dazu da Probleme zu zu lösen, die man ohne sie gar nicht hätte! -----BEGIN PGP SIGNATURE----- Version: PGP Desktop 9.6.2 (Build 2014) Charset: ISO-8859-1 wsBVAwUBRu7gmbbCXWAFTgLjAQhqVAgAnnA7jWLaRL23zlx0cROtYAw1cTaL49+Q 2aYEtDBrqlGi11bXTjrv3DJhId1J36n3Cxh10IrTJLkD5btsIrBfcHAcPJj9teQt DdGWsXskZjXYcLrY3mhi8DAakRd9kwScKU3d5SZxIsX7D8pGi1a2KUfz/6lSoIYP 2hZMHnhj42Y6FXhVmMzvzslF4nj89n1lBp2erO0Ol9vGTgxo19a4lJkdqHdP5HJg qO8cQp1H9lIJFNZ+dmZX3Va9vnqkG+U14/n4mQnHyK+M+dBHrt2cGeA/HcU9TZOR 0X9NieL/+GSIB9QAN6vKhpsUIwhz26S7xAYSngy00GaIYmgGZqojig== =mnA0 -----END PGP SIGNATURE----- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Montag, 17. September 2007 22:16 schrieb Horst Templer:
so ähnliche Dumps mach ich auch jede Nacht. Allerdings nicht eine DB in ne Datei, sondern pro Tabelle in ne Datei. Halte ich persönlich für flexibler. Landet alles im selben Verzeichnis, aber das pro DB in unterschiedliche Verzeichnisse zu packen sollte kein Thema sein. Bei Interesse kann ich gerne mal das script posten.
klar, her damit. Bin ja schließlich auf der Suche nach sowas... -- Michael Herrmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Dienstag, 18. September 2007 10:41 schrieb Michael Herrmann:
Hallo,
Am Montag, 17. September 2007 22:16 schrieb Horst Templer:
so ähnliche Dumps mach ich auch jede Nacht. Allerdings nicht eine DB in ne Datei, sondern pro Tabelle in ne Datei. Halte ich persönlich für flexibler. Landet alles im selben Verzeichnis, aber das pro DB in unterschiedliche Verzeichnisse zu packen sollte kein Thema sein. Bei Interesse kann ich gerne mal das script posten.
klar, her damit. Bin ja schließlich auf der Suche nach sowas... Andere auch, also bitte an die Liste :-)
-- Michael Herrmann
Grüße Rolf -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Hallo Liste, hier das Script. Ist kein Allheilmittel, aber die Daten lassen sich auf nem anderen Rechner problemlos wieder importieren und die DB benutzen. ############################# - BEGIN_SCRIPT - ################################### #!/bin/bash ################################################################################ # # Script Name: db_dump.sh # Author: Herr Templer # Datum: 11.03.2007 # Revision: 0.0 - Grunstruktur der Scriptfunktionen # 0.1 - Erweiterung auf alle Tabellen und Voller dump # # Action: Voller dump aller Tabellen. # Aufruf: Über cron / 4:00 Uhr Taeglich # Beschreibung: s. Action # # # ################################################################################ # set -x ################################################################################ # Variablen ################################################################################ SCRIPTBASE="/root/bin/full" zeitstempel=`date +%Y%m%d-%H%M%S` stunde=`date +%H` dbname="gesext" BASIS="/opt/lampp" backuppfad="/var/mysql_backup" quellpfad="$BASIS/var/mysql" dumppfad="${backuppfad}/dump" dateiname="${dbname}_db_${zeitstempel}.tgz" ################################################################################ # Funktionen ################################################################################ function run_check(){ if [ $? -ne 0 ] then echo " Funktion ${fname} nicht erfolgreich!" else echo " Funktion ${fname} erfolgreich ausgefuehrt!" fi } function plattencheck(){ fname="Plattencheck" usage=`df -k|grep /dev/sda3|awk {'print $5'}|awk -F% {'print $1'}` if [ $usage -gt '90' ] then echo "FEHLER! Nicht genug Festplattenspeicher um die Datensicherung zu starten!!!" exit fi } function verzeichnis_pruefen(){ fname="Verzeichnis Pruefen" if [ ! -d ${dumppfad} ] then mkdir ${dumppfad} chmod ugo+w ${dumppfad} fi if [ ! -d ${dumppfad}/compressed ] then mkdir ${dumppfad}/compressed chmod ugo+w ${dumppfad}/compressed fi if [ ! -d ${dumppfad}/uncompressed ] then mkdir ${dumppfad}/uncompressed chmod ugo+w ${dumppfad}/uncompressed fi } function get_table_names() { $BASIS/bin/mysql -u Backup -pPASSWORD < $SCRIPTBASE/show_DB-NAME_tables.sql | grep -v "Tables_in_DB-NAME" > $SCRIPTBASE/table_names.txt } function dump(){ fname="Dump" echo " Dump gestartet..." date for i in `cat $SCRIPTBASE/table_names.txt` do DUMP_SQL="select * into outfile '/var/mysql_backup/dump/dump-${i}.dmp' FIELDS TERMINATED BY ';' optionally ENCLOSED BY '\\\"' escaped by '\\\\' from ${i};" # echo $DUMP_SQL $BASIS/bin/mysql -u Backup -pPASSWORD << EOLEINGABE use ${dbname} $DUMP_SQL EOLEINGABE done date echo "Dump abgeschlossen!" } function move_dump(){ fname="Move Dump File" echo "Dump Dateien werden verschoben." for i in `cat $SCRIPTBASE/table_names.txt` do mv /var/mysql_backup/dump/dump-${i}.dmp /var/mysql_backup/dump/uncompressed/dump-${i}-${zeitstempel}.dmp done } function remove_zip(){ fname="Remove Zip" echo "Dateien werden geloescht/gezippt." #ho find $dumppfad -type f -mtime 14 -exec rm -f {} \; find $dumppfad/uncompressed -type f -mtime 7 -exec gzip {} \; find $dumppfad/uncompressed -name "*.gz" -exec mv {} $dumppfad/compressed \; } function replicate2backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed } function replicate2anderer_backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed rsync -avrz -e ssh $SCRIPTBASE/table_names.txt IP_ZIELRECHNER/Sicherungen/mysql_backup/dump/uncompressed } ################################################################################ # Main ################################################################################ plattencheck run_check verzeichnis_pruefen run_check get_table_names run_check dump run_check move_dump run_check remove_zip run_check #replicate2backupspace #run_check replicate2anderer_backupspace run_check ############################ - END-SCRIPT - ######################################## Problematisch ist nur wenn sich die Tabellen Struktur ändert. Also Felder dazu kommen. Da ist mir noch nichts eingefallen wie ich das auch auf die andere Maschine übertragen kann. Verbesserungsvorschläge nehme ich immer gerne entgegen :o) Gruß Horst Rolf Masfelder schrieb:
Am Dienstag, 18. September 2007 10:41 schrieb Michael Herrmann:
Hallo,
Am Montag, 17. September 2007 22:16 schrieb Horst Templer:
so ähnliche Dumps mach ich auch jede Nacht. Allerdings nicht eine DB in ne Datei, sondern pro Tabelle in ne Datei. Halte ich persönlich für flexibler. Landet alles im selben Verzeichnis, aber das pro DB in unterschiedliche Verzeichnisse zu packen sollte kein Thema sein. Bei Interesse kann ich gerne mal das script posten.
klar, her damit. Bin ja schließlich auf der Suche nach sowas...
Andere auch, also bitte an die Liste :-)
-- Michael Herrmann
Grüße
Rolf
- -- Computer sind dazu da Probleme zu zu lösen, die man ohne sie gar nicht hätte! -----BEGIN PGP SIGNATURE----- Version: PGP Desktop 9.6.2 (Build 2014) Charset: ISO-8859-1 wsBVAwUBRu/7K7bCXWAFTgLjAQi63Af/fcgktHyplGvZEgDFkbUiVMHQFXd8LLI3 nSK7uc2eE12nYW+mW8TN6tyiELH6WlYNkBOtEuobL1SAVrUqD7ghShzbVTeAj1aG EOBdaWze7mMOgb36wKSnzqhBnKn8zhB2vYZq0bOKEFKAEr4h3rvcX8VgAIe80ri1 b3TCXv3PFZJ75FJowQCajNp684zmW2lp1GqIfmdHmNLDNBKFu5yntdPSEFxgh9QP 2TC3YGTC9mM5+sMKFGNgrRu9bkjWvqhLDNLbZ7j3k/zaG2ViztP5JyGYJftZ+LAM 8S7FgsbeVw8vS/AU80DgtT1TI9vfaKD16vb47nyWDzXomIVN46QYxg== =anxR -----END PGP SIGNATURE----- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Dienstag, 18. September 2007 18:22 schrieb Horst Templer:
Hallo Liste,
hier das Script. Ist kein Allheilmittel, aber die Daten lassen sich auf nem anderen Rechner problemlos wieder importieren und die DB benutzen.
############################# - BEGIN_SCRIPT -
Als Vorlage: nicht schlecht! Kleinigkeiten müssen angepasst werden ( /dev/sda3 ...) und das Script show_DB-NAME_tables.sql fehlt noch. Gut gefällt mir der Teil zum replizieren auf einen Backup-Server (muss natürlich auch angepasst werden ...) Danke, Rolf
###################################
#!/bin/bash
##################################################################### ########### # # Script Name: db_dump.sh # Author: Herr Templer # Datum: 11.03.2007 # Revision: 0.0 - Grunstruktur der Scriptfunktionen # 0.1 - Erweiterung auf alle Tabellen und Voller dump # # Action: Voller dump aller Tabellen. # Aufruf: Über cron / 4:00 Uhr Taeglich # Beschreibung: s. Action # # # ##################################################################### ########### # set -x ##################################################################### ########### # Variablen ##################################################################### ########### SCRIPTBASE="/root/bin/full" zeitstempel=`date +%Y%m%d-%H%M%S` stunde=`date +%H` dbname="gesext" BASIS="/opt/lampp" backuppfad="/var/mysql_backup" quellpfad="$BASIS/var/mysql" dumppfad="${backuppfad}/dump" dateiname="${dbname}_db_${zeitstempel}.tgz"
##################################################################### ########### # Funktionen ##################################################################### ########### function run_check(){ if [ $? -ne 0 ] then echo " Funktion ${fname} nicht erfolgreich!" else echo " Funktion ${fname} erfolgreich ausgefuehrt!" fi }
function plattencheck(){ fname="Plattencheck" usage=`df -k|grep /dev/sda3|awk {'print $5'}|awk -F% {'print $1'}` if [ $usage -gt '90' ] then echo "FEHLER! Nicht genug Festplattenspeicher um die Datensicherung zu starten!!!" exit fi }
function verzeichnis_pruefen(){ fname="Verzeichnis Pruefen" if [ ! -d ${dumppfad} ] then mkdir ${dumppfad} chmod ugo+w ${dumppfad} fi
if [ ! -d ${dumppfad}/compressed ] then mkdir ${dumppfad}/compressed chmod ugo+w ${dumppfad}/compressed fi
if [ ! -d ${dumppfad}/uncompressed ] then mkdir ${dumppfad}/uncompressed chmod ugo+w ${dumppfad}/uncompressed fi }
function get_table_names() { $BASIS/bin/mysql -u Backup -pPASSWORD < $SCRIPTBASE/show_DB-NAME_tables.sql | grep -v "Tables_in_DB-NAME" > $SCRIPTBASE/table_names.txt }
function dump(){ fname="Dump" echo " Dump gestartet..." date for i in `cat $SCRIPTBASE/table_names.txt` do DUMP_SQL="select * into outfile '/var/mysql_backup/dump/dump-${i}.dmp' FIELDS TERMINATED BY ';' optionally ENCLOSED BY '\\\"' escaped by '\\\\' from ${i};" # echo $DUMP_SQL $BASIS/bin/mysql -u Backup -pPASSWORD << EOLEINGABE use ${dbname} $DUMP_SQL EOLEINGABE done date echo "Dump abgeschlossen!"
}
function move_dump(){ fname="Move Dump File" echo "Dump Dateien werden verschoben." for i in `cat $SCRIPTBASE/table_names.txt` do mv /var/mysql_backup/dump/dump-${i}.dmp /var/mysql_backup/dump/uncompressed/dump-${i}-${zeitstempel}.dmp done }
function remove_zip(){ fname="Remove Zip" echo "Dateien werden geloescht/gezippt." #ho find $dumppfad -type f -mtime 14 -exec rm -f {} \; find $dumppfad/uncompressed -type f -mtime 7 -exec gzip {} \; find $dumppfad/uncompressed -name "*.gz" -exec mv {} $dumppfad/compressed \; }
function replicate2backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed }
function replicate2anderer_backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed rsync -avrz -e ssh $SCRIPTBASE/table_names.txt IP_ZIELRECHNER/Sicherungen/mysql_backup/dump/uncompressed }
##################################################################### ########### # Main ##################################################################### ###########
plattencheck run_check verzeichnis_pruefen run_check get_table_names run_check dump run_check move_dump run_check remove_zip run_check #replicate2backupspace #run_check replicate2anderer_backupspace run_check
############################ - END-SCRIPT - ########################################
Problematisch ist nur wenn sich die Tabellen Struktur ändert. Also Felder dazu kommen. Da ist mir noch nichts eingefallen wie ich das auch auf die andere Maschine übertragen kann.
Verbesserungsvorschläge nehme ich immer gerne entgegen :o)
Gruß Horst
... schnipp...
-- Computer sind dazu da Probleme zu zu lösen, die man ohne sie gar nicht hätte!
Grüße Rolf -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Rolf Masfelder schrieb:
Am Dienstag, 18. September 2007 18:22 schrieb Horst Templer:
Hallo Liste,
hier das Script. Ist kein Allheilmittel, aber die Daten lassen sich auf nem anderen Rechner problemlos wieder importieren und die DB benutzen.
############################# - BEGIN_SCRIPT -
Als Vorlage: nicht schlecht!
Danke.
Kleinigkeiten müssen angepasst werden ( /dev/sda3 ...) und das Script show_DB-NAME_tables.sql fehlt noch.
Ups. ###################### show_DB_NAME_tables.sql ############################# use DB_NAME; show tables; ####################### END ############################################## Hier noch das script um den ganzen mist wieder einzulesen. Muss aber dazu sagen das es hier drum geht verschidenen Programmierern unterschiedliche DB's zum herum spielen zu geben ######################### BEGIN SCRIPT ######################################## #!/bin/bash ################################################################################ # # Script Name: get_db_dump.sh # Author: Horst Templer # Datum: 05.03.2007 # Revision: 0.0 - Grunstruktur der Scriptfunktionen # # # Action: - Dump Dateien von Backup Space holen # - Daten in TestDB einspielen, erst master, dann # fuer jeden einzelnen Techniker # - Stored Procedure ausfuehren um Userdaten auf # Testbedingungen zu setzen # Aufruf: per cron, jeden Tag um 4:15 Uhr # Beschreibung: s. Action # # # ################################################################################ #set -x ################################################################################ # Variablen ################################################################################ QUELL_IP_DUMP="0.0.0.0" QUELL_DIR_DUMP="/Sicherungen/mysql_backup/dump/uncompressed/" ZIEL_DIR_DUMP="/var/mysql_backup/dump/uncompressed/" ZEITSTEMPEL=`date +%Y%m%d` SYNCER="/usr/bin/rsync" OPTIONEN="-uvrz" LOADER="/opt/lampp/bin/mysql -u Access_ht29 -pPilatus" DB_NAME="DB-NAME" USERS="Techniker1 Techniker 2" PROZEDURNAME="update_testdb_users" MODUS="replace" ################################################################################ # Funktionen ################################################################################ function plattencheck() { usage=`df -k|grep /dev/hda3|awk {'print $5'}|awk -F% {'print $1'}` echo "Plattencheck - fuellgrad: $usage %" if [ $usage -gt '90' ] then echo "FEHLER! Nicht genug Festplattenspeicher um die Datensicherung zu starten!!!" exit fi } function cleanup() { find $ZIEL_DIR_DUMP -type f -mtime +3 -exec rm -f {} \; } function sync_dumpfile() { $SYNCER $OPTIONEN ${QUELL_IP_DUMP}:${QUELL_DIR_DUMP}dump*${ZEITSTEMPEL}-??????.dmp $ZIEL_DIR_DUMP $SYNCER $OPTIONEN ${QUELL_IP_DUMP}:${QUELL_DIR_DUMP}table_names.txt $ZIEL_DIR_DUMP } function sync_pix() { $SYNCER $OPTIONEN ${QUELL_IP_PIX}:${QUELL_DIR_PIX} $ZIEL_DIR_PIX } function truncate_master_tables() { for i in `cat ${ZIEL_DIR_DUMP}table_names.txt` do /opt/lampp/bin/mysql -u USER -pPASSWORD << EOFEINGABE truncate ${DB_NAME}.${i}; EOFEINGABE done } function truncate_techniker_tables() { for j in $USERS do for i in `cat ${ZIEL_DIR_DUMP}table_names.txt` do /opt/lampp/bin/mysql -u USER -pPASSWORD << EOFEINGABE truncate ${DB_NAME}_${j}.${i}; EOFEINGABE done done } function load_all_dumpfiles_master() { # DUMPFILE_LIST=`ls -1 /var/mysql_backup/dump-*-${ZEITSTEMPEL}-??????.dmp` DUMPFILE_LIST=`ls -1 ${ZIEL_DIR_DUMP}dump-*-${ZEITSTEMPEL}-04????.dmp` k=1 for i in ${DUMPFILE_LIST} do TABLE=`echo $DUMPFILE_LIST | cut -d " " -f $k | cut -d "-" -f 2` k=`echo $[$k+1]` # echo $TABLE LOAD_SQL="load data infile '$i' $MODUS into table $TABLE FIELDS TERMINATED BY ';' optionally ENCLOSED BY '\\\"' escaped by'\\\\';" # echo $LOAD_SQL $LOADER << EOLEINGABE use $DB_NAME; $LOAD_SQL EOLEINGABE $LOADER << EOLEINGABE use $DB_NAME; call update_testdb_users(); EOLEINGABE done } function load_all_dumpfiles_techniker() { # DUMPFILE_LIST=`ls -1 /var/mysql_backup/dump-*-${ZEITSTEMPEL}-??????.dmp` DUMPFILE_LIST=`ls -1 ${ZIEL_DIR_DUMP}dump-*-${ZEITSTEMPEL}-04????.dmp` for j in $USERS do echo $j k=1 for i in ${DUMPFILE_LIST} do TABLE=`echo $DUMPFILE_LIST | cut -d " " -f $k | cut -d "-" -f 2` k=`echo $[$k+1]` # echo $TABLE LOAD_SQL="load data infile '$i' $MODUS into table $TABLE FIELDS TERMINATED BY ';' optionally ENCLOSED BY '\\\"' escaped by'\\\\';" # echo $LOAD_SQL $LOADER << EOLEINGABE use ${DB_NAME}_${j}; $LOAD_SQL EOLEINGABE done $LOADER << EOLEINGABE use ${DB_NAME}_${j}; call update_testdb_users(); EOLEINGABE done } ################################################################################ # Main ################################################################################ echo "Dumfiles einlesen begonnen..." date echo "--------------------------------------------------------------" echo "Aufraeumen alter dumpfiles" echo "--------------------------------------------------------------" cleanup date echo "--------------------------------------------------------------" echo "Verfuegbaren Platten Speicher pruefen" echo "--------------------------------------------------------------" plattencheck date echo "--------------------------------------------------------------" echo "Synchronisation der zuletzt erzeugten dumpfiles von Backup Space" echo "--------------------------------------------------------------" sync_dumpfile date echo "--------------------------------------------------------------" echo "Leeren der TestDB gesext Master" echo "--------------------------------------------------------------" truncate_master_tables date echo "--------------------------------------------------------------" echo "Einlesen der DB dumps in TeastDB gesext Master" echo "--------------------------------------------------------------" load_all_dumpfiles_master date echo "--------------------------------------------------------------" echo "Leeren der Techniker DB's" echo "--------------------------------------------------------------" truncate_techniker_tables date echo "--------------------------------------------------------------" echo "Einlesen der dump Files in die Techniker DB's" echo "--------------------------------------------------------------" load_all_dumpfiles_techniker echo "Dumpfiles eingelesen" date ###################### END SCRIPT ############################################
Gut gefällt mir der Teil zum replizieren auf einen Backup-Server (muss natürlich auch angepasst werden ...)
Danke,
Rolf
###################################
#!/bin/bash
##################################################################### ########### # # Script Name: db_dump.sh # Author: Herr Templer # Datum: 11.03.2007 # Revision: 0.0 - Grunstruktur der Scriptfunktionen # 0.1 - Erweiterung auf alle Tabellen und Voller dump # # Action: Voller dump aller Tabellen. # Aufruf: Über cron / 4:00 Uhr Taeglich # Beschreibung: s. Action # # # ##################################################################### ########### # set -x ##################################################################### ########### # Variablen ##################################################################### ########### SCRIPTBASE="/root/bin/full" zeitstempel=`date +%Y%m%d-%H%M%S` stunde=`date +%H` dbname="gesext" BASIS="/opt/lampp" backuppfad="/var/mysql_backup" quellpfad="$BASIS/var/mysql" dumppfad="${backuppfad}/dump" dateiname="${dbname}_db_${zeitstempel}.tgz"
##################################################################### ########### # Funktionen ##################################################################### ########### function run_check(){ if [ $? -ne 0 ] then echo " Funktion ${fname} nicht erfolgreich!" else echo " Funktion ${fname} erfolgreich ausgefuehrt!" fi }
function plattencheck(){ fname="Plattencheck" usage=`df -k|grep /dev/sda3|awk {'print $5'}|awk -F% {'print $1'}` if [ $usage -gt '90' ] then echo "FEHLER! Nicht genug Festplattenspeicher um die Datensicherung zu starten!!!" exit fi }
function verzeichnis_pruefen(){ fname="Verzeichnis Pruefen" if [ ! -d ${dumppfad} ] then mkdir ${dumppfad} chmod ugo+w ${dumppfad} fi
if [ ! -d ${dumppfad}/compressed ] then mkdir ${dumppfad}/compressed chmod ugo+w ${dumppfad}/compressed fi
if [ ! -d ${dumppfad}/uncompressed ] then mkdir ${dumppfad}/uncompressed chmod ugo+w ${dumppfad}/uncompressed fi }
function get_table_names() { $BASIS/bin/mysql -u Backup -pPASSWORD < $SCRIPTBASE/show_DB-NAME_tables.sql | grep -v "Tables_in_DB-NAME" > $SCRIPTBASE/table_names.txt }
function dump(){ fname="Dump" echo " Dump gestartet..." date for i in `cat $SCRIPTBASE/table_names.txt` do DUMP_SQL="select * into outfile '/var/mysql_backup/dump/dump-${i}.dmp' FIELDS TERMINATED BY ';' optionally ENCLOSED BY '\\\"' escaped by '\\\\' from ${i};" # echo $DUMP_SQL $BASIS/bin/mysql -u Backup -pPASSWORD << EOLEINGABE use ${dbname} $DUMP_SQL EOLEINGABE done date echo "Dump abgeschlossen!"
}
function move_dump(){ fname="Move Dump File" echo "Dump Dateien werden verschoben." for i in `cat $SCRIPTBASE/table_names.txt` do mv /var/mysql_backup/dump/dump-${i}.dmp /var/mysql_backup/dump/uncompressed/dump-${i}-${zeitstempel}.dmp done }
function remove_zip(){ fname="Remove Zip" echo "Dateien werden geloescht/gezippt." #ho find $dumppfad -type f -mtime 14 -exec rm -f {} \; find $dumppfad/uncompressed -type f -mtime 7 -exec gzip {} \; find $dumppfad/uncompressed -name "*.gz" -exec mv {} $dumppfad/compressed \; }
function replicate2backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed }
function replicate2anderer_backupspace(){ fname="Replikation der dump Dateien auf ZIELRECHNER" rsync -avrz --delete /var/mysql_backup/dump/uncompressed/ IP_ZIELRECHNER:/Sicherungen/mysql_backup/dump/uncompressed rsync -avrz -e ssh $SCRIPTBASE/table_names.txt IP_ZIELRECHNER/Sicherungen/mysql_backup/dump/uncompressed }
##################################################################### ########### # Main ##################################################################### ###########
plattencheck run_check verzeichnis_pruefen run_check get_table_names run_check dump run_check move_dump run_check remove_zip run_check #replicate2backupspace #run_check replicate2anderer_backupspace run_check
############################ - END-SCRIPT - ########################################
Problematisch ist nur wenn sich die Tabellen Struktur ändert. Also Felder dazu kommen. Da ist mir noch nichts eingefallen wie ich das auch auf die andere Maschine übertragen kann.
Verbesserungsvorschläge nehme ich immer gerne entgegen :o)
Gruß Horst
... schnipp...
-- Computer sind dazu da Probleme zu zu lösen, die man ohne sie gar nicht hätte!
Grüße
Rolf
- -- Gruß Horst - -- Computer sind dazu da Probleme zu zu lösen, die man ohne sie gar nicht hätte! -----BEGIN PGP SIGNATURE----- Version: PGP Desktop 9.6.2 (Build 2014) Charset: ISO-8859-1 wsBVAwUBRvAhR7bCXWAFTgLjAQhW0wf/aLpHdW1rvk/8fzWWQfa/ArUWfV9kwcSN DRtjPlPiZDiAVsexQWG6zzjx5No3ypL1FSPktqC0FWUpQ2rI8rNmVP/IngQuX+LF TA2OnPz5aytK+LSFIIb7uB6E3vp3yzjttuHIw56Bv1y0/GZykkm421t+rEo10tq6 zhmYRfOochnidf7HHfiQQCigS3iJi9NZFza0BfV1nkZZHgmyC4WBa7CPpZkH75ra VskYZrwcV2lReFypCj4U/LjXnpoGIYysQSWKp7BXLJJ4NnprCYaJDAxEq7PrXH49 CPI4OV6KcXNXzuhtngMqca380RXx/mzHctpoBI+DHHmv0fS+v4Lezg== =2wNL -----END PGP SIGNATURE----- -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, Am Montag, 17. September 2007 21:51 schrieb Michael Herrmann:
Hallo,
mein cron macht des Nächtens täglich einen mysqldump über die gesamte Datenbank. Das Ergebnis ist eine 500 MB große sql-Datei. (Wird natürlich gegzipt und getart, dann sinds nur noch 50 MB.) Da es beim Wieder-Einspielen eines Backups aber darauf ankommt, dass ich meistens nur die Daten einer einzigen Database brauche (weil irgendso ein Heini irgendwo seine Daten zerstört hat), mache ich vor dem tar und gzip ein csplit -k mysql_dump.sql /^CREATE\ DATABASE/ {100} Dadurch bekomme ich pro Database eine eigene Datei. Diese werden dann alle getart, gezippt und weggesichert. Nachteil: Die Einzeldateien heißen xx01, xx02 usw. Im Ernstfall muss ich also kurz in jede einzelne Datei reinschauen, welche Database da erzeugt wird...
nach etwas Suchen bin ich auf folgendes Skript gestoßen: #!/bin/bash echo "Alle MySQL-Datenbanken sichern:" # Bereinigte Liste der Datenbanken erzeugen # "geheim" ist das MySQL-Rootpasswort: DBASELIST=`mktemp` mysqlshow -pgeheim | awk '{print $2}' | grep -v Databases | sort >$DBASELIST # Wohin sollen die ganzen Backups geschrieben werden? cd /irgendeinverzeichnis mkdir -p `date +%Y%m%W` cd `date +%Y%m%W` for x in `cat $DBASELIST`; do echo "Datenbank: $x sichern"; mysqldump --opt -pgeheim $x >$x.sql; done; echo "Alte .gz-Dateien loeschen:" rm *.gz echo "Dateien zippen:" gzip * Das tut eigentlich genau das, was ich wollte. -- Michael Herrmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Hallo, habe das Skript noch erweitert, so dass es alle Backups, die älter sind als 14 Tage automatisch löscht. #!/bin/bash echo "Alle MySQL-Datenbanken sichern:" # Bereinigte Liste der Datenbanken erzeugen # "geheim" ist das MySQL-Rootpasswort: DBASELIST=`mktemp` mysqlshow -pgeheim | awk '{print $2}' | grep -v Databases | sort >$DBASELIST # Wohin sollen die ganzen Backups geschrieben werden? # in diesem Fall: /opt/backups/ cd /opt/backups mkdir -p `date +%Y%m%d` cd `date +%Y%m%d` for x in `cat $DBASELIST`; do echo "Datenbank: $x sichern"; mysqldump --opt -pgeheim $x >$x.sql; done; echo "Alte .gz-Dateien loeschen:" rm *.gz echo "Dateien zippen:" gzip * echo "Backups älter als 14 Tage löschen:"; DATUMALT=`date +%Y%m%d --date="14 days ago"` rm /opt/backups/$DATUMALT/* rmdir /opt/backups/$DATUMALT -- Michael Herrmann -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
Am Montag, 8. Oktober 2007 21:34:21 schrieb Michael Herrmann:
nach etwas Suchen bin ich auf folgendes Skript gestoßen: [Shell-Script9
Eine Variante in Perl, die die für den eingetragenen User zugänglichen Datenbanken sichert: <schnipp> #!/usr/bin/perl use strict; use DBI; # convert unix time to date + time my ($sec,$min,$hour,$mday,$mon,$year) = localtime(time); my $date = sprintf("%0.2d.%0.2d.%0.4d",$mday,$mon+1,$year+1900); # backup variables my $date_ymd = sprintf("%0.4d%0.2d%0.2d",$year+1900,$mon+1,$mday); my $backup_directory = "/srv/backup"; my $backup_dir ="$backup_directory/$date_ymd"; my $dsn = 'DBI:mysql:mysql:localhost'; my $db_user_name = ''; # Username für Zugriff auf die Datenbank my $db_password = ''; # Passwort dazu my $dbh = DBI->connect($dsn, $db_user_name, $db_password); # start print "\nmysql2backup.pl Version 20050506 GPL U. Neist (http://www.singollo.de)\n"; print "\nStarte Backup: "; system "/bin/date"; # if dir doesn't exists, create it! if ( opendir (DIR,$backup_dir) ) { print "\nLoesche alte Backup-Files:\n"; system "/bin/rm -vf $backup_dir/*.dump.bz2"; print "done\n\n"; } else { mkdir $backup_dir; system "/bin/chown root.root $backup_dir" } closedir DIR; my $old_dir = `/usr/bin/find $backup_directory -mtime 28 -type d`; if ($old_dir eq "") { print "Keine alten Backup-Verzeichnisse gefunden.\n\n" } else { chomp $old_dir; # delete old backups print "\nLoesche alte Backup-Verzeichnisse: "; system "/bin/rm -vf $old_dir/*"; rmdir $old_dir; print "fertig\n\n"; } # start to backup mysql-db print "Erstelle Backup der MySQL-DB und komprimiere File mit bzip2\n"; # dump all the DBs we want to backup my $sth = $dbh->prepare(qq{ show databases }); $sth->execute(); while (my ($db_name) = $sth->fetchrow_array()) # keep fetching until there's nothing left { my $dump_file = "$backup_dir/mysql_db.$db_name.dump"; $dump_file =~ s/\ /_/; print "Database to be backuped: $db_name... "; system "/usr/bin/mysqldump -c -e -l -q --flush-logs -u$db_user_name -p$db_password '$db_name'
$dump_file"; system "/usr/bin/bzip2 -sv4 $dump_file"; } $sth->finish();
# restart the update log to log to a new file! system "/usr/bin/mysqladmin-u$db_user_name -p$db_password refresh"; # set mode to 0400 print "\nSetze Rechte... "; system "/bin/chmod 0400 $backup_dir/*"; print "fertig\n\n"; $dbh->disconnect(); </schnipp> Läuft hier zusammen mit einigen anderen Backupscripts. Gruß Udo -- Um die Liste abzubestellen, schicken Sie eine Mail an: opensuse-de+unsubscribe@opensuse.org Um eine Liste aller verfuegbaren Kommandos zu bekommen, schicken Sie eine Mail an: opensuse-de+help@opensuse.org
participants (4)
-
Horst Templer
-
Michael Herrmann
-
Rolf Masfelder
-
Udo Neist