DBMS 2

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

mysqld - MySQL 서버

DBMS 2
MySQL 가이드
데이터 베이스 관리
mysqld - MySQL 서버
작성자
admin
작성일
2021-02-19 10:49
조회
2728

mysqld - MySQL 서버

mysqld Command Options
Server System Variables
Using System Variables
Server Status Variables
The Server SQL Mode
The MySQL Server Shutdown Process

mysqld 는 MySQL 서버다. 이 MySQL서버 구성에 대해서는 다음과 같이 다루기로 한다:


  • 서버가 지원하는 스타트업 옵션
  • 서버 시스템 변수
  • 서버 상태 변수
  • 서버 SQL모드 설정 방법
  • 서버 셧다운 과정
mysqld 명령어 옵션

mysqld 서버를 시작할 때, 여러분은 Section 4.3, “프로그램 옵션 지정하기”에서 설명하는 방법으로 프로그램 옵션을 지정할 수 있다. 가장 일반적인 방법은 옵션 파일 또는 명령어 라인에서 옵션을 제공하는 것이다. 하지만, 대부분의 경우에는 서버가 매번 실행할 때마다 동일한 옵션을 사용하도록 해 주는 것이 가장 바람직한 방법이다. 이렇게 동작하도록 하는 최선의 방법은 옵션 파일에 옵션을 작성하는 것이다.

Section 4.3.2, “옵션 파일 사용하기”를 참조할 것.

mysqld는 [mysqld] 와 [server] 그룹에서 옵션을 읽는다. mysqld_safe 는 [mysqld], [server], [mysqld_safe], 및 [safe_mysqld] 그룹에서 옵션을 읽는다. mysql.server는 [mysqld] 와 [mysql.server] 그룹에서 옵션을 읽는다.

임베디드 MySQL 서버는 일반적으로 [server], [embedded], 그리고 [xxxxx_SERVER] 그룹에서 옵션을 읽는데, 여기에서 xxxxx는 서버가 임베디드되는 어플리케이션의 이름이다.

mysqld는 많은 수의 옵션을 사용한다. 옵션 리스트를 간략하게 보기 위해서는 mysqld -help를 실행한다. 전체 옵션 리스트를 보기 위해서는 mysqld --verbose -help를 사용한다.

아래의 리스트는 가장 일반적인 서버 옵션을 보여주는 것이다. 추가적인 옵션들에 대해서는 나중에 설명하기로 한다:


  • 보안에 영향을 주는 옵션들: Section 5.7.3, “보안 관련 mysqld 옵션”.
  • SSL-관련 옵션들: Section 5.9.7.5, “SSL 명령어 옵션”.
  • 바이너리 로그 제어 옵션들: Section 5.12.3, “바이너리 로그”.
  • 리플리케이션 관련 옵션들: Section 6.8, “리플리케이션 스타트업 옵션”.
  • 특정 스토리지 엔진에 관련되는 옵션들: Section 14.1.1, “MyISAM 스타트업 옵션”, Section 14.5.3, “BDB 스타트업 옵션”, Section 14.2.4, “InnoDB 스타트업 옵션과 시스템 변수”, 그리고 Section 15.5.5.1, “mysqld 에 대한 MySQL 클러스터 관련 옵션”.

여러분은 이 섹션 후반부에서 설명하는 방법을 사용해서, 변수 이름을 옵션처럼 사용해서 서버 시스템 변수의 값을 설정할 수도 있다.


  • --help, -?
    간략한 도움말을 출력하고 종료한다. --verbose 와 --help 를 모두 사용해서 전체 도움말을 볼 수도 있다.
  • --allow-suspicious-udfs
    이 옵션은 메인 함수에 대해서 xxx symbol 만을 갖고 있는 사용자 지정 함수를 읽을 것인지를 제어한다. 디폴트로는 오프 (off)이며 최소 한 개의 보조 심볼을 갖고 있는 UDF만 읽을 수 있다; 이것은 규칙에 맞게 작성된 UDF가 아닌 다른 공유 오브젝트 파일에서 함수를 읽고자 하는 시도를 하지 못하도록 한다. 이 옵션은 5.0.3에서 추가되었다.
  • --ansi
    MySQL 신텍스 대신에 표준(ANSI) SQL 신텍스를 사용한다. SQL모드를 보다 정확하게 제어하기 위해서는 --sql-mode 를 대신 사용한다.
  • --basedir=path, -b path
    MySQL 설치 디렉토리에 대한 경로. 모든 경로는 일반적으로 이 경로에 관련되어 있다.
  • --bind-address=IP
    연결하고자 하는 IP 주소.
  • --bootstrap
    이 옵션은 mysql_install_db 스크립트가 전체 MySQL 서버를 구동시키지 않는 채로 MySQL 권한 테이블을 생성하기 위한 것이다.
  • --character-sets-dir=path
    문자 셋이 설치되어 있는 디렉토리. Section 5.11.1, “데이터와 정렬을 위해 사용하는 문자 셋
  • --character-set-client-handshake
    클라이언트가 보낸 문자 셋 정보를 무시하지 말도록 함. 클라이언트 정보를 무시하고 디폴트 서버 문자셋을 사용하기 위해서는, --skip-character-set-client-handshake를 사용한다; 이렇게 하면 MySQL이 4.0 버전처럼 구동을 한다.
  • --character-set-filesystem=charset_name
    파일 시스템 문자 셋. 이 옵션은 character_set_filesystem 시스템 변수를 설정한다. MySQL 5.0.19에서 추가되었다.
  • --character-set-server=charset_name, -C charset_name
    charset_name을 디폴트 서버 문자 셋으로 사용한다. Section 5.11.1, “데이터와 정렬을 위해 사용되는 문자 셋”을 참조.
  • --chroot=path
    chroot() 시스템 호출을 사용하는 동안 mysqld 서버를 폐쇄적인 상황으로 만들어 둔다. 이것은 보안 문제 관점에서 추천되는 방식이다. 이 옵션을 사용하면 LOAD DATA INFILE 과 SELECT ... INTO OUTFILE 사용이 다소 제한된다는 점을 알아두기 바란다.
  • --collation-server=collation_name
    collation_name을 디폴트 서버 콜레션(collation)으로 사용한다.
  • --console
    (윈도우 시스템에만 해당.) --log-error가 지정되어 있다고 하더라도, 에러 로그 메시지를 stderr 과 stdout에 작성한다. 이 옵션이 사용되면 mysqld는 콘솔을 닫지 않는다.
  • --core-file
    mysqld가 멈추는 경우에 코어 파일을 작성한다. 어떤 시스템에서는, mysqld_safe 에 대해서 --core-file-size 옵션을 반드시 지정해야 한다. 솔라이스와 같은 시스템의 경우에는, 여러분이 --user 옵션을 함께 사용한다면 코어 파일을 얻을 수 없다는 점을 알아 두기 바란다.
  • --datadir=path, -h path
    데이터 디렉토리에 대한 경로.
  • --debug[=debug_options], -# [debug_options]
    MySQL을 --with-debug와 함께 구성하면, 이 옵션을 사용해서 mysqld 이 실행하고 있는 사항에 대한 추적 파일 (trace file)을 얻을 수가 있다. debug_options 스트링은 'd:t:o,file_name'이며, 디폴트는 'd:t:i:o,mysqld.trace'이다.
  • --default-character-set=charset_name (거의 사용하지 않음)
    charset_name 를 디폴트 문자 셋으로 사용한다.
  • --default-collation=collation_name
    collation_name 를 디폴트 콜레션(collation)으로 사용한다. 이 옵션 대신에 --collation-server를 사용함.
  • --default-storage-engine=type
    collation_name 를 디폴트 콜레션(collation)으로 사용한다. 이 옵션 대신에 --collation-server를 사용함.
  • --default-table-type=type
    이 옵션은 --default-storage-engine과 같다.
  • --default-time-zone=timezone
    디폴트 서버 타임 존을 설정한다. 이 옵션은 글로벌 time_zone 시스템 변수를 설정한다. 이 옵션이 주어지지 않으면, 디폴트 타임 존은 시스템 타임 존과 같게 된다 (system_time_zone 시스템 변수가 설정된 값).
  • --delay-key-write[= OFF | ON | ALL]
    키 쓰기 지연(delay)을 사용하는 방법을 지정한다. 지연된 키 쓰기는 키 버퍼가 MyISAM 테이블을 작성하는 동안에 플러시 (flush)되지 않도록 한다. OFF는 키 쓰기 지연을 비활성화 시킨다. ON은 DELAY_KEY_WRITE 옵션을 가지고 생성되는 태이블에 대한 지연 키 쓰기를 활성화 시킨다. ALL은 모든 MyISAM 테이블에 대한 작성을 지연 시킨다.
    Note: 이 변수를 ALL로 설정하면, MyISAM 테이블이 사용될 때 다른 프로그램 (다른 MySQL 서버 또는 myisamchk)에서는 이 테이블을 사용할 수 없게 된다.
  • --des-key-file=file_name
    이 파일에서 디폴트 DES 키를 읽어 온다. 이러한 키들은 DES_ENCRYPT() 과 DES_DECRYPT() 함수가 사용한다.
  • --enable-named-pipe
    네임드 파이프 지원을 활성화 시킨다. 이 옵션은 Windows NT, 2000, XP, and 2003 시스템에만 적용되며, 네임드 파이프 접속을 지원하는 mysqld-nt 와 mysqld-max-nt 서버에서만 사용할 수 있다.
  • --exit-info[=flags], -T [flags]
    이것은 mysqld 서버를 디버깅 하기 위해 사용하는 다른 플래그의 비트 마스크(bit mask) 이다. 이 옵션이 무슨 일을 하는지 정확히 알지 못한다면 사용하지 말기 바란다!
  • --external-locking
    외부 잠금(시스템 잠금)을 활성화 시키는데, 4.0 이후에는 디폴트로 비활성화 된다. lockd가 완전하게 동작하지 않는 시스템 (리눅스와 같은 시스템)에서 이 옵션을 사용한다면, mysqld가 데드락 (deadlock) 되기 쉽다는 점을 알아두기 바란다. 이 옵션은 이전에는 --enable-locking라고 불리었다.
    Note: MySQL 처리 과정에서 MyISAM 테이블을 업데이트 할 수 있도록 하기 위해 이 옵션을 사용하고자 한다면, 아래의 조건이 만족하는지 먼저 확인해야 한다:
    • 다른 프로세스가 업데이트하는 테이블을 사용하는 쿼리에 대해 쿼리 캐시를 사용하지 않는다.
    • 어떠한 공유 테이블에서도 --delay-key-write=ALL 또는 DELAY_KEY_WRITE=1을 사용하지 않는다.
    이것을 실행하는 가장 손쉬운 방법은 --external-locking 을 항상 --delay-key-write=OFF 및 --query-cache-size=0과 함께 사용하는 것이다 (이것은 디폴트로 실행되지 않는데, 그 이유는 많은 셋업에서 위와 같이 혼용해서 사용하는 것이 더 유용하기 때문이다.)
  • --flush
    각 SQL명령문을 실행한 후에 모든 변경 사항을 디스크에 플러시 (flush)한다 (동기화 시킴). 정상적인경우, MySQL은 각 SQL 명령문을 실행한 후에만 모든 변경 사항을 디스크에 기록하고 OS가 동기화를 처리하도록 한다.
  • --init-file=file
    스타트업 때 이 파일에서 SQL 명령문을 읽는다. 각 명령문은 하나의 라인에 있어야 하며 코멘트를 포함하지 말아야 한다.
  • --innodb-safe-binlog
    InnoDB 테이블의 내용과 바이너리 로그간의 일관성을 부여한다. Section 5.12.3, “바이너리 로그”를 참조할 것. 이 옵션은 MySQL 5.0.3에서 삭제 되었다.
  • --innodb-xxx
    InnoDB 옵션은 Section 14.2.4, “InnoDB 스타트업 옵션과 시스템 변수”에 기록 되어 있다.
  • --language=lang_name, -L lang_name
    지정한 언어로 클라이언트 에러 메시지를 리턴 한다. lang_name은 언어 이름 또는 언어 파일이 설치된 디렉토리의 전체 경로 이름이다.
  • --large-pages
    어떤 하드웨어 OS는 디폴트 (일반적으로 4KB) 보다 큰 메모리 페이지를 지원한다. 이것에 대한 실제 구현은 하드웨어와 OS의 기능에 달려 있다. 보다 많은 메모리 엑세스를 실행하는 어플리케이션들은 큰 페이지를 사용해서 트랜젝션 룩어사이드 버퍼(TLB)를 열이여 주기 때문에 성능을 향상 시킬 수가 있다.
    현재까지는, 리눅스에서만 이 기능을 구현하고 있다 (리눅스에서는 이것을 휴즈 TLB (huge TLB)라고 부른다). 향후에는 FreeBSD, Solaris 그리고 다른 플랫폼에도 지원 할 예정이다. 이 옵션은 디폴트로는 비활성화 되어 있다. 이것은 5.0.3에 추가 되었다.
  • --log[=file_name], -l [file_name]
    이 옵션은 일반 쿼리 로그 로깅을 활성화 시키는데, 이 로그는 클라이언트 연결과 클라이언트에서 전달한 SQL 명령문을 기록한 엔트리를 가지고 있다. Section 5.12.2, “일반 쿼리 로그”를 참조할 것. 파일 이름을 생략하면, MySQL은 host_name.log를 파일 이름으로 사용한다.
  • --log-bin=[base_name]
    바이너리 로깅을 활성화 시킨다. 서버는 바이너리 로그에 데이터를 변경하는 모든 명령문을 기록하는데, 이 바이너리 로그는 백업과 리플리케이션용으로 사용된다.
    옵션 값을 준다면, 그것이 로그 시퀀스에 대한 베이스 이름이 된다. 서버는 베이스 이름에 숫자 접미사를 순차적으로 부가해서 바이너리 로그 파일을 생성한다. 이것은 여러분이 베이스 이름을 지정할 때 권장되는 방식이다. 옵션 값을 주지 않는다면, MySQL은 host_name-bin을 베이스 이름으로 사용한다.
  • --log-bin-index[=file_name]
    바이너리 로그 파일 이름에 대한 인덱스 파일. 파일 이름을 생략하고, --log-bin를 사용해 서 하나를 지정하지 않으면, MySQL은 host_name-bin.index를 파일 이름으로 사용한다.
  • --log-bin-trust-function-creators[={0|1}]
    인수가 없거나 또는 1 이면, 이 옵션은 log_bin_trust_function_creators 시스템 변수를 1로 설정한다. 인수가 0 이면, 시스템 변수를 0으로 설정한다. log_bin_trust_function_creators는 MySQL이 어떻게 스토어드 함수 생성에 제약을 주는지를 결정한다.
    이 옵션은 MySQL 5.0.16에서 추가 되었다.
  • --log-bin-trust-routine-creators[={0|1}]
    이것은 --log-bin-trust-function-creators의 예전 이름이다. MySQL 5.0.16 이전에는, 스토어드 함수뿐만 아니라 스토어드 프로시저에도 이것이 적용되었고, log_bin_trust_routine_creators 시스템 변수를 설정한다. 5.0.16 이후에는 기능이 무의미해 졌다. 이것은 이전 버전과의 호환성을 유지하기는 하지만 이것을 사용하면 경고 메시지가 나오게 된다.
    이 옵션은 MySQL 5.0.6에 추가 되었다.
  • --log-error[=file_name]
    에러와 스타트업 메시지를 이 파일에 로그한다. 파일 이름을 생략하면, MySQL은 host_name.err를 사용한다. 파일 이름에 확장자가 없으면, 서버는 .err를 확장자에 추가한다.
  • --log-isam[=file_name]
    모든 MyISAM 변경 사항을 이 파일에 로그한다 (MyISAM을 디버깅할 때에만 사용함).
  • --log-long-format (거의 사용하지 않음)
    업데이트 로그, 바이너리 로그, 그리고 슬로우 쿼리 로그등이 활성화 되어 있다면 여분의 정보들을 기록한다. 예를 들면, 사용자 이름과 타임 스탬프는 모든 쿼리에 기록된다. 이 옵션은 무의미해졌는데, 그 이유는 이 기능들이 디폴트 로깅 기능에 포함이 되었기 때문이다. --log-queries-not-using-indexes 옵션은 슬로우 쿼리 로그에 인덱스를 사용하지 않는 쿼리를 기록할 목적으로 사용할 수 있다.
  • --log-queries-not-using-indexes
    이 옵션을 --log-slow-queries와 함께 사용하면, 인덱스를 사용하지 않는 쿼리들은 슬로우 쿼리 로그에 기록된다.
  • --log-short-format
    업데이트 로그, 바이너리 로그, 그리고 슬로우 쿼리 로그등이 활성화 되어 있다면, 그곳에 정보를 적게 기록한다. 예를 들면, 사용자 이름과 타임스탬프는 쿼리에 기록되지 않는다.
  • --log-slow-admin-statements
    OPTIMIZE TABLE, ANALYZE TABLE, 및 ALTER TABLE과 같은 슬로우 관리 명령문을 슬로우 쿼리 로그에 기록한다.
  • --log-slow-queries[=file_name]
    long_query_time 시간보다 많이 걸리는 모든 쿼리를 이 파일에 기록한다. 보다 자세한 내용은 --log-long-format 과 --log-short-format 옵션을 참조하기 바란다.
  • --log-warnings=[level], -W [level]
    Aborted connection... 과 같은 경고문을 에러 로그에 기록한다. 이옵션을 활성화 시킬 것을 권장하는데, 예를 들면, 여러분이 리플리케이션을 사용하는 경우가 여기에 해당한다 (여러분은 네트워크 오류 및 재 접속 메시지와 같이, 어떤 일이 있었는지에 대한 보다 자세한 정보를 얻을 수 있다). 이 옵션은 디폴트로 활성화 되고, 생략될 경우는 디폴트 level 값이 1이 된다. 이 옵션을 비활성화 하기 위해서는, --log-warnings=0을 사용한다. 종료된 연결은 이 값이 1보다 크지 않을 경우에는 에러 로그에 기록되지 않는다.
  • --low-priority-updates
    테이블-수정 연산 (INSERT, REPLACE, DELETE, UPDATE)에 대해서 선택 연산 보다 낮은 우선 순위를 부여한다. 이것은 오직 한 개의 쿼리에 {INSERT | REPLACE | DELETE | UPDATE} LOW_PRIORITY ... 를 통해서 낮은 우선권을 열 수 있거나, 또는 SET LOW_PRIORITY_UPDATES=1 를 사용해서 하나의 쓰레드의 우선권을 변경할 수도 있다.
  • --memlock
    메모리에 있는 mysqld를 잠근다 (lock). 이 옵션은 mlockall() 시스템 호출을 지원하는 솔라리스와 같은 시스템에서 동작한다. 이것은 OS가 mysqld를 디스크에 스왑 시키는 문제가 있을 경우에 도움이 된다. 이 옵션을 사용하기 위해서는 root로 서버에 접속해야 하지만, 이렇게 하는 것은 일반적으로 보안상 그리 좋은 방법이 아니라는 점을 알아두기 바란다.
  • --myisam-recover[=option[,option]...]]
    MyISAM 스토리지 엔진을 복구 모드로 설정한다. 이 옵션은 DEFAULT, BACKUP, FORCE, 또는 QUICK을 사용한 어떠한 조합으로도 값을 열 수 있다. 만약에 다중 값을 지정할 경우에는, 콤마로 값들을 구분해 준다. 또한 ""를 값으로 지정하면 이 옵션을 비활성화 시킬 수 있다. 이 옵션이 사용되면, mysqld가 MyISAM 테이블을 열 때마다 테이블이 깨졌는지 또는 올바르게 닫혔는지를 검사하게 된다. (마지막 옵션은 여러분이 외부 잠금을 비활성화 시킬 경우에만 동작한다.) 이와 같은 경우에는, mysqld는 테이블에서 검사를 실행한다. 테이블이 깨졌다면, mysqld는 이 테이블을 복원 시킨다.
    아래의 옵션은 복원 작업 실행에 영향을 주는 것들이다:

    Option Description
    DEFAULT --myisam-recover에 아무런 옵션을 주지 않을 경우와 같다.
    BACKUP 복구중에 테이블이 변경되었다면, tbl_name.MYD 파일의 백업을 tbl_name-datetime.BAK로 저장한다.
    FORCE .MYD 파일에서 한 개 이상의 열을 잃는다 하더라도 복구 작업을 진행한다
    QUICK 테이블에 아무런 삭제 블록이 없다면 테이블 열을 검사하지 말 것.

    서버가 테이블을 자동으로 복구를 하기 전에, 복구에 대한 정보를 에러 로그에 기록을 한다. 사용자 간섭 없이 대부분의 문제를 해결하길 원한다면, BACKUP, FORCE 옵션을 사용한다. 이렇게 하면 몇몇 열들이 삭제가 된다고 하더라도 복구 작업을 계속 진행하도록 만들지만, 나중을 위해서 이전 데이터들을 백업해 두도록 한다.
  • --ndb-connectstring=connect_string
    NDB 스토리지 엔진을 사용할 때에는 접속 스트링 옵션을 사용해서 클러스터 구성을 배포하는 관리 서버를 지정하는 것이 가능하다.
  • --ndbcluster
    바이너리가 NDB Cluster 스토리지 엔진을 지원한다면, 이 옵션은 엔진을 활성화 시키는데, 디폴트로는 이 옵션이 비활성화 되어 있다.
  • --old-passwords
    서버가 새로운 패스워드를 짧은 (4.1 이전 버전) 패스워드 해쉬로 만들도록 한다. 이 옵션은 서버가 이전 버전의 클라이언트 프로그램을 반드시 지원해야 하는 경우에 매우 유용하다.
  • --one-thread
    이 옵션은 오직 하나의 쓰레드만 사용한다 (리눅스에서 디버깅용 임). 이 옵션은 서버를 디버깅이 가능하도록 활성화 시켜놓은 경우에만 사용 가능하다.
  • --open-files-limit=count
    mysqld에서 사용 가능한 파일 디스크립터 (descriptor)의 숫자를 변경한다. 만약에 이 옵션이 설정되지 않았거나 또는 0으로 설정되면, mysqld는 이 값을 사용해서 setrlimit()를 갖는 파일 디스크립터를 확보 (reserve)해 놓는다. 이 값이 0이면, mysqld는 max_connections×5 또는 max_connections + table_open_cache×2개의 파일을 확보해 둔다. mysqld 가 Too many open files 이라는 에러 메시지를 보내면 이 값을 좀더 크게 늘리도록 해본다.
  • --pid-file=path
    프로세스 ID 파일의 경로 이름. 이 파일은 mysqld_safe 와 같은 다른 프로그램이 서버의 프로세스 ID를 검사하기 위해 사용한다.
  • --port=port_num, -P port_num
    TCP/IP 접속을 위해 사용되는 포트 번호. 포트 번호는 서버가 root 시스템 사용자로 시작되지 않을 경우에는 1024 또는 그 이상의 값이 되어야 한다.
  • --port-open-timeout=num
    어떤 시스템에서는, 서버가 종료될 때 TCP/IP 포트를 즉시 사용할 수 없을 수도 있다. 서버가 종료된 후에 곧 바로 다시 재 가동 시킬 경우에는, 서버가 포트를 재 오픈을 시도하지만 실패를 하게 된다. 이 옵션은 서버가 TCP/IP 포트를 열 수 없다면, 사용할 수 있을 때까지 얼마를 기다려야 하는지를 알려준다. 디폴트는 대기 시간이 없는 것이다. 이 옵션은 MySQL 5.0.19에서 추가 되었다.
  • --safe-mode
    최적화 과정 중에 몇 가지를 건너 띈다.
  • --safe-show-database (거의 사용하지 않음)
    Section 5.8.3, “MySQL이 제공하는 권한”를 참조할 것.
  • --safe-user-create
    이 옵션이 활성화 되면, 사용자가 mysql.user 테이블 또는 테이블에 있는 컬럼을 대한 INSERT 권한을 갖고 있지 않는 한 GRANT 명령문을 사용해서 새로운 MySQL 사용자를 생성할 수 없게 된다.
  • --secure-auth
    구형 (pre-4.1) 패스워드를 가지고 있는 계정을 사용하고자 하는 클라이언트의 인증을 허용하지 않음.
  • --shared-memory
    로컬 클라이언트의 공유 메모리 연결을 가능하게 함. 이 옵션은 윈도우에서만 사용 가능함.
  • --shared-memory-base-name=name
    공유 메모리 연결을 위해 사용하는 공유 메모리 이름. 이 옵션은 윈도우에서만 사용 가능하다. 디폴트 이름은 MYSQL이다. 이 이름은 대소 문자를 구분한다.
  • --skip-bdb
    BDB 스토리지 엔진을 사용하지 못하도록 함. 이 옵션은 메모리를 절약시켜 주며 몇몇 동작의 속도를 향상 시켜준다. BDB 테이블이 필요할 경우에는 이 옵션을 사용하지 말기 바란다.
  • skip-concurrent-insert
    MyISAM 테이블에 선택과 삽입을 동시에 할 수 있는 기능을 오프 (off)시킨다 (이 옵션은 여러분이 생각하기에 위의 테이블에 버그가 있다고 생각할 경우에만 사용한다).
  • --skip-external-locking
    외부 잠금 (시스템 잠금)을 사용하지 않음. 외부 잠금을 사용하지 않은 상태에서는, 서버를 셧다운 시킬 때 반드시 myisamchk를 사용해야 한다. 이러한 요구 사항을 없애기 위해서는, CHECK TABLE 및 REPAIR TABLE 명령문을 사용해서 MyISAM 테이블을 검사하고 복구한다. MySQL 4.0이후에는 외부 잠금 기능은 디폴트로 비활성화 되어 있다.
  • --skip-grant-tables
    이 옵션은 서버가 권한 시스템을 전혀 사용하지 못하도록 만드는데, 이렇게 하면 모든 사용자가 서버에 아무런 제약 없이 모든 데이터 베이스를 접근할 수 있도록 해 주는 것이다. 여러분은 구동중인 서버가 시스템 쉘에서 mysqladmin flush-privileges 또는 mysqladmin reload 명령어를 실행하거나, 또는 서버에 접속을 한 후에 MySQL FLUSH PRIVILEGES 명령문을 입력해서 그랜트 테이블을 다시 한번 사용해서 시작하게끔 만들 수 있다. 이 옵션은 또한 사용자 정의 함수 (UDF) 로드 ( Load)를 억제 시킨다.
  • --skip-host-cache
    IP를 위한 보다 빠른 이름 (faster name-to-IP) 해결을 위해 내부 호스트 이름 캐시를 사용하지 못함. 대신에, 클라이언트가 접속할 때 마다 DNS 서버에 쿼리를 준다.
  • --skip-innodb
    InnoDB 스토리지 엔진을 사용하지 못하게 함. 이 옵션은 메모리와 디스크의 사용량을 절약 시키며 어떤 동작에서는 성능을 향상 시킨다. InnoDB 테이블이 필요 하지 않으면, 이 옵션을 사용하지 말 것.
  • --skip-name-resolve
    클라이언트 접속을 검사할 때 호스트 이름을 사용하지 못하도록 한다. IP 번호만 사용한다. 이 옵션을 사용한다면, 그랜트 테이블에 들어 있는 모든 Host 컬럼의 값은 IP 번호 또는 localhost가 되어야 한다.
  • --skip-ndbcluster
    NDB Cluster 스토리지 엔진을 사용하지 못하도록 한다. 이 옵션은 NDB Cluster 스토리지 엔진을 지원하도록 구축된 바이너리에 대해서는 디폴트이다; 서버는 --ndbcluster 옵션이 확실하게 주어지는 경우에만 이 스토리지 엔진에 대해 메모리와 다른 자원들을 할당한다.
  • --skip-networking
    TCP/IP 접속에 대해서는 전혀 고려하지 않도록 만든다. mysqld를 사용하는 모든 인터액션 (interaction)은 네임드 파이프 또는 공유 메모리(윈도우) 또는 유닉스 소켓 파일(유닉스)에서만 이루어져야 한다. 이 옵션은 로컬 클라이언트만 사용하도록 하는 시스템에서는 적극 권장하는 사항이다.
  • --standalone
    윈도우 NT 계열 시스템에서만 사용 가능함; MySQL 서버가 서비스 형태로 구동 되지 못하도록 만듦.
  • --symbolic-links, --skip-symbolic-links
    심볼릭 링크 지원을 활성화 또는 비활성화 함. 이 옵션은 윈도우와 유닉스에서 서로 다른 효과를 나타낸다:
    • 윈도우 시스템의 경우, 심볼릭 링크를 활성화 하면 실제 디렉토리 경로를 가지고 있는 db_name.sym 파일을 생성해서 데이터베이스 디렉토리에 심볼릭 링크를 구축한다.
    • 유닉스 시스템의 경우, 심볼릭 링크를 활성화 하면 CREATE TABLE 명령문 옵션인 INDEX DIRECTORY 또는 DATA DIRECTORY를 가진 또 다른 디렉토리에 MyISAM 인덱스 파일 또는 데이터 파일을 링크 시킬 수가 있다. 만약에 그 테이블을 삭제 또는 다른 이름으로 변경한다면, 심볼릭 링크를 가지고 있는 파일도 역시 삭제되거나 이름이 바뀌게 된다.
  • --skip-safemalloc
    MySQL이 --with-debug=full과 함께 구성되면, 모든 MySQL 프로그램은 각 메모리 할당 및 메모리 정리 (freeing) 동작을 하는 동안에 메모리 오버런 (overrun)을 검사하게 된다. 이러한 검사는 매우 느리게 진행되기 때문에, 서버가 이러한 동작을 하지 못하도록 하기 위해서는, --skip-safemalloc 옵션을 사용한다.
  • --skip-show-database
    이 옵션을 사용하면, SHOW DATABASES 권한을 가진 사용자만이 SHOW DATABASES 명령문을 사용할 수 있게 되며, 이 명령문은 모든 데이터 베이스의 이름을 화면에 보여 주게 된다. 이 옵션이 없으면, SHOW DATABASES 명령문을 모든 사용자가 사용할 수 있으나, 사용자가 SHOW DATABASES 권한 또는 데이터 베이스에 대한 다른 권한을 갖고 있을 때에만 각각의 데이터 베이스 이름을 화면에 보여 주게 된다. 모든 글로벌 권한은 데이터 베이스에 대한 권한으로 간주된다는R>스택 트레이스 (trace)를 작성하지 말 것. 이 옵션은 여러분이 디버거 아래에서 mysqld를 구동 시킬 때 유용하다. 어떤 시스템의 경우, 코어 파일을 가져오기 위해서는 이 옵션을 사용해야만 하는 경우도 있다.
  • --skip-thread-priority
    빠른 응답 시간을 위해 쓰레드 우선권을 비활성화 시킴.
  • --socket=path
    유닉스 시스템의 경우, 이 옵션은 로컬 접속이 이루어 졌을 때 사용하기 위한 유닉스 소켓 파일을 지정한다. 디폴트 값은 /tmp/mysql.sock이다. 윈도우 시스템의 경우, 이 옵션은 네임드 파이프를 사용하는 로컬 접속이 이루어 졌을 때 사용하기 위한 파이프 이름을 지정한다. 디폴트 값은 MySQL 이다 (대소 문자 구분하지 않음).
  • --sql-mode=value[,value[,value...]]
    SQL 모드를 설정함.
  • --temp-pool
    이 옵션은 서버가 만든 대부분의 임시 파일들이 각각의 새로운 파일에 대해 서로 다른 이름을 사용하는 대신에 작은 이름 셋을 사용하도록 만든다. 이렇게 하면 서로 다른 이름을 가진 많은 수의 새로운 파일을 다루는 리눅스 커널 문제를 해결할 수 있다. 예전에는, 리눅스는 메모리 “leak”을 발생 시켰는데, 그 이유는 이것이 디스크 캐시가 아닌 디렉토리 엔트리 캐시에 할당되었기 때문이다.
  • --transaction-isolation=level
    디폴트 트랜젝션 고립 (isolation) 레벨을 설정한다. level 값은 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, 또는 SERIALIZABLE가 될 수 있다.
  • --tmpdir=path, -t path
    임시 파일을 생성하기 위한 디렉토리의 경로. 이 옵션은 임시 테이블을 가지고 있기에는 너무 작은 파티션에 디폴트 /tmp 디렉토리가 존재할 경우에 유용하게 사용될 수 있다. 이 옵션은 라운드 로빈 (round-robin) 형태로 사용되는 몇몇 경로들을 수용한다. 경로들은, 유닉스에서는 콜론으로 구분되어야 하며, 윈도우, NetWare, 그리고 OS/2에서는 세미 콜론을 사용해야 한다. 만약에 MySQL 서버가 리플리케이션 슬레이브로 동작한다면, 메모리 기반의 파일 시스템에 있는 디렉토리 또는 서버가 재 구동될 때 없어지는 디렉토리를 가리키기 위한 -tmpdir 설정을 할 수가 없게 된다. 리플리케이션 슬레이브는 임시 테이블 또는 LOAD DATA INFILE 동작을 리플리케이트 (replicate) 할 수 있도록 서버를 재 구동하기 위해 몇가지 임시 파일들을 필요로 한다. 만약에 임시 파일 디렉토리에 있는 파일들을 서버 재 구동 때 잃어 버리게 되면, 리플리케이션은 실패하게 된다.
  • --user={user_name | user_id}, -u {user_name | user_id}
    mysqld 서버를 user_name 이름 또는 숫자 사용자 ID user_id를 갖고 있는 사용자처럼 구동 시킨다. (이 문장에서 “사용자”는 시스템 로그인 계정을 의미하는 것이며, 그랜트 테이블에 나열되어 있는 MySQL 사용자를 가리키는 것이 아니다.) 이 옵션은 root 계정으로 mysqld 을 구동 시킬 때에는 필수 조건이다. 서버는 이 사용자 ID를 스타트업 시퀀스 동안 변경 시키는데, 이로 인해 서버가 root 계정이 아닌 특정 사용자로 구동되도록 만들어 버린다.
    사용자가 --user=root 옵션을 my.cnf 파일에 추가할 때 생길 수 있는 보안 문제를 피하기 위해서는 (이로 인해서 서버를 는로 구동 시키게 만듦), 여러 개의 --user 옵션이 있다면 mysqld는 지정된 첫번째 --user 옵션만을 사용하고 경고문을 보여 주게 된다. /etc/my.cnf 와 $MYSQL_HOME/my.cnf 에 있는 옵션들은 명령어 옵션 전에 실행되기 때문에 여러분이 --user 옵션을 /etc/my.cnf에 넣고 root가 아닌 다른 값을 지정할 것을 권장한다. /etc/my.cnf 에 있는 옵션들을 다른 --user 옵션들 보다 먼저 찾기 때문에 확실하게 서버를 root가 아닌 다른 사용자로 구동시키며, 다른 --user 옵션이 발견되면 경고를 발생하게끔 만들도록 한다.
  • --version, -V
    버전 정보를 화면에 보여준 다음에 종료한다 (exit).

