DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

myisampack, myisampack, mysql

DBMS 2
MySQL 가이드
클라이언트 및 유틸리티 프로그램
myisampack, myisampack, mysql
작성자
admin
작성일
2021-02-19 10:58
조회
1131

myisampack - 압축된, 읽기 전용 MyISAM 테이블 만들기

myisampack 유틸리티는 MyISAM 테이블을 압축한다. myisampack


mysql - MySQL 명령어 라인 툴

mysql 옵션
mysql 명령어
텍스트 파일로부터 SQL 명령문 실행하기
mysql 팁

mysql은 간단한 SQL 쉘이다 (GNU readline 기능을 가지고 있음). 이것은 인터액티브(interactive) 및 단방향적인(non-interactive) 사용을 지원해 준다. 인터액티브로 사용될 경우, 쿼리의 결과 값은 ASCII-테이블 포맷 형태로 표현된다. 단방향적으로 사용되는 경우 (예를 들면, 필터로서 사용되는 경우), 그 결과는 탭으로 구분되는 포맷을 갖게 된다. 결과 포맷은 명령어 옵션을 사용해서 변경 시킬 수 있다.

메모리가 부족해서 대형 결과 셋을 처리하는데 문제가 있다면, --quick 옵션을 사용하도록 한다. 이것은 mysql로 하여금 전체 결과 셋을 검색하고 그것을 출력하기 전에 메모리에 버퍼링하기 보다는 서버에서 결과를 한번에 하나씩 추출하도록 만든다. 이것은 mysql_store_result()에 있는 것이 아닌 클라이언트/서버 라이브러리 안에 있는 mysql_use_result() C API 함수를 사용해서 결과 셋을 리턴해 준다.

mysql를 사용하는 것은 매우 쉽다. 다음과 같이 명령어 프롬프트에서 이것을 호출하라:



shell> mysql db_name 



또는:



shell> mysql --user=user_name --password=your_password db_name


그 다음에 SQL 명령문을 입력하고, ‘;’, \g, 또는 \G 로 명령문을 종료한 후 엔터키(Enter Key)를 누른다.

다음과 같이 스크립트 파일(배치 파일) 안에서 SQL명령문을 실행할 수 있다:



shell> mysql db_name < script.sql > output.tab

mysql 옵션

mysql 은 다음 옵션을 지원한다:


    • --help, -?
      도움말을 출력하고 종료.
    • --auto-rehash
      자동 재해싱(rehashing)을 활성화 시킨다. 이 옵션은 디폴트로 동작하며, 테이블 및 컬럼 이름 완료(completion)을 활성화 시킨다. --skip-auto-rehash를 사용하면 재해싱(rehashing)을 비 활성화 시킬 수 있다. 이렇게 하면 mysql을 보다 빠르게 시작할 수는 있지만, 테이블 및 컬럼 이름 완료(completion)을 사용하고자 할 경우에는 반드시 rehash 명령어를 입력해야 한다.
    • --batch, -B
      컬럼 구분자(separator)로서 탭을 사용해서 새로운 라인에 각 열로 결과를 출력한다. 이 옵션을 사용하면, mysql은 히스토리 파일(history file)을 사용하지 않게 된다.
    • --character-sets-dir=path
      문자(캐릭터) 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조할 것.
    • --column-names
      결과에 컬럼 이름을 작성한다.
    • --compress, -C
      클라이언트와 서버가 압축을 지원하면, 클라이언트와 서버간에 전달된 모든 정보를 압축한다.
    • --database=db_name, -D db_name
      사용할 데이터 베이스. 원래 옵션 파일에서 유용하게 쓰인다.
    • --debug[=debug_options], -# [debug_options]
      디버깅 로그를 작성한다. debug_options 스트링은 종종 'd:t:o,file_name'가 된다. 디폴트는 'd:t:o,/tmp/mysql.trace'이다.
    • --debug-info, -T
      프로그램이 종료될 때 디버깅 정보를 출력한다.
    • --default-character-set=charset_name
      charset_name를 디폴트 문자 셋으로 사용한다. Section 5.11.1, “데이터 및 정렬을 위해 사용되는 문자 셋”을 참조할 것.
    • --delimiter=str
      명령문 구획 문자(delimiter)를 설정한다. 디폴트는 세미 콜론 (‘;’). 이다.
      --execute=statement, -e statement
