sun's longitude:242 17 13.59 
· 자유게시판 · 묻고답하기 · 알파문서 · RPMS list
· 사용자문서 · 팁/FAQ모음 · 리눅스Links · 자료실
· 서버정보 · 운영자 · Books/FAQ · FreeBSD
/board/read.php:소스보기  
알파문서
자주 잊어먹거나, 메모해 둘 필요성이 있는 팁이나 문서, 기타 등등
[*** 쓰기 금지단어 패턴 ***]
글 본문 중간에 업로드할 이미지를 추가하는 방법 : @@이미지이름@@
ex) @@foo.gif@@
53 번 글의 답장글: [MySQL] SELECT 결과의 출력물 제어(pager)
글쓴이: 산이 [홈페이지] 글쓴날: 2003년 10월 02일 03:32:34 목(새벽) 조회: 28822

많이 사용하지 않은 MySQL pager 설정에 관한 내용입니다.
...

요약 :
mysql> pager more -d

[MySQL] SELECT 결과의 출력물 제어(pager)와 출력물 형태

1. interactive 모드(none batch 모드)에서

이 모드는 보통 'mysql>' 이라는 프롬프트가 표시되는 모드를
말합니다.
(4.x.x 에서는 MYSQL_PS1 이라는 재미있는 환경 변수 설정이
가능하더군요)

mysql> nopager
PAGER set to stdout
mysql> \n
PAGER set to stdout
mysql> \h
...

이와 같이 기본 PAGER 값은 '표준출력(stdout)'
 입니다.

그럼 예를 들어서,

mysql> SELECT .... ;

이와 같이 검색 결과에 대한 그 line 수가 화면 스크린 line 수
보다 많으면
주욱 밑으로 내려가서 제일 위쪽의 결과는 보질 못합니다.
(물론 스크롤이 지원한다면 볼 수 있지만, 이것도 한계가 있죠..
보통 1500 line?)

이것을 예전에 SELECT ..... LIMIT 300,100;
이런식으로 무식하게(?) 입력했던 기억이 나네요..

이런 화면출력을 command line 의 more 나 less 처럼 보여줄 수 있는
설정이
PAGER 설정입니다.
(참고로, win32 에서는 작동하지 않는다고 하네요.. 그런
명령어가 없기 때문에 ?)
(또한 batch, -B 모드에서는 작동하지 않습니다.)

그럼 PAGER를 설정해 봅시다.

PAGER 설정 방법은

mysql> pager PAGER
or
mysql> \P PAGER

입니다. 

- PAGER 부분에는 ' 또는 " 로 묶어주면 안되고,
- 여기에 more 나 less, cat, tee ... 등등의
- UNIX/LINUX 명령어와 이들의 옵션을 설정해 주면 됩니다.
- Off 방법은 nopager 나 \n 명령어를 내리면 됩니다.

간단하게,

mysql> pager more
or
mysql> pager more -d
PAGER set to more -d
mysql>
mysql> SHOW STATUS;
...
...
--More--[Press space to continue, 'q' to quit.]

무슨 의미인지 아시겠죠?

그럼 이번에는 화면에 출력함과 동시에(more) 그 결과물을
파일로
저정해 봅시다.

이때는 화면 출력과 파일 저장을 한꺼번에 할려면 tee 라는
명령어를
사용하면 되겠죠.
이모드에서 'tee', '\T' 라는 명령와 같은 역할입니다.

\T 는 계속적인 화면 캡춰라고 생각하면 되고,
실제로 PAGER 에서 설정한 tee 의 결과물과는 조금 틀림.
(\T 는 화면상에 출력된 모든 에러, SQL 문, 출력물 등등이
포함됨)

mysql> pager tee /path/to/result.txt | more  -d
PAGER set to tee /path/to/result.txt | more -d

more 를 파이프(|) 앞에 두면 안됩니다.

그런데 이 PAGER 설정에 의한 result.txt 파일은 항상 최근의
결과물만
저장됩니다. 이유는 아시겠죠?
result.txt 파일에 계속적인 결과물을 추가하고자 한다면,

mysql> pager  tee -a /path/to/result.txt | more -d

이렇게 tee 에 -a 옵션을 사용해야 합니다.
(-a : append)

그럼 이번에 그냥 화면출력 없이 파일에 저장만 해봅시다.

mysql> pager cat > /path/to/result2.txt
or
mysql> pager cat >> /path/to/result2.txt

아주 간단하죠?
나머지는 각자 응용해 보세요.


2. command line 모드에서

이른바 '콘솔' 또는 '터미널' 모드라고 하는 shell 커맨드라인을
의미합니다.

2-1. interactive 모드로 들어갈 때

shell> mysql [-u username -p] --pager='more -d' [dbname]

이렇게 --pager 옵션을 사용하면 설정한 PAGER가 기본 PAGER가
됩니다.
이 PAGER 설정은 my.cnf 에서 설정한(있다면)
 PAGER에 덮어쓰기 됩니다.

