MySQL的命令行 - 我可以实际使用的锁?(MySQL from the command line

2019-08-02 08:32发布

我这样做,与使用MySQL的相互作用于数据库的bash脚本mysql命令行程序。 我想在我的SQL使用表锁。 我能做到这一点?

mysql -e "LOCK TABLES mytable"
# do some bash stuff
mysql -u "UNLOCK TABLES"

我问,究其原因是因为表锁只为会话,所以不会锁尽快为MySQL的程序完成释放?

Answer 1:

[编辑]

过的基本思路-只运行“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}

请注意,有几个控制问题:

  • 此代码具有没有错误检查对未锁定(或“其它东西”内的任何SQL命令)。 这绝对是不平凡的。
  • 由于在第一个例子中,“其他的东西”是一个子shell中,你不能轻易设置从上下文脚本的返回码。


Answer 2:

这里有一种方法,我敢肯定有但更简单的方法..

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


Answer 3:

一个非常有趣的方法,我发现了,而寻找到这个问题,我自己的,是使用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



Answer 4:

没有另一种方法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立即运行,那么它会等待睡眠定时器。



文章来源: MySQL from the command line - can I practically use LOCKs?