2016-05-31 1 views
2

나는 데이터베이스에 추가 할 여러 테이블을 가지고 있고, 나는 실패 쿼리의 일부는 그래서 다음과 같은 관련 정보를 수집 할 예상 :MySQL의 명령 줄을 입력하지 않고도 MySQL의 쿼리 결과를 수집

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

bash 명령 줄에서이 정보를 캡처하는 방법을 알아낼 수 없었습니다. 나는 "쿼리 OK"메시지가 외부 획득 할 수있는 방법을 MySQL로 -

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

...하지만 오류 로그가 채워됩니다 : 나는 다음 시도했다? 내가 파일로 출력 한 후 문제를 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

문제 errout이 버퍼링되는 동안 리눅스 stdout에 버퍼링되어있다. 즉, 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에 (stdout) 버퍼를 강제로 플러시 할 수 있습니다.

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

으로 주문해야합니다.

Btw., --show-warnings은 기본적으로 거짓이므로 grep이 암시하는 것처럼 경고를 받으려면 --show-warnings을 추가 할 수 있습니다.

다른 방법으로는 별도의 파일에 create 문을 분할하거나 하나의 파일에 넣지 않고 각각에 대해 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 

그러나 저는 쉘 스크립팅이 SQL을 실행하는 방법이 아니라고 주장합니다. 대신 Perl과 같은 더 많은 기능을 가진 언어를 사용하십시오.