2

我正在使用 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 客户端退出时将其返回,将其写入文件以供控制脚本读取等。

4

2 回答 2

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

这样,您可以创建表锁以获取快照,并使用您的脚本根据快照状态控制接下来发生的事情。

于 2013-09-06T13:02:19.747 回答
0

你可以这样做:

根@localhost> mysql
mysql>系统bash
根@localhost> foo
foo:未找到
root@localhost> 回显 $? > 日志文件
root@localhost> 退出
mysql>

logfile现在包含您的返回值。如果你想自动化它,你可以例如。创建这些脚本:

脚本_bash.sh:

#!/bin/bash
foo
echo $? > logfile

脚本_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

您是否可以做到并不意味着您应该这样做:) 我绝对建议从“控制脚本”触发系统命令。

于 2013-09-06T10:31:08.457 回答