Correction : résilience des sauvegardes MySQL et 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 errno=0
19 while IFS='' read -r database
20 do {
21 test "${database:+set}"
22 if test -e ~backup/snapshot/mysql/$database
23 then
24 cat >&2 <<-EOF
25 ERROR: soit une sauvegarde est déjà en cours, soit une précédente a échoué.
26 EOF
27 false
28 fi
29 can_hotcopy=yes
30 while IFS=' ' read -r table engine
31 do
32 case $engine in
33 (MyISAM|ARCHIVE) :;;
34 (*) can_hotcopy=no;;
35 esac
36 done <<-EOF
37 $(mysql -u backup --batch --skip-column-names <<-EOF
38 SELECT table_name,engine
39 FROM information_schema.tables
40 WHERE table_schema = '$database';
41 EOF
42 )
43 EOF
44 case $can_hotcopy in
45 (yes)
46 cd /
47 sudo -u root find ~mysql-data -mindepth 1 -maxdepth 1 -type d -exec \
48 install -d -m 750 -o mysql -g backup {} +
49 cd - >/dev/null 2>&1
50 test "${TRACE:+set}" || quiet=--quiet
51 mysqlhotcopy --method=cp -u backup ${quiet:-} \
52 "$database" ~backup/snapshot/mysql
53 ;;
54 (no)
55 install -d -m 770 -o backup -g backup \
56 ~backup/snapshot/mysql/"$database"
57 mysqldump --opt --events -u backup ${TRACE:+--verbose} \
58 --result-file ~backup/snapshot/mysql/$database/dump.sql \
59 "$database"
60 ;;
61 esac
62 eval "$@"
63 rm -rf \
64 ~backup/snapshot/mysql/"$database"
65 } || {
66 errno=$?
67 cat >&2 <<-EOF
68 ERROR: $0 "$database" "$@"
69 EOF
70 if test "${database:+set}"
71 then rm -rf ~backup/snapshot/mysql/"$database"
72 fi
73 }
74 done <<-EOF
75 $(mysql -u backup --batch --skip-column-names <<-EOF
76 SELECT schema_name
77 FROM information_schema.schemata
78 WHERE schema_name NOT IN ('information_schema', 'performance_schema')
79 AND schema_name LIKE '$database_pattern';
80 EOF
81 )
82 EOF
83 exit $errno