?
  • 명령문을 실행하고 종료한다. 디폴트 결과 포맷은 -batch가 만든 것과 비슷하다. Section 4.3.1, “명령어 라인에서 옵션 사용하기”을 참조할 것.
  • --force, -f
    SQL 에러가 발생하더라도 계속 진행시킨다.
  • --host=host_name, -h host_name
    주어진 호스트에서 MySQL 서버에 접속을 한다.
  • --html, -H
    HTML 결과를 만든다.
  • --ignore-spaces, -i
    함수 이름 다음에 나오는 스페이스를 무시한다. 이 옵션의 효과는 IGNORE_SPACE SQL 모드에 대한 설명에서 다루어졌다 (Section 5.2.5, “서버 SQL 모드”를 참조할 것).
  • --line-numbers
    에러가 발생한 라인 숫자를 작성한다. --skip-line-numbers를 사용하면 이 옵션을 비활성화 할 수 있다.
  • --local-infile[={0|1}]
    LOAD DATA INFILE 에 대한 LOCAL 기능을 활성화 또는 비활성화 시킨다. 아무런 값이 없는 경우, 이 옵션은 LOCAL 을 활성화 시킨다. 이 옵션은 LOCAL 을 명확하게 비활성화 또는 활성화 시키기 위해 --local-infile=0 또는 --local-infile=1 형태로 표현된다. 서버가 이 옵션을 지원하지 않으면, LOCAL 를 활성화 시키는 의미가 없게 된다.
  • --named-commands, -G
    지명된(named) mysql 명령어를 활성화 시킨다. 긴-포맷(Long-format) 명령어뿐만 아니라 짧은-포맷(short-format) 명령어도 사용할 수 있다. 예를 들면, quit 과 \q 은 둘 다 인식된다. --skip-named-commands를 사용하면 지명된 명령어를 비 활성화 시킬 수가 있다. Section 8.5.2, “mysql 명령어”를 참조할 것.
  • --no-auto-rehash, -A
    --skip-auto-rehash의 반대 옵션. --auto-rehash에 대한 설명을 참조할 것.
  • --no-beep, -b
    에러가 발생할 때 경고음을 내지 말도록 한다.
  • --no-named-commands, -g
    지명된 명령어를 비 활성화 시킨다. 세미 콜론 (‘;’)으로 끝나는 라인의 처음 부분에서는 \* 형태만을 사용하거나, 또는 지명된 명령어만을 사용한다. mysql은 디폴트로 이 옵션이 활성화 된 상태로 시작을 한다. 하지만, 이 옵션을 사용한다고 하더라도, 긴-포맷 명령어는 맨 처음 라인에서부터 시작을 한다. Section 8.5.2, “mysql 명령어”를 참조할 것.
  • --no-pager
    --skip-pager의 반대 옵션. --pager 옵션을 참조할 것.
  • --no-tee
    결과를 파일로 복사하지 말도록 한다. Section 8.5.2, “mysql 명령어”를 참조하여 티 파일(tee file)에 대해서 알아 본다.
  • --one-database, -o
    명령어 라인에서 지명된 디폴트 데이터 베이스에 대한 것을 제외하고 다른 명령문은 무시를 한다. 이 옵션은 바이너리 로그에서 다른 데이터 베이스를 업데이트하지 못하도록 하는 경우에 유용하다.
  • --pager[=command]
    쿼리 결과를 페이징(paging)하기 위해 주어진 명령어를 사용한다. 명령어가 생략되면, 디폴트 페이저(pager)는 PAGER 환경 변수 값이 된다. 유효한 페이저는 less, more, cat [> filename] 등이 된다. 이 옵션은 유닉스에서만 구동된다. 배치(batch) 모드에서는 구동되지 않는다. 페이징(paging)을 비활성화 시키기 위해서는, --skip-pager를 사용한다. Section 8.5.2, “mysql 명령어”에서 보다 자세한 정보를 참조한다.
  • --password[=password], -p[password]
    서버에 접속을 할 때 사용하는 패스워드. 짧은 옵션 형태 (-p)를 사용한다면, 옵션과 패스워드 사이에 스페이스를 가질 수 없다. 명령어 라인에서 --password 또는 -p 옵션 다음에 password 값을 생략한다면, 프롬프트가 나오게 된다. 명령어 라인에서 패스워드를 지정하는 것은 안전한 방법이 아니다. Section 5.9.6, “패스워드보안 유지하기”를 참조할 것.
  • --port=port_num, -P port_num
    접속을 위해 사용할 TCP/IP 포트 번호.
  • --prompt=format_str
    지정된 포맷에 프롬프트를 설정한다. 디폴트는 mysql>이다. 프롬프트가 포함할 수 있는 특별 시퀀스는 Section 8.5.2, “mysql 명령어”에서 설명한다.
  • --protocol={TCP|SOCKET|PIPE|MEMORY}
    사용할 접속 프로토콜.
  • --quick, -q
    각각의 쿼리 결과를 캐시에 넣지 않고, 결과가 나올 때 마다 한 줄씩 출력한다. 이로 인해 결과가 느리게 나오는 경우에는 서버의 속도를 느려진다. 이 옵션을 사용하면, mysql은 히스토리 파일(history file)을 사용하지 않게 된다.
  • --raw, -r
    이스케이프 변환(escape convertion)을 사용하지 않고 컬럼 값을 작성한다. 이 옵션은 종종 --batch 옵션과 함께 사용된다.
  • --reconnect
    서버에 대한 접속이 끊어지면, 자동으로 재 접속을 시도하게 된다. 접속이 끊어질 때 마다 한번씩 재 접속을 시도하게 된다. 재 접속 동작을 없애기 위해서는, --skip-reconnect를 사용한다.
  • --safe-updates, --i-am-a-dummy, -U
    키 값을 사용해서 수정할 열을 지정하는 UPDATE 와 DELETE 명령문만을 허용한다. 옵션 파일에서 이 옵션을 설정했다면, 명령어 라인에서 --safe-updates를 사용하여 옵션 파일의 것을 덮어 씌울 수가 있다. Section 8.5.4, “mysql 팁”을 참조할 것.
  • --secure-auth
    4.11. 이전 버전 포맷에서 패스워드는 서버에 보내지 않도록 한다. 새로운 패스워드 포맷을 사용하지 않는 접속을 막을 때 사용할 수 있다.
  • --show-warnings
    각 명령문을 실행 후에 경고가 발생한다면 이 경고문을 출력하도록 한다. 이 옵션은 인터액티브(interactive) 모드 및 배치 모드에서 적용된다. 이 옵션은 5.0.6에서 추가 되었다.
  • --sigint-ignore
    SIGINT 신호를 무시한다.
  • --silent, -s
    침묵 모드 (Silent mode). 결과물의 만들어 내지 않는다. 더 적은 결과물을 위해서 이 옵션은 여러 번 반복 사용할 수 있다.
  • --skip-column-names, -N
    결과에 컬럼 이름을 쓰지 않도록 한다.
  • --skip-line-numbers, -L
    에러가 발생한 경우 라인 번호를 쓰지 않도록 한다. 에러 메시지를 포함하는 결과 파일을 비교하고자 할 경우에 유용한 옵션이다.
  • --socket=path, -S path
    localhost에 접속을 하는 경우, 사용할 유닉스 소켓 파일, 또는 윈도우에서 사용할 지명된 파이프의 이름.
  • --table, -t
    테이블 포맷으로 결과를 출력한다. 이것은 인터액티브 모드에서는 디폴트이지만, 배치 모드에서도 결과를 테이블로 만들기 위해 사용될 수 있다.
  • --tee=file_name
    주어진 파일에 결과물에 대한 복사본은 첨부한다. 이 옵션은 배치 모드에서는 동작하지 않는다. Section 8.5.2, “mysql 명령어”를 참조할 것.
  • --unbuffered, -n
    각 쿼리를 실행한 후에 버퍼를 플러시한다.
  • --user=user_name, -u user_name
    서버에 접속을 할 때 사용할 MySQL 사용자 이름.
  • --verbose, -v
    버보스 모드(Verbose mode). 프로그램이 실행한 사항에 대해 자세한 정보를 출력한다. 이 옵션은 더 많은 결과물을 생성하기 위해 여러 번 반복 사용을 할 수가 있다. (예를 들면, -v -v -v는 배치 모드에서도 테이블 결과 포맷을 만들어 낸다.)
  • --version, -V
    버전 정보를 출력한 후에 종료.
  • --vertical, -E
    쿼리의 결과 열을 가로(vertically)로 출력한다 (컬럼 값 당 하나의 라인). 이 옵션을 사용하지 않으면, 각각의 명령문을 \G를 사용해서 종료 시킴으로써 가로로 결과를 표시하도록 만들 수가 있다.
  • --wait, -w
    접속할 수 없다면, 그대로 중단하지 말고 대기를 한 다음에 다시 접속을 시도한다.
  • --xml, -X
    결과를 XML 형태로 만들도록 한다.

