xref: /openbmc/qemu/scripts/qemu-guest-agent/fsfreeze-hook.d/mysql-flush.sh.sample (revision 63e3555e80c31776285accbb4d0c14ae91c457dc)
1*96610da2STomoki Sekiyama#!/bin/sh
2*96610da2STomoki Sekiyama
3*96610da2STomoki Sekiyama# Flush MySQL tables to the disk before the filesystem is frozen.
4*96610da2STomoki Sekiyama# At the same time, this keeps a read lock in order to avoid write accesses
5*96610da2STomoki Sekiyama# from the other clients until the filesystem is thawed.
6*96610da2STomoki Sekiyama
7*96610da2STomoki SekiyamaMYSQL="/usr/bin/mysql"
8*96610da2STomoki SekiyamaMYSQL_OPTS="-uroot" #"-prootpassword"
9*96610da2STomoki SekiyamaFIFO=/var/run/mysql-flush.fifo
10*96610da2STomoki Sekiyama
11*96610da2STomoki Sekiyama# Check mysql is installed and the server running
12*96610da2STomoki Sekiyama[ -x "$MYSQL" ] && "$MYSQL" $MYSQL_OPTS < /dev/null || exit 0
13*96610da2STomoki Sekiyama
14*96610da2STomoki Sekiyamaflush_and_wait() {
15*96610da2STomoki Sekiyama    printf "FLUSH TABLES WITH READ LOCK \\G\n"
16*96610da2STomoki Sekiyama    trap 'printf "$(date): $0 is killed\n">&2' HUP INT QUIT ALRM TERM
17*96610da2STomoki Sekiyama    read < $FIFO
18*96610da2STomoki Sekiyama    printf "UNLOCK TABLES \\G\n"
19*96610da2STomoki Sekiyama    rm -f $FIFO
20*96610da2STomoki Sekiyama}
21*96610da2STomoki Sekiyama
22*96610da2STomoki Sekiyamacase "$1" in
23*96610da2STomoki Sekiyama    freeze)
24*96610da2STomoki Sekiyama        mkfifo $FIFO || exit 1
25*96610da2STomoki Sekiyama        flush_and_wait | "$MYSQL" $MYSQL_OPTS &
26*96610da2STomoki Sekiyama        # wait until every block is flushed
27*96610da2STomoki Sekiyama        while [ "$(echo 'SHOW STATUS LIKE "Key_blocks_not_flushed"' |\
28*96610da2STomoki Sekiyama                 "$MYSQL" $MYSQL_OPTS | tail -1 | cut -f 2)" -gt 0 ]; do
29*96610da2STomoki Sekiyama            sleep 1
30*96610da2STomoki Sekiyama        done
31*96610da2STomoki Sekiyama        # for InnoDB, wait until every log is flushed
32*96610da2STomoki Sekiyama        INNODB_STATUS=$(mktemp /tmp/mysql-flush.XXXXXX)
33*96610da2STomoki Sekiyama        [ $? -ne 0 ] && exit 2
34*96610da2STomoki Sekiyama        trap "rm -f $INNODB_STATUS; exit 1" HUP INT QUIT ALRM TERM
35*96610da2STomoki Sekiyama        while :; do
36*96610da2STomoki Sekiyama            printf "SHOW ENGINE INNODB STATUS \\G" |\
37*96610da2STomoki Sekiyama                "$MYSQL" $MYSQL_OPTS > $INNODB_STATUS
38*96610da2STomoki Sekiyama            LOG_CURRENT=$(grep 'Log sequence number' $INNODB_STATUS |\
39*96610da2STomoki Sekiyama                          tr -s ' ' | cut -d' ' -f4)
40*96610da2STomoki Sekiyama            LOG_FLUSHED=$(grep 'Log flushed up to' $INNODB_STATUS |\
41*96610da2STomoki Sekiyama                          tr -s ' ' | cut -d' ' -f5)
42*96610da2STomoki Sekiyama            [ "$LOG_CURRENT" = "$LOG_FLUSHED" ] && break
43*96610da2STomoki Sekiyama            sleep 1
44*96610da2STomoki Sekiyama        done
45*96610da2STomoki Sekiyama        rm -f $INNODB_STATUS
46*96610da2STomoki Sekiyama        ;;
47*96610da2STomoki Sekiyama
48*96610da2STomoki Sekiyama    thaw)
49*96610da2STomoki Sekiyama        [ ! -p $FIFO ] && exit 1
50*96610da2STomoki Sekiyama        echo > $FIFO
51*96610da2STomoki Sekiyama        ;;
52*96610da2STomoki Sekiyama
53*96610da2STomoki Sekiyama    *)
54*96610da2STomoki Sekiyama        exit 1
55*96610da2STomoki Sekiyama        ;;
56*96610da2STomoki Sekiyamaesac
57