5.1.5 시스템 변수 사용
MySQL Server는 그 구성 방법을 지시하는 많은 시스템 변수가 유지되고 있습니다. 섹션 5.1 "서버 시스템 변수" 이러한 변수의 의미가 포함되어 있습니다. 각 시스템 변수에는 기본값이 있습니다. 시스템 변수는 명령 행 옵션을 사용하거나 옵션 파일에서 서버를 시작할 때 설정할 수 있습니다. 이들의 대부분은 SET
문을 사용하여 서버 실행 중에 동적으로 변경할 수 있으며,이를 통해 서버를 중지하고 다시 시작할 필요없이 서버의 동작을 변경할 수 있습니다. 시스템 변수 값을 수식에서 참조 할 수 있습니다.
서버에는 두 종류의 시스템 변수가 유지되고 있습니다. 글로벌 변수는 서버의 전체 작업에 영향을줍니다. 세션 변수는 개별 클라이언트 연결 작업에 영향을줍니다. 소정의 시스템 변수는 글로벌 값과 세션 값을 모두 가질 수 있습니다. 글로벌 시스템 변수와 세션 시스템 변수는 다음과 같이 관련되어 있습니다.
서버가 시작하면 서버는 모든 글로벌 변수를 기본값으로 초기화합니다. 이러한 기본값은 명령 행에 지정된 옵션 또는 옵션 파일에서 변경할 수 있습니다. ( 섹션 4.2.3 "프로그램 옵션 지정" 을 참조하십시오.)
서버는 연결하는 각 클라이언트의 세션 변수 세트도 보유하고 있습니다. 클라이언트의 세션 변수는 대응하는 글로벌 변수의 현재 값을 사용하여 연결시에 초기화됩니다. 예를 들어, 클라이언트의 SQL 모드는 세션
sql_mode
값으로 제어되지만이 값은 클라이언트가sql_mode
전역 값에 연결할 때 초기화됩니다.
시스템 변수 값은 명령 행 옵션 또는 옵션 파일을 사용하면 서버 시작시 전역으로 설정할 수 있습니다. 부팅 옵션을 사용하여 숫자를 가지고 값을 설정할 때 값은 1024,1024 2 또는 1024 3의 배수를 나타내는 K
, M
또는 G
의 접미사 (대소있는 소문자)으로 지정할 수 각각 킬로바이트, 메가 바이트 또는 기가 바이트 단위를 나타냅니다. 그러면 다음 명령은 16M 바이트의 쿼리 캐시 크기와 1G 바이트의 최대 패킷 크기에서 서버를 시작합니다.
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
= value
query_cache_size
의 값이 실행시 32M 바이트를 초과하지 않도록하려면 옵션 --maximum-query_cache_size=32M
를 사용합니다.
많은 시스템 변수는 동적이며 SET
문을 사용하여 서버가 실행중인 동안 변경할 수 있습니다. 목록 내용은 섹션 5.1.5.2 "동적 시스템 변수" 를 참조하십시오. SET
를 이용하여 시스템 변수를 변경하려면 선택적으로 수식어 앞에하는 var_name
으로 시스템 변수를 참조하십시오.
변수가 전역 변수임을 명시 적으로 지시하기 위하여는 그 이름 앞에
GLOBAL
또는@@global.
을 지정합니다. 전역 변수를 설정하려면SUPER
권한이 필요합니다.변수가 세션 변수임을 명시 적으로 지시하는 그 이름 앞에
SESSION
,@@session.
또는@@
를 넣습니다. 세션 변수를 설정하는 데 특별한 권한이 필요하지 않지만, 클라이언트는 자신의 세션 변수만을 변경할 수 있으며, 다른 클라이언트의 변수는 변경할 수 없습니다.LOCAL
과@@local.
은SESSION
과@@session.
동의어입니다.수식이 아무것도 없으면,
SET
은 세션 변수를 변경합니다.
SET
문은 쉼표로 구분 된 여러 변수 할당을 포함 할 수 있습니다. 여러 시스템 변수를 설정하면 문에서 가장 최근의 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;
시스템 변수 @@
구문은 다른 일부 데이터베이스 시스템과의 호환성을 지원하고 있습니다. var_name
세션 시스템 변수를 변경하면 세션이 끝날 때까지 또는 변수를 다른 값으로 변경하기 전까지는 그 값이 적용됩니다. 다른 클라이언트는 변경을 볼 수 없습니다.
글로벌 시스템 변수를 변경하면 그 값은 서버가 재시작 할 때까지 기억되어 새로운 연결에 사용됩니다. (글로벌 시스템 변수를 영구적으로 설정하려면 옵션 파일에 설정해야합니다.) 글로벌 변수에 액세스하는 모든 클라이언트가 변경을 확인할 수 있습니다. 그러나 변경은 변경 후 연결하는 클라이언트의 해당 세션 변수에만 영향을 미칩니다. 글로벌 변수의 변경은 현재 연결된 클라이언트의 세션 변수에 영향을주지 않습니다 ( SET GLOBAL
명령문을 발행하는 클라이언트 세션 변수에 영향을주지 않습니다).
오용을 방지하기 위해 SET SESSION
과에서만 사용할 수있는 변수와 함께 SET GLOBAL
를 사용하거나 전역 변수를 설정할 때 GLOBAL
(또는 @@global.
)를 지정하지 않으며 경우에 MySQL에서 오류가 발생합니다.
SESSION
변수를 GLOBAL
값으로 설정하거나 GLOBAL
값을 컴파일시 MySQL의 기본값으로 설정하거나하려면 DEFAULT
키워드를 사용합니다. 예를 들어, 다음 두 명령문은 max_join_size
의 세션 값을 글로벌 값으로 설정하는데있어서 동일합니다.
SET max_join_size = DEFAULT; SET @@ session.max_join_size = @@ global.max_join_size;
모든 시스템 변수를 DEFAULT
로 설정되는 것은 아닙니다. 그런 경우 DEFAULT
를 사용하면 오류가 발생합니다.
중 하나 @@
한정자를 사용하여 특정 글로벌 시스템 변수 또는 세션 시스템 변수의 값을 식으로 볼 수 있습니다. 예를 들어, 다음과 같이 SELECT
문에서 값을 얻을 수 있습니다.
SELECT @@ global.sql_mode @@ session.sql_mode @@ sql_mode;
@@
과 같은 식으로 시스템 변수를 참조 할 때 (즉, var_name
@@global.
또는 @@session.
을 지정하지 않으면), MySQL은 세션 값이 존재하면 그것을 돌려주고, 그렇지 않으면 글로벌 값을 돌려줍니다. (이것은 항상 세션 값을 참조하는 SET @@
와는 다릅니다.) var_name
= value
SHOW VARIABLES
에 의해 표시되는 일부 변수는 SELECT @@
구문에서 사용할 수없는 경우가 있고, var_name
'알수 없는 시스템 변수입니다'
로 표시됩니다. 그 경우의 해결 방법으로 SHOW VARIABLES LIKE '
를 사용할 수 있습니다. var_name
'
값 승수를 지정하는 접미사는 서버를 시작할 때 변수를 설정할 때 사용할 수 있지만 런타임에 SET
값을 설정하는 데 사용할 수 없습니다. 한편, SET
을 사용하면 수식을 사용하여 변수의 값을 할당 할 수 있지만, 서버를 시작할 때 변수를 설정할 때 사용할 수 없습니다. 예를 들어, 서버를 시작할 때 다음의 첫 번째 줄은 유효하지만 두 번째 줄은 무효입니다.
shell>mysql --max_allowed_packet=16M
shell>mysql --max_allowed_packet=16*1024*1024
반대로, 실행시 다음 두 번째 줄은 유효하지만 첫 번째 줄은 무효입니다.
mysql>SET GLOBAL max_allowed_packet=16M;
mysql>SET GLOBAL max_allowed_packet=16*1024*1024;
일부 시스템 변수는 SET
문을 ON
또는 1
로 설정하여 활성화되고, 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 | /home/mysql/ |
| 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 | /home/mysql/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_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.1.6-alpha-log |
| version_comment | Source distribution |
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| 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
변수도 변경 될 가능성이 있습니다. SESSION
변수를 GLOBAL
변수와 동일한 이름을 추가 할 경우 클라이언트가 GLOBAL
변수를 변경하려고했으나 클라이언트 SESSION
변수 만 변경되어 버릴 가능성이 있습니다.