스크립트에서 mysql -NBse "..." 형태를 자주 만난다. 이것은 하나의 옵션이 아니라 짧은 옵션 네 개를 붙여 쓴 것이다.
| 옵션 | 긴 이름 | 뜻 |
|---|---|---|
-N |
--skip-column-names |
결과에서 컬럼 이름 줄을 뺀다 |
-B |
--batch |
표 테두리 없이 탭으로 구분해 출력한다 |
-s |
--silent |
출력을 더 줄인다. -B 와 함께 쓰면 구분자가 탭이 된다 |
-e |
--execute |
뒤에 오는 SQL 을 실행하고 바로 끝낸다 |
-e 는 값을 받는 옵션이므로 묶음의 맨 뒤에 와야 한다. -eNBs 로 쓰면 NBs 가 SQL 로 해석된다.
mysql -NBse "SELECT name FROM users WHERE active = 1" appdb
결과는 헤더 없이 한 줄에 한 행씩 나오므로 while read 로 바로 받을 수 있다.
-p${PASSWORD} 를 명령줄에 쓰면 같은 서버의 다른 사용자가 ps 로 볼 수 있고 셸 히스토리에도 남는다. 설정 파일로 분리한다.
[client]
user=appuser
password=${PASSWORD}
chmod 600 /etc/mysql/backup.cnf
mysql --defaults-extra-file=/etc/mysql/backup.cnf -NBse "SELECT 1"
--defaults-extra-file 은 기본 설정 파일을 읽은 뒤에 추가로 읽는다. 기본 설정을 무시하고 이 파일만 쓰려면 --defaults-file 을 쓴다. 두 옵션 모두 명령줄의 가장 앞에 와야 한다.
탭 구분 출력에서 값 안에 탭이나 줄바꿈이 들어 있으면 파싱이 깨진다. 값이 자유 문자열이면 구분자를 명시하는 편이 낫다.
mysql -NBse "SELECT CONCAT_WS('|', id, name) FROM users" appdb
NULL 은 배치 모드에서 NULL 이라는 네 글자로 출력된다. 빈 문자열과 구분해야 하면 IFNULL(col, '') 로 먼저 바꾼다.
오류를 잡으려면 종료 코드를 본다. mysql 은 SQL 오류가 나면 0 이 아닌 값을 돌려준다.
if ! result=$(mysql --defaults-extra-file=/etc/mysql/backup.cnf -NBse "SELECT 1" 2>/tmp/mysql.err); then
echo "쿼리 실패: $(cat /tmp/mysql.err)" >&2
exit 1
fi