또한 --var_name=value 신텍스를 사용해서 다음 변수를 설정할 수 있다:


  • connect_timeout
    접속 타임 아웃이 되기 전까지의 시간(초 단위) (디폴트는 0임).
  • max_allowed_packet
    서버에 전달 또는 서버로부터 받게 되는 패킷의 최대 길이. (디폴트는 16MB임.)
  • max_join_size
    --safe-updates를 사용할 때 하나의 조인에 있게 되는 열의 자동 한계 값 (디폴트 값은 1,000,000.)
  • net_buffer_length
    TCP/IP 및 소켓 통신을 위한 버퍼의 크기. (디폴트 값은 16KB.)
  • select_limit
    --safe-updates을 사용할 때 SELECT 명령문에 대한 자동 한계 값. (디폴트 값은 1,000.)
mysql 명령어

mysql 은 입력하는 각각의 SQL 명령문을 서버에 전달해서 실행이 되도록 한다. 여기에는 mysql은 또한 자체가 해석할 수 있는 명령어 셋이 있다. 이러한 명령어 리스트는, help 또는 \h 를 mysql> 프롬프트에서 입력하면 볼 수 있다:



mysql> help
List of all MySQL commands:
Note that all text commands must be first on line and end with ';'
? (\?) Synonym for `help'.
clear (\c) Clear command.
connect (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter. NOTE: Takes the rest of the line as
new delimiter.
edit (\e) Edit command with $EDITOR.
ego (\G) Send command to mysql server, display result vertically.
exit (\q) Exit mysql. Same as quit.
go (\g) Send command to mysql server.
help (\h) Display this help.
nopager (\n) Disable pager, print to stdout.
notee (\t) Don't write into outfile.
pager (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print (\p) Print current command.
prompt (\R) Change your mysql prompt.
quit (\q) Quit mysql.
rehash (\#) Rebuild completion hash.
source (\.) Execute an SQL script file. Takes a file name as an argument.
status (\s) Get status information from the server.
system (\!) Execute a system shell command.
tee (\T) Set outfile [to_outfile]. Append everything into given
outfile.
use (\u) Use another database. Takes database name as argument.
charset (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.


각각의 명령어는 긴 폼과 짧은 폼을 모두 가지고 있다. 긴 폼은 대소 문자를 구분하지 않지만 짧은 포맷은 구분을 한다. 긴 폼은 세미 콜론 종결자를 선택적으로 가질 수 있지만, 짧은 폼은 가질 수가 없다.

delimiter 명령어에서는, 백 슬레쉬 (‘\’) 문자를 사용하지 말아야 하는데, 그 이유는 이 문자가 MySQL에서는 이스케이프(escape)문자이기 때문이다.

edit, nopager, pager, 그리고 system 명령어는 유닉스에서만 동작을 한다.

status 명령어는 사용하고 있는 서버 및 접속 정보를 제공한다. --safe-updates 모드에서 서버를 구동 중이라면, status 는 사용하는 쿼리에 영향을 주는 mysql 변수 값도 출력을 하게 된다.

쿼리와 그 결과에 로그를 하기 위해서는, tee 명령어를 사용한다. 스크린에 표시되는 모든 데이터는 주어진 파일에 첨부가 된다. 이것은 디버깅 목적으로도 유용하게 사용할 수가 있다. 이 기능을 명령어 라인에서 --tee 옵션을 사용해서 활성화 시킬 수 있거나, 또는 tee 명령어를 사용해서 인터액티브(interactive)하게 활성화 시킬 수가 있다. tee 파일은 notee 명령어를 사용해서 비 활성화 시킬 수 있다. Tee를 다시 실행 시키면 재 활성화 시킬 수가 있게 된다. 파라미터를 사용하지 않으면, 이전(previous) 파일이 사용된다. tee 명령어는 각 명령문이 실행된 후에, 그리고 mysql이 다음 프롬프트를 출력하기 전에 쿼리 결과를 파일에 플러시한다는 점을 알아두자.

--pager 옵션을 사용하면, less, more와 같은 유닉스 프로그램, 또는 다른 비슷한 프로그램을 사용해서 인터액티브 모드에서 쿼리 결과를 검색 또는 브라우즈(browse)할 수 있게 된다. 이 옵션에 아무런 값을 지정하지 않으면, mysql은 PAGER 환경 변수의 값을 체크하고 이것을 페이저에 설정한다. 결과 페이징은 pager 명령어를 가지고 활성화 시킬 수 있으며 nopager를 가지고 비활성화 시킬 수 있다. 명령어는 옵션 인수를 가진다; 옵션 인수가 주어진다면, 페이징 프로그램은 그것을 설정한다. 인수가 없다면, 페이저는 명령어 라인에서 설정된 페이저로 설정되거나, 또는 아무런 페이저가 없는 경우에는 stdout 가 된다.

결과 페이징은 popen()함수를 사용하기 때문에 유닉스에서만 동작을 하는데, 윈도우에서는 이 함수를 지원하지 않는다. 윈도우의 경우, tee 옵션은 비록 어떤 환경에서는 편리한 방식은 아닐 지라도 쿼리 결과를 저장하는데 대신 사용될 수도 있다.

pager 명령어에 대한 몇 가지 팁이 아래에 있다:


  • 이것을 사용해서 파일에 쓰기를 할 수 있고 그 결과는 파일에만 기록된다:
    mysql> pager cat > /tmp/log.txt
    또한 페이저로 사용하고자 하는 프로그램에 대한 옵션을 지정할 수도 있다:
    mysql> pager less -n -i -S

    위의 예에서 -S 옵션을 주목하도록 한다. 이것이 수평으로 넓은(wide) 쿼리 결과를 브라우징(browsing)하는데 매우 유용하다는 점을 알 수 있을 것이다. 때때로 매우 넓은 결과를 스크린에서 읽기가 어려울 때가 있다. less에 대한 -S 옵션은 여러분이 왼쪽과 오른 쪽 화살표 키를 사용해서 결과를 수평(horizontally)으로 스크롤(scroll)할 수 있게끔 해 준다. 또한 이 옵션을 less과 함께 사용하면 수평-브라우즈(horizontal-browse) 모드를 온(on)/오프(off)시킬 수도 있게 된다. 보다 자세한 정보는, less 매뉴얼 페이지를 읽도록 한다:
  • shell> man less
  • 쿼리 결과를 다루기 위해서 매우 복잡한 페이저 명령어를 지정할 수 있다:
    mysql> pager cat | tee /dr1/tmp/res.txt \
    | tee /dr2/tmp/res2.txt | less -n -i -S

    이 예문에서 보면, 명령어는 /dr1 과 /dr2에 마운트 되어 있는 서로 다른 두 개의 파일 시스템상의 두 디렉토리에 있는 두 개의 파일에 쿼리 결과를 보내고 있지만, 여전히 less를 통해서 결과를 스크린에 출력시킨다.

또한, tee 와 pager 함수를 서로 연결시킬 수도 있다. tee 파일을 활성화 시키고 pager를 less에 설정하면, less 프로그램을 사용해서 그 결과를 검색할 수 있고 동시에 모든 것을 파일에 첨부 시킬 수 있게 된다. pager 명령어와 함께 사용된 유닉스 tee와 tee 명령어에 빌트-인(built-in)된 mysql간의 차이점은 유닉스 tee를 사용하지 못하는 경우가 되더라도 빌트-인 tee는 동작을 한다는 점이다. 빌트-인 tee 는 또한 스크린에 표시되는 모든 것을 로그 하지만, pager와 함께 사용된 유닉스 tee는 그렇게 되지 않는다. 부가적으로, tee 파일 로깅은 mysql 내부에서 인터액티브하게 온(On)/오프(Off)될 수 있다 이 기능은 여러분이 어떤 쿼리만을 파일에 로그하고자 할 때 유용하게 사용할 수 있다.

디폴트 mysql> 프롬프트는 재 구성될 수 있다. 프롬프트를 정의하기 위한 스트링은 아래의 특수 시퀀스를 갖는다:



Option Description
\v The server version
\d The default database
\h The server host
\p The current TCP/IP port or socket file
\u Your username
\U Your full user_name@host_name account name
\\ A literal ‘\’ backslash character
\n A newline character
\t A tab character
\ A space (a space follows the backslash)
\_ A space
\R The current time, in 24-hour military time (0-23)
\r The current time, standard 12-hour time (1-12)
\m Minutes of the current time
\y The current year, two digits
\Y The current year, four digits
\D The full current date
\s Seconds of the current time
\w The current day of the week in three-letter format (Mon, Tue, …)
\P am/pm
\o The current month in numeric format
\O The current month in three-letter format (Jan, Feb, …)
\c A counter that increments for each statement you issue
\S Semicolon
\' Single quote
\" Double quote

‘\’ 앞에 문자가 있게 되면 그것은 그 문자가 된다.
아무런 인수 없이 prompt 명령어를 지정하면, mysql은 mysql>의 디폴트 프롬프트로 리셋된다
여러 가지 방법을 사용해서 프롬프트를 설정할 수 있다:


  1. 환경 변수 사용. 프롬프트 스트링을 위해서는 MYSQL_PS1 환경 변수를 사용한다. 예를 들면:
    shell> export MYSQL_PS1="(\u@\h) [\d]> "
  2. 명령어 라인 옵션 사용. 명령어 라인에서 --prompt 옵션을 mysql에 지정한다. 예를 들면:
    shell> mysql --prompt="(\u@\h) [\d]> "
    (user@host) [database]>

  3. 옵션 파일 사용. MySQL 옵션 파일의 [mysql] 그룹에 있는 prompt 옵션을 설정한다. 홈 디렉토리에 있는 /etc/my.cnf 또는 .my.cnf 파일을 사용한다. 예를 들면:
    [mysql]
    prompt=(\\u@\\h) [\\d]>\\_

    이 예문에서 보면, 백 슬레시가 두 번 반복 사용된 점을 유의한다. 옵션 파일에 있는 prompt 옵션을 사용해서 프롬프트를 설정한다면, 특별 프롬프트 옵션을 사용할 때 백 슬레시를 두 번 사용하는 것이 좋다. 사용이 허용된 프롬프트 옵션 셋 및 옵션 파일에서 인식되는 특수 이스케이프(escape) 시퀀스 셋에는 오버랩(oberlap)되는 것들이 몇 가지 존재한다. (이러한 시퀀스들은 Section 4.3.2, “옵션 파일 사용하기”에 나와 있다.) 따라서, 백 슬레시를 중복해서 사용하지 않게 되면 이러한 오버랩으로 인해 문제가 생길 수도 있게 된다. 예를 들면, \s 는 현재 초(second) 값으로 해석되는 대신에 스페이스로 해석이 된다. 아래의 예문에서는 현재의 시간을 HH:MM:SS> 포맷으로 옵션 파일 안에 포함 시키기 위한 프롬프트 정의 방법을 보여준다:
    [mysql]
    prompt="\\r:\\m:\\s> "

  4. 인터액티브하게 프롬프트를 설정한다. prompt (또는 \R) 명령어를 사용해서 인터액티브하게 프롬프트를 변경 시킬 수가 있다. 예를 들면:
    mysql> prompt (\u@\h) [\d]>\_
    PROMPT set to '(\u@\h) [\d]>\_'
    (user@host) [database]>
    (user@host) [database]> prompt
    Returning to default PROMPT of mysql>
    mysql>

텍스트 파일로부터 SQL 명령문 실행하기

mysql 클라이언트는 전형적으로 인터랙티브하게 사용된다:



shell> mysql db_name

그러나 SQL 명령문을 파일 안에 넣은 다음에 mysql이 파일에 입력된 내용을 읽어 오도록 만들 수도 있다. 이렇게 하기 위해서는, 실행하고자 하는 명령문을 포함하는 텍스트 파일 text_file 을 생성해야 한다. 그리고 다음과 같이 mysql를 호출한다:



shell> mysql db_name < text_file

만일 그 파일의 첫 줄에 USE db_name 명령문을 놓는다면, 명령어 라인에서 데이터 베이스 이름을 지정할 필요가 없다:



shell> mysql < text_file

이미 mysql을 구동 중이라면, source 또는 \. 명령어를 사용하는 SQL스크립트 파일을 실행 시킬 수 있다:



mysql> source file_name
mysql> \. file_name


때때로 스크립트로 사용자에게 진행과정에 대한 정보를 보여주도록 하고자 하는 경우가 있을 수 있다. 이 때 다음과 같은 명령문을 삽입하면 된다:



SELECT '<info_to_display>' AS ' ';

이 명령문은 <info_to_display>를 출력한다.

Section 3.5, “배치 모드에서 mysql 사용하기”를 참조할 것.


mysql 팁
쿼리 결과를 수직으로(Vertically) 출력하기
--safe-updates 옵션 사용하기
mysql 자동-재 접속 비활성화 하기

이 섹션에서는 mysql을 보다 효율적으로 사용할 수 있도록 도움을 주는 몇 가지 팁에 대해서 설명을 하기로 한다.


쿼리 결과를 수직으로(Vertically) 출력하기

어떤 쿼리 결과들은 화면에 수평이 아닌 수직으로 출력을 하는 것이 보다 읽기 편한 경우가 있다. 쿼리를 세미 콜론이 아닌 \G로 끝맺게 되면 그 결과가 화면에 수직으로 표시가 된다. 예를 들면, 새로운 라인을 포함하는 긴 텍스트 값들은 수직으로 표시하는 것이 훨씬 읽기 편하다:



mysql> SELECT * FROM mails WHERE LENGTH(txt) < 300 LIMIT 300,1\G
*************************** 1. row ***************************
msg_nro: 3068
date: 2000-03-01 23:29:50
time_zone: +0200
mail_from: Monty
reply: monty@no.spam.com
mail_to: "Thimble Smith" <tim@no.spam.com>
sbj: UTF-8
txt: >>>>> "Thimble" == Thimble Smith writes:

Thimble> Hi. I think this is a good idea. Is anyone familiar
Thimble> with UTF-8 or Unicode? Otherwise, I'll put this on my
Thimble> TODO list and see what happens.

Yes, please do that.

Regards,
Monty
file: inbox-jani-1
hash: 190402944
1 row in set (0.09 sec)

</tim@no.spam.com>

--safe-updates 옵션 사용하기

초보 사용자의 경우, 유용하게 사용할 수 있는 스타트업 옵션이 --safe-updates (또는 같은 효과를 나타내는 --i-am-a-dummy)일 것이다. 이것은 DELETE FROM tbl_name 명령어를 입력하면서 WHERE 구문을 잊고 사용하지 않을 경우에 도움이 될 것이다. 보통의 경우, 이 같은 명령문은 테이블에서 모든 열을 삭제한다. --safe-updates를 사용하면, 키 값을 지정해야 열을 삭제할 수 있다. 이렇게 하면 실수를 막을 수 있다.

--safe-updates 옵션을 사용하면, mysql은 MySQL 서버에 접속을 할 때 아래의 명령문을 출력한다



SET SQL_SAFE_UPDATES=1,SQL_SELECT_LIMIT=1000, SQL_MAX_JOIN_SIZE=1000000;

Section 13.5.3, “SET 신텍스”를 참조할 것.

SET 명령문은 다음과 같은 효과를 갖는다:


  • WHERE 구문에 키 제한 값을 지정하지 않거나 또는 LIMIT 구문을 제공하지 않으면(또는 둘 다) UPDATE 또는 DELETE 명령문을 실행할 수 없다. 예를 들면:
    UPDATE tbl_name SET not_key_column=val WHERE key_column=val;
    UPDATE tbl_name SET not_key_column=val LIMIT 1;

  • 명령문에 LIMIT 구문이 없다면, 서버는 모든 SELECT 결과를 최대 1,000 열로 제한한다.
  • 서버는 1,000,000 열 조합 이상을 조사하는데 필요한 다중-테이블 SELECT 명령문을 중단 시킨다.

1,000부터 1,000,000 사이에서 한계를 지정하기 위해서는, --select_limit 및 --max_join_size 옵션을 사용해서 디폴트를 무시하도록 만들어야 한다:



shell> mysql --safe-updates --select_limit=500 --max_join_size=10000


mysql 자동-재 접속 비활성화 하기

mysql 클라이언트가 쿼리를 보내는 도중에 서버와 접속이 끊어지게 되면, 클라이언트는 즉시 자동으로 서버와 재 접속을 시도하고 쿼리를 다시 전송한다. 그러나 mysql이 재 접속에 성공한다고 하더라도, 처음에 했던 접속은 종료가 되었기 때문에 이전에 설정된 모든 세션 오브젝트와 설정 값들은 잃어 버리게 된다: 임시 테이블, 오토 커밋(autocommit) 모드, 그리고 사용자 정의 및 세션 변수 등. 또한 현재의 모든 트랜젝션도 롤백된다. 이것은 매우 위험할 수도 있는데, 아래의 예에서 보듯이, 서버가 알지 못하는 상태에서 첫 번째와 두 번째 명령문 사이에서 셧 다운 되고 재 시작이 되기 때문이다.:



mysql> SET @a=1;
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t VALUES(@a);
ERROR 2006: MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 1
Current database: test

Query OK, 1 row affected (1.30 sec)

mysql> SELECT * FROM t;
+------+
| a |
+------+
| NULL |
+------+
1 row in set (0.05 sec)


접속과 함께 사용자 변수 @a는 잃게 되고, 재 접속 후 정의되지 않는다. 접속이 끊어지면 에러와 함께 mysql을 종료시키는 것이 중요하다면, mysql 클라이언트를 --skip-reconnect 옵션과 함께 시작하면 된다.

출처 : MySQL 코리아