Warm tip: This article is reproduced from serverfault.com, please click

bash-命令行中的MySQL

(bash - MySQL from the command line)

发布于 2009-08-24 20:50:08

我正在做一个使用mysql命令行程序与MySQL数据库交互的bash脚本我想在SQL中使用表锁。我可以这样做吗?

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

我问的原因是因为表锁只为会话保留,所以一旦mysql程序完成,就不会释放该锁吗?

Questioner
Rory
Viewed
0
NVRAM 2009-08-26 00:22:59

[编辑]

nos的基本思想是-只运行一次“ mysql”,提供的解决方案nos应该可以工作,但是它将FIFO保留在磁盘上。

也是正确的,我搞砸了:一个简单的“ echo X >FIFO”将关闭FIFO; 我记错了。抱歉,我的(已删除)评论不适用时间。

就是说,你不需要FIFO,可以使用进程间管道。并查看我的旧MySQL脚本,有些类似于此,但是你不能让任何命令写入stdout(没有一些“ exec”技巧)。

#!/bin/bash
(
  echo "LOCK TABLES mytable READ ;"
  echo "Doing something..." >&2
  echo "describe mytable;" 
  sleep 5
  echo "UNLOCK  tables;" 
) | mysql ${ARGUMENTS}

另一种选择是将文件描述符分配给FIFO,然后使其在后台运行。nos非常相似,但是“ exec”选项不需要子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命令)。绝对是不平凡的。
  • 由于在第一个示例中,“其他内容”位于子外壳中,因此你无法轻松地从该上下文设置脚本的返回码。