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 = valuequery_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=16Mshell>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 변수 만 변경되어 버릴 가능성이 있습니다.