Ajout : sauvegardes automatiques des bases postgresql.
[lhc/ateliers.git] / local / backup / mysql-snapshot
1 #!/bin/sh -eu
2 # SYNTAX: $database_pattern -- $snapshot_eval
3 # DESCRIPTION: crée un instantané pour chaque base de données MySQL $database donnée
4 # DESCRIPTION: dans ~backup/snapshot/mysql/"$database",
5 # DESCRIPTION: puis évalue $snapshot_eval,
6 # DESCRIPTION: puis efface l'instantané.
7 ${TRACE:+set -x}
8
9 test "$(id -u)" = "$(id -u backup)"
10
11 database_pattern=$1; shift
12 test ! "${1-}" = -- || shift
13 test ! $# = 0 || set -- :
14
15 install -d -m 770 -o backup -g backup \
16 ~backup/snapshot/mysql
17
18 snapshot () {
19 local database="$1" && shift &&
20 test ! -e ~backup/snapshot/mysql/"$database" &&
21 # NOTE: soit une sauvegarde est déjà en cours,
22 # soit une précédente a échoué.
23 can_hotcopy=yes &&
24 while IFS=' ' read -r table engine
25 do
26 case $engine in
27 (MyISAM|ARCHIVE) :;;
28 (*) can_hotcopy=no;;
29 esac
30 done <<-EOF &&
31 $(mysql -u backup --batch --skip-column-names <<-EOF || exit 1
32 SELECT table_name,engine
33 FROM information_schema.tables
34 WHERE table_schema = '$database';
35 EOF
36 )
37 EOF
38 case $can_hotcopy in
39 (yes)
40 cd / &&
41 sudo -u root find ~mysql-data -mindepth 1 -maxdepth 1 -type d -exec \
42 install -d -m 750 -o mysql -g backup {} + &&
43 cd - >/dev/null 2>&1 &&
44 test "${TRACE:+set}" || quiet=--quiet &&
45 mysqlhotcopy --method=cp -u backup ${quiet:-} \
46 "$database" ~backup/snapshot/mysql
47 ;;
48 (no)
49 install -d -m 770 -o backup -g backup \
50 ~backup/snapshot/mysql/"$database" &&
51 mysqldump --opt --events -u backup ${TRACE:+--verbose} \
52 --result-file ~backup/snapshot/mysql/"$database"/dump.sql \
53 "$database"
54 ;;
55 esac &&
56 eval "$@" &&
57 rm -rf \
58 ~backup/snapshot/mysql/"$database"
59 }
60
61 exit=0
62 while IFS=' ' read -r database
63 do if ! snapshot "$database" "$@"
64 then
65 exit=1
66 cat >&2 <<-EOF
67 ERROR: snapshot "$database" "$@"
68 EOF
69 fi
70 done <<-EOF
71 $(mysql -u backup --batch --skip-column-names <<-EOF || exit 1
72 SELECT schema_name
73 FROM information_schema.schemata
74 WHERE schema_name NOT IN ('information_schema', 'performance_schema')
75 AND schema_name LIKE '$database_pattern';
76 EOF
77 )
78 EOF
79 exit $exit