Skip to content

Instantly share code, notes, and snippets.

@vebutton
Created January 7, 2026 18:17
Show Gist options
  • Select an option

  • Save vebutton/aeb96a4aa200ec14e0aeb3e61780c9db to your computer and use it in GitHub Desktop.

Select an option

Save vebutton/aeb96a4aa200ec14e0aeb3e61780c9db to your computer and use it in GitHub Desktop.
QGA Sample MySQL
#!/bin/sh
# Flush MySQL tables to disk before the filesystem is frozen.
# Keeps a read lock to avoid write accesses from other clients until thawed.
MYSQL="/usr/bin/mysql"
MYSQL_OPTS="-uroot" # "-prootpassword"
FIFO="/var/run/mysql-flush.fifo"
# Check if mysql is installed and the server is running
if ! [ -x "$MYSQL" ] || ! "$MYSQL" $MYSQL_OPTS < /dev/null; then
exit 0
fi
flush_and_wait() {
printf "FLUSH TABLES WITH READ LOCK \\G\n"
trap 'printf "$(date): $0 is killed\n" >&2' HUP INT QUIT ALRM TERM
read < "$FIFO"
printf "UNLOCK TABLES \\G\n"
rm -f "$FIFO"
}
case "$1" in
freeze)
mkfifo "$FIFO" || exit 1
flush_and_wait | "$MYSQL" $MYSQL_OPTS &
# Wait until every block is flushed
while [ "$(echo 'SHOW STATUS LIKE "Key_blocks_not_flushed"' | "$MYSQL" $MYSQL_OPTS | tail -1 | cut -f 2)" -gt 0 ]; do
sleep 1
done
# For InnoDB, wait until every log is flushed
INNODB_STATUS=$(mktemp /tmp/mysql-flush.XXXXXX)
[ $? -ne 0 ] && exit 2
trap "rm -f $INNODB_STATUS; exit 1" HUP INT QUIT ALRM TERM
while :; do
printf "SHOW ENGINE INNODB STATUS \\G" | "$MYSQL" $MYSQL_OPTS > "$INNODB_STATUS"
LOG_CURRENT=$(grep 'Log sequence number' "$INNODB_STATUS" | tr -s ' ' | cut -d' ' -f4)
LOG_FLUSHED=$(grep 'Log flushed up to' "$INNODB_STATUS" | tr -s ' ' | cut -d' ' -f5)
[ "$LOG_CURRENT" = "$LOG_FLUSHED" ] && break
sleep 1
done
rm -f "$INNODB_STATUS"
;;
thaw)
[ ! -p "$FIFO" ] && exit 1
echo > "$FIFO"
;;
*)
exit 1
;;
esac
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment