2016-05-31 37 views
2

我有我想要添加到一個數據庫的多個表,我預計一些失敗的查詢,所以我想收集類似下面的相關信息:收集MySQL查詢結果,而不必輸入mysql命令行

mysql> drop table user; 
Query OK, 0 rows affected (0.00 sec) 

我一直無法弄清楚如何在bash命令行上捕獲這些信息。我試過以下內容:

mysql --force -ujay -p db <create.sql> log.txt 2> error.txt 

...但只有錯誤日誌得到填充 - 我如何獲得mysql外部的「查詢OK」消息?


讓我輸出到一個文件,然後grepping的問題,我編輯的腳本:

mysql -vv --force -ujay -p db < create.sql &>> log.txt 
grep -i '^Query\|^Warning\|^ERROR' log.txt 

這裏的問題是結果:

ERROR 1050 (42S01) at line 28: Table 'db' already exists 
Query OK, 0 rows affected 
Query OK, 0 rows affected 

不在查詢執行的順序。第一個和第三個查詢是成功的,所以順序應該看起來如下:

Query OK, 0 rows affected 
ERROR 1050 (42S01) at line 28: Table 'db' already exists 
Query OK, 0 rows affected 

在這種情況下,順序非常重要。

這是日誌的外觀被創建後:

-------------- 
ERROR 1050 (42S01) at line 28: Table 'db' already exists 
-------------- 
CREATE TABLE `db` (
    `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    PRIMARY KEY (`Host`,`Db`,`User`), 
    KEY `User` (`User`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges' 
-------------- 
Query OK, 0 rows affected 

-------------- 
CREATE TABLE `db` (
    `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    PRIMARY KEY (`Host`,`Db`,`User`), 
    KEY `User` (`User`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges' 
-------------- 

-------------- 
CREATE TABLE `db1` (
    `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '', 
    `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    `Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N', 
    PRIMARY KEY (`Host`,`Db`,`User`), 
    KEY `User` (`User`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Database privileges' 
-------------- 

Query OK, 0 rows affected 

Bye 

正如你可以看到消息不會出現在正確的順序(我不知道爲什麼在創建表的語句出現在所有 - - 我假設的-vvv標誌)。

+0

有一個命令開關,但我不知道它是什麼。 –

+0

你有沒有試過使用詳細?因此,在命令中添加'-vv'或者'-vvv'。 – drewyupdrew

+0

@ user3299633您可以嘗試在該文件上使用grep或fgrep和wc -l,其中所有mysql日誌都是 – Caius

回答

5

的這裏的問題是,在linux stdout緩衝而errout是無緩衝。這基本上意味着stdout將等待,直到它具有例如8kb的數據寫入文件之前,而errout將立即寫入,從而導致不同的順序。所以你的日誌文件通常看起來像stderr messages that happened during first 8kb of stdoutdata - 8kb of stdoutdata - stderr messages during next 8kb of stdoutdata - next 8kb of stdoutdata - ...

您可以使用選項-n--unbuffered強制mysql在每次查詢後刷新(標準輸出)緩衝區,例如,

mysql -vv -n --force -ujay -p db < create.sql &>> log.txt 
grep -i '^Query\|^Warning\|^ERROR' log.txt 

應該給你正確的順序。

Btw。,--show-warnings默認爲false,所以如果您想要獲取警告,因爲您的grep意味着,您可能需要添加--show-warnings

另一種方法是將你的創建語句拆分成單獨的文件(或者不要將它們放在一個文件中),併爲它們中的每一個調用mysql,這會讓你有機會直接在你的程序中作出反應到一個缺失的表格,它將保證創建順序及其邏輯(例如,如果您創建表db1,db,db並且第一個失敗,並且第二個對db1的引用並因此也失敗,則將創建第三個表db。之後校正db1並重復它現在不會像第一次正確一樣,因爲現在第二個表將失敗,因爲第三個表已經存在,而不是第三個表失敗,因爲第二個表已經存在。)

+0

非常感謝。這將使我能夠實現整個流程的自動化。 – user3299633

1

現在簡單的解決方案是將grep更改爲sed--假設grep是問題。

sed -n '/^Query/p; /^Warning/p; /^Error/p' log.txt 
+0

不幸的是,這是行不通的。它產生相同類型的輸出。恐怕這種行爲是由於mysql命令的工作原理造成的。我會將示例輸出添加到我的原始帖子中。 – user3299633

0

這將兩個輸出合併在一起。這會做你需要的嗎?

>log.txt 2>&1 

但我認爲shell腳本不是執行SQL的方式。相反,使用一些具有更多功能的語言,例如Perl。