2013-09-01 1 views
2

Я использую клиентское соединение MySQL для выпуска FLUSH TABLES WITH READ LOCK, а затем создаю снимок LVM. Я бы хотел, чтобы сценарий более высокого уровня (Ruby) захватил код возврата создания моментального снимка, но не может определить, как его захватить в клиенте MySQL. Для упрощения:Как получить возвращаемое значение системной команды, выпущенной в MySQL-клиенте

mysql> system pwd 
/root 

Я бы ожидать, что system вернуть 0.

mysql> system foo 
sh: 1: foo: not found 

Я бы ожидать, что system вернуть 127 в Баш и т.д.

Есть ли какой-нибудь способ, чтобы получить, что код ошибки в клиенте MySQL и вернуть его при выходе клиента MySQL, записать его в файл для чтения с помощью управляющего скрипта и т. д.

+0

Я не уверен в ответе, но команда tee в mysql регистрирует все, что есть на консоли после входа в mysql-клиент. – developerCK

ответ

2

Для запуска FTWRL в контексте, где вы также работает системные команды, и они зависят друг от друга, указывает, что Вы хотите, чтобы очистить, а затем снимок, а затем решить, что делать на основе этого, прежде чем отпустить блокировку таблицы ,

Вам нужно сделать это в том же скрипте, чтобы убедиться, что они работают вместе, и вы пытаетесь это сделать в сценарии SQL. Намного проще сделать это наоборот, выполнив сценарий SQL от внутри системного скрипта, потому что вы принимаете решения на основе условий оболочки, а не условий 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 

Таким образом, вы можете создать блокировку таблицы взять снимок и использовать ваш сценарий контролировать то, что происходит дальше в зависимости от состояния снимка.

+0

Спасибо за комментарии - мне нужно просмотреть этот вариант и RandomSeed, чтобы выбрать, но я соглашусь, как только вы проверили. – Joe

+0

В принципе это работает, хотя я реализую его в Ruby с gem mysql2.Я заметил, что FLUSH TABLES WITH READ LOCK может выйти из строя и выбить клиента, но команда все еще выполняется в MySQL (т. Е. Он не отменяет команду изящно, скрипт просто умирает). – Joe

0

Вы можете сделать это:

 

[email protected]> mysql 
mysql> system bash 
[email protected]> foo 
foo: not found 
[email protected]> echo $? > logfile 
[email protected]> exit 
mysql> 

logfile теперь содержит ваше возвращаемое значение. Если вы хотите автоматизировать его, вы можете, например. создать эти скрипты:

script_bash.sh:

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

script_mysql.sql:

system script_bash.sh 

Тогда:

[email protected]> chmod +x script_bash.sh 
[email protected]> mysql < script_mysql.sql #or mysql -e"script_bash.sh" 
[email protected]> cat logfile 
127 

ли вы можете сделать это не значит, что вы следует do это :) Я бы определенно рекомендовал запустить системную команду из «контрольного скрипта».

+0

Спасибо за комментарии - мне нужно рассмотреть этот вариант, и Джереми выбрать, но я соглашусь, как только его проверили. – Joe

Смежные вопросы