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