aboutsummaryrefslogtreecommitdiff
path: root/handlers/mysql
blob: 4439bcc533173f84b9ca962ada281781d11f756e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#
# mysql handler script for backupninja
#

getconf backupdir /var/backups/mysql
getconf databases all
getconf compress yes
getconf dbusername
getconf dbpassword
getconf dbhost localhost
getconf hotcopy no
getconf sqldump no
getconf user root

# create backup dirs

[ -d $backupdir ] || mkdir -p $backupdir
[ -d $backupdir ] || fatal "Backup directory '$backupdir'"
hotdir="$backupdir/hotcopy"
dumpdir="$backupdir/sqldump"
[ "$sqldump" == "no" -o -d $dumpdir ] || mkdir -p $dumpdir
[ "$hotcopy" == "no" -o -d $hotdir ] || mkdir -p $hotdir

# create .my.cnf
 # (we do this because we don't want to have to specify the password on the command line
 # because then anyone would be able to see it with a 'ps aux'. instead, we create a 
 # temporary ~/.my.cnf in root's home directory).

if [ "$dbusername" != "" ]; then
	home=`grep '^root' /etc/passwd | awk -F: '{print $6}'`
	[ -d $home ] || fatal "Can't find root's home directory ($home)."
	mycnf="$home/.my.cnf"
	if [ -f $mycnf ]; then
		# rename temporarily
		tmpcnf="$home/my.cnf.disable"
		debug 0 "mv $mycnf $tmpcnf"
		mv $mycnf $tmpcnf
	fi
	oldmask=`umask`
	umask 077
	cat > $mycnf <<EOF
# auto generated backupninja mysql conf
[mysql]
user=$dbusername
password=$dbpassword

[mysqldump]
user=$dbusername
password=$dbpassword

[mysqlhotcopy]
user=$dbusername
password=$dbpassword
EOF
	umask $oldmask
fi
	
## HOT COPY

if [ "$hotcopy" == "yes" ]; then 
	if [ "$databases" == "all" ]; then
		execstr="$MYSQLHOTCOPY --quiet --allowold --regexp /.\*/./.\*/ $hotdir"
		debug 0 "su $user -c '$execstr'"
		if [ ! $test ]; then
			output=`su $user -c "$execstr" 2>&1`
			code=$?
			if [ "$code" == "0" ]; then
				debug 0 $output
				debug 1 "Successfully finished hotcopy of all mysql databases"
			else
				debug 2 $output
				debug 2 "Failed to hotcopy all mysql databases"
			fi
		fi
	else	
		for db in $databases; do
			execstr="$MYSQLHOTCOPY --allowold $db $hotdir"
			debug 0 "su $user -c '$execstr'"
			if [ ! $test ]; then
				output=`su $user -c "$execstr" 2>&1`
				code=$?
				if [ "$code" == "0" ]; then
					debug 0 $output
					debug 1 "Successfully finished hotcopy of mysql database $db"
				else
					debug 2 $output
					debug 2 "Failed to hotcopy mysql database $db"
				fi
			fi
		done
	fi
fi
	
## SQL DUMP

if [ "$sqldump" == "yes" ]; then
	if [ "$databases" == "all" ]; then
		databases=`echo 'show databases' | su $user -c "$MYSQL" | grep -v Database`
	fi

	for db in $databases; do
		execstr="$MYSQLDUMP --lock-tables --complete-insert --add-drop-table --quick --quote-names $db > $dumpdir/${db}.sql"
		debug 0 "su $user -c '$execstr'"
		if [ ! $test ]; then
			output=`su $user -c "$execstr" 2>&1`
			code=$?
			if [ "$code" == "0" ]; then
				debug 0 $output
				debug 1 "Successfully finished dump of mysql database $db"
			else
				debug 2 $output
				debug 2 "Failed to dump mysql databases $db"
			fi
		fi
	done
	
	if [ "$compress" == "yes" ]; then
		output=`$GZIP -f $dumpdir/*.sql 2>&1`
		debug 0 $output
	fi
fi

if [ "$dbusername" != "" ]; then
	## clean up tmp config file
	debug 0 "rm $mycnf"
	rm $mycnf
	if [ -f "$tmpcnf" ]; then
		debug 0 "mv $tmpcnf $mycnf"
		mv $tmpcnf $mycnf
	fi
fi

return 0