我正在使用MySQL客户端连接来发出FLUSH TABLES WITH READ LOCK
,然后创建LVM快照。我希望更高级别的脚本(Ruby)捕获快照创建的返回代码,但无法确定如何在MySQL客户端中捕获它。简化:
mysql> system pwd
/root
我希望system
返回0.
mysql> system foo
sh: 1: foo: not found
我希望system
以bash等方式返回127
是否有某种方法可以在MySQL客户端中检索该错误代码并在MySQL客户端退出时将其返回,将其写入文件以供控制脚本读取等。
答案 0 :(得分:2)
要在同时运行系统命令的上下文中运行FTWRL
并且它们彼此依赖,表示您要刷新,然后快照,然后决定要做什么基于释放表锁之前的那个。
您需要在同一个脚本中执行此操作以确保它们一起工作,并且您正尝试在SQL脚本中执行此操作。通过从内部系统脚本运行SQL脚本,反之亦然,因为您根据shell条件而不是SQL条件做出决策。
这是我如何做到的(在Perl中):
#!/usr/bin/perl -w
use DBI;
my $d = DBI->connect('dbi:mysql:mysql','root','***');
$d->do('FLUSH TABLES WITH READ LOCK') or die ("Can't flush tables in MySQL");
# Here's the important bit: Capture the status in $s and branch on the result
my $s = system('lvm lvcreate -s -n lv_datadirbackup -L 4G /dev/VG_MYSQL/lv_datadir');
if($s == 0) {
print ("Snapshot created.\n");
$d->do('UNLOCK TABLES') or die("Can't unlock tables");
... # etc
这样您就可以创建表锁获取快照,并使用您的脚本根据快照状态控制接下来发生的事情。
答案 1 :(得分:0)
你可以这样做:
root@localhost> mysql mysql> system bash root@localhost> foo foo: not found root@localhost> echo $? > logfile root@localhost> exit mysql>
logfile
现在包含您的返回值。
如果你想自动化它,你可以例如。创建这些脚本:
script_bash.sh:
#!/bin/bash
foo
echo $? > logfile
script_mysql.sql:
system script_bash.sh
然后:
root@localhost> chmod +x script_bash.sh
root@localhost> mysql < script_mysql.sql #or mysql -e"script_bash.sh"
root@localhost> cat logfile
127
你能否这样做并不意味着你应该这样做:)我肯定会建议从“控制脚本”中解雇系统命令。