mysqldump: Datenbanken ignorieren

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

  1. #!/usr/bin/env sh
  2. # Dump selected mysql databases via mysqldump and write
  3. # the complete dump in a single file including master-data
  4. #
  5. # @copyright 2012 Stefan Konarski
  6. # @license BSD License
  7. # @version 0.1
  8. #
  9.  
  10. # Compress backup files
  11. #pack=$(which bzip2)
  12. pack=''
  13.  
  14. # mysqldump binary
  15. dump=$(which mysqldump)
  16. if [ ! -x $dump ]; then
  17. echo "$dump not executable"
  18. exit 1
  19. fi
  20.  
  21. # mysql binary
  22. mysql=$(which mysql)
  23. if [ ! -x $mysql ]; then
  24. echo "$mysql not executable"
  25. exit 1
  26. fi
  27.  
  28. # file for temporary data
  29. data=$(mktemp /tmp/$(basename $0).XXXXXX) || exit 1
  30. # trap it
  31. trap "rm -f $data" 0 1 2 5 15
  32.  
  33. # Read password and concatenate login string
  34. dialog --title "Mysql user root" --clear --insecure --passwordbox "Enter password" 10 30 2> $data
  35. pw=$(cat $data)
  36. if [ "" = "$pw" ]; then
  37. dblogin="-u root"
  38. else
  39. dblogin="-u root -p$pw"
  40. fi
  41.  
  42. # Fetch databases
  43. alldbs="$($mysql $dblogin -Bse 'show databases')"
  44. # initialize database counter and checkbox options
  45. dbc=0
  46. opt=""
  47. for db in $alldbs; do
  48. opt="$opt $db $dbc off"
  49. dbc=$(($dbc+1))
  50. done
  51.  
  52. # Define height more flexible
  53. height=$((5+$dbc))
  54. if [ $height -gt 25 ]; then
  55. height=25
  56. fi
  57.  
  58. dialog --checklist "Choose databases for dump:" $height 40 30 $opt 2>$data
  59. mydb=$(cat "${data}")
  60.  
  61. # Concatenate database string
  62. databases="";
  63. for db in $mydb; do
  64. d=$(echo $db | sed -e "s/^.//" | sed -e "s/.$//")
  65. databases="$databases $d"
  66. done
  67.  
  68. # Master data
  69. dialog --yesno "Write master informations (--master-data)" 0 0
  70. if [ 1 = $? ]; then
  71. mopt=''
  72. else
  73. mopt="--master-data"
  74. fi
  75.  
  76. dialog --inputbox "Enter dump file name" 0 0 2> $data
  77. fn=$(cat "${data}")
  78.  
  79. $dump $mopt $dblogin --databases $databases --result-file=$fn
  80.  
  81. dialog --msgbox "Done! Databases $databases has been saved." 0 0
  82. dialog --clear