여러분은 --var_name=value를 사용해서 서버 시스템 변수에 값을 할당할 수 있다. 예를 들면, --key_buffer_size=32M 는 key_buffer_size 변수에 32MB를 설정한다.

여러분이 변수에 값을 설정할 때, MySQL은 자동으로 그 값이 지정한 범위 내에서 사용될 수 있는 것으로 고치거나, 또는 만약에 특정 값만을 사용할 수 있다면 사용 가능한 값에 가장 근접한 값으로 조정한다는 점을 알아 두기 바란다.

만약에 런 타임시에 SET 을 가지고 설정할 수 있는 변수 값의 최대 값을 제한하고자 한다면, --maximum-var_name 명령어 옵션을 사용한다.

--set-variable=var_name=value 또는 -O var_name=value 신텍스를 사용해서 변수를 지정하는 것도 가능하다. 이 신텍스는 거의 시용하지 않음..

여러분은 구동 중에 있는 서버에 대해서 SET 명령문을 사용해서 대부분의 시스템 변수를 변경 시킬 수 있다.


서버 시스템 변수

mysql 서버는 서버가 어떻게 구성되었는지를 가리키는 많은 시스템 변수들을 유지 관리 한다. 각 시스템 변수는 디폴트 값을 가지고 있다. 시스템 변수들은 명령어 라인 또는 옵션 파일에서 옵션을 사용하여 서버 스타트업 때 설정될 수 있다. 대부분의 것들은 서버가 구동되고 있는 동안에 SET 명령문을 가지고 동적으로 변경할 수 있는데, 이 명령문은 서버를 종료하고 재 구동 시키지 않는 상태에서 서버 동작을 수정할 수 있다. 여러분은 수식 안에 있는 시스템 변수를 참조할 수도 있다.

시스템 변수 이름과 값을 볼 수 있는 방법은 여러 가지가 있다:


  • 서버가 디폴트 및 옵션 파일에서 읽는 변수 값을 보기 위해서는, 아래의 명령어를 사용한다:
    mysqld --verbose --help
  • 옵션 파일에 있는 설정 값은 무시하고, 서버 자체가 컴파일한 디폴트에 근거해서 사용할 값을 보기 위해서는, 아래의 명령어를 사용한다:
    mysqld --no-defaults --verbose --help
  • 구동 중에 있는 서버가 현재 사용하는 값을 보기 위해서는, SHOW VARIABLES 명령문을 사용한다.

이 섹션에서는 각 시스템 변수를 보다 자세하게 설명한다. 버전 번호가 없는 변수들은 모든 MySQL 5.0 릴리즈에 존재하는 것임을 의미한다. 이러한 변수들에 대한 이전 버전 정보는 MySQL 3.23, 4.0, 4.1 Reference Manual을 참조하기 바란다.

부가적인 시스템 변수에 대한 정보는 아래의 섹션을 참고하기 바란다:


  • Section 5.2.3, “Using System Variables”에서는 시스템 변수 값을 설정하고 출력하기 위한 신텍스를 설명한다.
  • Section 5.2.3.2, “동적(dynamic) 시스템 변수”에서는 런타임 시에 설정할 수 있는 변수들을 설명한다.
  • 시스템 변수 튜닝에 대한 정보는 Section 7.5.2, “Tuning Server Parameters”에서 설명하고 있다.
  • Section 14.2.4, “InnoDB Startup Options and System Variables”에서는InnoDB 시스템 변수를 설명한다.

Note: 아래의 변수 설명문 중에는 변수를 “활성화” 또는 “비활성화” 하는 것에 대해 설명하는 것이 있다. 이러한 변수들은 SET 명령문을 사용해서 그 값을 ON 또는 1로 설정해서 활성화 시키거나, 또는 OFF 또는 0으로 설정해서 비활성화 시킬 수가 있다. 하지만, 이러한 변수들을 명령어 라인 또는 옵션 파일에서 설정하기 위해서는, 이것들은 반드시 1 또는 0으로 설정해야 한다; ON 또는 OFF로 설정하면 구동이 되지 않는다. 예를 들면, 명령어 라인에서, --delay_key_write=1는 구동할 수 있지만, --delay_key_write=ON 는 실행할 수 없다.

