많이 사용하지 않은 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) |