참고로 batch 모드로(--batch, -B) 들어갈때는 적용되질 않습니다.


2-2. mysql 클라이언트의 -e 옵션을 사용할 경우

shell> mysql [-u username] [-p] --pager='more -d' [dbname] -e 'SELECT ...' [>
result.txt]

이런식의 PAGER 설정은 바보스럽습니다(PAGER
 는 interactive 모드에서 가능).
이것을 다음과 같이 입력해야 합니다
(화면 출력과 redirection 에 관한 내용임).

shell> mysql [-u username] [-p] [dbname] -e 'SELECT ...' [| tee [-a] result.txt] |
more -d


3. my.cnf 에 설정

기본이 되는 PAGER를 설정해 봅시다.

mysql 클라이언트가 설정값을 읽는 순서는,

  /etc/my.cnf  : global 설정파일
  |
  `--> /usr/local/mysql/var/my.cnf : Database 디렉토리
       |
       `--> $HOME/.my.cnf : 사용자 설정파일
            |
            `--> mysql [OPTIONS] ... : command line에서 직접 설정

이런식으로 순차적으로 읽어가면서 그 설정값들을 override
합니다.

관리자 입장이라면 구지 설정하지 않아도 되지만, 사용자
편의를 제공한다는
목적에서 설정하고자 한다면 /etc/my.cnf 가 적당하겠죠.
그리고 사용자는 각 사용자 홈 디렉토리 밑에 .my.cnf 파일을
생성하여 설정하면 됩니다.

-- ~user1/.my.cnf (예) -----------------
...
[mysql]
...
local-infile    = 1
ignore-spaces
pager           = more -d
...
----------------------------------------


4. SELECT 의 출력물 포맷에 대해서

SELECT 출력물에 대한 포맷은 interactive 모드, batch 모드,
shell command line 마다 조금씩 틀립니다.
(--table, -t, --html, -H, --batch, -B 옵션에 따라 다름)

출력물(결과물)
 포맷은 다음과 같습니다.

1) --table, -t 옵션이나 기본 interactive 모드에서 TABLE 형태
2) --html, -H 옵션을 사용할 경우의 HTML TAG 형태
3) INTO OUTFILE 구문에 의한 각 세로 칸(이하 'column')이
TAB(기본)으로 구분된 형태
4) mysqldump(DUMP) 에 의한 SQL 구문.
5) rows 단위(\G) 형태


4-1. TABLE 형태

가로, 세로가 선(-, +, |)으로 그어진 다음과 같은 포맷 구조를
말합니다.

+----+--------------------------------------+
| no | title                                |
+----+--------------------------------------+
|  1 | 질문 답변 게시판입니다.              |
|  2 | 리눅스용 데이타베이스                |
|  8 | su를 통해 root 권한을 획득해도..     |
|  9 | RE: su를 통해 root 권한을 획득해도.. |
| 10 | [질문] 스팍 리눅스 ..                |
+----+--------------------------------------+

해당 column 값이 숫자형이면 기본적으로 오른쪽 정렬을 하고,
문자열이면 왼쪽 정렬을 합니다.(HTML TABLE 과 같은 형식으로)
그리고 빈 공간들은 TAB 이 아닌 SPACE 들로 구성되어 있으며,
interactive 모드의 기본 형태입니다.

- TABLE 형태로 결과물을 얻을 수 있는 방법

1) 기본 interactive 모드의 화면 출력(--batch, -B, --html, -H 옵션
없이)에서,
   \G 가 아닌 기본 ; 나 \g 를 사용하여 쿼리를 전송할 경우의
출력 화면과,
   이 조건에서 tee 나 page 설정으로 저장된 파일

2) command line 에서 --table, -t 옵션이 없이 화면 출력물
   ex)
   shell> mysql [-u username] [-p] [dbname] -e "SELECT ..."

3) command line 에서 --table, -t 옵션과 -e 옵션의 결합 결과물
   ex)
   shell> mysql [-u username] [-p] [dbname] --table -e "SELECT ..." [>
result.txt]

*주의)
2)에서 result.txt 파일로 redirect 하면 결과물은 <TAB> 으로 구분된
형태가 됨.
3)에서 --table 옵션을 지정했다고 하더라고, "SELECT ... INTO
OUTFILE result.txt ..."
와 같은 SQL 구문의 결과물인 result.txt 파일은 TAB(기본)으로
구분됩니다.


4-2. HTML TAG 형태

mysql은 결과물에 대해서 HTML TAG 형태도 지원합니다.

- HTML TAG 형태로 결과물을 얻을 수 있는 방법

1) --html, -H 옵션을 사용한 interactive 모드에서 화면 출력과
저장물
   ex)
   shell> mysql [-u username] [-p] [dbname] --html
   mysql> SHOW TABLES;
   <TABLE
BORDER=1><TR><TH>Tables_in_mysql</TH></TR><TR><TD>columns_priv<
/TD> ...
   ...</TD></TR></TABLE>

2) command line 모드에서 --html, -H 옵션을 사용한 화면 출력과
저장물
   ex)
   shell> mysql [-u username] [-p] [dbname] --html -e "SELECT ..." [>
result.html]

*주의) 긴 한줄(max columns) 이상으로 구성된 HTML 형태임.


4-3 TAB 으로 구분된 형태

mysql 에서 어떤 결과물을 파일로 DUMP 할 경우 각 columns 이
TAB(기본)으로 구분된
다음과 같은 형태를 말합니다.

---------------------------------------------------
1  <TAB>  질문 답변 게시판입니다.
2  <TAB>  리눅스용 데이타베이스
8  <TAB>  su를 통해 root 권한을 획득해도..
9  <TAB>  RE: su를 통해 root 권한을 획득해도..
10 <TAB>  [질문] 스팍 리눅스 ..
---------------------------------------------------
*주의) <TAB> 은 \t 로 실제로 '<TAB>' 문자열이 아님.

각 컬럼의 정렬방식은 왼쪽정렬입니다.


- TAB 으로 구분된 결과물을 얻을 수 있는 방법

1) interactive 모드에서 SELECT ... INTO OUTFILE 구문을 사용할 경우
   ex)
   mysql> SELECT no,title INTO OUTFILE '/path/to/dump.txt' FROM table;

2) command line 모드에서 -e 옵션 안의 OUTFILE 결과물
   ex)
   shell> mysql [-u username] [-p] [dbname] -e "...INTO OUTFILE
'/path/to/dump.txt' ..."

3) command line 모드에서 redirect 의 결과물
   ex)
   shell> mysql [-u username] [-p] [dbname] -e "SELECT ..." > result.txt

4) mysqldump -T, --tab=/path/to/dir 에 의한 DUMP 된 text 파일


*주의)
2)번의 dump.txt 파일과 3)번의 result.txt 파일은 모두 <TAB>으로
구분되어 있지만
2)번은 첫번 째 라인에 columns 이름이 없고, 3)번은 옵션에 따라서
다르다 즉,
-N, --skip-column-names 옵션을 사용하면 2)번과 동일하다.

    [FIELDS
        [TERMINATED BY '\t']
        [[OPTIONALLY] ENCLOSED BY '']
        [ESCAPED BY '\\' ]
    ]
    [LINES 
        [STARTING BY '']    
        [TERMINATED BY '\n']
    ]
    

--fields-terminated-by=... 
--fields-enclosed-by=... 
--fields-optionally-enclosed-by=... 
--fields-escaped-by=... 
--lines-terminated-by=... 


4) DUMP 에 의한 SQL 구문.
5) rows 단위(\G) 형태




mysql> select no,title into outfile '/home/outfile.txt' from qa where no <10;    
                                     
ERROR 1: Can't create/write to file '/home/outfile.txt' (Errcode: 13)


ERROR 1045: Access denied for user: 'mysql@localhost' (Using password: NO)

위의 ERROR 1045 :
해당 유저에 대한 File_priv 권한이 없기 때문입니다.
이 설정은
mysql.user 테이블에서 설정합니다.
보안상의 이유로 대부분 File_priv 권한은 'N' 으로 되어 있죠.

그리고 OUPFILE 에 의해 생성된 파일은
mysql client(접속한 호스트)에 위치하는 것이 아니라
mysql server 에 위치합니다.

또한 파일 소유자와 그룹은 mysqld 의 process 유저, 즉
대부분 mysql 유저와 mysql 그룹 권한으로 파일이
생성되며,
기존에 같은 파일이 있으면 override 가 되지않고
에러를 냅니다.
-------------------------------

* 후기 :
기회(시간)가 된다면,

[MYSQL]
- 사용자변수와 가상 순위번호
- INDEX 설정과 사용여부(explain),
 filesort ...
- SQL 우선순위(입력,검색)

- 메모리 설정 튜닝
- LIKE 보다 INSTR()이 더 빠르다던데..

[PHP]
- 2차원 배열 정렬에 관하여
- 사용자 스크린(해상도)
 통계 구하기

[APACHE]
- Action 에 의한 이미지 서버 분산(experimental)


[기타]
- 변수 출력
- stty 와 -cols(`ps' command)

 
이전글 : [APACHE] HTTP Request 제한(400, 414, GET)
다음글 : [MYSQL] 우선순위, LOW_PRIORITY, DELAYED, ...  
 from 61.254.75.40
JS(Redhands)Board 0.4 +@

|글쓰기| |답장쓰기| |수정| |삭제|
|이전글| |다음글| |목록보기|
인쇄용 

apache lighttpd linuxchannel.net 
Copyright 1997-2024. linuxchannel.net. All rights reserved.

Page loading: 0.01(server) + (network) + (browser) seconds