]> arthur.barton.de Git - MkMySqlDump.git/blob - bin/mkmysqldump
Don't output command, it could contain passwords!
[MkMySqlDump.git] / bin / mkmysqldump
1 #!/bin/sh
2 #
3 # mkmysqldump -- dump MySQL (master) data
4 # Copyright (c)2015 Alexander Barton <alex@barton.de>
5 #
6
7 NAME=$(basename "$0")
8
9 # Defaults
10 MYHOST="localhost"
11 MYUSER="root"
12 MYPW=""
13 OUTFILE="$(hostname -s)-$(date "+%Y%m%d-%H%M%S").sql"
14 STATS=""
15 COMPRESS=""
16
17 Help() {
18         echo "$NAME [<options> ...]"
19         echo
20         echo "  --host|-h <host>"
21         echo "      MySQL server hostname [\"$MYHOST\"]."
22         echo "  --user|-u <user>"
23         echo "      MySQL server user [\"$MYUSER\"]."
24         echo "  --password|-p <password>"
25         echo "      MySQL server password [\"$MYPW\"]".
26         echo "  --outfile|-o <file>"
27         echo "      Path and name of SQL dump file [\"$OUTFILE\"]."
28         echo "  --outdir|-d <directory>"
29         echo "      Directory for automatically named dump files."
30         echo "  --summary|-s"
31         echo "      Display file and file system status summary."
32         echo "  --gzip"
33         echo "      Compress SQL dump file using gzip(1)"
34         echo "  --bzip2"
35         echo "      Compress SQL dump file using bzip2(1)"
36         echo "  --xz"
37         echo "      Compress SQL dump file using xz(1)"
38         echo
39 }
40
41 Usage() {
42         Help
43         exit 2
44 }
45
46 ErrorNotice() {
47         echo
48         echo "----->  THERE HAVE BEEN ERRORS!  <-----"
49         echo
50 }
51
52 for cmd in mysql mysqldump; do
53         if ! which "$cmd" >/dev/null 2>&1; then
54                 echo "$NAME: \"$cmd\" command not found!"
55                 exit 1
56         fi
57 done
58
59 while [ $# -gt 0 ]; do
60         case "$1" in
61           "--host"|"-h")
62                 [ $# -ge 2 ] || Usage
63                 MYHOST="$2"
64                 shift 2
65                 ;;
66           "--user"|"-u")
67                 [ $# -ge 2 ] || Usage
68                 MYHOST="$2"
69                 shift 2
70                 ;;
71           "--password"|"-p")
72                 [ $# -ge 2 ] || Usage
73                 MYPW="$2"
74                 shift 2
75                 ;;
76           "--outfile"|"-o")
77                 [ $# -ge 2 ] || Usage
78                 OUTFILE="$2"
79                 shift 2
80                 ;;
81           "--outdir"|"-d")
82                 [ $# -ge 2 ] || Usage
83                 OUTFILE="$2/$(hostname -s)-$(date "+%Y%m%d-%H%M%S").sql"
84                 shift 2
85                 ;;
86           "--gzip")
87                 COMPRESS="gzip -v"
88                 shift
89                 ;;
90           "--bzip2")
91                 COMPRESS="bzip2 -v"
92                 shift
93                 ;;
94           "--xz")
95                 COMPRESS="xz -v"
96                 shift
97                 ;;
98           "--summary"|"-s")
99                 STATS=1
100                 shift
101                 ;;
102           "--help")
103                 Help
104                 exit 0
105                 ;;
106           *)
107                 Usage
108         esac
109 done
110
111 echo "Dumping MySQL server on \"$MYHOST\" (user \"$MYUSER\"):"
112 echo "Started: $(date)"
113 umask 0077
114
115 [ -n "$MYPW" ] && PWSWITCH="--password='$MYPW'" || PWSWITCH=""
116
117 echo "Getting list of databases from server ..."
118 DATABASES=$(
119         mysql -h "$MYHOST" -u "$MYUSER" $PWSWITCH -e 'show databases' \
120          | grep "^\| " | cut -d' ' -f2 | grep -v "Database" \
121          | grep -v "information_schema" \
122          | grep -v "performance_schema" \
123          | grep -v "mysql"
124 )
125 if [ $? -ne 0 ]; then
126         echo "Failed to get list of databases! Aborting!"
127         ErrorNotice
128         exit 1
129 fi
130
131 echo "Will dump the following databases:"
132 for d in $DATABASES; do
133         echo " - $d"
134 done
135
136 echo "Dumping SQL data to file \"$OUTFILE\" ..."
137 echo "Start date: $(date)"
138 CMD="mysqldump \
139         -h $MYHOST \
140         -u $MYUSER \
141         $PWSWITCH \
142         --master-data=1 \
143         --databases $DATABASES"
144 $CMD >"$OUTFILE"; r=$?
145 if [ -n "$COMPRESS" -a -s "$OUTFILE" -a $r -eq 0 ]; then
146         echo "Dump done: $(date)"
147         echo "Compressing dump file ($COMPRESS) ..."
148         $COMPRESS "$OUTFILE"
149 fi
150 echo "End: $(date)"
151 echo
152
153 if [ -n "$STATS" ]; then
154         echo "SQL dump file"
155         for f in "$OUTFILE"*; do
156                 ls -lh "$f"*
157         done
158         echo
159         df -h "$(dirname "$OUTFILE")"
160         echo
161 fi
162
163 if [ $r -eq 0 ]; then
164         echo "Dump command exited with code 0, success."
165 else
166         echo "Dump command FAILED with code $r!" >&2
167         ErrorNotice
168 fi
169
170 echo
171 exit $r