mysqldump: Datenbanken ignorieren
Letzte Änderung am 08.02.2012
Eine Option um Datenbanken beim Sichern zu ignorieren gibt es nicht. Abhilfe schafft dieses kleine Script.
Funktionsweise
Nachdem die ausführbaren Dateien mysql und mysqldump gefunden wurden, wird nach dem Passwort des Datenbank-Benutzers root gefragt. Damit werden alle verfügbaren Datenbanken ermittelt aus denen eine Auswahl getroffen werden kann
Es besteht dann die Möglichkeit zu wählen, ob die Option "--master-data" angewendet werden soll.
Nach Eingabe eines Dateinamens wird der Inhalt der selektierten Datenbanken von mysqldump in diese Datei geschrieben.
Das Script ist unsicher, weil:
- das Passwort des MySQL-Benutzers root kurzfristig in eine Datei geschrieben wird
- das Passwort dann unverschlüsselt im Hauptspeicher verbleibt und unter Umständen in den Cache geschrieben werden kann
- eine Datei mit der Bezeichnung der Ausgabedatei von mysqldump ohne Rückfrage überschreiben wird (sofern Rechte dazu bestehen)
Das Script
#!/usr/bin/env sh # Dump selected mysql databases via mysqldump and write # the complete dump in a single file including master-data # # @copyright 2012 Stefan Konarski # @license BSD License # @version 0.1 # # Compress backup files #pack=$(which bzip2) pack='' # mysqldump binary dump=$(which mysqldump) if [ ! -x $dump ]; then echo "$dump not executable" exit 1 fi # mysql binary mysql=$(which mysql) if [ ! -x $mysql ]; then echo "$mysql not executable" exit 1 fi # file for temporary data data=$(mktemp /tmp/$(basename $0).XXXXXX) || exit 1 # trap it trap "rm -f $data" 0 1 2 5 15 # Read password and concatenate login string dialog --title "Mysql user root" --clear --insecure --passwordbox "Enter password" 10 30 2> $data pw=$(cat $data) if [ "" = "$pw" ]; then dblogin="-u root" else dblogin="-u root -p$pw" fi # Fetch databases alldbs="$($mysql $dblogin -Bse 'show databases')" # initialize database counter and checkbox options dbc=0 opt="" for db in $alldbs; do opt="$opt $db $dbc off" dbc=$(($dbc+1)) done # Define height more flexible height=$((5+$dbc)) if [ $height -gt 25 ]; then height=25 fi dialog --checklist "Choose databases for dump:" $height 40 30 $opt 2>$data mydb=$(cat "${data}") # Concatenate database string databases=""; for db in $mydb; do d=$(echo $db | sed -e "s/^.//" | sed -e "s/.$//") databases="$databases $d" done # Master data dialog --yesno "Write master informations (--master-data)" 0 0 if [ 1 = $? ]; then mopt='' else mopt="--master-data" fi dialog --inputbox "Enter dump file name" 0 0 2> $data fn=$(cat "${data}") $dump $mopt $dblogin --databases $databases --result-file=$fn dialog --msgbox "Done! Databases $databases has been saved." 0 0 dialog --clear