これまでで最も美しいソリューションではありませんが、これは機能します。私は同じニーズを持っていました。これが私の解決策です。変数名に合わせてわずかに変更されています。これはシェル BASH セマンティクスに大きく依存しているため、Linux で MySQL を実行していると想定しています。Windows を使用している場合、これはおそらく機能しません。
# Mysql script to lock all tables in one DB
# (such as to get a consistent export dump of one database)
MYSQLCMD="mysql -u$BACKUP_USER -p$BACKUP_PASS -A"
function lock_db {
[ -e "/tmp/mysql-db-lock-${1}" ] && rm "/tmp/mysql-db-lock-${1}"
mkfifo "/tmp/mysql-db-lock-${1}"
(
(
echo "SELECT CONCAT( 'LOCK TABLES '
, GROUP_CONCAT(CONCAT('\`',table_name,'\`'),' WRITE')
, ';'
) AS \"-- Statement to lock tables\"
FROM information_schema.tables
WHERE table_schema='${1}'
ORDER BY table_name;
" | $MYSQLCMD
echo "\! cat '/tmp/mysql-db-lock-${1}' >/dev/null"
echo 'UNLOCK TABLES;'
) | $MYSQLCMD -D"${1}"
rm "/tmp/mysql-db-lock-${1}"
) &
}
function unlock_db {
>"/tmp/mysql-db-lock-${1}"
}
# Lock one database, all tables
lock_db $DB_NAME
# Verify locks have been placed
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD
# Do whatever here that you needed the locked db for
mysqldump -u$BACKUP_USER -p$BACKUP_PASS $DB_NAME > $SQL_FILE
# Release locks
unlock_db $DB_NAME
# Verify locks released
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD