gpt4 book ai didi

mysql - 如何锁定一个mysql数据库中的所有表?

转载 作者:可可西里 更新时间:2023-11-01 06:28:33 24 4
gpt4 key购买 nike

我编写了一个备份 shell 脚本来执行 mysqldump。

mysqldump -u$BACKUP_USER -p$BACKUP_PASS --flush-logs --lock-tables $DB_NAME > $SQL_FILE

我的数据库的存储引擎是 MyISAM。所以我不能使用 --single-transaction 选项。--lock-tables 在mysqldump 进程中只锁定一个表。我的 MySQL 实例中有很多数据库,我不想使用 --lock-all-tables,它会锁定我服务器中运行的所有数据库。那么,如何同时锁定一个 mysql 数据库中的所有表以便我可以转储它?

最佳答案

目前这不是最漂亮的解决方案,但它确实有效。我有同样的需要,这是我的解决方案,稍作修改以匹配您的变量名称。我假设您在 Linux 上运行 MySQL,因为这在很大程度上依赖于 shell BASH 语义。如果您使用的是 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

关于mysql - 如何锁定一个mysql数据库中的所有表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14050627/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com