我有一个将数据复制到外部磁盘的应用程序。复制请求存储在 MySQL 数据库中,并将从多个复制机读取,这些复制机运行 bash 脚本来获取请求。一旦请求被接收,它就会在数据库中被设置为“进行中”。但是,我试图避免多台机器同时读取请求并开始复制相同数据的情况。
我打算使用表锁定来执行此操作,但我很挣扎,因为当 session 过期时表锁就会过期,因此如果我这样做:
mysql="mysql -h dbhost -u user -pPassword diskcopydb"
echo "LOCK tables diskcopy WRITE;" | $mysql
echo "SELECT SQL_NO_CACHE * FROM diskcopy WHERE status=\"request\"" | $mysql
在获取请求时锁实际上已经过期,因此竞争条件仍然存在。这里有一个问题:
MySQL from the command line - can I practically use LOCKs?
其中 SQL 命令被打包到一个 block 中,并将它们一起通过管道传输到 MySQL,但我需要从中途获取 MySQL 的输出来接收请求。有人有这个的食谱吗?看起来它应该是一个相当常见的用例......
最佳答案
这个问题实际上在这里得到了回答:
Bulk insert of MySQL related tables from bash
换句话来说,使用 Bash 与 MySQL 进行双向通信会很棘手,而使用 Perl 或 Python 等“适当的”编程语言会更容易,您可以在其中打开和保持连接。
关于mysql - 避免 Bash 脚本中的 MySQL 读取竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12461344/