버퍼 크기, 길이, 그리고 스택의 크기에 대한 값은 별도로 지정되지 않는 한 바이트 단위로 지정한이다.


  • auto_increment_increment
    auto_increment_increment 및 auto_increment_offset는 마스터와 마스터간의 리플리케이션을 위한 용도로 사용되며, 또한 AUTO_INCREMENT 컬럼의 동작을 제어하기 위해서도 사용된다. 두 변수 모두 글로벌 또는 로컬 변수로 지정할 수 있으며, 또한 각각은 1에서 65,535 사이의 정수 값을 가질 수 있다. 위의 두 변수 중에 하나를 0으로 설정하면 그 값은 0 대신에 1로 설정된다. 위의 두 변수 중에 하나를 65.535보다 큰 값 또는 0보다 작은 값으로 설정하면 그 값은 65.535가 된다. auto_increment_increment 또는 auto_increment_offset 값을 정수가 아닌 값으로 설정하고자 하면 에러가 발생하고, 그 변수의 실제 값이 그대로 유지된다. 이 두 변수는 AUTO_INCREMENT 실행에 아래와 같이 영향을 준다:
    • auto_increment_increment는 연속적인 컬럼 값 사이의 간격을 제어 한다. 예를 들면:
      mysql> SHOW VARIABLES LIKE 'auto_inc%';
      +--------------------------+-------+
      | Variable_name | Value |
      +--------------------------+-------+
      | auto_increment_increment | 1 |
      | auto_increment_offset | 1 |
      +--------------------------+-------+
      2 rows in set (0.00 sec)

      mysql> CREATE TABLE autoinc1
      -> (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
      Query OK, 0 rows affected (0.04 sec)

      mysql> SET @@auto_increment_increment=10;
      Query OK, 0 rows affected (0.00 sec)

      mysql> SHOW VARIABLES LIKE 'auto_inc%';
      +--------------------------+-------+
      | Variable_name | Value |
      +--------------------------+-------+
      | auto_increment_increment | 10 |
      | auto_increment_offset | 1 |
      +--------------------------+-------+
      2 rows in set (0.01 sec)

      mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
      Query OK, 4 rows affected (0.00 sec)
      Records: 4 Duplicates: 0 Warnings: 0

      mysql> SELECT col FROM autoinc1;
      +-----+
      | col |
      +-----+
      | 1 |
      | 11 |
      | 21 |
      | 31 |
      +-----+
      4 rows in set (0.00 sec)

      (이러한 변수들의 현재 값을 얻기 위해 SHOW VARIABLES를 어떻게 사용했는지 잘 알아 두기 바란다.)
    • auto_increment_offset는 AUTO_INCREMENT 컬럼 값의 시작 포인트를 결정한다. 아래에 나오는 명령문들이 auto_increment_increment 설명에서 나왔던 예제와 같은 세션 동안 실행된다고 가정한다:
      mysql> SET @@auto_increment_offset=5;
      Query OK, 0 rows affected (0.00 sec)

      mysql> SHOW VARIABLES LIKE 'auto_inc%';
      +--------------------------+-------+
      | Variable_name | Value |
      +--------------------------+-------+
      | auto_increment_increment | 10 |
      | auto_increment_offset | 5 |
      +--------------------------+-------+
      2 rows in set (0.00 sec)

      mysql> CREATE TABLE autoinc2
      -> (col INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
      Query OK, 0 rows affected (0.06 sec)

      mysql> INSERT INTO autoinc2 VALUES (NULL), (NULL), (NULL), (NULL);
      Query OK, 4 rows affected (0.00 sec)
      Records: 4 Duplicates: 0 Warnings: 0

      mysql> SELECT col FROM autoinc2;
      +-----+
      | col |
      +-----+
      | 5 |
      | 15 |
      | 25 |
      | 35 |
      +-----+
      4 rows in set (0.02 sec)

      만약에 auto_increment_offset 값이 auto_increment_increment 값보다 크다면, auto_increment_offset 값은 무시된다.
    이 변수들 중에 하나 또는 두개 모두 변경된 후에 새로운 열이 AUTO_INCREMENT 컬럼을 가지고 있는 테이블에 삽입 된다면, 그 결과는 직관적으로 볼 수 없게 되는데, 그 이유는 AUTO_INCREMENT 값 시리즈는 컬럼에 이미 존재하는 어떠한 변수들도 고려하지 않고 계산되기 때문이며, 또한 삽입되는 바로 다음의 값이 적어도 AUTO_INCREMENT 컬럼에 있는 최대 존재 값 보다 큰 시리즈에 있는 값이 되기 때문이다. 다른 말로 한다면, 그 시리즈는 다음과 같이 계산된다:
    auto_increment_offset + N × auto_increment_increment
    여기에서 N 은 시리즈[1, 2, 3, ...]에 있는 양수 정수 값이다. 예를 들면:
    mysql> SHOW VARIABLES LIKE 'auto_inc%';
    +--------------------------+-------+
    | Variable_name | Value |
    +--------------------------+-------+
    | auto_increment_increment | 10 |
    | auto_increment_offset | 5 |
    +--------------------------+-------+
    2 rows in set (0.00 sec)

    mysql> SELECT col FROM autoinc1;
    +-----+
    | col |
    +-----+
    | 1 |
    | 11 |
    | 21 |
    | 31 |
    +-----+
    4 rows in set (0.00 sec)

    mysql> INSERT INTO autoinc1 VALUES (NULL), (NULL), (NULL), (NULL);
    Query OK, 4 rows affected (0.00 sec)
    Records: 4 Duplicates: 0 Warnings: 0

    mysql> SELECT col FROM autoinc1;
    +-----+
    | col |
    +-----+
    | 1 |
    | 11 |
    | 21 |
    | 31 |
    | 35 |
    | 45 |
    | 55 |
    | 65 |
    +-----+
    8 rows in set (0.00 sec)

    auto_increment_increment 및 auto_increment_offset용으로 나온 값은 시리즈 5 + N × 10을 만들어 내는데, 즉, [5, 15, 25, 35, 45, ...]가 된다. INSERT 보다 앞선 col 컬럼에 있는 최대값은 31이 되며, AUTO_INCREMENT 시리즈에서 그 다음으로 사용 가능한 값은 35가 된다. 따라서 그 시점에 시작되는 col에 대한 삽입 값과 결과는 SELECT 쿼리로 나오는 것과 같게 된다.
    이러한 두 변수가 하나의 단일 테이블에 영향을 주도록 제한하는 것은 불가능하며, 따라서 이 변수들을 다른 데이터 베이스 관리 시스템이 제공하는 시퀀스에서는 사용할 수가 없다; 이 변수들은 MySQL 서버에 있는 모든 테이블의 모든 AUTO_INCREMENT 컬럼 동작을 제어한다. 이 변수들 중에 하나가 글로벌로 설정 된다면, 그 효과는 글로벌 값이 변경되거나 또는 그것들을 로컬 변수로 설정해서 무시하도록 하지 않거나, mysqld를 재 구동하지 않는 한 계속 유지를 하게 된다. 로컬 변수로 지정하면, 새로운 값은 모든 테이블에서 현재의 사용자가 세션 기간 동안 새롭게 삽입하는 AUTO_INCREMENT 컬럼에 영향을 미치게 되며, 그 세션 동안 값을 변경하지 않는 한 계속 유지를 한다.
    auto_increment_increment 변수는 MySQL 5.0.2에 추가 되었다. 디폴트 값은 1이다.
    Section 6.13, “Auto-Increment in Multiple-Master Replication”를 참조할 것
  • auto_increment_offset
    이 변수는 MySQL 5.0.2에서 소개가 되었다. 이것의 디폴트 값은 1이다. auto_increment_increment를 참조하기 바란다.
  • back_log
    MySQL이 가질 수 있는 엄청난 양의 연결 요청 수. 이것은 메인 MySQL 쓰레드가 매우 짧은 시간 동안 엄청난 수의 연결을 요청 받을 때 활동하기 시작한다. 그런 경우가 되면 이 변수는 얼마 동안 (실제로는 매우 짧은 시간 동안) 메인 쓰레드로 하여금 연결을 검사하고 새로운 쓰레드를 시작하도록 만든다. back_log 값은 MySQL이 새로운 요청에 대해 답을 하기 위해 순간적으로 멈추기 전에 얼마나 많은 요청을 스택에 넣어 둘 수 있는지를 표시한다. 이 값을 증가 시키는 것은 매우 짧은 시간 동안에 많은 수의 연결을 예상할 경우에만 필요하게 된다.
    다른 말로 설명하면, 이 값은 서버쪽으로 들어오는 TCP/IP 연결에 대한 수신 큐 (listen queue)의 크기가 된다. 여러분이 사용하는 OS는 이 큐 크기에 대해 고유 값을 가지고 있다. 유닉스의 listen() 시스템 호출에 대한 매뉴얼에서 보다 자세한 정보를 찾을 수 있을 것이다. 여러분이 사용하는 OS 사용 설명서에서 이 변수의 최대 값을 알아보기 바란다. back_log 는 OS 가 제한하는 크기를 초과할 수는 없다.
  • basedir
    MySQL이 설치된 베이스 디렉토리. 이 변수는 --basedir 옵션을 가지고 설정할 수 있다.
  • bdb_cache_size
    BDB 테이블용 캐시 인덱스와 열에 할당 되는 버퍼의 크기. 여러분이 BDB 테이블을 사용하지 않는다면, 이 캐시에 메모리를 할당하지 않기 위해서는 mysqld를 --skip-bdb와 함께 시작해야 한다.
  • bdb_home
    BDB 테이블에 대한 베이스 디렉토리. 이것은 datadir 변수와 동일한 값으로 지정되어야 한다.
  • bdb_log_buffer_size
    BDB 테이블용 캐시 인덱스와 열에 할당 되는 버퍼의 크기. 만약에 BDB 테이블을 사용하지 않으면, 이것을 0으로 설정해야 하거나 또는 이 캐시에 메모리를 할당하지 않기 위해서 mysqld를 --skip-bdb와 함께 시작해야 한다.
  • bdb_logdir
    BDB 스토리지 엔진이 자신의 로그 파일을 기록하는 디렉토리. 이 변수는 --bdb-logdir 옵션을 가지고 설정할 수 있다.
  • bdb_max_lock
    BDB 테이블을 위해 활성화 시킬 수 있는 잠금의 최대 수(디폴트로는 10,000). 여러분이 오랜 트랜젝션을 실행할 때 또는 mysqld가 쿼리를 계산하기 위해 많은 수의 열들을 검사할 때 아래와 같은 에러가 발생할 경우에는 이 값을 증가 시켜야 한다:
    bdb: Lock table is out of available locks
    Got error 12 from ...

  • bdb_shared_data
    여러분이 --bdb-shared-data를 사용해서 다중 프로세스 모드에 있는 버클리 DB(Berkeley DB)를 구동 시킨다면 이것은 ON이 된다. (버클리 DB를 초기화 할 때에는 DB_PRIVATE를 사용하지 말 것.)
  • bdb_tmpdir
    BDB 임시 파일 디렉토리.
  • binlog_cache_size
    트랜젝션 동안 바이너리 로그용 SQL명령문을 가지고 있기 위한 캐시의 크기. 서버가 어느 한 트랜젝션 스토리지 엔진을 지원할 경우 또는 서버가 바이너리 로그 활성화 상태 ((--log-bin 옵션)일 경우라면 각 클라이언트에 대해서 바이너리 캐시가 할당된다. 여러분이 크기가 큰 다중-명령문 트랜젝션을 자주 사용하는 경우라면 이 캐시의 크기를 크게 해서 성능을 향상 시킬 수가 있다. Binlog_cache_use 와 Binlog_cache_disk_use 상태 변수는 이 변수의 크기를 튜닝 하는데 유용하게 사용 된다.
  • bulk_insert_buffer_size
    MyISAM은 비어 있지 않은 테이블에 데이터를 추가할 때 INSERT ... SELECT, INSERT ... VALUES (...), (...), ..., 및 LOAD DATA INFILE에 대해서 벌크 (bulk) 삽입 연산을 보다 빠르게 진행하기 위해서 특별한 트리 형태의 캐시를 사용한다. 이 변수는 쓰레드당 캐시 트리의 크기를 바이트 단위로 제한 한다. 이 변수를 0으로 설정하면 위에서 설명한 최적화 기능이 비활성화 된다. 디폴트 크기는 8MB이다.
  • character_set_client
    클라이언트로부터 전달되는 명령문용 문자 셋.
  • character_set_connection
    문자 셋 인트로듀서 (introducer)를 갖고 있지 않는 리터럴 (literal) 및 숫자-문자 (number-to-string) 변환을 위해 사용되는 문자 셋.
  • character_set_database
    디폴트 데이터 베이스가 사용하는 문자 셋. 서버는 디폴트 데이터 베이스가 변할 때 마다 이 변수를 설정한다. 디폴트 데이터 베이스가 없다면, 이 변수는 character_set_server와 같은 값을 가지게 된다.
  • character_set_filesystem
    파일 시스템 문자 셋. 이 변수는 LOAD DATA INFILE 과 SELECT ... INTO OUTFILE 명령문 그리고 LOAD_FILE() 함수와 같은 파일 이름을 참조하는 스트링 리터럴을 해석하는데 사용된다. 이러한 파일 이름은 파일을 오픈 하려는 시도가 있기 전에 character_set_client에서 character_set_filesystem으로 변환된다. 디폴트 값은 binary인데, 이것은 이무런 변환이 없다는 것을 의미한다. 멀티 바이트 파일 이름을 사용할 수 있는 시스템에서는 서로 다른 값을 사용하도록 한다. 예를 들면, 시스템이 UTF-8를 사용해서 파일 이름을 표시한다면, character_set_filesytem을 'utf8'로 설정한다. 이 변수는 MySQL 5.0.19에 추가 되었다.
  • character_set_results
    쿼리 결과를 클라이언트에 리턴하기 위해 사용되는 문자 셋.
  • character_set_server
    서버의 디폴트 문자 셋.
  • character_set_system
    식별자 (identifier)를 저장하기 위해 서버가 사용하는 문자 셋. 그 값은 항상 utf8 이 된다.
  • character_sets_dir
    문자 셋이 설치되어 있는 디렉토리.
  • collation_connection
    연결 문자 셋의 콜레션 (collation).
  • collation_database
    디폴트 데이터 베이스가 사용하는 콜레션 (collation). 서버는 디폴트 데이터베이스가 변경될 때 마다 이 변수를 설정한다. 디폴트 데이터 베이스가 없다면, 이 변수의 값은 collation_server의 값과 같게 된다.
  • collation_server
    서버의 디폴트 콜레션 (collation).
  • completion_type
    트랜젝션 완료 타입:
    • 만약에 값이 0 (디폴트)이면, COMMIT 과 ROLLBACK 은 실행되지 않음.
    • 값이 1이면, COMMIT 과 ROLLBACK 은 각각 COMMIT AND CHAIN 과 ROLLBACK AND CHAIN과 같게 된다. (새로운 트랜젝션이 이제 막 완료된 트랜젝션과 동일한 고립 (isolation) 레벨을 가지고 곧장 실행된다.)
    • 값이 2이면, COMMIT 과 ROLLBACK 은 COMMIT RELEASE및 ROLLBACK RELEASE 값과 각각 같게 된다. (서버는 트랜젝션을 마친 후에 접속을 끊는다.)
    이 변수는 MySQL 5.0.3에서 추가 되었다.
  • concurrent_insert
    만약에 ON (디폴트 값)이면, MySQL은 INSERT 와 SELECT 명령문으로 하여금 중간에 빈 블록이 없는 MyISAM 테이블에 대해서 동시에 구동 될 수 있도록 해 준다. mysqld 을 --safe 또는 --skip-new와 함께 실행시키면 이 옵션을 오프 (off)시킬 수가 있다.
    MySQL 5.0.6에서는, 이 변수는 세 개의 정수 값으로 변경 되었다:

    Value Description
    0 오프(Off)
    1 (디폴트) 테이블 중간에 빈 공간이 없는 MyISAM 테이블에 대한 동시 삽입을 가능하게 함
    2 모든 MyISAM 테이블에 대한 동시 삽입을 가능하게 함. 테이블이 중간에 공간을 가지고 있고 다른 쓰레드가 사용을 하고 있다면, 새로운 열은 테이블 맨 마지막에 삽입이 된다. 테이블이 사용되고 있지 않다면, MySQL은 일반적인 읽기 잠금을 실행하고 새로운 열을 테이블의 빈 공간에 삽입한다.

  • connect_timeout
    mysqld 서버가 Bad handshake에 반응하기 전에 연결 패킷을 기다리는 대기 시간.
  • datadir
    MySQL 데이터 디렉토리. 이 변수는 --datadir 옵션으로 설정할 수 있다.
  • date_format
    이 변수는 구현 되지 않음.
  • datetime_format
    이 변수느 구현 되지 않음.
  • default_week_format
    WEEK() 함수용으로 사용하기 위한 디폴트 모드 값. Section 12.5, “날짜 및 시간 함수”를 참조할 것.
  • delay_key_write
    이 옵션은 MyISAM 테이블에만 적용된다. 이것은 아래의 값 중에 하나를 가지고서 CREATE TABLE 명령문에서 사용되는 DELAY_KEY_WRITE 테이블 옵션을 처리한다.

    Option Description
    OFF DELAY_KEY_WRITE 는 무시된다.
    ON MySQL CREATE TABLE 명령문에서 지정 되는 DELAY_KEY_WRITE 옵션들의 값을 존중한다. 이것이 디폴트 값이다.
    ALL 새롭게 열린 모든 테이블을, 마치 DELAY_KEY_WRITE 활성화 옵션을 가지고 생성 된 것처럼 다룬다.

    만약에 DELAY_KEY_WRITE가 테이블에 대해서 활성화 되어 있다면, 모든 인덱스를 업데이트 하고 있는 테이블에 대해서는 키 버퍼가 플러시 되지 않고, 대신에 테이블이 닫힐 때에만 플러시를 하게 된다. 여러분이 이 기능을 사용한다면, 키가 많은 경우에는 속도가 증가하지만, 서버를 --myisam-recover 옵션 (예를 들면, --myisam-recover=BACKUP,FORCE)과 함께 구동 시켜서 모든 MyISAM 테이블을 자동으로 검사하도록 해야 한다.
    --external-locking를 사용해서 외부잠금을 활성화 시킨다고 하더라도 지연 키 작성 (delayed key write)을 사용하는 테이블에 대한 인덱스 손실은 막지 못한다는 것을 알아 두기 바란다.
  • delayed_insert_limit
    delayed_insert_limit 지연 열 삽입을 하고 나면, INSERT DELAYED 핸들러 쓰레드는 어떤 SELECT 명령문 실행이 지연되고 있는지를 검사하게 된다. 만약에 이러한 지연 명령문이 존재한다면, 지연된 열을 삽입하기 전에 이 명령문이 먼저 실행되도록 허용한다.
  • delayed_insert_timeout
    INSERT DELAYED 핸들러 쓰레드가 INSERT 명령문이 종료되기 전에 대기해야 하는 시간.
  • delayed_queue_size
    이것은 INSERT DELAYED 명령문을 처리할 때 큐에 넣을 수 있는 테이블당 열의 한계 값이다. 큐가 가득 차게 되면, INSERT DELAYED 명령문을 실행하고자 하는 클라이언트는 큐가 다시 비워질 때까지 기다는 / 연산자를 사용한 나눗셈 결과를 보다 정확하게 얻기 위해 지정하는 정밀도(precision) 숫자를 가리킨다 . 디폴트 값은 4 이다. 최소 및 최대의 값은 각각 0과 30이다. 아래의 예문은 디폴트 값을 늘리는 것이 어떤 효과를 나타내는지를 보여 주는 것이다.
    mysql> SELECT 1/7;
    +--------+
    | 1/7 |
    +--------+
    | 0.1429 |
    +--------+
    mysql> SET div_precision_increment = 12;
    mysql> SELECT 1/7;
    +----------------+
    | 1/7 |
    +----------------+
    | 0.142857142857 |
    +----------------+

    이 변수는 MySQL 5.0.6에서 추가 되었다.
  • engine_condition_pushdown
    이 변수는 NDB에 적용된다. 디폴트 값은 0 (OFF)이다: mycol 이 인덱스가 아닌 (non-indexed) 컬럼인 곳에서 SELECT * FROM t WHERE mycol = 42와 같은 쿼리를 실행한다면, 쿼리는 모든 NDB 노드에 있는 전체 테이블을 스캔하면서 실행된다. 각 노드는 MySQL 서버에 모든 열을 보내는데 이 서버는 WHERE 조건문을 적용한다. engine_condition_pushdown이 1 (ON)로 설정되어 있다면, 조건문은 스토리지 엔진에 “밀어 넣어 (pushed down)”지게 되고 NDB 노드로 보내지게 된다. 각 노드는 이 조건문을 사용해서 스캔을 하게 되며, 이 조건문에 일치하는 열만을 MySQL 서버에 리턴한다.
    이 변수는 MySQL 5.0.3에서 추가 되었다. 이 버전 이전에는, 디폴트 NDB 동작은 이 변수가 OFF로 설정되었을 때와 같았다.
  • expire_logs_days
    바이너리 로그를 자동으로 삭제하기 위한 날짜의 수. 디폴트는 0 이며, 이것은 “자동 삭제 없음 (no automatic removal)”을 의미하는 것이다. 스타트업 및 바이너리 로그 로테이션이 있을 때에만 삭제가 가능하다.
  • flush
    만약에 ON이 되면, 각 SQL명령문이 실행된 후에 서버는 모든 변경 사항을 디스크에 플러시(동기화) 시킨다. 정상적인 경우, MySQL은 각 SQL 명령문이 실행된 후에만 모든 변경 사항을 디스크에 작성하고 디스크와의 동기화는 OS로 하여금 처리하도록 만든다. Mysqld를 --flush 옵션과 함께 구동 시키면 이 변수는 ON 으로 설정 된다.
  • flush_time
    이것을 0 이 아닌 값으로 설정을 하면, 사용하던 시스템 자원을 해제하고 플레시되지 않은 데이터를 디스크에 동기화 시키기 위해 모든 테이블은 flush_time 동안 닫히게 된다. 우리는 이 옵션을 윈도우 9x, Me, 또는 시스템 자원이 작은 시스템에서만 사용할 것을 권장한다.
  • ft_boolean_syntax
    IN BOOLEAN MODE를 사용하는 불리안 전체-문장 검색 (full text search)이 지원하는 연산자 리스트. 디폴트 값은 '+ -><()~*:""&|'이다. 이 값을 변경하는 규칙은 아래와 같다:
    • 연산자 함수는 스트링 안에 있는 위치를 가지고 결정한다.
    • 대체되는 값은 14개의 문자로 이루어져야 한다.
    • 각 문자는 ASCII non-alphanumeric 이어야 한다.
    • 처음 또는 두 번째 문자는 스페이스 이어야 한다.
    • 11번째와 12번째의 구문 인용 부호 문자를 제외하고는 문자를 중복해서 사용할 수는 없다.
    • 10, 13, 그리고 14 (디폴트는 ‘:’, ‘&’, and ‘|’로 되어 있음)는 나중에 사용할 목적으로 사용이 지정 (reserve)되어 있다
  • ft_max_word_len
    하나의 FULLTEXT 인덱스 안에 포함되는 단어의 최대 길이.
    Note: FULLTEXT 인덱스 값을 변경한 후에는 반드시 재 구축해야 한다. REPAIR TABLE tbl_name QUICK을 사용한다.
  • ft_min_word_len
    하나의 FULLTEXT 인덱스에 포함 되는 단어의 최소 길이.
    Note: FULLTEXT 인덱스 값을 변경한 후에는 반드시 재 구축해야 한다. REPAIR TABLE tbl_name QUICK을 사용한다.
  • ft_query_expansion_limit
    전체-문장 검색용 스톱워드 (stopword) 리스트를 읽기 위한 파일. 이 파일에 있는 모든 단어들이 사용된다; 코멘트는 사용되지 않는다. 디폴트로 스톱워드의 빌트인 (built-in) 리스트가 사용된다 (myisam/ft_static.c 파일에 정의된 것 같은). 이 변수를 빈 스트링 ('')으로 설정하면 스톱워드 필터링이 비활성화 된다.
    Note: FULLTEXT 인덱스 값을 변경한 후에는 반드시 재 구축해야 한다. REPAIR TABLE tbl_name QUICK을 사용한다.
  • group_concat_max_len
    GROUP_CONCAT() 함수를 위한 최대 사용 길이. 디폴트는 1024이다.
  • have_archive
    만약에 mysqld가 ARCHIVE 테이블을 지원하면 YES 가 되고, 그렇지 않으면 NO가 된다.
  • have_bdb
    mysqld가 BDB 테이블을 지원하면 YES가 된다. 만약에 skip-bdb이 사용되면 DISABLED 이 된다.
  • have_blackhole_engine
    mysqld가 BLACKHOLE 테이블을 지원하면 YES. 아니면, NO.
  • have_compress
    zlib 압축 라이브러리를 서버에서 사용할 수 있으면 YES. 아니면, NO. 아닌 경우에는, COMPRESS()와 UNCOMPRESS()는 사용할 수 없다.
  • have_crypt
    crypt() 시스템 호출을 서버에서 사용할 수 있다면 YES. 아니면, NO. 아닌 경우에는, ENCRYPT() 함수를 사용할 수 없다.
  • have_csv
    mysqld가 ARCHIVE 테이블을 지원하면 YES. 아니면, NO.
  • have_example_engine
    mysqld가 EXAMPLE 테이블을 지원하면 YES. 아니면, NO.
  • have_federated_engine
    mysqld가 FEDERATED 테이블을 지원하면 YES. 아니면, NO. 이 변수는 MySQL 5.0.3에서 추가 되었다.
  • have_geometry
    서버가 스파샬 (spatial) 데이터 타입을 지원하면 YES. 아니면, NO.
  • have_innodb
    mysqld가 InnoDB 테이블을 지원하면 YES. --skip-innodb이 사용되면, DISABLED.
  • have_isam
    MySQL 5.0의 경우에는 이 변수를 이전 버전과의 호환성을 위해서만 사용한다. 이것은 항상 NO 인데, 그 이유는 ISAM 테이블이 더 이상 지원되지 않기 때문이다.
  • have_ndbcluster
    mysqld가 NDB Cluster 테이블을 지원하면 YES. --skip-ndbcluster 이 사용되면, DISABLED.
  • have_openssl
    mysqld가 서버/클라이언트 프로토콜 SSL (암호화)을 지원하면 YES. 아니면, NO.
  • have_query_cache
    mysqld가 쿼리 캐시를 지원하면 YES. 아니면, NO.
  • have_raid
    MySQL 5.0에서, 이 변수는 예전 버전과의 호환성을 위해서만 사용된다. 이것은 항상 NO인데, 그 이유는 RAID 테이블은 더 이상 지원되지 않기 때문이다.
  • have_rtree_keys
    RTREE 인덱스를 사용할 수 있다면 YES. 아니면, NO. (이것은 MyISAM 테이블에 있는 스파샬 인덱스를 위해 사용된다.)
  • have_symlink
    심볼릭 링크 지원이 활성화 되면 YES. 아니면, NO. 유닉스에서 DATA DIRECTORY 와 INDEX DIRECTORY 테이블 옵션 지원을 위해서, 그리고 윈도우에서는 데이터 디렉토리 심링크(symlink)를 지원하기 위해서는 이 변수가 필요하다.
  • init_connect
    연결 되어 있는 각 클라이언트를 위해 서버가 실행하는 스트링. 이 스트링은 한 개 또는 그 이상의 SQL 명령문으로 구성된다. 다중 명령문을 지정하기 위해서는, 각각을 세미콜론으로 구분한다. 예를 들면, 각 클라이언트는 디폴트로 오토커미트 (autocommit) 모드를 활성화 해서 사용한다. 오토커미트를 디폴트로 비활성화 시킬 수 있는 글로벌 시스템 변수는 없으나, init_connect를 사용하면 동일한 효과를 얻을 수가 있다:
    SET GLOBAL init_connect='SET AUTOCOMMIT=0';
    이 변수를 명령어 라인 또는 옵션 파일에서 설정할 수 있다. 옵션 파일에 안에서 이 변수를 설정하기 위해서는 다음의 라인을 추가한다:
    [mysqld]
    init_connect='SET AUTOCOMMIT=0'

    SUPER 권한을 가지고 있는 사용자는 init_connect 컨텐츠를 실행할 수 없다는 점을 알아두기 바란다. 이것은 init_connect에 대한 오류 값으로 인해 모든 클라이언트가 연결을 할 수 없는 경우가 발생하지 않도록 하기 위한 것이다. 예를 들면, 이 변수 값에 신텍스 에러가 있는 명령문이 들어 있을 수도 있는데, 이런 일이 발생하면 클라이언트가 연결을 할 수 없게 된다. init_connect 를 SUPER 권한을 가지고 있는 사용자용으로 실행하지 않으면 연결을 열고 init_connect 값을 고치는 것이 가능해진다.
  • init_file
    여러분이 서버를 구동할 때 --init-file 옵션을 사용해서 지정한 파일의 이름. 이것은 서버가 구동될 때 실행되기를 원하는 SQL 명령문을 가지고 있는 파일이어야 한다. 각 명령문은 싱글 라인으로 되어 있어야 하고 코멘트가 없어야 한다.
  • init_slave
    이 변수는 init_connect와 유사하지만, SQL 쓰레드가 시작될 때마다 슬레이브 서버가 실행하는 스트링이 된다. 스트링 포맷은 init_connect 변수 포맷과 같다.
  • innodb_xxx
    InnoDB 시스템 변수는 Section 14.2.4, “InnoDB 스타트업 옵션 및 시스템 변수”에 나와 있다.
  • interactive_timeout
    인터액티브 (interactive) 연결이 닫히기 전에 서버가 대기하는 시간. 인터액티브 클라이언트는 mysql_real_connect()를 위한 CLIENT_INTERACTIVE 옵션을 사용하는 클라이언트 형태로 정의된다. wait_timeout을 참조할 것.
  • join_buffer_size
    인덱스를 사용하지 않는 조인이 (join) 전체 테이블을 스캔하기 위해 사용하는 버퍼의 크기. 정상적인 경우, 빠른 조인을 얻을 수 있는 최선의 방법은 인덱스를 추가하는 것이다. 인덱스 추가가 불가능할 때 전체 조인을 보다 빠르게 하기 위해서는 join_buffer_size 값을 늘리면 된다. 하나의 조인 버퍼가 두 테이블 간의 각 전체 조인을 위해 할당된다. 인덱스를 사용하지 않는 여러 개의 테이블 간의 복잡한 조인을 위해서는, 다중 조인 버퍼가 필요할 수도 있다.
  • key_buffer_size
    모든 쓰레드는 MyISAM 테이블을 위한 인덱스 블록을 버퍼링하고 공유한다. key_buffer_size는 인덱스 블록을 위해 사용되는 버퍼의 크기이다. 키 버퍼는 키 캐시라고도 불린다.
    key_buffer_size의 최대 사용 가능 설정 값은 4GB이다. 하지만, 효과적으로 사용되는 최대 크기는 이보다는 작은데, 이 크기는 여러분이 사용하는 시스템의 물리적인 RAM과 OS 또는 하드웨어 플랫폼이 한정하는 프로세스 당 RAM의 한계치에 따라 정해진다.
    여유가 있는 만큼 최대한의 크기로 이 값을 늘려서 보다 나은 인덱스 핸들링 (모든 읽기와 다중 쓰기에 대해)을 구현한다. MySQL이 주로 구동되는 머신의 전체 메모리 중에서 25%를 사용하는 것이 가장 일반적인 방법이다. 하지만, 이 값을 너무 크게 설정하면 (예를 들면, 전체 메모리의 50% 이상), 시스템은 극도의 성능 저하가 발생할 수도 있다. MySQL은 데이터 읽기를 위한 파일 시스템 캐싱을 OS에 의존하기 때문에, 이러한 파일 시스템 캐싱을 위한 메모리 여유 공간을 확보해 두어야 한다. 또한, 다른 스토리지 엔진을 위한 메모리 공간도 고려를 해야 한다.
    SHOW STATUS 명령문 및 Key_read_requests, Key_reads, Key_write_requests, 그리고 Key_writes 상태 변수를 조사함으로써 키 버퍼의 성능을 검사할 수가 있다.
    Key_reads/Key_read_requests 비율은 일반적으로 0.01 보다 작게 나온다.
    Key_writes/Key_write_requests 비율은 업데이트와 삭제를 주로 사용할 경우에는, 거의 1 정도가 되지만, 만약에 많은 열을 동시에 업데이트를 하거나 또는 DELAY_KEY_WRITE 테이블 옵션을 사용할 경우에는 1보다 훨씬 작게 나온다.
    사용 중에 있는 키 버퍼의 조각 (fraction)은 key_buffer_size를 Key_blocks_unused 상태 변수와 버퍼 블록 크기를 조인 (join)해서 측정할 수가 있으며, 이것은 key_cache_block_size 시스템 변수를 가지고 사용할 수가 있다:
    1 - ((Key_blocks_unused × key_cache_block_size) / key_buffer_size)
    이 값은 추정 값일 뿐인데, 그 이유는 키 버퍼에 있는 일정 공간들이 관리 구조상 내부적으로 할당되어 있기 때문이다. 다중의 MyISAM 키 캐시를 생성하는 것은 가능하다. 4GB의 크기 제한은 각 캐시에 개별적으로 적용되며, 그룹으로는 적용되지 않는다.
  • key_cache_age_threshold
    이 값은 핫 서브-체인(hot sub-chain)에서 웜 서브 체인(warm sub-chain)으로 버퍼를 디모션(demotion)시키는 것을 제어한다. 보다 작은 값일수록 디모션이 더 빠르게 진행된다. 최소 값은 100 이다. 디폴트 값은 300이다.
  • key_cache_block_size
    키 캐시에 있는 블록의 바이트 크기. 디폴트는 1024이다.
  • key_cache_division_limit
    키 캐시 버퍼 체인의 핫 및 왐 서브 체인 (hot and warm sub-chain)간의 구분 포인트(division point). 이것은 왐 서브 체인용으로 사용되는 버퍼의 퍼센트 값이 된다. 사용 가능한 범위는 1에서 100까지 이다. 디폴트 값은 100이다.
  • language
    에러 메시지용으로 사용되는 언어.
  • large_file_support
    mysqld가 대용량 파일 지원을 위한 옵션과 함께 컴파일 되었는지를 확인함.
  • large_pages
    대용량 페이지 지원이 활성화 되었는지를 검사. 이 변수는 MySQL 5.0.3에 추가 되었다.
  • license
    서버가 가지고 있는 라이센스 타입.
  • local_infile
    LOCAL이 LOAD DATA INFILE 명령문을 지원하는지를 검사
  • locked_in_memory
    mysqld가 메모리에서 -memlock을 가지고 잠겨 있는지를 검사.
  • log
    모든 명령문을 일반 쿼리 로그에 기록하는 것이 활성화 되었는지를 검사.
  • log_bin
    바이너리 로그가 활성화 되었는지를 검사.
  • log_bin_trust_function_creators
    이 변수는 바이너리 로그가 활성화 되었을 때 적용된다. 이것은 스토어드 함수 생성기(creator)가 바이너리 로그에 불안정한 이벤트를 작성하는 스토어드 함수를 생성하지 못하도록 제어한다. 0 (디폴트)으로 설정되면, 사용자가 CREATE ROUTINE 또는 ALTER ROUTINE 권한과 더불어서 SUPER 권한을 갖고 있지 않는 한 스토어드 함수를 생성 또는 변경할 수가 없게 된다. 0으로 설정하면 함수가 DETERMINISTIC 특성 또는 READS SQL DATA 또는 NO SQL 특성을 가지고 선언되어야 하는 제약이 추가된다. 이 변수를 1로 설정하면, MySQL은 스토어드 함수 생성에서 대해서 이러한 제약을 하지 않게 된다. 이 변수는 MySQL 5.0.16에 추가 됨.
  • log_bin_trust_routine_creators
    이것의 예전 이름은 log_bin_trust_function_creators이었다. MySQL 5.0.16 이전에는, 이것이 스토어드 프로시저에는 적용되었으나 스토어드 함수에는 적용되지 않았다. 5.0.16 이후에는, 이 변수의 기능이 거의 없어졌다. 이것은 예전 버전과의 호환성을 위해서만 인식되고 있지만 경고문은 만들게 된다. 이 변수는 MySQL 5.0.6에 추가 되었다
  • log_error
    에러 로그의 위치.
  • log_slave_updates
    마스터 서버로부터 슬레이브 서버가 받게 되는 업데이트가 슬레이브 자신의 바이너리 로그에 기록되는지를 검사한다. 바이너리 로깅을 슬레이브에서 영향을 주기 위해서는 이것이 반드시 활성화 되어야 한다. Section 6.8, “리플리케이션 스타트업 옵션”를 참조할 것.
  • log_slow_queries
    슬로우 쿼리가 로그 되는지를 검사. “슬로우(Slow)”는 long_query_time 변수 값을 가지고 측정한다. Section 5.12.4, “슬로우 쿼리 로그”를 참조.
  • long_query_time
    쿼리 실행이 이 값보다 오래 걸리면, 서버는 Slow_queries 상태 변수를 증가시킨다. --log-slow-queries 옵션을 사용하면, 쿼리는 슬로우 쿼리 로그 파일에 기록된다. 이 값은 CPU 시간이 아닌 실제 시간으로 측정되기 때문에, 가볍게 (lightly) 로드된 시스템의 한계 상황 (threshold)에 있는 쿼리는 무겁게 (heavily) 로드된 시스템의 한계 상황 위에 있는 것 보다 우선권을 가지게 된다. 최소 값은 1이다. Section 5.12.4, “슬로우 쿼리 로그”를 참조할 것.
  • low_priority_updates
    만약에 이 값을 1로 설정하면, 모든 INSERT, UPDATE, DELETE, 및 LOCK TABLE WRITE 명령문은 이것들이 영향을 주는 테이블에 더 이상 처리되지 않은 SELECT 또는 LOCK TABLE READ 명령문이 없을 때 실행을 대기한다. 예전에는 이 변수를 sql_low_priority_updates라고 불렀다.
  • lower_case_file_system
    이 변수는 데이터 디렉토리가 저장되어 있는 파일 시스템의 대소 문자 구분 여부를 나타낸다. OFF는 파일 이름의 대소 문자 구분을 하는 것을 의미하며, ON은 구분 하지 않는다는 것을 나타낸다.
  • lower_case_table_names
    이 변수가 1로 설정되면, 테이블 이름은 디스크에 소문자로 저장되고 테이블 이름 비교는 대소 문자를 구분하지 않게 된다. 2로 설정되면, 테이블 이름은 지정한 문자 크기의 이름으로 저장되지만, 소문자 비교만을 하게 된다. 이 옵션은 데이터 베이스 이름과 테이블 별칭에도 적용된다. InnoDB 테이블을 사용하는 경우에는, 모든 플랫폼에 이 변수 값을 1로 설정해서 모든 이름이 소문자로 변환되도록 해야 한다.
    대소 문자를 구분하는 파일 이름을 갖고 있지 않는 시스템 (윈도우 또는 Mac OS X)에서 MySQL을 구동하고 있다면, 이 변수를 0으로 설정하지 말아야 한다. 이 변수가 스타트업 때 설정되지 않고 데이터 디렉토리가 저장되어 있는 파일 시스템이 파일 이름의 문자 크기를 구분하지 않는다면, MySQL은 자동으로 lower_case_table_names을 2로 설정한다.
  • max_allowed_packet
    패킷 한 개의 최대 크기 또는 생성되었거나 생성 중인 스트링의 최대 크기. 패킷 메시지 버퍼는 net_buffer_length 바이트 크기로 초기화 되지만, 필요할 경우에는 max_allowed_packet 바이트만큼 커지게 된다. 디폴트 값은 대형 패킷을 가져올 만큼의 크기가 된다.
    여러분이 BLOB 컬럼 또는 긴 스트링을 사용한다면 이 값을 늘려야 한다. 그 크기는 여러분이 원하는 BLOB의 크기만큼 만들어야 한다. max_allowed_packet에 대한 프로토콜 제한치는 1GB이다.
  • max_binlog_cache_size
    다중 명령문 트랜젝션이 이것보다 많은 메모리를 요구한다면, 서버는 Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage 에러를 발생 시킨다.
  • max_binlog_size
    바이너리 로그에 기록하는 것으로 인해 현재의 로그 파일 크기가 이 변수 값을 초과하게 된다면, 서버는 바이너리 로그를 로테이트 시킨다 (현재의 파일을 닫고 다음 파일을 연다). 여러분은 이 변수의 값을 1GB보다 초과하거나 4096 바이트 보다 작게 설정할 수 없다. 디폴트 값은 1GB이다.
    하나의 트랜젝션은 그 자체가 바이너리 로그에 기록되기 때문에, 트랜젝션을 여러 개로 나누어서 각 바이너리에 저장하는 것은 불가능 하다. 그러므로, 커다란 트랜젝션을 가지고 있는 경우에는, max_binlog_size 보다 큰 바이너리 로그를 볼 수도 있을 것이다. max_relay_log_size가 0이면, max_binlog_size의 값은 릴레이 로그에도 함께 적용된다.
  • max_connect_errors
    만약에 어떤 호스트에서 나오는 인터럽트의 숫자가 이 변수의 숫자보다 많으면, 그 호스트가요청하는 다음 연결은 차단된다. FLUSH HOSTS 명령문을 사용하면 차단된 호스트를 해제 시킬 수 있다.
  • max_connections
    클라이언트의 동시 연결 허용 숫자. 이 값을 늘리면 mysqld가 요구하는 파일 디스크립터(descriptor)의 숫자가 늘어나게 된다.
  • max_delayed_threads
    INSERT DELAYED 명령문을 처리하기 위해서는 쓰레드의 숫자를 이 값보다 크게 시작하지 말 아야 한다. 만약에 모든 INSERT DELAYED 쓰레드를 사용한 후에 새로운 테이블에 데이터를 삽입하고자 한다면, 삽입되는 열은 마치 DELAYED 속성을 지정하지 않은 것처럼 동작한다. 이것을 0으로 설정하면, MySQL은 DELAYED 열을 처리하는 쓰레드를 결코 생성하지 않는다; 이로 인해 DELAYED가 전체적으로 비활성화된다.
  • max_error_count
    SHOW ERRORS 와 SHOW WARNINGS 명령문에 의해 화면에 보여주기 위해 저장하는 에러, 경고, 그리고 노트 메시지의 최대 숫자.
  • max_heap_table_size
    이 변수는 MEMORY 테이블이 커질 수 있는 최대의 크기를 설정한다. 이 변수의 값은 MEMORY 테이블의 MAX_ROWS 값을 계산하는데 사용된다. 이 변수 값 설정은 테이블이 CREATE TABLE과 같은 명령문을 가지고 재 생성 되지 않거나 ALTER TABLE 또는 TRUNCATE TABLE을 가지고 변경되지 않는 한 기존의 어떠한 MEMORY 테이블에_threads
    이 변수는 max_delayed_threads와 동일한 것이다.
  • max_join_size
    max_join_size 열 (싱글-테이블 명령문에 대해서) 또는 열 조합 (다중-테이블 명령문에 대해서) 보다 많은 것을 검사하는데 필요하거나 또는 max_join_size 디스크 검사보다 많은 것을 처리하는 SELECT 명령문을 허용하지 않는다. 이 값을 설정하면, 여러분은 키가 올바르게 사용되지 않고 오랜 시간 동안 처리가 되는 SELECT 명령문을 가져올 수가 있다. 사용자가 WHERE 구문이 부족하거나, 오랜 시간이 걸리는, 또는 수많은 열을 리턴 하는 조인 (join)을 실행하고자 한다면, 이것을 설정한다.
    DEFAULT 값이 아닌 것으로 이 변수를 설정하면 SQL_BIG_SELECTS 값은 0으로 리셋 된다. SQL_BIG_SELECTS 값을 다시 설정하면, max_join_size 변수는 무시된다.
    쿼리 결과가 쿼리 캐시에 있다면, 결과 크기 검사는 수행되지 않는데, 그 이유는 결과 값이 이전에 이미 계산되었기 때문에 클라이언트에 그것을 보낼 필요가 없기 때문이다.
    예전에는 이 변수를 sql_max_join_size라고 했었다.
  • max_length_for_sort_data
    어떤 filesort 알고리즘을 사용할지 결정하는 인덱스 값의 크기를 컷오프함 (cutoff).
  • max_relay_log_size
    리플리케이션 슬레이브가 자신의 릴레이 로그에 기록을 함으로써 현재의 로그 파일이 이 변수 크기보다 커지게 되면, 슬레이브는 릴레이 로그를 로테이트 시킨다 (현재의 파일을 닫고 그 다음의 파일을 연다). 만약에 max_relay_log_size가 0 이면, 서버는 max_binlog_size를 바이너리 로그와 릴레이 로그 모두를 위해 사용한다. max_relay_log_size가 0보다 크게 되면, 서버는 릴레이 로그 크기를 제한하게 되고, 여러분이 두 개의 로그 파일을 서로 다른 크기로 사용할 수 있도록 한다. max_relay_log_size는 4096 바이트와 1GB, 또는 0으로 설정해야 한다. 디폴트 값은 0이다.
  • max_seeks_for_key
    키를 기반으로 열을 찾을 때 검색 (seek)하는 최대 추정 숫자의 한계. MySQL 옵티마이저는, 인덱스를 스캐닝해서 테이블에서 매칭 열을 찾을 때, 인덱스의 실제 기수 (cardinality)에는 상관 없이 키 검사의 숫자가 이것보다 크지 않다고 가정한다. 이것을 작은 값으로 설정해서(100 정도) MySQL로 하여금 테이블 스캔 대신에 인덱스 스캔 하도록 만들 수가 있다.
  • max_sort_length
    BLOB 또는 TEXT 값을 정렬할 때 사용하는 바이트 수. 각 값의 첫 번째 max_sort_length 바이트만이 사용된다; 나머지는 무시된다.
  • max_tmp_tables
    클라이언트가 동시에 오픈할 수 있는 임시 테이블의 최대 숫자. (이 옵션은 아직 어떠한 연산도 하지 않는다.)
  • max_user_connections
    지정한 모든 MySQL 계정에게 허용된 최대 동시 연결 수. 0 은 “제한 없음 (no limit)”을 의미 한다.
    MySQL 5.0.3 이전에는, 이 변수는 글로벌 범위에서만 사용되었다. MySQL 5.0.3 이후에는, 읽기 전용 범위에서도 적용된다. 이 변수는 글로벌 및 세션 범위 (읽기 전용)로 설정할 수 있다. 현재의 계정이 0이 아닌 MAX_USER_CONNECTIONS 리소스 리미트 (limit)를 가지고 있지 않는 한 세션 변수는 글로벌 변수와 같은 값을 가지게 된다. 이와 같은 경우, 세션 변수에는 계정 리미트가 적용된다.
  • max_write_lock_count
    이 변수만큼 쓰기 잠금 (lock)을 실행 한 후에, 지연 중인 읽기 잠금 요청을 실행하도록 만든다.
  • myisam_data_pointer_size
    아무런 MAX_ROWS 옵션이 지정되지 않을 때 CREATE TABLE이 MyISAM 테이블용으로 사용하는 디폴트 포인터 크기 (바이트 단위). 이 변수는 2보다 작거나 7보다 클 수가 없다. 디폴트는 6이다 (5.0.6 이전에는 4 이다). 이 변수는 MySQL 4.1.2에서 추가 되었다.
    Note: 이 변수는 MySQL 5.0.6에서 삭제되었다.
  • myisam_max_sort_file_size
    MyISAM 인덱스를 재 생성하는 동안 (REPAIR TABLE, ALTER TABLE, 또는 LOAD DATA INFILE를 실행하는 동안) MySQL이 사용할 수 있는 임시 파일의 최대 크기. 파일의 크기가 이 값보다 크면, 인덱스는 좀 더 느린 키 캐시를 대신 사용해서 생성된다.
  • myisam_recover_options
    --myisam-recover 옵션의 값. Section 5.2.1, “mysqld Command Options”를 참조할 것.
  • myisam_repair_threads
    이 값이 1보다 크면, MyISAM 테이블 인덱스는 Repair by sorting 프로세스 동안에 병렬 (각 인덱스는 자신의 쓰레드에 있게 됨)로 생성된다. 디폴트는 1이다. Note: 다중-쓰레드 리페어 (repair)는 아직 베타 수준이다.
  • myisam_sort_buffer_size
    REPAIR TABLE을 실행하는 동안 MyISAM 인덱스를 정렬할 때 또는 CREATE INDEX 또는 ALTER TABLE을 가지고 인덱스를 생성할 때 할당되는 버퍼의 크기.
  • myisam_stats_method
    MyISAM 테이블용 인덱스 값 배포에 관련된 통계 값을 수집할 때 서버가 NULL 값을 처리하는 방법. 이 변수는 nulls_equal과 nulls_unequa 중에 하나의 값을 가진다. nulls_equal의 경우에는, 모든 NULL 인덱스 값은 동일한 값으로 간주되며 NULL 값의 숫자와 동일한 크기를 갖는 단일 값 그룹을 형성한다. nulls_unequal의 경우에는, NULL 값은 동일하지 않는 것으로 간주되고, 각각의 NULL은 크기가 1인 서로 구분되는 그룹을 형성한다.
    테이블 통계 값를 만들기 위해 사용하는 방식은 옵티마이저가 쿼리 실행을 위해 인덱스를 선택하는 방법에 영향을 주며, 이에 대해서는 Section 7.4.7, “MyISAM 인덱스 통계값 수집”에서 상세하게 다루고 있다.
    이 변수는 MySQL 5.0.14에서 추가 되었다. 이전의 버전에서의 통계 값 수집 방법은 nulls_equal과 동일하였다.
  • multi_read_range
    범위를 선택하는 동안에 스토리지 엔진에 보내는 범위의 최대 숫자를 지정한다. 디폴트 값은 256이다. 하나의 엔진에 여러 개의 범위를 동시에 보내면 특히 NDBCLUSTER와 같은 엔진의 선택 연산 성능이 크게 향상된다. 이 엔진은 범위 요청을 모든 모드에 보낼 필요가 있고, 한번에 이러한 많은 요청을 보내는 것은 통신 비용을 매우 효과적으로 절감시킬 수가 있다. 이 변수는 MySQL 5.0.3에서 추가 되었다.
  • named_pipe
    (윈도우 시스템만 적용됨.) 서버가 네임드 파이프를 통한 연결을 지원하는지 나타낸다.
  • net_buffer_length
    통신 버퍼는 SQL 명령문 사이에서 이 변수의 크기를 리셋 시킨다. 이 변수는 보통 변경되지 않지만, 만약에 여러분이 메모리를 거의 갖고 있지 않다면, 이 변수를 클라이언트가 보내는 명령문의 길이만큼 설정할 수 있다. 만약에 명령문이 이 길이를 초과하면, 버퍼는 자동으로 늘어나게 되고, 크기는 max_allowed_packet 바이트만큼 된다.
  • net_read_timeout
    읽기 연산을 중단하기 전에 서버 연결을 통해 보다 많은 데이터를 읽기 위해 대기하는 시간. 이 타임 아웃은 TCP/IP를 통한 연결에만 적용되며, 유닉스 소켓 파??은 적용되지 않는다. 서버가 클라이언트로부터 데이터를 읽을 경우에는 net_read_timeout이 중단 시기를 제어하는 타임 아웃 값이 된다. 서버가 클라이언트에 쓰기 연산을 하는 경우에는 net_write_timeout이 중단 시기를 제어하는 타임 아웃 값이 된다. slave_net_timeout도 함께 참조하기 바람.
  • net_retry_count
    통신 포트에서 읽기 연산이 인터럽트 (interrupt)되면, 중단을 하기 전에 이 변수가 지정하는값만큼 다시 시도를 한다. FreeBSD에서는 이 변수를 매우 크게 설정을 해야 하는데, 그 이유는 내부 인터럽트가 모든 쓰레드에 전달 되기 때문이다.
  • net_write_timeout
    쓰기 연산을 중단하기 전에 하나의 블록이 기록될 때까지 기다리는 대기 시간. 이 타임 아웃은 TCP/IP 연결에만 적용되며, 유닉스 소켓 파일, 네임드 파이프, 또는 공유 메모리를 통한 연결에는 적용되지 않는다. net_read_timeout도 참조할 것.
  • new
    이 변수는 MySQL 4.0에서 사용되었다. 현재는 이전 버전과의 호환성을 위해 남아 있다. 5.0에서는 항상 OFF이다.
  • old_passwords
    이것은 변수가 아니지만, 몇몇 변수들을 설정할 때 사용된다.
  • one_shot
    이것은 변수가 아니지만, 몇몇 변수들을 설정할 때 사용된다.
  • open_files_limit
    OS가 mysqld에 허용한 오픈 가능 파일 수. 이것은 시스템이 허용하는 실제 값이며, 여러분이 --open-files-limit 옵션을 사용해서 mysqld 또는 mysqld_safe에 준 값과는 다른 것이다. MySQL이 오픈 파일의 숫자를 변경하지 못하는 시스템에서는 이 값이 0 이 된다.
  • optimizer_prune_level
    옵티마이저 검색 공간에서 적게 사용될 (less-promising) 부분을 잘라내는 쿼리 최적화를 실행하는 동안 적용되는 휴리스틱스 (heuristics)을 제어함. 그 값이 0 이면 휴리스틱스를 비활성화 시켜서 옵티마이저가 소모적인 검색 (exhaustive search)을 하도록 만든다. 1로 설정하면 옵티마이저는 중간 플랜 (intermediate plan)에 의해 추출된 열의 숫자를 기반으로 검색 플랜을 잘라낸다. 이 변수는 MySQL 5.0.1에 추가 되었다.
  • optimizer_search_depth
    쿼리 옵티마이저가 실행하는 검색의 최대 깊이. 쿼리 릴레이션 숫자보다 크게 설정하면 보다 좋은 쿼리 플랜을 만들 수는 있으나, 쿼리의 실행 플랜을 만드는 데에는 보다 많은 시간이 필요하게 된다. 쿼리에 있는 릴레이션 보다 작게 설정을 하면 실행 플랜이 좀더 빨라지기는 하지만, 결과 플랜은 더욱 더 나쁘게 나올 수도 있다. 0으로 설정을 하면, 시스템은 자동으로 적당한 값을 가져오게 된다. 쿼리에서 사용되는 테이블의 최대 크기에 2를 더해서 설정을 하면, 옵티마이저는 5.0.0 (그리고 이전 버전)에서 사용되었던 알고리즘으로 변환된다. 이 변수는 MySQL 5.0.1에 추가 되었다.
  • pid_file
    프로세스 ID (PID) 파일의 경로. 이 변수는 --pid-file 옵션으로 설정할 수 있다.
  • port
    서버가 TCP/IP 연결용으로 사용하는 포트 번호. 이 변수는 -port 옵션으로 설정할 수 있다.
  • preload_buffer_size
    인덱스를 프리 로딩 preloading)할 때 할당되는 버퍼의 크기.
  • protocol_version
    MySQL 서버가 사용하는 클라이언트/서버 프로토콜 버전.
  • query_alloc_block_size
    명령문을 분석 및 실행하는 동안에 생성되는 오브젝트를 위해 할당되는 메모리 블록 할당 크기. 메모리 분할 (fragmentation)에 문제가 있다면, 이 변수를 약간 늘려 주면 도움이 될 것이다.
  • query_cache_limit
    이 변수 값보다 큰 결과는 캐시하지 말도록 지정하는 변수. 디폴트는 1MB이다.
  • query_cache_min_res_unit
    쿼리 캐시가 블록에 할당하는 최소 크기 (바이트 단위). 디폴트는 4096 (4KB)이다. 이 변수에 대한 튜닝 정보는 Section 5.14.3, “쿼리 캐시 구성”에 있다.
  • query_cache_size
    쿼리 결과를 캐싱하기 위해 할당되는 메모리 크기. 디폴트는 0 이며, 이것은 쿼리 캐시를 비활성화 한다는 것을 의미한다. query_cache_type을 0으로 설정하더라도, query_cache_size의 크기는 할당된다는 것을 알아두기 바란다.
  • query_cache_type
    쿼리 캐시 타입을 설정한다. GLOBAL 값을 설정하면 나중에 연결되는 모든 클라이언트가 이 타입을 사용하게 된다. 개별 클라이언트들은 자신만의 쿼리 캐시를 SESSION 값으로 설정할 수 있다. 이 변수가 사용할 수 있는 값은 다음과 같다:

    Option Description
    0 또는 OFF 결과를 캐시 하거나 추출하지 말 것. 이것은 쿼리 캐시 버퍼를 할당 해지하지 않는다는 것을 알기 바란다. 할당 해지를 하기 위해서는, query_cache_size를 0으로 한다.
    1 or ON SELECT SQL_NO_CACHE로 시작되는 결과만 제외하고 모든 쿼리 결과를 캐시 한다.
    2 or DEMAND SELECT SQL_CACHE로 시작되는 쿼리의 결과만을 캐시 한다.

    이 변수의 디폴트는 ON이다.
  • query_cache_wlock_invalidate
    일반적으로, 하나의 클라이언트가 MyISAM 테이블상에서 WRITE 잠금을 획득하면, 쿼리 결과가 쿼리 캐시에 존재할 경우에 다른 클라이언트는 테이블에서 읽은 명령문을 입력하지 못하도록 막을 수가 없게 된다. 이 변수를 1로 설정하면 테이블에 대한 WRITE 잠금 획득이 그 테이블을 참조하는 쿼리 캐시에 있는 모든 쿼리를 유효하지 못한 것으로 만든다. 이로 인해 잠금이 효력을 갖고 있는 동안 테이블 접속을 시도하는 다른 클라이언트는 계속 대기를 하게 된다.
  • query_prealloc_size
    명령문 파싱 및 실행을 위해 사용되는 영구 (persistent) 버퍼의 크기. 이 버퍼는 명령문 사이에서는 사용할 수 없다. 여러분이 복잡한 쿼리를 구동 시킨다면, query_prealloc_size 값을 보다 크게 하는 것이 성능 개선을 위해 효과적인 것인데, 그 이유는 서버가 쿼리 실행 연산을 하는 동안 메모리 할당을 할 필요가 없기 때문이다.
  • range_alloc_block_size
    범위 최적화를 할 때 할당되는 블록의 크기.
  • read_buffer_size
    시퀀셜 스캔을 실행하는 각 쓰레드는 스캔을 하는 각 테이블 별로 이 변수 크기만큼의 버퍼를 할당한다 (바이트 단위). 여러분이 많은 수의 시퀀셜 스캔을 한다면, 이 변수의 값을 늘리고자 할 것이다. 이 변수의 디폴트 값은 131072 이다.
  • read_only
    리플리케이션 슬레이브 서버를 위해 이 변수를 ON으로 설정을 하면, 슬? 사용자로부터 오는 업데이트만을 실행하고 나머지 업데이트는 무시를 하게 된다. 이것은 슬레이브 서버가 자신의 마스터 서버 (클라이언트가 아님)에서 나오는 업데이트만 수용하도록 할 때 유용하게 사용할 수 있다. MySQL 5.0.16 이후에는, 이 변수는 TEMPORARY 테이블에는 적용되지 않는다.
  • relay_log_purge
    릴레이 로그 파일이 더 이상 필요하지 않으면 즉시 릴레이 로그 파일을 자동으로 깨끗이 비우는 것 (purging)을 활성화 또는 비활성화 시킴. 디폴트 값은 1 (ON)임.
  • read_rnd_buffer_size
    키 정렬 연산을 실행한 후에 정렬된 순서대로 열을 읽을 경우에는 디스크 검색을 피하기 위해 이 버퍼를 사용해서 열을 읽게 된다. 이 변수를 큰 값으로 설정하면 ORDER BY 연산 성능이 현격하게 향상된다. 하지만, 이 변수는 각 클라이언트 별로 할당되는 버퍼이므로, 글로벌 변수에는 큰 값을 할당하지 말아야 한다. 대신에, 대형 쿼리들을 구동해야 하는 클라이언트에서는 세션 변수를 변경하도록 한다.
  • secure_auth
    만약에 MySQL 서버가 --secure-auth 옵션을 가지고 구동 되었다면, 구형 포맷 (4.1 이전)패스워드를 갖고 있는 모든 계정의 접속을 막게 된다. 그와 같은 경우, 이 변수의 값은 ON이 되고, 반대의 경우는 OFF가 된다.
    구형 포맷의 패스워드 사용을 전적으로 막고자 한다면 이 변수의 값을 활성화 시킨다. 이 옵션이 활성화 되어 있고 권한 테이블이 4.1 이전 버전으로 되어 있다면 서버는 에러를 발생시키며 구동에 실패를 하게 된다.
  • server_id
    서버 ID. 이 값은 --server-id 옵션으로 설정된다. 이 옵션은 마스터와 슬레이브 서버를 활성화 시켜서 자신들을 서로 구분할 수 있도록 하는데 사용된다.
  • shared_memory
    (윈도우 시스템에서만 적용됨.) 서버가 공유 메모리 접속을 허용하는지 판단하는 변수.
  • shared_memory_base_name
    (윈도우 시스템에서만 적용됨.) 공유 메모리 연결을 위해 사용하는 공유 메모리의 이름. 이 변수는 여러 개의 MySQL 인스턴스를 하나의 머신에서 구동 시킬 때 유용하게 사용된다. 디폴트 이름은 MYSQL이다. 이 이름은 대소 문자를 구분한다.
  • skip_external_locking
    mysqld가 외부 잠금 (external locking)을 사용하면 이 변수는 OFF 가 되고, 외부 잠금을 사용하지 않으면, ON이 된다.
  • skip_networking
    서버가 로컬 접속 (non-TCP/IP)만을 허용하면, 이 변수는 ON이 된다. 유닉스 시스템의 경우, 로컬 접속은 유닉스 소켓 파일을 사용한다. 윈도우에서는, 네임드 파이프 또는 공유 메모리를 사용한다. NetWare에서는, TCP/IP 접속만을 지원하기 때문에 이 변수를 ON으로 설정하지 못한다. 이 변수는 --skip-networking 옵션을 사용해서 활성화 시킬 수가 있다.
  • skip_show_database
    이 변수는 사용자들이 SHOW DATABASES 권한을 가지고 있지 않을 때에는 SHOW DATABASES 명령문을 사용하지 못하도록 만든다. 이것은 사용자들이 다른 사람의 데이터 베이스를 보는 문제에 관련하여 보안성을 증가 시킨다. 이 변수는 SHOW DATABASES 권한에 따라서 다른 영향을 갖게 된다: 변수 값이 ON이면, SHOW DATABASES 명령문은 SHOW DATABASES 권한을 갖고 있는 사용자에게만 허용이 되고, 명령문은 모든 데이터 베이스의 이름을 화면에 출력 한다. 이 값이 OFF이면, SHOW DATABASES는 모든 사용자에게 허용되지만, SHOW DATABASES 또는 다른 권한을 갖고 있는 사용자의 데이터 베이스 이름만 화면에 출력 하게 된다.
  • slave_compressed_protocol
    슬레이브와 마스터 모두가 슬레이브/마스터 압축 프로토콜을 지원한다면, 이것을 사용하고 있는지 검사함.
  • slave_load_tmpdir
    LOAD DATA INFILE 명령문을 리플리케이션 하기 위한 임시 파일을 슬레이브가 생성하는 디렉토리의 이름
  • slave_net_timeout
    데이터 읽기를 중단하기 전에 마스터/슬레이브 접속에서 좀더 많은 데이터를 기다리는 대기 시간. 이 타임 아웃은 TCP/IP 연결에서만 적용되며, 유닉스 소켓 파일, 네임드 파이프, 또는 공유 메모리를 통한 접속은 해당되지 않는다.
  • slave_skip_errors
    슬레이브가 무시하는 리플리케이션 에러.
  • slave_transaction_retries
    리플리케이션 슬레이브 SQL 쓰레드가 InnoDB 데드락 (deadlock) 또는 InnoDB의 과도한 innodb_lock_wait_timeout 또는 NDBCluster의 TransactionDeadlockDetectionTimeout 또는 TransactionInactiveTimeout 때문에 트랜젝션 실행에 실패를 하게 되면, 에러 때문에 종료를 하기 전에 자동으로 slave_transaction_retries 변수 값이 지정하는 횟수 동안 재 시도를 하게 된다. 4.0.3 이전 버전의 디폴트는 0 이다. 여러분은 반드시 이 변수의 값을 0보다 크게 설정을 해서 “재시도”를 활성화 시키는 것이 좋은 방법이다. 5.0.3 또는 그 후의 버전에서는 디폴트가 10 이다.
  • slow_launch_time
    쓰레드를 생성하는 시간이 이 변수의 값보다 길게 걸린다면, 서버는 Slow_launch_threads 상태 변수의 값을 늘리게 된다.
  • socket
    유닉스 시스템의 경우, 이 변수는 로컬 클라이언트 연결에 사용되는 소켓 파일의 이름이 된다. 디폴트는 /tmp/mysql.sock이다. (어떤 배포판에서는, 디렉토리가 다를 수도 있는데, RPM의 경우는, /var/lib/mysql과 같다.)
    윈도우 시스템의 경우에는, 이 변수가 로컬 클라이언트 연결에서 사용되는 네임드 파이프의 이름이 된다. 디폴트 값은 MySQL (대소 문자 구분 없음)가 된다.
  • sort_buffer_size
    정렬을 실행하는데 필요한 각 쓰레드는 이 변수 크기의 버퍼를 할당한다. 이 변수 크기를 늘리면, ORDER BY 또는 GROUP BY 연산 속도가 향상 된다.
  • sql_mode
    현재의 서버 SQL 모드를 나타내며, 동적으로 설정될 수 있다. Section 5.2.5, “서버 SQL 모드”를 참조할 것.
  • sql_slave_skip_counter
    슬레이브 서버가 무시하는 마스터의 이벤트 숫자. Section 13.6.2.6, “SET GLOBAL SQL_SLAVE_SKIP_COUNTER 신텍스”를 참조.
  • storage_engine
    디폴트 스토리지 엔진 (테이블 타입). 스토리지 엔진을 서버 스타트업 때 설정하기 위해서는, --default-storage-engine 옵션을 사용한다. Section 5.2.1, “mysqld Command Options”를 참조할 것.
  • sync_binlog
    이 변수 값이 양수 (positive)이면, MySQL 서버는 sync_binlog 쓰기 연산이 바이너리 로그 기록을 마칠 때마다 자신의 바이너리 로그를 디스크에 동기화 시킨다 (fdatasync()를 사용해서). 자동 실행 (autocommit)이 활성화 되어 있다면 명령문 별로 하나의 바이너리 로그 쓰기 연산이 있고, 그렇지 않으면 트랜젝션 별로 한 개의 쓰기 연산이 있다는 것을 알아 두기 바란다. 디폴트 값은 0 이며, 이것은 디스크에 대한 동기화가 없다는 것을 의미한다. 1로 설정하는 것이 안전한 선택인데, 그 이유는 데이터의 충돌이 있을 때에 여러분은 최대 하나의 명령문 또는 트랜젝션만을 바이너리 로그에서 잃? 동작을 하게 된다 (디스크가 배터리-백업 캐시를 가지고 있지 있으면, 동기화는 매우 빨리 진행된다). sync_binlog의 값이 0 (디폴트)이면, 어떠한 플러싱 (flushging)도 일어나지 않는다. 서버는 파일 컨텐츠 플러시를 OS에 의존한다.
  • sync_frm
    이 변수를 1로 설정하면, 임시 테이블이 아닌 것이 자신의 .frm 파일을 생성할 때 디스크 동기화가 이루어진다 (fdatasync()를 사용해서). 이런 방식은 비록 속도는 느리지만 충돌이 일어나는 경우에는 보다 안전한 방법이다. 디폴트는 1이다.
  • system_time_zone
    서버 시스템 타임 존. 서버가 실행을 시작하면, 서버는 타임 존을 머신의 디폴트에서 내려 받게 되는데, 이것은 서버를 구동하거나 또는 스타트업 스크립트를 위해 사용하는 계정의 환경에 따라서 수정할 수가 있다. 전형적으로 타임 존은 TZ 환경 변수가 지정을 한다. 또한, mysqld_safe 스크립트의 --timezone 옵션을 가지고도 설정할 수 있다. system_time_zone 변수와 time_zone 변수는 다른 것이다. 비록 두 변수가 동일한 값을 가지고 있다고 하더라도, 나중 변수는 연결되는 각 클라이언트의 타임 존을 초기화하는데 사용하는 것이다.
  • table_cache
    모든 쓰레드용으로 오픈하는 테이블의 숫자. 이 값을 증가 시키는 것은 mysqld가 요구하는 파일 디스크립터의 숫자가 늘어난다. Opened_tables 상태 변수를 검사하면 테이블 캐시를 증가 시킬 필요가 있는지를 검사할 수 있다. 만약에 Opened_tables의 값이 크고 FLUSH TABLES을 자주 실행하지 않는다면 (이것은 모든 테이블을 닫은 후에 다시 열게 함), table_cache 변수의 값을 늘려야 한다.
  • table_type
    이 변수는 storage_engine과 동의어다. MySQL 5.0에서는, storage_engine 이라는 이름을 주로 사용한다.
  • thread_cache_size
    서버가 다시 사용할 목적으로 캐시를 하는 쓰레드의 숫자. 클라이언트의 연결이 끊기게 되면, 캐시 안에 있는 쓰레드의 수가 thread_cache_size 보다 작을 경우에 클라이언트 쓰레드는 캐시 안으로 들어가게 된다. 쓰레드 대한 요청은 캐시에 쓰레드가 있다면 그것을 다시 사용하고, 캐시가 비어 있을 때에만 새로운 쓰레드를 생성한다. 새로운 연결을 많이 할 경우에는 이 변수 값을 늘려 놓는 것이 성능 향상에 좋다. (일반적으로는, 여러분이 제대로 쓰레드 구현을 할 수만 있다면, 이것을 통한 성능 향상은 이루어 지지 않을 것이다.) Connections과 Threads_created 상태 변수 사이의 차이를 조사 함으로써, 여러분은 쓰레드 캐시가 얼마나 효율적으로 사용되고 있는지 알아 볼 수 있다.
  • thread_concurrency
    솔라이스 시스템의 경우, mysqld는 이 변수 값을 가지고 thr_setconcurrency()를 호출한다. 이 함수는 어플리케이션을 활성화 시켜서 동시에 구동시켜야 하는 쓰레드의 바람직한 숫자가 몇 개인지를 쓰레드 시스템에 전달한다.
  • thread_stack
    각 쓰레드를 위한 스택의 크기. crash-me 테스트를 통해 알 수 있는 대부분의 제약 사항은 이 값과 관련이 된다. 디폴트 값을 사용해도 일반 연산을 실행할 만큼 충분히 크다.
  • time_format
    이 변수는 구현되지 않는다.
  • time_zone
    현재의 타임 존. 이 변수는 연결되는 각 클라이언트의 타임 존을 초기화 시키는데 사용된다. 디폴트 초기 값는 'SYSTEM' 이다 (이것은, “system_time_zone”의 값을 사용한다는 것을 의미한다). 이 변수 값은 서버 스타트업 시점에 --default-time-zone 옵션을 가지고 확정적으로 지정할 수가 있다.
  • tmp_table_size
    메모리 내에 있는 임시 테이블이 이 변수의 크기를 초과하면, MySQL은 자동으로 이 변수의 값을 디스크에 있는 MyISAM 테이블 값으로 변환 시킨다. 만약에 충분한 메모리가 있는 상태에서 많은 수의 GROUP BY 쿼리를 실행한다면, tmp_table_size의 값을 증가 시키도록 한다.
  • tmpdir
    임시 파일과 임시 테이블용으로 사용되는 디렉토리. 이 변수는 라운드-로빈 방식에서 사용되는 여러 가지 경로 리스트로 설정할 수 있다. 유닉스에서 경로는 콜론 (‘:’)으로, 그리고 윈도우, NetWare, 그리고 OS/2에서는 세미 콜론(‘;’)을 사용해서 구분한다. 다중-디렉토리에는 로드 (load)를 여러 개의 물리적인 디스크 사이에 분산하는데 사용할 수 있는 기능이 있다. 만약에 MySQL 서버가 리플리케이션 슬레이브로 동작한다면, tmpdir가 메모리 기반 파일 시스템에 있는 디렉토리 또는 서버 호스트가 재 구동될 때 없어지는 디렉토리를 가리키도록 설정할 수가 없다. 리플리케이션 슬레이브는 시스템이 재 구동될 때 남아 있는 임시 파일들을 사용해서 임시 테이블 또는 LOAD DATA INFILE 동작을 리플리케이션 한다. 임시 파일 디렉토리에 있는 파일을 서버 재 구동시에 잃게 되면, 리플리케이션은 실패하게 된다. 하지만, 여러분이 4.0.0 또는 그 이후 버전을 사용한다면, slave_load_tmpdir 변수를 사용해서 슬레이브의 임시 디렉토리를 시작할 수가 있다. 이와 같은 경우, 슬레이브는 tmpdir 값을 사용하지 않으며 tmpdir은 임시 장소에 설정된다.
  • transaction_alloc_block_size
    메모리를 사용하는 트랜젝션 별 메모리 풀 (pool)의 크기 (바이트 단위). transaction_prealloc_size를 참조할 것.
  • transaction_prealloc_size
    다양한 트랜젝션과 관련된 할당은 트랜젝션 별로 메모리 풀에서 메모리를 가져 온다. 풀의 초기 크기는 바이트 단위로 transaction_prealloc_size가 된다. 메모리가 여유가 없기 때문이며 풀에서 메모리를 가져올 수 없는 경우에는, transaction_alloc_block_size를 바이트 단위로 늘리도록 한다. 트랜젝션이 마치게 되면, 풀은 transaction_prealloc_size 바이트만큼 열어든다. transaction_prealloc_size의 크기를 충분히 크게 해서 단일 트랜젝션 안에 있는 모든 명령문을 수용할 수 있게 하면, 많은 수의 malloc() 호출을 피할 수가 있다.
  • tx_isolation
    디폴트 트랜젝션 고립 (isolation) 레벨. 디폴트는 REPEATABLE-READ이다. 이 변수는 SET TRANSACTION ISOLATION LEVEL 명령문으로 설정된다. 여러분이 tx_isolation를 스페이스가 있는 고립 레벨 이름으로 직접 설정하는 경우에는, 레벌 이름을 인용 부호 (‘’)로 둘러 쌓야 하며, 스페이스는 대쉬 (-)로 바꾸어야 한다. 예를 들면:
    SET tx_isolation = 'READ-COMMITTED';
  • updatable_views_with_limit
    update 명령문이 LIMIT 구문을 가지고 있다면, 언더라잉 (underlying) 테이블에서 정의된 프라이머리 키에 대한 모든 컬럼을 뷰 (view)가 가질 수 없을 때 뷰에 대한 업데이트를 생성할 수 있는지를 결정하는 변수. (GUI 툴이 이러한 업데이트를 자주 만듦.) UPDATE 또는 DELETE 명령문이 하나의 업데이트다. 여기에서 의미하는 프라이머리 키는 PRIMARY KEY, 또는 NULL을 가지고 있지 않는 컬럼에 있는 UNIQUE 인덱스를 가리키는 것이다. 이 변수는 두 가지의 값을 가질 수 있다:
    • 1 또는 YES: 경고문만을 만들어 낸다 (에러 메시지가 아님). 이것이 디폴트 값이다.
    • 0 또는 NO: 업데이트를 금지 한다.
    이 변수는 MySQL 5.0.2에 추가 되었다.
  • version
    서버 버전 번호.
  • version_bdb
    BDB 스토리지 엔진 버전.
  • version_comment
    configure 스크립트는 MySQL을 구축할 때 지정할 수 있도록 하는 --with-comment 옵션을 가지고 있다. 이 변수는 그 코멘트 값을 가지고 있다.
  • version_compile_machine
    MySQL이 설치된 머신 또는 아키텍처의 타입.
  • version_compile_os
    MySQL이 설치되어 있는 OS 타입.
  • wait_timeout
    논-인터렉티브 연결 (non-interactive connection)에서 서버가 종료를 하기 전에 액티비티(activity)를 기다리는 서버 대기 시간 (초 단위). 이 타임 아웃은 TCP/IP 연결에만 적용되며, 유닉스 소켓 파일, 네임드 파이프, 또는 공유 메모리를 통한 연결에는 적용되지 않는다. 쓰레드 스타트업의 경우, 세션 wait_timeout 값은 클라이언트 타입에 따라서 글로벌 wait_timeout 값 또는 글로벌 interactive_timeout 값으로부터 초기화가 된다 (mysql_real_connect()에 대한 CLIENT_INTERACTIVE 연결 옵션에서 정의한 것과 같이). interactive_timeout을 함께 참조할 것.
시스템 변수 사용하기
구조(structured) 시스템 변수
동적(dynamic) 시스템 변수

mysql 서버는 서버 구성 방식을 알려주는 많은 시스템 변수들을 관리한다. Section 5.2.2, “서버 시스템 변수”에서는 이러한 변수들의 의미를 설명한다. 각 시스템 변수는 디폴트 값을 가지고 있다. 시스템 변수는 서버 스타트업 시점에 명령어 라인 또는 옵션 파일에서 설정될 수 있다. 대부분의 변수는 서버가 구동되는 동안에 SET 명령문을 사용해서 동적으로 그 값이 변경될 수 있는데, 이 명령문은 서버를 중단하고 다시 구동시키지 않는 상태에서 서버의 동작을 수정할 수 있게 해 준다. 여러분은 수식에 있는 시스템 변수 값을 참조할 수도 있다.

서버는 두 가지 종류의 시스템 변수를 관리한다. 글로벌 변수는 서버의 전반적인 동작에 영향을 준다. 세션 변수는 개별 클라이언트 연결에 대한 서버 동작에만 영향을 준다. 지정한 시스템 변수는 글로벌과 세션 값을 모두 가질 수가 있다. 글로벌 및 세션 시스템 변수는 다음과 같이 설정된다:


  • 서버를 구동하면, 서버는 모든 글로벌 변수를 자신의 디폴트 값으로 초기화 시킨다. 이러한 디폴트 값은 명령어 라인 또는 옵션 파일에서 지정한 옵션으로 변경될 수 있다. ( Section 4.3, “프로그램 옵션 지정하기”를 참조할 것.)
  • 서버는 연결된 각각의 클라이언트에 대한 세션 변수 셋을 관리하기도 한다. 클라이언트의 세션 변수는 연결되는 시점에 대응되는 글로벌 변수의 현재 값으로 초기화 된다. 예를 들면, 클라이언트의 SQL 모드는 세션 sql_mode 값의 제어를 받는데, 이것은 클라이언트가 접속될 때 글로벌 sql_mode 값으로 초기화 된다.

시스템 변수 값은 서버 스타트업 시점에 명령어 라인 또는 옵션 파일에 있는 옵션을 가지고 글로벌하게 설정 될 수 있다. 스타트업 옵션을 사용해서 변수에 숫자 값을 설정을 한다면, 이 값은 K, M, 또는 G (대 소문자 구분 없음)라는 접미사를 사용해서 1024, 10242 or 10243의 승수를 표시할 수 있다;즉, 킬로 바이트, 메가 바이트,또는 기가 바이트를 의미한다. 따라서, 아래의 명령어는 서버를 16메가 바이트의 캐시와 1 기가 바이트의 최대 패킷 크기를 가지고 구동 되도록 만드는 것이다:



mysqld --query_cache_size=16M --max_allowed_packet=1G

옵션 파일 내에서는 다음과 같이 설정한다:



[mysqld]
query_cache_size=16M
max_allowed_packet=1G


접미사의 문자 크기는 상관이 없다; 16M 와 16m 는 동일한 것이며, 1G 와 1g도 마찬가지다.

만약에 런타임 시점에 SET 명령문을 가지고 설정할 수 있는 시스템 변수의 최대 값을 제한하고자 한다면, 서버 스타트업 시점에 --maximum-var_name 옵션을 사용해서 최대 값을 제한하면 된다. 예를 들면, query_cache_size의 크기가 런타임 시점에 32MB 보다 커지기 않게 하기 위해서는, --maximum-query_cache_size=32M 옵션을 사용하면 된다.

시스템 변수들 중에 많은 수가 동적인 변수이며, 서버가 동작 중에 있을 때 SET 명령문을 사용해서 변수 값을 변경할 수가 있다. 이러한 변수의 리스트를 보고 싶다면, Section 5.2.3.2, “동적(dynamic) 시스템 변수”를 참조 한다. SET명령문을 사용해서 시스템 변수를 변경하기 위해서는, var_name을 사용하면 되고, 선택적으로 모디파이어 (modifier)를 옵션으로 사용하기도 한다:


  • 어떤 변수를 확실하게 글로벌 변수로 지정하기 위해서는, 변수 이름 앞에 GLOBAL 또는 @@global. 를 지정한다. 글로벌 변수 지정은 SUPER 권한이 있어야 한다.
  • 어떤 변수를 확실하게 세션 변수로 지정하기 위해서는, 변수 이름 앞에 SESSION, @@session. 또는 @@.를 지정한다. 세션 변수 설정은 특별한 권한이 필요하지 않지만, 클라이언트는 자신의 세션 변수만을 변경할 수 있으며, 다른 클라이언트의 세션 변수에는 영향을 열 수가 없다.
  • LOCAL 과 @@local. 은 SESSION 과 @@session. 과 동일한 것이다.
  • 모디파이어 (modifier)가 없다면, SET 명령문은 세션 변수를 변경 시킨다.

SET 명령문은 여러 개의 변수 할당문 (assignment)을 가질 수 있고, 각각은 콤마(,)로 구분된다. 여러 개의 시스템 변수를 설정한다면, 명령문 안에 있는 가장 최신의 GLOBAL 또는 SESSION 모디파이어를 모디파이어가 지정되지 않은 변수를 위해 사용한다.



예제: 

SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;


여러분이 SET 명령문을 사용해서 시스템 변수 값을 지정하는 경우에는 변수 값 접미사는 사용할 수가 없다. 하지만, 값을 하나의 수식 형태로 나타낼 수는 있다:



SET sort_buffer_size = 10 * 1024 * 1024;

@@var_name 신텍스는 다른 데이터 베이스 시스템과의 호환성을 위해 제공되는 것이다.

여러분이 세션 시스템 변수를 변경한다면, 그 값은 여러분이 세션을 종료하거나 또는 그 세션 변수의 값을. 변수 값 변경은 다른 클라이언트에는 보여지지 않는다.

글로벌 변수를 변경한다면, 서버가 재 구동 되기 전까지 변경된 값이 유지가 되고 새로운 연결에서 사용될 것이다. (글로벌 변수를 영구적인 값으로 만들기 위해서는, 그 값을 옵션 파일에서 설정을 해야 한다.) 이렇게 변경된 값은 글로벌 변수에 접근하는 모든 클라이언트가 볼 수 있게 된다. 하지만, 변경 사항은 글로벌 변수 변경 후에 접속을 하는 클라이언트의 세션 변수에만 영향을 주게 된다. 글로벌 변수의 변경 내용은 이미 기존에 접속을 하고 있는 클라이언트의 세션 변수에는 어떠한 영향도 주지 못한다 (클라이언트가 SET GLOBAL 명령문을 입력한다고 하더라도 마찬가지임).

올바르지 않게 사용하는 것을 방지하기 위해서, SET SESSION 명령문에서만 사용되는 변수를 가지고 SET GLOBAL을 사용하거나 또는 글로벌 변수를 설정할 때 GLOBAL (또는 @@global.)를 사용하지 않을 경우에는 에러를 발생 시킨다.

SESSION 변수를 GLOBAL 값으로 설정하거나 또는 GLOBAL 값을 컴파일된 MySQL 디폴트 값으로 설정하기 위해서는, DEFAULT 키워드를 사용한다. 예를 들면, 아래의 두 명령문은 max_join_size의 세션 값을 글로벌 값으로 설정하는데 있어서 동일한 것들이다:



SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;


모든 시스템 변수가 DEFAULT로 설정되는 것은 아니다. 그와 같은 경우에 DEFAULT를 사용하면 에러가 발생한다.

@@-모디파이어 (modifiers) 중의 하나를 사용해서 수식 안에 있는 글로벌 또는 세션 시스템 변수의 특정 값을 참조할 수가 있다. 예를 들면, SELECT 명령문에 있는 값을 다음과 같이 추출할 수가 있다:



SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;

수식 안에 있는 시스템 변수를 @@var_name로 참조하면 (즉, @@global. 또는 @@session.을 지정하지 않을 때), MySQL은 세션 값이 존재하면 그것을 리턴하고 아니면 글로벌 값을 리턴한다. (이것은 SET @@var_name = value와는 다른 것인데, 이것은 항상 세션 값을 참조하는 것이다.)

Note: 어떤 시스템 변수들은 ON 또는 1으로 설정을 해서 SET 명령문을 활성화 시키거나 또는 OFF 또는 0으로 설정을 해서 비활성화 시킬 수가 있다. 하지만, 이 같은 변수들을 명령어 라인 또는 옵션 파일에서 설정하기 위해서는, 반드시 1 또는 0으로 설정을 해야 한다; ON 또는 OFF로 설정하는 것은 동작하지 않는다. 예를 들면, 명령어 라인에서, --delay_key_write=1은 동작을 하지만 --delay_key_write=ON는 그렇지 못하게 된다.

시스템 변수 이름과 값을 화면에 출력 하기 위해서는, SHOW VARIABLES 명령문을 사용한다:



mysql> SHOW VARIABLES;
+--------+--------------------------------------------------------------+
| Variable_name | Value |
+--------+--------------------------------------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | / |
| bdb_cache_size | 8388600 |
| bdb_home | /var/lib/mysql/ |
| bdb_log_buffer_size | 32768 |
| bdb_logdir | |
| bdb_max_lock | 10000 |
| bdb_shared_data | OFF |
| bdb_tmpdir | /tmp/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
...
| innodb_additional_mem_pool_size | 1048576 |
| innodb_autoextend_increment | 8 |
| innodb_buffer_pool_awe_mem_mb | 0 |
| innodb_buffer_pool_size | 8388608 |
| innodb_checksums | ON |
| innodb_commit_concurrency | 0 |
| innodb_concurrency_tickets | 500 |
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
...
| version | 5.0.19-Max |
| version_comment | MySQL Community Edition - Max (GPL) |
| version_compile_machine | i686 |
| version_compile_os | pc-linux-gnu |
| wait_timeout | 28800 |
+--------+--------------------------------------------------------------+


LIKE 구문을 사용하면, 명령문은 패턴이 일치하는 변수 값들만 출력한다. 특정 변수의 이름을 얻기 위해서는, LIKE 구문을 아래와 같이 사용한다:



SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';


이름이 일치하는 변수의 리스트를 얻기 위해서는, LIKE 구문 안에 ‘%’ 와일드 카드 문자를 사용한다:



SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';


와일드 카드 문자는 매치 시키고자 하는 패턴 안에서는 어느 위치에서도 사용할 수가 있다. 엄밀하게 말한다면, ‘_’ 는 모든 단일 문자를 매치를 시키는 와일드 카드 문자이기 때문에, 문자 그대로 이것을 매치 시키고자 한다면 ‘\_’ 형태로 사용해야 한다. 실제로는, 거의 필요하지가 않다.

SHOW VARIABLES 명령문의 경우, 여러분이 GLOBAL 또는 SESSION중에 어느 것도 지정을 하지 않으면, MySQL은 SESSION 값을 리턴 한다.

GLOBAL 변수만을 설정할 때에 GLOBAL 키워드를 요청하고 글로벌 변수에서 값을 추출할 때에는 요청하지 않는 이유는 이후 버전에서 나올 수 있는 문제들을 피하기 위해서이다. 우리가 GLOBAL 변수와 똑 같은 이름을 사용하는 SESSION 변수를 삭제했다면, SUPER 권한을 가지고 있는 클라이언트는 자신의 연결을 위한 SESSION 변수가 아닌 GLOBAL 변수를 실수로 변경할 수도 있을 것이다. 만약에 GLOBAL 변수와 똑 같은 이름을 사용해서SESSION 변수를 추가 한다면, 자신의 변경된 SESSION 변수만을 찾고자 했던 클라이언트는 GLOBAL 변수를 변경하려고 할 것이다.


구조(structured) 시스템 변수

구조 변수(structured variable)는 정규 시스템 변수 (regular system variable)와 두 가지 측면에서 서로 다르다:


  • 구조 변수 값은 밀접하게 관련이 있다고 판단되는 서버 파라미터를 지정하는 요소들을 가지고 있는 구조이다.
  • 구조 변수 타입에는 여러 가지 인스턴스가 있을 수 있다. 각 인스턴스는 서로 다른 이름을 가지며 서버가 관리하는 서로 다른 자원들을 참조한다.

MySQL 5.0은 하나의 구조 변수 타입을 지원하는데, 이것은 키 캐시 동작을 관장하는 파라미터를 지정한다. 키 캐시 구조 변수는 다음 요소들을 가진다:


  • key_buffer_size
  • key_cache_block_size
  • key_cache_division_limit
  • key_cache_age_threshold

이 섹션에서는 구조 변수를 참조하기 위한 신텍스를 설명한다. 키 캐시 변수를 신텍스 예제에서 사용하지만, 키 캐시가 어떻게 동작하는지에 대한 상세 설명은 Section 7.4.6, “MyISAM 키 캐시”를 참조하기 바란다.

구조 변수 인스턴스의 컴퍼넌트를 참조하기 위해서는, instance_name.component_name 포맷에 있는 컴파운드 이름을 사용한다. 예를 들면:



hot_cache.key_buffer_size
hot_cache.key_cache_block_size
cold_cache.key_cache_block_size


각각의 구조 시스템 변수에 대해서는, default 이름을 가진 하나의 인스턴스가 먼저 정의 된다. 아무런 인스턴스 이름을 사용하지 않고 구조 변수 컴퍼넌트를 참조할 경우에는, default 인스턴스가 사용된다. 따라서, default.key_buffer_size 와 key_buffer_size 는 둘 다 동일한 시스템 변수를 참조하게 된다.

구조 변수 인스턴스와 컴퍼넌트는 아래의 명명 규칙을 따른다:


  • 지정한 구조 변수 타입에 대해서는, 각 인스턴스는 반드시 그 타입의 변수 안에서 고유의 이름을 가져야 한다. 하지만, 인스턴스 이름은 구조 변수 타입 전체에서 유일한 이름을 사용할 필요는 없다. 예를 들면, 각 구조 변수는 default라는 이름의 변수를 하나씩 갖고 있고, 따라서 default는 변수 타입 전체에서 유일하지가 않게 된다.
  • 각 구조 변수 타입의 컴퍼넌트 이름은 반드시 모든 시스템 변수 이름을 통틀어서 유일해야 한다. 그렇지 않다면 (즉, 두 개의 서로 다른 타입의 구조 변수들이 동일한 이름의 컴퍼넌트 멤버 이름을 공유한다면), 인스턴스 이름을 사용해서 검증하지 못한 멤버 이름을 참조하기 위해서 어떤 디폴트 구조 변수를 사용해야 하는지가 불분명해 진다.
  • 만약에 구조 변수 인스턴스 이름이 인용 부호를 사용하지 않은 아이덴티파이어 (identifier)처럼 규칙에 어긋나 있다면, 백틱스 (backticks)를 사용하는 인용 부호화된 아이덴티파이어로 그것을 참조한다. 예를 들면, hot-cache는 규칙에 위반되지만, `hot-cache` 은 아니다.
  • global, session, 그리고 local은 규칙에 맞는 (legal) 인스턴스 이름이 아니다. 이것은 비 구조 (non-structured) 시스템 변수를 참조하기 위한 @@global.var_name과 같은 표기법 (notation)과는 충돌을 피하게 된다.

현재까지의 버전으로는, 위의 처음 두 가지 규칙에 대해서만 위반 가능성이 없는데, 그 이유는 구조 변수 타입만이?은 다른 구조 변수들이 향후에 생성되는 경우에 보다 중요성이 증대될 것이다.

한가지 예외적인 것은, 단순한 변수 이름만 나타나는 문장에서 컴파운드 이름을 사용해서 구조 변수의 컴퍼넌트를 참조할 수가 있다는 것이다. 예를 들면, 여러분은 명령어 라인 옵션을 사용해서 구조 변수의 값을 지정할 수가 있다:



shell> mysqld --hot_cache.key_buffer_size=64K

옵션 파일에서는, 아래의 신텍스를 사용한다:



[mysqld]
hot_cache.key_buffer_size=64K


서버가 이 옵션을 가지고 구동된다면, 서버는 8MB의 디폴트 키 캐시와 더불어서 64KB 크기의 hot_cache라는 이름의 키 캐시를 생성하게 된다.

여러분이 서버를 다음과 같이 구동 시켰다고 가정하자:



shell> mysqld --key_buffer_size=256K \
--extra_cache.key_buffer_size=128K \
--extra_cache.key_cache_block_size=2048


이와 같은 경우, 서버는 디폴트 키 캐시를 256KB로 설정하게 된다. (--default.key_buffer_size=256K처럼 작성할 수도 있다) 아울러, 서버는 extra_cache 라는 이름의 두 번째 키 캐시를 128KB 크기로 생성을 하는데, 이 크기는2048 바이트로 설정되는 테이블 인덱스 블록을 캐싱 하기 위한 블록 버퍼의 크기이다.

아래의 예제는 크기가 3:1:1의 비율로 되어 있는 세 개의 서로 다른 키 캐시를 가지고 서버를 시작하도록 하는 것이다:



shell> mysqld --key_buffer_size=6M \
--hot_cache.key_buffer_size=2M \
--cold_cache.key_buffer_size=2M


구조 변수 값은 런타임 시점에도 설정 및 추출 할 수가 있다. 예를 들면, hot_cache 라는 이름의 키 캐시를 10MB 크기로 설정하기 위해서는, 아래의 명령문 중에 하나를 사용한다:



mysql> SET GLOBAL hot_cache.key_buffer_size = 10*1024*1024;
mysql> SET @@global.hot_cache.key_buffer_size = 10*1024*1024;


캐시 크기를 추출하기 위해서는, 다음과 같이 한다:



mysql> SELECT @@global.hot_cache.key_buffer_size;

하지만, 아래의 명령문은 실행되지 않는다. 변수는 컴파운드 이름으로 해석되는 것이 아니고, LIKE 패턴-매칭 동작을 위한 단순한 스트링으로 해석된다:



mysql> SHOW GLOBAL VARIABLES LIKE 'hot_cache.key_buffer_size';

이것은 단순 변수 이름이 나타날 수 있는 곳에서 구조 변수 이름을 사용할 수 있도록 하는 예외적인 경우이다.


동적(dynamic) 시스템 변수

서버 시스템 변수들 중에 많은 것들이 동적 변수이며 런타임 시점에 SET GLOBAL 또는 SET SESSION를 사용해서 설정할 수 있다. SELECT 명령문을 사용해서 그 값을 얻을 수도 있다. Section 5.2.3, “시스템 변수 사용하기”를 참조하기 바란다.

아래의 테이블에는 모든 동적 시스템 변수들이 나와 있다. 마지막 컬럼은 각 변수가 GLOBAL 또는 SESSION 중에 어느 것에 (또는 모두에) 적용되는지를 나타낸다. 또한, 이 테이블에는 SET 명령문을 가지고 설정할 수 있는 세션 옵션 리스트도 나와 있다. 이 옵션들에 대해서는 Section 13.5.3, “SET 신텍스”에서 설명하고 있다.

“스트링 (string)” 타입을 가지고 있는 변수들은 스트링 값을 가지게 된다. “숫자 (numeric)” 타입 변수들은 숫자를 값으로 가진다. “불리안 (boolean)” 타입 변수들은 0, 1, ON 또는 OFF로 설정된다. (이 변수들을 명령어 라인 또는 옵션 파일에서 설정할 경우에는, 숫자 값으로 설정을 해야 한다.) “목록 (enumeration)”으로 표시된 변수들은 일반적으로 변수에 지정될 수 있는 가능한 값들 중에 한가지로 설정되어야 하지만, 원하는 목록과 대응되는 숫자로도 설정할 수 있다. 목록 시스템 변수에 대해서는, 첫 번째 목록 값이 0이 된다. 이것은 ENUM 컬럼과는 다른 것인데, 이 컬럼에서는 첫 번째 목록 값이 1이 된다.



Variable Name Value Type Type
Autocommit boolean SESSION
big_tables boolean SESSION
binlog_cache_size numeric GLOBAL
bulk_insert_buffer_size numeric GLOBAL | SESSION
character_set_client string GLOBAL | SESSION
character_set_connection string GLOBAL | SESSION
character_set_filesystem string GLOBAL | SESSION
character_set_results string GLOBAL | SESSION
character_set_server string GLOBAL | SESSION
collation_connection string GLOBAL | SESSION
collation_server string GLOBAL | SESSION
completion_type numeric GLOBAL | SESSION
concurrent_insert boolean GLOBAL
connect_timeout numeric GLOBAL
convert_character_set string GLOBAL | SESSION
default_week_format numeric GLOBAL | SESSION
delay_key_write OFF | ON | ALL GLOBAL
delayed_insert_limit numeric GLOBAL
delayed_insert_timeout numeric GLOBAL
delayed_queue_size numeric GLOBAL
div_precision_increment numeric GLOBAL | SESSION
engine_condition_pushdown boolean GLOBAL | SESSION
error_count numeric SESSION
expire_logs_days numeric GLOBAL
flush boolean GLOBAL
flush_time numeric GLOBAL
foreign_key_checks boolean SESSION
ft_boolean_syntax numeric GLOBAL
group_concat_max_len numeric GLOBAL | SESSION
identity numeric SESSION
innodb_autoextend_increment numeric GLOBAL
innodb_commit_concurrency numeric GLOBAL
innodb_concurrency_tickets numeric GLOBAL
innodb_max_dirty_pages_pct numeric GLOBAL
innodb_max_purge_lag numeric GLOBAL
innodb_support_xa boolean GLOBAL | SESSION
innodb_sync_spin_loops numeric GLOBAL
innodb_table_locks boolean GLOBAL | SESSION
innodb_thread_concurrency numeric GLOBAL
innodb_thread_sleep_delay numeric GLOBAL
insert_id boolean SESSION
interactive_timeout numeric GLOBAL | SESSION
join_buffer_size numeric GLOBAL | SESSION
key_buffer_size numeric GLOBAL
last_insert_id numeric SESSION
local_infile boolean GLOBAL
log_warnings numeric GLOBAL
long_query_time numeric GLOBAL | SESSION
low_priority_updates boolean GLOBAL | SESSION
max_allowed_packet numeric GLOBAL | SESSION
max_binlog_cache_size numeric GLOBAL
max_binlog_size numeric GLOBAL
max_connect_errors numeric GLOBAL
max_connections numeric GLOBAL
max_delayed_threads numeric GLOBAL
max_error_count numeric GLOBAL | SESSION
max_heap_table_size numeric GLOBAL | SESSION
max_insert_delayed_threads numeric GLOBAL
max_join_size numeric GLOBAL | SESSION
max_relay_log_size numeric GLOBAL
max_seeks_for_key numeric GLOBAL | SESSION
max_sort_length numeric GLOBAL | SESSION
ax_tmp_tables numeric GLOBAL | SESSION
max_user_connections numeric GLOBAL
max_write_lock_count numeric GLOBAL
myisam_stats_method enum GLOBAL | SESSION
multi_read_range numeric GLOBAL | SESSION
myisam_data_pointer_size numeric GLOBAL
log_bin_trust_function_creators boolean GLOBAL
myisam_max_sort_file_size numeric GLOBAL | SESSION
myisam_repair_threads numeric GLOBAL | SESSION
myisam_sort_buffer_size numeric GLOBAL | SESSION
net_buffer_length numeric GLOBAL | SESSION
net_read_timeout numeric GLOBAL | SESSION
net_retry_count numeric GLOBAL | SESSION
net_write_timeout numeric GLOBAL | SESSION
old_passwords numeric GLOBAL | SESSION
optimizer_prune_level numeric GLOBAL | SESSION
optimizer_search_depth numeric GLOBAL | SESSION
preload_buffer_size numeric GLOBAL | SESSION
query_alloc_block_size numeric GLOBAL | SESSION
query_cache_limit numeric GLOBAL
query_cache_size numeric GLOBAL
query_cache_type enumeration GLOBAL | SESSION
query_cache_wlock_invalidate boolean GLOBAL | SESSION
query_prealloc_size numeric GLOBAL | SESSION
range_alloc_block_size numeric GLOBAL | SESSION
read_buffer_size numeric GLOBAL | SESSION
read_only numeric GLOBAL
read_rnd_buffer_size numeric GLOBAL | SESSION
rpl_recovery_rank numeric GLOBAL
safe_show_database boolean GLOBAL
secure_auth boolean GLOBAL
server_id numeric GLOBAL
slave_compressed_protocol boolean GLOBAL
slave_net_timeout numeric GLOBAL
slave_transaction_retries numeric GLOBAL
slow_launch_time numeric GLOBAL
sort_buffer_size numeric GLOBAL | SESSION
sql_auto_is_null boolean SESSION
sql_big_selects boolean SESSION
sql_big_tables boolean SESSION
sql_buffer_result boolean SESSION
sql_log_bin boolean SESSION
sql_log_off boolean SESSION
sql_log_update boolean SESSION
sql_low_priority_updates boolean GLOBAL | SESSION
sql_max_join_size numeric GLOBAL | SESSION
sql_mode enumeration GLOBAL | SESSION
sql_notes boolean SESSION
sql_quote_show_create boolean SESSION
sql_safe_updates boolean SESSION
sql_select_limit numeric SESSION
sql_slave_skip_counter numeric GLOBAL
updatable_views_with_limit enumeration GLOBAL | SESSION
sql_warnings boolean SESSION
sync_binlog numeric GLOBAL
sync_frm boolean GLOBAL
storage_engine enumeration GLOBAL | SESSION
table_cache numeric GLOBAL
table_type enumeration GLOBAL | SESSION
thread_cache_size numeric GLOBAL
time_zone string GLOBAL | SESSION
timestamp boolean SESSION
tmp_table_size enumeration GLOBAL | SESSION
transaction_alloc_block_size numeric GLOBAL | SESSION
transaction_prealloc_size numeric GLOBAL | SESSION
tx_isolation enumeration GLOBAL | SESSION
unique_checks boolean SESSION
wait_timeout numeric GLOBAL | SESSION
warning_count numeric SESSION

서버 상태(status) 변수

서버는 자신의 동작 정보를 제공하는 많은 상태 변수를 관리한다. 이러한 변수와 값들은 SHOW STATUS 명령문을 사용해서 볼 수가 있다:



mysql> SHOW STATUS;
+-----------------------------------+------------+
| Variable_name | Value |
+-----------------------------------+------------+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
...
| Connections | 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_files | 3 |
| Created_tmp_tables | 2 |
...
| Threads_created | 217 |
| Threads_running | 88 |
| Uptime | 1389872 |
+-----------------------------------+------------+



FLUSH STATUS 명령문을 사용하면 많은 종류의 상태 변수를 0으로 리셋 시킬 수가 있다.

상태 변수는 아래와 같은 의미를 가지고 있다. 아무런 버전 정보가 없는 변수들은 5.0 이전 버전에서부터 있었던 것들이다.


  • Aborted_clients
    클라이언트가 올바르게 닫히지 않고 멈추었기 때문에 중단된 연결 숫자.
  • Aborted_connects
    MySQL 서버 연결 실패 횟수.
  • Binlog_cache_disk_use
    트랜젝션으로부터 받은 명령문을 저장하기 위해 임시 파일을 사용하고 binlog_cache_size 변수 값을 초과해서 임시 바이너리 로그 캐시를 사용한 트랜젝션의 숫자.
  • Binlog_cache_use
    임시 바이너리 로그 캐시를 사용한 트랜젝션의 숫자.
  • Bytes_received
    모든 클라이언트로부터 전달 받은 바이트의 숫자.
  • Bytes_sent
    모든 클라이언트에 전달된 바이트의 수.
  • Com_xxx
    Com_xxx 명령문 카운터 변수는 각 xxx 명령문이 실행된 횟수를 가리킨다. 각 명령문 타입에 대해서는 하나의 상태 변수가 존재한다. 예를 들면, Com_delete와 Com_insert는 DELETE와 INSERT 명령문을 각각 카운트 한다. Com_stmt_xxx 상태 변수는 5.0.8에 추가 되었다:
    • Com_stmt_prepare
    • Com_stmt_execute
    • Com_stmt_fetch
    • Com_stmt_send_long_data
    • Com_stmt_reset
    • Com_stmt_close
    이 변수들은 프리페어드 명령문의 명령어를 표현한다. 이들 변수 이름들은 네트워크 레이어(layer)에서 사용되는 COM_xxx 명령어 셋을 참조한다. 다른 말로 표현하면, 이들 변수 값은 프리페어드 명령문 API가 mysql_stmt_prepare(), mysql_stmt_execute()와 같은 것을 호출한 후에 실행될 때마다 증가하게 되는 것이다. 하지만, Com_stmt_prepare, Com_stmt_execute, 그리고 Com_stmt_clos 역시 PREPARE, EXECUTE, 또는 DEALLOCATE PREPARE에 대해서도 각각 증가를 한다. 또한, 이전 버전의 명령문 카운터 변수 (4.1.3 이후에 사용된 것들)인 Com_prepare_sql, Com_execute_sql, 그리고 Com_dealloc_sql 역시 PREPARE, EXECUTE, 및 DEALLOCATE PREPARE 명령문에 대해서 증가를 하게 된다. Com_stmt_fetch는 커서가 가져가는 네트워크 라운드-트립(round-trip)의 전체 숫자를 표현한다.
    Com_stmt_xxx 변수의 모든 것들은 프리페어드 명령문 이슈가 알려져 있지 않거나 또는 실행하는 동안 에러가 발생되더라도 증가를 한다. 다른 말로 표현하면, 이들 변수의 값들은 발생된 요청의 숫자에 대응하는 것이지, 성공적으로 완료가 된 요청의 숫자에 대응되는 것이 아니다.
  • Compression
    클라이언트 연결이 클라이언트/서버 프로토콜에서 압축 사용을 제어하는 변수. MySQL 5.0.16에 추가 됨.
  • Connections
    MySQL 서버에 시도된 접속 횟수 (성공 또R>서버가 명령문을 실행할 때 자동으로 디스크에 생성하는 임시 테이블의 숫자.
  • Created_tmp_files
    mysqld가 생성한 임시 파일의 숫자.
  • Created_tmp_tables
    서버가 명령문을 실행할 때 자동으로 생성되는 메모리 상주 임시 테이블의 숫자. Created_tmp_disk_tables이 크다면, tmp_table_size 변수의 값을 늘려서 임시 테이블이 디스크가 아닌 메모리 기반으로 생성되도록 할 수도 있다.
  • Delayed_errors
    에러를 발생 시키는 (아마도 duplicate key) INSERT DELAYED로 작성된 열의 숫자.
  • Delayed_insert_threads
    사용 중에 있는 INSERT DELAYED 핸들러 쓰레드 숫자.
  • Delayed_writes
    INSERT DELAYED가 기록한 열의 숫자.
  • Flush_commands
    FLUSH 명령문의 실행 숫자.
  • Handler_commit
    내부 COMMIT 명령문의 숫자.
  • Handler_discover
    MySQL 서버는 NDB Cluster 스토리지 엔진이 지정한 이름을 사용하는 테이블을 인식하는지 요청할 수 있다. 이것을 디스커버리 (discovery)라고 부른다. Handler_discover는 테이블들이 이 메커니즘을 통해서 몇 번이나 발견되었는지를 나타낸다.
  • Handler_delete
    열이 테이블에서 삭제된 횟수.
  • Handler_read_first
    첫 번째 엔트리가 인덱스에서 읽혀진 횟수. 이 값이 크다면, 서버는 많은 수의 전체 인덱스 스캔 (full index scan)을 실행하고 있음을 의미하는 것이다; 예를 들면, SELECT col1 FROM foo의 경우에서 col1은 인덱스 된 것으로 간주된다.
  • Handler_read_key
    키를 근거로 열을 읽기 위한 요청 횟수. 이 값이 크다면, 여러분이 사용하는 테이블이 쿼리에 올바르게 인덱스 되어 있다는 좋은 의미다.
  • Handler_read_next
    키 순서에서 바로 다음에 있는 열을 읽기 위한 요청 횟수. 인덱스 컬럼을 범위 제한 값으로 쿼리 하거나 또는 인덱스 스캔을 한다면, 이 값이 증가하게 된다.
  • Handler_read_prev
    키 순서에서 바로 전에 있는 열을 읽기 위한 요청 횟수. 이러한 읽기 방식은 주로 ORDER BY ... DESC를 최적화 시키기 위해 사용된다.
  • Handler_read_rnd
    고정된 위치를 근거로 열을 읽기 위한 요청 횟수. 결과 값을 정렬하도록 요청하는 많은 수의 쿼리를 실행하는 중이라면, 이 값이 높게 설정된다. 이것은 MySQL이 전체 테이블을 스캔할 것을 요구하는 쿼리를 많이 가지고 있거나 또는 키를 정확히 사용하지 않는 조인(join)을 가지고 있는 것이다.
  • Handler_read_rnd_next
    데이터 파일에 있는 다음 열을 읽기 위한 요청 횟수. 이 값은 여러분이 많은 수의 테이블 스캔을 할 경우에 높게 된다. 이것은 일반적으로 테이블이 올바르게 인덱스 되지 않았거나 또는 쿼리가 인덱스를 제대로 활용하지 못하고 있음을 의미한다.
  • Handler_rollback
    내부 ROLLBACK 명령문의 숫자.
  • Handler_update
    테이블에 있는 열을 업데이트 하기 위해 요청하는 횟수.
  • Handler_write
    테이블에 열을 하나 삽입하기 위한 요청 횟수.
  • Innodb_buffer_pool_pages_data
    데이터를 가지고 있는 페이지 숫자. MySQL 5.0.2에서 추가됨.
  • Innodb_buffer_pool_pages_dirty
    현재 더티 (dirty)한 데이터가 있는 페이지 숫자. MySQL 5.0.2에서 추가됨.
  • Innodb_buffer_pool_pages_flushed
    버퍼 풀 페이지-플러시 (buffer pool page-flush) 요청 숫자. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_pages_free
    프리 (free) 페이지 숫자. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_pages_latched
    InnoDB 버퍼 풀에 있는 latched 페이지 숫자. 이것은 현재 읽히고 있거나 또는 쓰여지고 있거나 또는 여러 가지 이유로 인해 플러시 될 수 없거나 또는 삭제할 수 없는 페이지들을 가리킨다. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_pages_misc
    열 잠금 또는 적응적 해시 인덱스(adaptive hash index)와 같은 관리적인 오버 헤드를 위해 할당되었기 때문에 비지 (busy) 상태인 페이지의 숫자. 이 값은 Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data 형태로도 계산할 수 있다. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_pages_total
    페이지에 있는 버퍼 풀의 전체 크기. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_read_ahead_rnd
    InnoDB에 의해 초기화 되는 “무작위(random)” 읽기 위주 (read-aheads) 숫자. 이것은 쿼리가 테이블의 많은 부분을 무작위 순서로 스캔 할 때 발생된다. MySQL 5.0.2에서 추가 됨.
  • Innodb_buffer_pool_read_ahead_seq
    InnoDB에 의해 초기화 되는 시퀀셜 읽기 위주 (read-aheads) 숫자. 이것은 InnoDB가 시퀀셜로 전체 테이블을 스캔할 때 발생한다. MySQL 5.0.2에서 추가 됨.
  • Innodb_buffer_pool_read_requests
    InnoDB가 실행한 논리적인 읽기 요청의 숫자. MySQL 5.0.2에서 추가 됨.
  • Innodb_buffer_pool_reads
    InnoDB가 버퍼 풀에서 찾지 못해서 단일 페이지 읽기를 해야만 하는 논리적 읽기 횟수. MySQL 5.0.2에 추가 됨.
  • Innodb_buffer_pool_wait_free
    일반적으로는, InnoDB 버퍼 풀에 대한 쓰기 연산은 백그라운드에 실행된다.를 한다. 하지만, 페이지 읽기 연산이나 또는 페이지 생성이 필요하지만 클린 (clean) 페이지를 사용할 수 없는 경우에는, 페이지가 우선 플러시 되는 것을 기다려야 한다. 이 카운터는 이러한 대기 인스턴스를 카운트 한다. 버퍼 풀의 크기가 올바르게 설정 되었다면, 이 값은 작을 것이다. MySQL 5.0.2에서 추가
  • Innodb_buffer_pool_write_requests
    InnoDB 버퍼 풀에서 실행된 쓰기 연산 수. MySQL 5.0.2에 추가 됨.
  • Innodb_data_fsyncs
    지금까지 실행된 fsync() 연산 수. MySQL 5.0.2에 추가 됨.
  • Innodb_data_pending_fsyncs
    현재 지연되고 있는 fsync() 연산 수. MySQL 5.0.2에 추가 됨.
  • Innodb_data_pending_reads
    현재 지연되고 있는 읽기 연산 수. MySQL 5.0.2에 추가됨.
  • Innodb_data_pending_writes
    현재 지연되고 있는 쓰기 연산 수. MySQL 5.0.2에 추가됨.
  • Innodb_data_read
    지금까지 읽은 데이터의 양 (바이트 단위). MySQL 5.0.2에 추가됨.
  • Innodb_data_reads
    데이터 읽기 연산의 전체 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_data_writes
    데이터 쓰기 연산의 전체 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_data_written
    지금까지 기록한 데이터의 양 (바이트 단위). MySQL 5.0.2에 추가됨.
  • Innodb_dblwr_writes, Innodb_dblwr_pages_written
    실행을 마친 중복 기록 (doublewrite) 연산 숫자와 이러한 목적으로 작성된 페이지의 숫자. MySQL 5.0.2에 추가 됨. Section 14.2.14.1, “Disk I/O”를 참조할 것.
  • Innodb_log_waits
    로그 버퍼가 너무 작아서 계속 진행을 하기 전에 플러시 되기를 요청 받은 대기 횟수. MySQL 5.0.2에 추가됨.
  • Innodb_log_write_requests
    로그 기록 연산 요청 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_log_writes
    로그 파일 대한 물리적 기록 연산 수. MySQL 5.0.2에 추가됨.
  • Innodb_os_log_fsyncs
    로그 파일에서 실행된 fsync() 쓰기 연산 수. MySQL 5.0.2에 추가됨.
  • Innodb_os_log_pending_fsyncs
    지연되고 있는 로그 파일 fsync() 연산의 수. MySQL 5.0.2에 추가됨.
  • Innodb_os_log_pending_writes
    지연되고 있는 로그 파일 쓰기 연산의 수. MySQL 5.0.2에 추가됨.
  • Innodb_os_log_written
    로그 파일에 기록된 바이트 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_page_size
    컴파일 된 InnoDB 페이지의 크기 (디폴트는 16KB). 페이지에서는 많은 값들이 카운트 된다; 페이지 크기는 이러한 것들이 손쉽게 바이트 단위로 변환되도록 해준다. MySQL 5.0.2에 추가됨.
  • Innodb_pages_created
    생성된 페이지의 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_pages_read
    읽혀진 페이지 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_pages_written
    기록된 페이지의 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_row_lock_current_waits
    현재 대기 상태에 있는 열 잠금의 숫자. MySQL 5.0.3에 추가됨.
  • Innodb_row_lock_time
    열 잠금을 얻기 위해 소비한 전체 시간 (밀리 초 단위). MySQL 5.0.3에 추가됨.
  • Innodb_row_lock_time_avg
    열 잠금을 얻기 위한 평균 시간 (밀리 초 단위). MySQL 5.0.3에 추가됨.
  • Innodb_row_lock_time_max
    열 잠금을 얻기 위한 최대 소비 시간 (밀리 초 단위). MySQL 5.0.3에 추가됨.
  • Innodb_row_lock_waits
    열 잠금을 기다려야만 하는 횟수. MySQL 5.0.3에 추가됨.
  • Innodb_rows_deleted
    InnoDB 테이블에서 삭제된 열의 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_rows_inserted
    InnoDB 테이블에 삽입된 열의 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_rows_read
    InnoDB 테이블에서 읽은 열의 숫자. MySQL 5.0.2에 추가됨.
  • Innodb_rows_updated
    InnoDB 테이블에 업데이트 된 열의 숫자. MySQL 5.0.2에 추가됨.
  • Key_blocks_not_flushed
    변경은 되었으나 아직까지는 디스크에 플러시 되지 않은 키 캐시 안에 있는 키 블록의 숫자.
  • Key_blocks_unused
    키 캐시에 있는 아직 사용되지 않은 블록의 숫자. 이 값을 사용해서 얼마나 많은 키 캐시가 사용 중에 있는지를 알아낼 수가 있다; Section 5.2.2, “서버 시스템 변수”에 있는 key_buffer_size에 관한 내용을 보기 바란다
  • Key_blocks_used
    키 캐시에 있는 이미 사용된 블록의 숫자. 이 값은 하이-워터 마크 (high-water mark)로서, 동시에 사용될 수 있는 블록의 최대 숫자를 가리키게 된다.
  • Key_read_requests
    키 블록을 캐시로부터 읽기 위한 요청 숫자.
  • Key_reads
    디스크에서 키 블록을 물리적으로 읽는 횟수. 만약에 Key_reads의 값이 크다면, key_buffer_size 값은 아마도 매우 작게 된다. 캐시가 안 되는 비율 (miss rate)은 Key_reads/Key_read_requests로 계산할 수 있다
  • Key_write_requests
    키 블록을 캐시에 기록하기 위한 요청 횟수.
  • Key_writes
    키 블록을 디스크에 물리적으로 기록하는 횟수.
  • Last_query_cost
    쿼리 옵티마이저가 계산한 최종 컴파일 쿼리의 전체 가격. 이것은 동일 쿼리에 대한 서로 다른 쿼리 플랜간의 비용을 비교할 때 유용하다. 디폴트 값은 0 이며, 이것은 어떠한 쿼리도 아직 컴파일 되지 않았음을 가리킨다. 이 변수는 MySQL 5.0.1에 추가 되었으며, 디폴트 값은 -1 이었다. MySQL 5.0.7에서는, 디폴트 값이 0으로 변경 되었다; 또한 5.0.7에서는, Last_query_cost 범위가 글로벌이 아닌 세션으로 변경되었다.
    MySQL 5.0.16 이전에는, 이 변수는 쿼리 캐시로부터 지원 받는 쿼리에 대해서는 업데이트를 하지 않았다.
  • Max_used_connections
    서버가 구동된 이후에 사용 중에 있는 동시 최대 연결 수.
  • Not_flushed_delayed_rows
    INSERT DELAY 쿼리에 쓰여지기를 기다리고 있는 열의 숫자.
  • Open_files
    열려 있는 파일의 숫자.
  • Open_tables
    열려 있는 스트링의 숫자 (주로 로깅을 위해 사용되는).
  • Open_tables
    열려 있는 테이블의 숫자.
  • Opened_tables
    열린 적이 있는 테이블의 숫자. Opened_tables이 크다면, table_cache 값은 아마도 매우 작게 된다.
  • Qcache_free_blocks
    쿼리 캐시에 있는 프리 메모리 블록의 숫자.
  • Qcache_free_memory
    쿼리 캐시를 위한 프리 (free) 메모리의 양.
  • Qcache_hits
    쿼리 캐시 히트 (hit) 숫자.
  • Qcache_inserts
    쿼리 캐시에 추가된 쿼리의 숫자.
  • Qcache_lowmem_prunes
    메모리 부족으로 인해 쿼리 캐시에서 삭제된 쿼리의 숫자.
  • Qcache_not_cached
    캐시 되지 않은 (non-cached) 쿼리의 숫자 (캐시 할 수 없거나, 또는 query_cache_type 설정으로 인해 캐시 되지 않은).
  • Qcache_queries_in_cache
    쿼리 캐시에 등록되어 있는 쿼리의 숫자.
  • Qcache_total_blocks
    쿼리 캐시에 있는 블록의 전체 숫자.
  • Questions
    클라이언트가 서버에 보낸 명령문의리플리케이션의 상태 (아직 구현되지 않음).
  • Select_full_join
    인덱스를 사용하지 않기 때문에 테이블을 스캔 하는 조인 (join)의 숫자. 이 값이 0 이면, 테이블에 있는 인덱스를 조심스럽게 검사하기 바란다.
  • Select_full_range_join
    참조 테이블에서 범위 검색을 사용하는 조인 (join)의 숫자.
  • Select_range
    첫 번째 테이블에서 범위를 사용한 조인 (join)의 숫자. 이것은 일반적으로 값이 상당히 크다고 하더라도 치명적인 문제는 아니다.
  • Select_range_check
    각 열을 사용한 이후에 키 사용량을 체크하는 키가 없는 조인의 숫자. 이것의 값이 0 이 아니면, 테이블에 있는 인덱스를 주의 깊게 살펴 보아야 한다.
  • Select_scan
    첫 번째 테이블의 전체 스캔을 행한 조인의 숫자.
  • Slave_open_temp_tables
    슬레이브 SQL 쓰레드가 현재 오픈한 임시 테이블의 숫자.
  • Slave_running
    서버가 마스터에 연결되어 있는 슬레이브라면, 이 값은 ON.
  • Slave_retried_transactions
    서버 스타트업 이후에 리플리케이션 슬레이브 SQL 쓰레드가 트랜젝션을 재 시도한 전체 횟수. 이 변수는 5.0.4에서 추가 되었다.
  • Slow_launch_threads
    slow_launch_time 시간보다 더 많은 생성 시간이 필요한 쓰레드의 숫자.
  • Slow_queries
    long_query_time 시간보다 오래 걸리는 쿼리의 숫자. Section 5.12.4, “The Slow Query Log”를 참고
  • Sort_merge_passes
    정렬 알고리즘을 사용해야만 하는 병합 패스 (merge pass)의 숫자. 이 값이 크다면, 여러분은 sort_buffer_size 시스템 변수의 값을 늘리는 것을 고려해야 한다.
  • Sort_range
    범위를 사용해서 실행된 정렬의 숫자.
  • Sort_rows
    정렬된 열의 숫자.
  • Sort_scan
    테이블 스캔에 의해 실행된 정렬의 숫자.
  • Ssl_xxx
    SSL 접속을 위해 사용된 변수들.
  • Table_locks_immediate
    테이블 잠금을 즉시 획득한 횟수.
  • Table_locks_waited
    테이블 잠금을 즉시 획득하지 못하고 대기가 필요했던 횟수. 이 값이 크고 성능상에 문제가 있다면, 여러분은 우선 쿼리를 최적화 하여야 하고, 그 다음에 테이블을 분리하거나 또는 리플리케이션을 사용해야 한다.
  • Threads_cached
    쓰레드 캐시에 있는 쓰레드의 숫자.
  • Threads_connected
    현재 열려 있는 연결 숫자.
  • Threads_created
    연결을 처리하기 위해 생성된 쓰레드의 숫자. 만약에 Threads_created가 크다면, thread_cache_size 값을 늘려본다. 캐시 히트 비율은 Threads_created/Connections로 계산할 수가 있다.
  • Threads_running
    슬리핑 (sleeping) 상태가 아닌 쓰레드의 숫자.
  • Uptime
    서버가 올라와 있는 시간.
서버 SQL 모드

MySQL 서버는 서로 다른 SQL 모드 상태에서 동작할 수 있으며, 서로 다른 클라이언트에 대해 이러한 모드들을 서로 다르게 적용할 수가 있다. 이를 통해 각 어플리케이션들은 서버 동작 모드를 따라서 자신의 요구 사항을 처리할 수 있게 된다.

모드란 MySQL이 어떤 SQL 신텍스를 지원하고 있는지 그리고 데이터의 유효성 (Validation)을 검사하는 방법은 무엇이 있는지를 가리키는 것이다. 이것은 MySQL을 서로 다른 환경에서 사용하는 것을 손쉽게 만들어 주며 다른 데이터 베이스 서버와 함께 MySQL을 사용하는 것이 가능하도록 만들어 준다.

디폴트 SQL 모드 설정은 mysqld를 --sql-mode="modes" 옵션과 함께 구동 시켜서 할 수가 있다. modes 는 콤마 (,)로 구분되는 서로 다른 모드 리스트이다. 디폴트 값은 비어 있다 (empty) (아무런 모드고 설정되어 있지 않다). 만약에 확실하게 비어둘 생각이라면, modes 값도 역시 비울 수가 있다. (--sql-mode="").

sql_mode 시스템 값을 설정을 하기 위한 명령문인 SET [GLOBAL|SESSION] sql_mode='modes'를 사용하면 서버 런 타임 시점에 SQL 모드 값을 변경 시킬 수가 있다. GLOBAL 변수 설정은 SUPER 권한이 필요하며 그 시간 이후에 연결되는 모든 클라이언트의 동작에 영향을 주게 된다. 모든 클라이언트는 자신의 세션 sql_mode 값을 언제든지 변경할 수가 있다.

현재의 글로벌 또는 세션 sql_mode 값은 아래의 명령문을 사용해서 설정할 수가 있다:



SELECT @@global.sql_mode;
SELECT @@session.sql_mode;


가장 중요한 sql_mode 값은 다음과 같다:


  • ANSI
    이 모드는 표준 SQL에 보다 근접하도록 신텍스와 실행 동작을 변경한다.
  • STRICT_TRANS_TABLES
    만약에 값을 지정한 형태로 트랜젝션 테이블에 삽입할 수가 없다면, 명령문을 중단한다. 논-트랜젝션 (non-transactional) 테이블에 대해서는, 그 값이 단일-열 명령문 또는 다중-열 명령문의 맨 처음 열에 나오게 되면 명령문을 중단한다. 보다 자세한 설명은 이 섹션 후반부에 하기로 한다. (MySQL 5.0.2에서 구현됨.)
  • TRADITIONAL
    MySQL 동작을 마치 “전통적인 (traditional)” SQL 데이터 베이스 시스템처럼 구동되도록 만든다. 올바르지 않은 값을 컬럼에 삽입할 때 이 모드에 대한 간단한 설명이 “경고문 대신에 에러로 나온다”.
    Note: INSERT/UPDATE는 에러가 발생되는 즉시 중단된다. 이것은 여러분이 논-트랜젝션(non-transaction) 스토리지 엔진을 사용하면서 원하는 결과가 아닐 것인데, 그 이유는 에러 이전에 수행된 데이터 변경은 롤백 (rolled-back)되지 않기 때문에 그 결과로 인해 ‘부분적으로 수행된 (partially done)” 업데이트만 되기 때문이다. (MySQL 5.0.2에 추가 됨)

이 매뉴얼이 “스트릭트 모드 (strict mode)”를 언급할 때에는, 적어도 STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 중의 하나가 활성화 되어 있는 곳의 모드를 의미하는 것이다.

아래의 리스트는 모든 지원 모드에 대한 설명이다:


    • ALLOW_INVALID_DATES
      전체 날짜를 검사하지 않는다. 월 (month)이 1에서 12 사이와 날짜가 1에서 31일 사이인 것만 검사한다. 이것은 여러분이 년, 월, 그리고 날짜 (day)를 세 개의 필드에서 얻고 사용자가 삽입하는 (날짜 검증 없이) 것을 정확하게 저장하고자 하는 웹 어플리케이션에서 유용하게 사용할 수 있다. 이 모드는 DATE 와 DATETIME 컬럼에 적용된다. 이것은 TIMESTAMP 컬럼에는 적용되지 않는데, 이 컬럼은 유효한 날짜를 필요로 한다.
      이 모드는 MySQL 5.0.2에서 추가 되었다. 5.0.2 이전에는, 이것이 디폴트 MySQL 날짜-핸들링 모드였다. 5.0.2 이후에는, 서버는 월 (month)와 날짜 (day) 값이, 단순히 1에서 12 사이와 1에서 31 사이의 값이 아닌, 규칙에 맞아야 하는 것을 요구한다. 스트릭트 모드를 비활성화 시키면, '2004-04-31' 과 같은 유효하지 않은 값은 '0000-00-00'로 변환 되고 경고문을 내보내게 된다. 스트릭트 모드를 활성화 시키면, 유효하지 않은 날짜 값은 에러를 발생 시킨다. 이러한 날짜 값을 허용하기 위해서는, ALLOW_INVALID_DATES를 활성화 시킨다.
    • ANSI_QUOTES
      ‘"’를 아이덴티파이어 인용 부호 문자로 다루고 (‘`’ 인용 부호 문자 처럼) 스트링 인용 문자로 다루지 않는다. 여러분은 이 모드에서도 여전히 ‘`’를 인용 아이덴티파이어로 사용할 수가 있다. ANSI_QUOTES를 활성화 시키면, 이중 인용 부호를 사용해서 문자 스트링을 인용할 수는 없게 되는데, 그 이유는 그것이 아이덴티파이어로 해석되기 때문이다.
    • ERROR_FOR_DIVISION_BY_ZERO
      INSERT 또는 UPDATE를 실행하는 동안 0 (또는 MOD(X,0))으로 나눗셈을 하는 것을 만나게 되면 스트릭트 모드에서는 에러가 나오게 된다 (다른 모드에서는 경고가 나옴). 만약에 이 모드가 활성화 되지 않았다면, MySQL은 0으로 나누는 것에 대해 NULL 값을 대신 리턴한다. INSERT IGNORE 또는 UPDATE IGNORE에서 사용되면, MySQL은 0으로 나누는 것에 대해 경고문을 만들어 내지만, 동작의 결과는 NULL이 된다. (MySQL 5.0.2에서 구현됨)
    • HIGH_NOT_PRECEDENCE
      MySQL 5.0.2 이후에, NOT 연산자의 우선권은 NOT a BETWEEN b AND c 와 같은 수식에서는 NOT (a BETWEEN b AND c)와 같이 분석 (parse)된다. MySQL 5.0.2 이전에는, 수식을 (NOT a) BETWEEN b AND c 과 같이 분석하였다. 이전 버전과 같은 우선권을 얻기 위해서는 HIGH_NOT_PRECEDENCE SQL 모드를 활성화 시키면 된다. (MySQL 5.0.2에서 추가됨)
mysql> SET sql_mode = '';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 0
mysql> SET sql_mode = 'broken_not';
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 1

  • IGNORE_SPACE
    함수 이름과 ‘(’ 문자 사이에 스페이스를 허용한다. 이것은 모든 함수 이름을 사용 지정된(reserved) 단어로 취급하도록 한다. 그 결과, 만약에 어떤 데이터 베이스, 테이블, 또는 사용 지정된 컬럼 이름에 여러분이 접근 하고자 한다면, 반드시 그것을 인용 부호화 해야 한다. 예를 들면, USER() 라는 함수는 이미 존재하기 때문에, mysql 데이터 베이스에 있는 user 테이블과 그 테이블 안에 있는 User 컬럼은 사용이 지정되며, 따라서 그것들은 인용 부호로 둘러 쌓여야 한다
    SELECT "User" FROM mysql."user";
    IGNORE_SPACE SQL 모드는 빌트인 (built-in) 함수에 적용 되며, 스토어드 루틴에는 적용되지 않는다. 루틴 이름 다음에 스페이스를 가지는 것은 항상 가능한데, IGNORE_SPACE가 활성화 되어 있는지 와는 상관이 없다.
  • NO_AUTO_CREATE_USER
    비어 있지 않는 (non-empty) 패스워드가 함께 지정되지 않는다면, GRANT가 자동으로 새로운 사용자를 생성하지 못하도록 만든다. (MySQL 5.0.2에 추가 됨)
  • NO_AUTO_VALUE_ON_ZERO
    NO_AUTO_VALUE_ON_ZERO는 AUTO_INCREMENT 컬럼을 처리 하는데 영향을 준다. 일반적으로, NULL 또는 0 중에 하나를 컬럼에 삽입하면 컬럼에 대한 그 다음 시퀀스의 숫자를 만들어낼 수 있다. NO_AUTO_VALUE_ON_ZERO 는 0 에 대한 이러한 행동을 종식 시켜서 NULL 만이 다음 시퀀스 숫자를 만들어 내도록 한다. 이 모드는 0 이 테이블의 AUTO_INCREMENT 컬럼에 있을 경우에 유용하게 사용될 수 있다. (0을 저장하는 것은 실제로는 권장할 사항이 아니다.) 예를 들면, 만약에 여러분이 mysqldump를 가지고 테이블을 덤프하고 그 다음에 그것을 다시 로드 한다면, MySQL은 0 값을 만날 때 새로운 시퀀스 번호를 만들어 내고, 그 결과 덤프된 내용과는 다른 내용물을 가진 테이블이 생성되게 된다. 덤프 파일을 다시 로드 하기 전에 NO_AUTO_VALUE_ON_ZERO를 활성화 시키는 것이 이 문제를 해결하는 방법이다. mysqldump는 이 문제를 해결하기 위해서, 자신의 결과에 자동으로 NO_AUTO_VALUE_ON_ZERO를 활성화 시키는 명령문을 포함 시키고 있다.
  • NO_BACKSLASH_ESCAPES
    백슬레시 문자(‘\’)를 스트링 안에서 이스케이프 (escape) 문자로 사용하지 않도록 한다. 이 모드가 활성화가 되면, 백슬레시는 다른 문자와 같이 일상적인 문자로 인식된다. (MySQL 5.0.1에서 구현됨)
  • NO_DIR_IN_CREATE
    테이블을 생성할 때, 모든 INDEX DIRECTORY 와 DATA DIRECTORY 디렉토리를 무시한다. 이 옵션은 슬레이브 리플리케이션 서버에서 유용하다.
  • NO_ENGINE_SUBSTITUTION
    CREATE TABLE과 같은 명령문이 비활성화 되었거나 또는 컴파일 되지 않은 스토리지 엔진을 지정할 때 디폴트 스토리지 엔진으로 자동 대체 되는 것을 막는다. (MySQL 5.0.8에서 구현됨)
  • NO_FIELD_OPTIONS
    SHOW CREATE TABLE 결과에 MySQL-특성 컬럼 옵션을 기록 하지 않는다. 이 모드는 포터빌러티 (portability) 모드에서 mysqldump에 의해 사용된다.
  • NO_KEY_OPTIONS
    SHOW CREATE TABLE 결과에 MySQL-특성 인덱스 옵션을 기록 하지 않는다. 이 모드는 포터빌러티 (portability) 모드에서 mysqldump에 의해 사용된다.
  • NO_TABLE_OPTIONS
    SHOW CREATE TABLE 결과에 MySQL-특성 테이블 옵션 (ENGINE과 같은)을 기록 하지 않는다. 이 모드는 포터빌러티 (portability) 모드에서 mysqldump에 의해 사용된다.
  • NO_UNSIGNED_SUBTRACTION
    뺄셈 연산에서, 오퍼랜드 (operand) 중의 하나가 부호화 되지 않으면 (unsigned) 그 결과를 UNSIGNED로 표시하지 않는다. 이것은 BIGINT UNSIGNED를 모든 문장에서 100% 사용할 수 있다는 의미하는 것이 아니라는 것을 알아 두도록 하자.
  • NO_ZERO_DATE
    스트릭트 모드에서, '0000-00-00'을 유효한 날짜 표시 방법으로 사용하지 않도록 한다. 여러분은 여전히 IGNORE 옵션을 사용해서 제로 날짜를 입력할 수 있게 된다. 스트릭트 모드가 아닐 때에는, 이러한 날짜는 사용할 수는 있지만 경고가 발생한다. (MySQL 5.0.2에서 추가됨)
  • NO_ZERO_IN_DATE
    스트릭트 모드에서, 월 또는 날짜 부분이 0 인 날짜는 받아들이지 않는다. 만약에 IGNORE 옵션이 사용된다면, MySQL은 '0000-00-00' 날짜를 이러한 날짜에 삽입한다. 스트릭트 모드가 아닌 경우에는, 이러한 날짜는 경고를 만들기는 하지만 사용 가능하다. (MySQL 5.0.2에 추가됨)
  • ONLY_FULL_GROUP_BY
    GROUP BY 구문?조하기 위한 쿼리를 허용하지 않는다.
  • PIPES_AS_CONCAT
    Treat || 를 OR 에 대한 동의어가 아닌 스트링 연쇄 (concatenation) 연산자로 다룬다.
  • REAL_AS_FLOAT
    REAL을 FLOAT에 대한 동의어로 다룬다. 디폴트로는, MySQL은 REAL을 DOUBLE의 동의어로 처리한다.
  • STRICT_ALL_TABLES
    모든 스토리지 엔진에 대해 스트릭트 모드를 활성화 시킨다. 유효하지 않은 데이터는 거절 된다. 추가적인 설명은 나중에 한다 (MySQL 5.0.2에 추가됨)
  • STRICT_TRANS_TABLES
    논-트랜젝션 스토리지 엔진을 사용 가능할 때, 트랜젝션 스토리지 엔진에 대한 스트릭트 모드를 활성화 시킨다. 부가적인 설명은 나중에 한다. (MySQL 5.0.2에서 구현됨)

스트릭트 모드는 MySQL가 유효하지 않거나 누락된 (missing) 데이터를 처리하는 방법을 제어한다. 하나의 값은 여러 가지 이유로 유효하지 않게 된다. 예를 들면, 컬럼에 대해 틀린 데이터 타입을 가질 수가 있거나, 또는 범위를 벗어날 수도 있다. 삽입될 새로운 열이 자신의 정의문 안에서 명확한 DEFAULT 구문이 없는 비-NULL 컬럼 값을 가지고 있지 않을 때 데이터는 누락 된다.

트랜젝션 테이블에 대해서는, STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES 중 하나의 모드가 활성화 될 때 명령문 안에 데이터가 유효하지 않거나 누락이 되면 에러가 발생하게 된다. 명령문은 중단되고 롤백 (roll-back) 된다.

논-트랜젝션 (non-transactional) 테이블에 대해서는, 만약에 삽입되어야 하거나 업데이트 되어야 하는 처음 열에 유효하지 않은 값이 나오게 되면, 양쪽 모드에 대해서 동일한 결과를 만들게 된다. 명령문은 중단되고 테이블은 변경되지 않는 상태를 유지한다. 명령문이 여러 개의 열을 삽입 또는 수정하고 유효하지 않은 값이 두 번째 또는 그 이후의 열에 나타나게 되면, 그 결과는 어떤 스트릭트 옵션이 활성화 되어 있는지에 따라 다르게 나온다:


  • STRICT_ALL_TABLES에 대해서는, MySQL은 에러를 리턴 하고 나머지 열들을 무시한다. 하지만, 이와 같은 경우에, 가장 앞서 있는 열들은 여전히 삽입 또는 업데이트가 된다. 이것은 여러분이 부분적인 업데이트를 한다는 것을 의미하며, 이런 상태를 원하지는 않았을 것이다. 이런 상황을 피하기 위해서는, 단일 열 명령문을 사용하는 것이 최선인데, 그 이유는 이러한 명령문은 테이블 변경 없이 중단될 수 있기 때문이다.
  • STRICT_TRANS_TABLES에 대해서는, MySQL은 유효하지 않은 값을 컬럼에 대해 가장 근접한 유효 값으로 변환 시킨 다음에 이 값을 삽입한다. 데이터 값이 누락될 경우에는, MySQL은 컬럼 데이터 타입에 대한 암시적인 (implicit) 디폴트 값을 삽입하게 된다. 둘 중의 어느 경우에도, MySQL은 에러 메시지가 아닌 경고 메시지를 만들게 되며 명령문을 계속 처리하게 된다. 암시적인 (Implicit) 디폴트 값에 대해서는 Section 11.1.4, “Data Type Default Values”에서 자세히 설명한다.

스트릭트 모드는 '2004-04-31'과 같은 유효하지 않은 날짜 값은 허용하지 않는다. 이 모드는 '2004-04-00' 또는 “제로(zero)” 날짜와 같은 제로 부분을 가진 날짜를 허용하지 않는다. 이러한 값들을 허용하지 않기 위해서는, 스트릭트 모드와 함께 NO_ZERO_IN_DATE 와 NO_ZERO_DATE SQL 모드를 활성화 시킨다.

스트릭트 모드를 사용하지 않는다면 (즉, STRICT_TRANS_TABLES 또는 STRICT_ALL_TABLES 중에 어느 것도 활성화 시키지 않는다면), MySQL은 유효하지 않거나 누락된 데이터 값을 적당히 유효하게 변환 시킨 값으로 삽입하고 경고문을 발생 시킨다. 스트릭트 모드에서는, INSERT IGNORE 또는 UPDATE IGNORE를 사용해서 이러한 동작을 구현할 수가 있다. Section 13.5.4.25, “SHOW WARNINGS 신텍스”를 참조할 것.

다음에 나오는 특별 모드들은 위에서 언급한 리스트에서 모드 값을 조합하기 위한 숏핸드 (shorthand) 형태로 제공된다. 이러한 모드들 전부 5.0.0부터 추가되었으나, TRADITIONAL은 예외적인 것으로서, 이것은 MySQL 5.0.2에서 추가가 되었다.

아래의 설명은 최신의 MySQL 버전에서 가장 많이 사용되고 있는 모든 모드 값들에 대한 것이다. 이전 버전의 경우에는, 조합 (combination) 모드는 사용할 수 없는 개별 모드 값을 포함하지 않는다.


  • ANSI
    REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE와 동일하다. MySQL 5.0.3 이전에는, ANSI에는 ONLY_FULL_GROUP_BY 도 포함되어 있었다. Section 1.9.3, “Running MySQL in ANSI Mode”를 참조할 것.
  • DB2
    PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS과 동일 하다.
  • MAXDB
    PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER와 동일 하다.
  • MSSQL
    PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS과 동일하다.
  • MYSQL323
    NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE와 동일하다.
  • MYSQL40
    NO_FIELD_OPTIONS, HIGH_NOT_PRECEDENCE와 동일하다.
  • ORACLE
    PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER와 동일하다.
  • POSTGRESQL
    PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS과 동일하다.
  • TRADITIONAL
    STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER와 동일하다.
MySQL 서버 셧다운 프로세스

서버의 셧다운(shutdown) 프로세스는 다음과 같이 진행된다:


  1. 셧다운 프로세스가 초기화 된다.
    서버 셧다운은 여러 가지 방법으로 초기화 될 수 있다. 예를 들면, SHUTDOWN 권한을 가지고 있는 사용자는 mysqladmin shutdown 명령어를 실행 시킬 수가 있다. mysqladmin은 MySQL이 지원하는 모든 플랫폼에서 사용할 수 있다. 다른 OS-특성 셧다운 초기화 방법도 역시 가능하다: 유닉스에서는 서버가 SIGTERM 신호를 받을 때 셧 다운된다. 윈도우에서 서비스 형태로 구동중인 서버는 서비스 관리자가 셧다운 하도록 요청할 때 셧다운 된다.
  2. 서버는 필요할 경우에 셧다운 쓰레드를 생성한다.
    어떤 방식으로 셧다운이 초기화 되었는지에 따라tj, 서버는 셧다운 프로세스를 처리하기 위한 쓰레드를 생성할 수 있다. 만약에 셧다운이 클라이언트의 요청으로 이루어 졌다면, 셧다운 쓰레드가 생성이 된다. 셧다운이 SIGTERM 신호를 받음으로서 이루어 진 것이라면, 신호 쓰레드가 셧다운 자체를 처리하거나, 또는 이러한 일을 하기 위한 별도의 새로운 쓰레드를 생성하게 된다. 만약에 서버가 셧다운 쓰레드를 생성하려고 시도 하지만 생성할 수 없게 되면 (예를 들면, 메모리 부족으로 인해), 에러 로그에서 볼 수 있는 진단 메시지를 발생시키게 된다:
    Error: Can't create thread to kill server
  3. 서버는 새로운 연결을 더 이상 허용하지 않는다.
    셧다운이 진행되는 동안 새로운 실행 동작이 이루어 지지 않게 하기 위해서, 서버는 새로운 클라이언트 연결을 허용하지 않게 된다. 서버는 네트워크의 접속을 차단함으로써 이러한 일을 처리한다: 유닉스에서는 TCP/IP 포트, 윈도우에서는 윈도우 네임드 파이프와 공유 메모리.
  4. 서버는 현재의 동작을 종료한다.
    클라이언트 연결과 관련이 있는 각각의 쓰레드에 대해서는, 클라이언트 연결이 종료하고 쓰레드는 킬드 (killed)로 표시가 된다. 쓰레드는 자신들이 이렇게 표시되는 것을 인지하게 되면 종료를 하게 된다. 아이들 (idle) 접속에 대한 쓰레드는 즉시 종료된다. 명령문을 처리하고 있는 쓰레드는 자신의 상태를 주기적으로 검사하고 종료를 하기 위해 시간을 끌게 된다. 쓰레드 종료에 대한 보다 자세한 내용은 Section 13.5.5.3, “KILL 신텍스”에서 참고하기 바라며, 특히 MyISAM 테이블에서의 킬드 (killed) REPAIR TABLE 또는 OPTIMIZE TABLE 동작에 대해서 참고를 하기 바란다.
    오픈 되어 있는 트랜젝션이 있는 쓰레드에 대해서는, 쓰레드를 롤백 시킨다. 하나의 쓰레드가 논-트랜젝션 테이블을 업데이트 한다면, 다중-열 UPDATE 또는 INSERT와 같은 동작은 테이블이 부분적으로 업데이트 된 상태로 놔 두게 되는데, 그 이유는 동작을 완료하기 전에 중단이 되기 때문이다.
    만약에 서버가 마스터 리플리케이션 서버일 경우에는, 현재 접속되어 있는 슬레이브와 관련된 쓰레드들은 다른 클라이언트의 쓰레드처럼 취급된다. 즉, 각각의 쓰레드는 킬드 (killed)로 표시 되고 각 쓰레드가 자신의 상태를 다음에 검사할 때 종료를 하게 된다.
    서버가 슬레이브 리플리케이션 서버일 경우에는, I/O 와 SQL 쓰레드는, 만약에 활동 중이라면, 클라이언트 쓰레드가 킬드로 표시되기 전에 마치게 된다. SQL 쓰레드는 자신의 현재 명령문을 끝까지 실행한 후에 (리플리케이션 문제가 발생되는 것을 피하기 위해) 종료를 하게 된다. SQL 쓰레드가 이 시점에 트랜젝션의 중간에 있게 되면, 트랜젝션은 롤백 된다.
  5. 스토리지 엔진이 셧다운 되거나 닫히게 된다.
    이 단계에서 테이블 캐시는 플러시 되고 모든 열려 있는 테이블은 닫히게 된다. 각 스토리지 엔진은 자신들이 관리하는 테이블에 대해 필요한 조치를 하게 된다. 예를 들면, MyISAM 은 테이블에 대한 모든 지연된 인덱스 쓰기를 플러시한다. InnoDB는 자신의 버퍼 풀의 내용을 디스크에 플러시하고 (5.0.5에서부터 구현됨: innodb_fast_shutdown 이 2가 아닐 경우), 현재의 LSN 을 테이블스페이스에 기록한 후에 자신의 내부 쓰레드를 종료하게 된다.
  6. 서버가 종료 된다.
출처 : MySQL 코리아