2016-05-31 54 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。