我这样做,与使用MySQL的相互作用于数据库的bash脚本mysql
命令行程序。 我想在我的SQL使用表锁。 我能做到这一点?
mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"
我问,究其原因是因为表锁只为会话,所以不会锁尽快为MySQL的程序完成释放?
我这样做,与使用MySQL的相互作用于数据库的bash脚本mysql
命令行程序。 我想在我的SQL使用表锁。 我能做到这一点?
mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"
我问,究其原因是因为表锁只为会话,所以不会锁尽快为MySQL的程序完成释放?
[编辑]
号过的基本思路-只运行“mysql的”一次,并提供应该工作的液体制剂,但它留下的FIFO在磁盘上。
号也是正确的,我搞砸了:一个简单的“ echo X >FIFO
”将关闭FIFO; 我记错。 而我(删除)评论WRT时机并不适用,对不起。
这就是说,你并不需要一个FIFO,你可以使用进程间的管道。 并通过我的旧版本的MySQL剧本看,一些工作类似,但你不能让任何命令写入stdout(没有一些“执行”的技巧)。
#!/bin/bash
(
echo "LOCK TABLES mytable READ ;"
echo "Doing something..." >&2
echo "describe mytable;"
sleep 5
echo "UNLOCK tables;"
) | mysql ${ARGUMENTS}
另一种选择可能是一个文件描述符分配到FIFO,然后把它在后台运行。 这非常类似于号一样,但“执行”选项,将不需要一个子shell来运行的bash命令; 因此,将允许你在“其他东西”设置“RC”:
#!/bin/bash
# Use the PID ($$) in the FIFO and remove it on exit:
FIFO="/tmp/mysql-pipe.$$"
mkfifo ${FIFO} || exit $?
RC=0
# Tie FD3 to the FIFO (only for writing), then start MySQL in the u
# background with its input from the FIFO:
exec 3<>${FIFO}
mysql ${ARGUMENTS} <${FIFO} &
MYSQL=$!
trap "rm -f ${FIFO};kill -1 ${MYSQL} 2>&-" 0
# Now lock the table...
echo "LOCK TABLES mytable WRITE;" >&3
# ... do your other stuff here, set RC ...
echo "DESCRIBE mytable;" >&3
sleep 5
RC=3
# ...
echo "UNLOCK TABLES;" >&3
exec 3>&-
# You probably wish to sleep for a bit, or wait on ${MYSQL} before you exit
exit ${RC}
请注意,有几个控制问题:
这里有一种方法,我敢肯定有但更简单的方法..
mkfifo /tmp/mysql-pipe
mysql mydb </tmp/mysql-pipe &
(
echo "LOCK TABLES mytable READ ;" 1>&6
echo "Doing something "
echo "UNLOCK tables;" 1>&6
) 6> /tmp/mysql-pipe
一个非常有趣的方法,我发现了,而寻找到这个问题,我自己的,是使用MySQL的SYSTEM
命令。 我仍然不肯定到底有什么缺陷,如果有的话,但它肯定会为很多的情况下工作:
例:
mysql <<END_HEREDOC
LOCK TABLES mytable;
SYSTEM /path/to/script.sh
UNLOCK TABLES;
END_HEREDOC
值得一提的是这仅适用于* nix中,显然, 一样的SYSTEM
命令 。
幸得丹尼尔Kadosh: http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html#c10447
没有另一种方法mkfifo
命令:
cat <(echo "LOCK TABLES mytable;") <(sleep 3600) | mysql &
LOCK_PID=$!
# BASH STUFF
kill $LOCK_PID
我认为,AMR的答案是简单的。 不过,我想分享这一点,因为别人可能还需要一个稍微不同的答案。
的sleep 3600
暂停1小时输入。 你可以找到其他的命令,使其暂停一下: https://unix.stackexchange.com/questions/42901/how-to-do-nothing-forever-in-an-elegant-way
该lock tables
SQL立即运行,那么它会等待睡眠定时器。