# Example mysql config file for very large systems.
#
# This is for large system with memory of 1G-2G where the system runs mainly
# MySQL.
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /usr/local/mysql/data) or
# ~/.my.cnf to set user-specific options.
#
# One can in this file use all long options that the program supports.
# If you want to know which options a program support, run the program
# with --help option.

# The following options will be passed to all MySQL clients
[client]
#password       = your_password
port            = 3306
socket          = /tmp/mysql.sock
#default-character-set=utf8

# Here follows entries for some specific programs

# The MySQL server
[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-locking
key_buffer = 384M
max_allowed_packet = 35M
table_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
myisam_sort_buffer_size = 64M
thread_cache = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
character-set-client-handshake=FALSE

# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking

# Replication Master Server (default)
# binary logging is required for replication
log-bin

# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id       = 1

# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
#    the syntax is:
#
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=<port>,
#    MASTER_USER=<user>, MASTER_PASSWORD=<password> ;
#
#    where you replace <host>, <user>, <password> by quoted strings and
#    <port> by the master's port number (3306 by default).
#
#    Example:
#
#    CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
#    MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
#    start replication for the first time (even unsuccessfully, for example
#    if you mistyped the password in master-password and the slave fails to
#    connect), the slave will create a master.info file, and any later
#    change in this file to the variables' values below will be ignored and
#    overridden by the content of the master.info file, unless you shutdown
#    the slave server, delete master.info and restart the slaver server.
#    For that reason, you may want to leave the lines below untouched
#    (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id       = 2
#
# The replication master for this slave - required
#master-host     =   <hostname>
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user     =   <username>
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =   <password>
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port     =  <port>
#
# binary logging - not required for slaves, but recommended
#log-bin

# Point the following paths to different dedicated disks
#tmpdir         = /tmp/
#log-update     = /path-to-dedicated-directory/hostname

# Uncomment the following if you are using BDB tables
#bdb_cache_size = 384M
#bdb_max_lock = 100000

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /usr/local/mysql/data/
#innodb_data_file_path = ibdata1:2000M;ibdata2:10M:autoextend
#innodb_log_group_home_dir = /usr/local/mysql/data/
#innodb_log_arch_dir = /usr/local/mysql/data/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 384M
#innodb_additional_mem_pool_size = 20M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 100M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 16M
#default-character-set=utf8

[mysql]
no-auto-rehash
default-character-set=utf8
# Remove the next comment character if you are not familiar with SQL
#safe-updates

[isamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

utf8 my.cnf  (0) 2012.08.10
mysql 캐릭터셋  (0) 2012.08.10
mysql 변수  (0) 2012.08.10
mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10

 character_set_client : 클라이언트가 서버로 보내는 명령문 문자셋
character_set_connection : 서버가 명령문을 해석하기 위해 사용하는 문자셋
character_set_database : 현재 데이터 베이스의 기본 문자셋 없으면 서버의 기본 문자셋
character_set_results : 서버가 결과값을 클라이언트에 보내는 문자셋
character_set_server : Mysql 시작시 옵션 default-character-set=utf8 에 의해 결정되는 default 캐릭터셋

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

utf8 my.cnf  (0) 2012.08.10
mysql 캐릭터셋  (0) 2012.08.10
mysql 변수  (0) 2012.08.10
mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10

5.2.2. 서버 시스템 변수

 

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 실행에 아래와 같이 영향을 준다:

          o 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를 어떻게 사용했는지 잘 알아 두기 바란다.)

          o 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

트랜젝션 완료 타입:

          o 만약에 값이 0 (디폴트)이면, COMMIT 과 ROLLBACK 은 실행되지 않음.
          o 값이 1이면, COMMIT 과 ROLLBACK 은 각각 COMMIT AND CHAIN 과 ROLLBACK AND CHAIN과 같게 된다. (새로운 트랜젝션이 이제 막 완료된 트랜젝션과 동일한 고립 (isolation) 레벨을 가지고 곧장 실행된다.)
          o 값이 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 명령문을 실행하고자 하는 클라이언트는 큐가 다시 비워질 때까지 기다려야 한다.

    * div_precision_increment

이 변수는 / 연산자를 사용한 나눗셈 결과를 보다 정확하게 얻기 위해 지정하는 정밀도(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)이 지원하는 연산자 리스트.

디폴트 값은 '+ -><()~*:""&|'이다. 이 값을 변경하는 규칙은 아래와 같다:

          o 연산자 함수는 스트링 안에 있는 위치를 가지고 결정한다.
          o 대체되는 값은 14개의 문자로 이루어져야 한다.
          o 각 문자는 ASCII non-alphanumeric 이어야 한다.
          o 처음 또는 두 번째 문자는 스페이스 이어야 한다.
          o 11번째와 12번째의 구문 인용 부호 문자를 제외하고는 문자를 중복해서 사용할 수는 없다.
          o 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

WITH QUERY EXPANSION을 사용하는 전체-문장 검색용으로 사용하는 탑 매치 (top match)숫자.

    * ft_stopword_file

전체-문장 검색용 스톱워드 (stopword) 리스트를 읽기 위한 파일. 이 파일에 있는 모든 단어들이 사용된다; 코멘트는 사용되지 않는다. 디폴트로 스톱워드의 빌트인 (built-in) 리스트가 사용된다 (myisam/ft_static.c 파일에 정의된 것 같은). 이 변수를 빈 스트링 ('')으로 설정하면 스톱워드 필터링이 비활성화 된다.

 

Note: FULLTEXT 인덱스 값을 변경한 후에는 반드시 재 구축해야 한다. REPAIR TABLE tbl_name QUICK을 사용한다.

l        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.

l        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, “슬로우 쿼리 로그”를 참조.

    * log_warnings

추가적인 경고 메시지가 나오는지를 검사. 디폴트로는 활성화 (1)되어 있다. 허용되지 않은 연결은 그 값이 1보다 크지 않으면 에러 로그에 기록되지 않는다.

    * 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 테이블에도 영향을 미치지 않는다.

    * max_insert_delayed_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에서 추가 되었다.

    * myisam_max_extra_sort_file_size (거의 사용하지 않음)

빠른 MyISAM 인덱스 생성을 위해 사용하는 임시 파일이 여기에서 지정하는 키 캐시보다 크다면, 키 캐시 방식을 사용하게 된다. 이것은 인덱스를 생성하기 위해 좀 더 느린 키 캐시 방식을 사용하는 대형 테이블에서 긴 문자 키를 사용하도록 하기 위해 주로 사용된다. 이 값은 바이트로 지정한이다.

 

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

서버가 MySQL 계정용 패스워드로 4.1 이전 스타일을 사용하는지 검사하는 변수.

    * 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으로 설정을 하면, 슬레이브가 슬레이브 쓰레드 또는 SUPER 권한을 갖는 사용자로부터 오는 업데이트만을 실행하고 나머지 업데이트는 무시를 하게 된다. 이것은 슬레이브 서버가 자신의 마스터 서버 (클라이언트가 아님)에서 나오는 업데이트만 수용하도록 할 때 유용하게 사용할 수 있다. 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 인덱스를 가리키는 것이다.

 

이 변수는 두 가지의 값을 가질 수 있다:

          o 1 또는 YES: 경고문만을 만들어 낸다 (에러 메시지가 아님). 이것이 디폴트 값이다.
          o 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을 함께 참조할 것.

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

utf8 my.cnf  (0) 2012.08.10
mysql 캐릭터셋  (0) 2012.08.10
mysql 변수  (0) 2012.08.10
mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10

 

최근들어 mysql 서버이전을 하면서 캐릭터셋 문제에 봉착하는 사람들이 많아졌다.
그런 분들을 위해 과정을 정리해 봤다 도움이 되었으면 한다.
아래의 정리는 경험을 바탕으로 적었기에 문제는 없을거 같지만 모든 환경을 테스트한것이 아니기에
이게 정답이다라고 할수는 없을것이기에 부족한 부분은 조언을 주셨으면 한다.

보통 3.x대 또는 4.x대에서 오랫동안 사이트를 운영하다 이번에 5.x 로 업하시는 분들이 이런 문제에 많이
봉착한다. 3.x 나 4.x 에서는 국내에 호스팅 환경이 euc-kr, euckr 이 대세였기에...
하지만 요즘은 utf8을 기본 지원하고 extra character set 으로 euckr 을 구축하는게 호스팅사들이 많은거 같다.

Type A 기본 캐릭터셋 euckr 서버에서 기본 캐릭터셋 utf8 서버로의 이전
    1. euckr => euckr 로의 이전
    2. euckr => utf8 로의 이전
Type B 기본 캐릭터셋 utf8 서버에서 기본 캐릭터셋 euckr 서버로의 이전
    3. utf8 => euckr 로의 이전
    4. utf8 => utf8 로의 이전

1. euckr => euckr 로의 이전
    1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
    2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names euckr;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=euckr;" 또는
        "ENGINE=??? DEFAULT CHARSET=euckr;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
    3) mysql -u user -p < backup.sql
    4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
        "set names euckr;"
        보통 웹프로그램은 별도의 화일을 하나로 두어 include 같은 방식을 취한다.
  5) 위와같이 정의를 함으써 utf8서버에서도 euckr 을 사용할수 있게 되는것이다.

        현재 변환 작업(euckr=>utf 베이스의 euckr)에서 "Data too long for column"이와 같은 오류는
        utf8 베이스의 mysql 서버에 euckr 데이터가 utf8로 입력되어 나오는 오류이다.
        그것을 예방하는것이 "set names euckr" 이며
        아래의 3가지 옵션을 변경하는 것이다.
        character_set_client    euckr
        character_set_connection    euckr
        character_set_results    euckr
        참고로 예전 Mysql 3.x 대에서 euc-kr 이라고 했었던 환경에서는 한글은 varchar(10)에서
        5글자 밖에 들어가지 않았다. 즉 한글자가 2개의 char 값을 차지 했는데...
        최근 버젼들은 euckr 환경이라도 varchar(10)에 한글 10자가 모두 들어간다.

        이전테스트를 하다보니 "샆"이란 문자가 입력이 되질 않았다.
        OS의 문제인지 mysql 의 문제인지 모르지만 국내 주소에 포스코 ?? 샾은 오류가 나서 "삽"으로
        바꿨다. 포스코?? 샵 아파트 주민분들에게 욕들어 먹는건 아닐런지 ㅡㅡ;;

2. euckr => utf8 로의 이전
    1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
    2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names utf8;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=utf8;" 또는
        "ENGINE=??? DEFAULT CHARSET=utf8;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
        그리고 EditPlus에서 저장할때 utf-8 형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
    4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names utf8;"

        "set names utf8;" 쿼리가 별도로 필요없는 경우도 있는데 이경우는 리눅스 계열이며
        서버 OS 캐릭터셋 자체가 UTF-8인 경우이다. 윈도우의 경우에는 DB와 웹이 UTF8로 설정되었다고
        하더라도 실제 커넥션을 맺어서 확인해 보면 latin1 이 설정되어 있는 경우가 많다.
        아래는 PHP를 통해 실제 윈도우서버(mysql utf8로 설정)에서
        character set 관련 설정을 출력해본 예제이다.
        <?
        $connect = mysql_connect('localhost','user명','user비밀번호');
        $DBresult = mysql_query("show variables like 'char%'",$connect);
        $rows = mysql_affected_rows();
        for ($i=0; $i<$rows; $i++) {
            mysql_data_seek($DBresult,$i);
            $result = mysql_fetch_array($DBresult);
            echo "$result[0] : $result[1]<BR>";
        }

        echo "<BR>";
        mysql_query("set names utf8",$connect);

        $DBresult = mysql_query("show variables like 'char%'",$connect);
      $rows = mysql_affected_rows();
      for ($i=0; $i<$rows; $i++) {
          mysql_data_seek($DBresult,$i);
          $result = mysql_fetch_array($DBresult);
          echo "$result[0] : $result[1]<BR>";
      }

        결과는 아래와 같았다 물론 이와 다를수도 있다. 다만 한번쯤 default character 가 utf8 이라도
        위의 소스로 한번쯤 확인해보는게 좋다.
        자신이 utf8로 설정했다고 하면서 실제로 utf8이 아닌경우도 상당히 많다.
        사실은 저도 이것때문에 삽질을 좀 했다는....

        character_set_client : latin1
        character_set_connection : latin1
        character_set_database : utf8
        character_set_filesystem : binary
        character_set_results : latin1
        character_set_server : utf8
        character_set_system : utf8
        character_sets_dir : C:\\Program Files\\MySQL\\MySQL Server 5.0\\share\\charsets\\

        character_set_client : utf8
        character_set_connection : utf8
        character_set_database : utf8
        character_set_filesystem : binary
        character_set_results : utf8
        character_set_server : utf8
        character_set_system : utf8
        character_sets_dir : C:\\Program Files\\MySQL\\MySQL Server 5.0\\share\\charsets\\

3. utf8 => euckr 로의 이전
  1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
  2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names euckr;" 입력한다.
        Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=euckr;" 또는
        "ENGINE=??? DEFAULT CHARSET=euckr;" 로 변경한다.
        EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
        그리고 EditPlus에서 저장할때 utf-8 형식이 아닌 기본형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
  4) db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names euckr;"
        최신버젼에서 Mysql 3.x 대 버젼의 euc-kr 로 이전을 한다면 그건 하지않는것이 ㅡㅡ;;
        그 이유는 위에서 언급한것처럼 한글의 글자 처리(2byte 처리)가 다르기 때문이다.
        그런 이유로 테이블을 다시 설정하거나 최악의 경우 다시 설계해야 하는 경우가 생긴다.


4. utf8 => utf8 로의 이전
  1) mysqldump 를 이용하여 mysql의 sql문을 dump를 받는다.
  2) backup.sql 이란 화일을 받았다면 EditPlus 같은 프로그램으로 최상단에 "set names utf8;" 입력한다.
      Create 문에 "Type=???;" 또는 "ENGINE=???;"를 "Type=??? DEFAULT CHARSET=utf8;" 또는
        "ENGINE=??? DEFAULT CHARSET=utf8;" 로 변경한다.
      EditPlus 에서는 Ctrl + H 로 변경창이 쓴다.
      그리고 UTF-8로 저장이 되어있지 않다면 EditPlus에서 저장할때 utf-8 형식으로 저장을 하자
  3) mysql -u user -p < backup.sql
  4) 기존의 "set names utf8"이 설정되어 있다면 상관없지만 없다면
        db connection 을 맺는 화일또는 공통설정화일에 아래의 쿼리를 먼저 서버로 날린다.
      "set names utf8;"
        위에서도 비슷하게 언급했듯이... show variables like 'char%' 쿼리를 통해
        character_set_client    utf8
        character_set_connection    utf8
        character_set_results    utf8
        이 부분이 다르게 설정했다면 꼭 "set names utf8;" 이부분이 필요하다.



※참고
보통 backup.sql 화일의 언어셋을 변환하는경우 EditPlus 나 그외 편집툴로 바로 바꾸는 경우도 있지만
화일이 큰 경우는 iconv 를 이용하는것도 괜찮다..
iconv -c -s -f $input_encording -t $output_encording $input_file > $output_file
 


var md5_norobot_key = '84506442dda92f2efef35c9d84cfea99'; // 글자수 제한 var char_min = parseInt(0); // 최소 var char_max = parseInt(0); // 최대

 
 
   칼솜   07-06-13 10:42 
와~ 전후좌우 다 통하는게 정리를 하셨네요 ^^
수고하셨습니다. 그런데 Type=MyISAM 이 4.1부터 ENGINE=MyISAM으로 바뀐것이라고
알고 있는데 확인해 주실수 있나요?
감사합니다 ^^
 
와~ 전후좌우 다 통하는게 정리를 하셨네요 ^^ 수고하셨습니다. 그런데 Type=MyISAM 이 4.1부터 ENGINE=MyISAM으로 바뀐것이라고 알고 있는데 확인해 주실수 있나요? 감사합니다 ^^
 
 
   전진하는아르고   07-06-13 10:43 
아 넵... 복사해서 붙여넣기를 했더니.. ㅋㅋㅋ
 
아 넵... 복사해서 붙여넣기를 했더니.. ㅋㅋㅋ
 
 
   Mersia   07-06-13 20:29 
ENGINE 로 변경이 된것은 맞으나 하위버전과의 호환성문제때문에 Type 도 먹힙니다.

5.x 이상에서는 덤프를 뜨면 ENGINE 로 나옵니다.
 
ENGINE 로 변경이 된것은 맞으나 하위버전과의 호환성문제때문에 Type 도 먹힙니다. 5.x 이상에서는 덤프를 뜨면 ENGINE 로 나옵니다.
 
 
   아쿠아™   07-06-13 20:41 
Type 이었다가 Engine 으로 바꼈어요.
하위버전 호완성을 위해서 걍 남겨둔거욤;;;;;;;
 
Type 이었다가 Engine 으로 바꼈어요. 하위버전 호완성을 위해서 걍 남겨둔거욤;;;;;;;
 
 
   blaer   07-06-14 00:48 
iconv랑 sed써서 변환하는 방법도 괜찮습니다.. ^^
 
iconv랑 sed써서 변환하는 방법도 괜찮습니다.. ^^
 
 
   낭망백수   07-06-14 12:08 
근데 한가지 의문점이...
서버가 utf-8 이냐 euc-kr 이냐는
한글을 담은 data field 가 utf-8이냐 euc-kr 이냐와는 상관없는것 아닌가요?

가장 간단하게 접근할 수 있는 방법은
이전의 해당 DB(DBMS 아님) 의 charset 이 무엇이냐를 판별한 다음 그걸 변경할 것이냐를 결정한 후,
덤프의 charset 을 변경하고,
새 DB의 charset 을 결정한 대로 다시 집어넣는 것이죠.

그러니까 해당 datafield 에만 최대한 집중하면 된다는 뜻입니다.
나머지는 mysql서버와 mysql클라이언트, 그리고 mysql서버가 돌아가는 시스템환경의
charset 인데 이건 웹어플리케이션에서 가져다 쓰는 data 와는 무관하지 않은가 생각하는 것입니다.

혹 제가 잘못 알고 있는 더욱 복잡한 상황이 있을수도 있겠습니다만,
간단하게 접근하면 훨씬 간단하게 해결할 수 있을것 같아서 커멘트 답니다.

꾸벅~!
 
근데 한가지 의문점이... 서버가 utf-8 이냐 euc-kr 이냐는 한글을 담은 data field 가 utf-8이냐 euc-kr 이냐와는 상관없는것 아닌가요? 가장 간단하게 접근할 수 있는 방법은 이전의 해당 DB(DBMS 아님) 의 charset 이 무엇이냐를 판별한 다음 그걸 변경할 것이냐를 결정한 후, 덤프의 charset 을 변경하고, 새 DB의 charset 을 결정한 대로 다시 집어넣는 것이죠. 그러니까 해당 datafield 에만 최대한 집중하면 된다는 뜻입니다. 나머지는 mysql서버와 mysql클라이언트, 그리고 mysql서버가 돌아가는 시스템환경의 charset 인데 이건 웹어플리케이션에서 가져다 쓰는 data 와는 무관하지 않은가 생각하는 것입니다. 혹 제가 잘못 알고 있는 더욱 복잡한 상황이 있을수도 있겠습니다만, 간단하게 접근하면 훨씬 간단하게 해결할 수 있을것 같아서 커멘트 답니다. 꾸벅~!
 
 
   전진하는아르고   07-06-14 14:51 
음... mysql 에 charset 관련 설정이 여러개가 있는데..
system database 이런건 솔찍히 중요하지 않습니다.
맞습니다.
데이터 백업시 중요시 되는건 백업sql데이터의 문서charset과 set names로 변경되는
character_set_client
character_set_connection
character_set_results
이 옵션만 정확하면 됩니다.

제가 이렇게 구차하게 나눠둔건..
default캐릭터셋 환경이 같고 캐리터셋이 같은경우 거의 백업 및 복구시 문제될게 없지만
다른 캐릭터셋에 관해서라면 조금씩 문제가 상이하기 때문입니다.

그리고 아시는분들이야 제가 정리한것보다 더 잘하실수 있겠지만..
보통 캐릭터셋 질문하시는분들을 보면 아직 서버운영에 미숙한 분들이 꽤 있습니다.
그 분들을 위해 좀더 상세히 나누고 예상될수 있는 문제들을 적어놓은 것입니다.

훨씬 간단하게 정리못해서 죄송합니다  ^^;;
능력이 거기까지 밖에 TT
 
음... mysql 에 charset 관련 설정이 여러개가 있는데.. system database 이런건 솔찍히 중요하지 않습니다. 맞습니다. 데이터 백업시 중요시 되는건 백업sql데이터의 문서charset과 set names로 변경되는 character_set_client character_set_connection character_set_results 이 옵션만 정확하면 됩니다. 제가 이렇게 구차하게 나눠둔건.. default캐릭터셋 환경이 같고 캐리터셋이 같은경우 거의 백업 및 복구시 문제될게 없지만 다른 캐릭터셋에 관해서라면 조금씩 문제가 상이하기 때문입니다. 그리고 아시는분들이야 제가 정리한것보다 더 잘하실수 있겠지만.. 보통 캐릭터셋 질문하시는분들을 보면 아직 서버운영에 미숙한 분들이 꽤 있습니다. 그 분들을 위해 좀더 상세히 나누고 예상될수 있는 문제들을 적어놓은 것입니다. 훨씬 간단하게 정리못해서 죄송합니다 ^^;; 능력이 거기까지 밖에 TT
 
 
   낭망백수   07-06-15 00:43 
참, 궁금한게 앞서느라 잘 정리해두신것 수고하셨다는 말씀을 못드렸네요. ^^;
수고하셨구요. 많은 분들에게 좋은 밑거름이 될 것임에는 틀림없는 자료입니다. ㅎㅎ;;;

꾸벅~!

 

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

mysql 캐릭터셋  (0) 2012.08.10
mysql 변수  (0) 2012.08.10
mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10
mysql event  (0) 2012.08.10

 

간단하게 실무에 사용 할 수 있게 요약만 적었습니다.

1) 기존 DB 에서 원하는 값만 따로 Table 생성 및 자료 구겨넣기

      CREATE TABLE member2 TYPE=innodb AS
      SELECT * FROM member WHERE joindate BETWEEN '1999-01-01' AND '2006-12-31';

2) PROCEDURE

  2-1) Mysql 에서 PROCEDURE 부르는 방법 : call 함수명('인자')

  2-2) 사용법 샘플

            CREATE PROCEDURE bengi_exam1()
            BEGIN
              --  변수 선언
              DECLARE bgtotal INTEGER; 
             
              --  회원테이블에서 벤지라는 글자가 들어간 사람의 총수을 구해서
              --  bgtotal 변수에 저장
              SELECT COUNT(upk) INTO bgtotal FROM member
              WHERE uname LIKE '%벤지%';
           
              --  총수 RETURN 
              SELECT bgtotal;
            END

           
3) FUNCTION

  3-1) Mysql 에서 FUNCTION 부르는 방법 : select function명('인자')

  3-2) 사용법 샘플
 
          --  datetime 형의 bdate 인자에 계산을 원하는 값 전달
          CREATE FUNCTION userage ( bdate datetime ) returns int(11)
          BEGIN
                  --  변수 선언         
                  DECLARE var_age INT;
                  --  나이를 구한다
                  SET var_age = date_format( now(),'%Y' ) - date_format( bdate,'%Y' );                 
                  -- 값을 RETURN 한다
                  RETURN(var_age);
          END;

         
4) PROCEDURE 에서 FUNCTION CALL
         
  4-1) 사용법 샘플
 
            CREATE PROCEDURE bengi_exam2()
            BEGIN
              -- 변수 선언
              DECLARE bgage INTEGER; 
              DECLARE membdate DATETIME; 
             
              -- 회원테이블에서 bengi라는 글자가 들어간 사람의 생년월일 구한다
              SELECT bdate INTO membdate FROM member
              WHERE uname = 'bengi';
           
              -- Function 에서 결과값을 받아 저장한다 (3-1 에 정의된것 사용)
              set bgage = userage(membdate); 
           
              -- 총수 RETURN 
              SELECT bgtotal;
            END

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

mysql 변수  (0) 2012.08.10
mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10
mysql event  (0) 2012.08.10
my.cnf  (0) 2012.08.10

 Mysql에서 innodb 는 상용DB와 비슷한 기능들을 지원한다.
물론 아직도 지원하지 않는 기능이 많지만...  그럭저럭 쓸만하다.
다음은 그중 외래키 지원에 관한것이다.

외래키란 A, B 라는 테이블이 있을경우
A 테이블 Key 값을 참조하여 B 테이블에서 사용할때 B테이블의 Key를 외래키라고 한다.
참고로 A 테이블의 참조하는 키를 참조키라고 한다.
그러므로 A 테이블의 참조키와 B 테이블의 외래키값은 동일한 값이 들어간다.
그외 자세한 내용은 인터넷에 많으니 찾아보시고... ^^

그러나 Web 쪽에서 Mysql 이 많이 사용되다 보니 거의 외래키를 사용할일이 없고..
웹호스팅사에서도 거의 InnoDB는 잘 지원하지 않다 보니 자주 사용되지는 않는다.
Mysql 서버를 독자적으로 쓰거나.. 또는 업무용 프로그램의 DB로 사용한다면
외래키 및 트랜젝션 처리를 사용하게 될것이다.

그럼 왜 외래키를 이용할까?
그건 데이터의 정확성 때문이라고 할수 있다.
왜 정확해 지냐라고 묻는다면 아래의 예제를 설명하고 나서 이야기 하겠다.

우선 다음과 같은 테이블을 만들자.
member_info : 회원 테이블
member_login : 회원이 로그인하면 로그인시간을 기록하는 테이블

CREATE TABLE `member_info` (
    `id` VARCHAR(20) NOT NULL DEFAULT '',
    `name` VARCHAR(16) NOT NULL DEFAULT '',
    PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `member_login` (
    `id` varchar(20) NOT NULL,
    `logintime` datetime NOT NULL default '0000-00-00 00:00:00',
    PRIMARY KEY  (`id`),
    CONSTRAINT `fk_id`
        FOREIGN KEY (`id`) REFERENCES `member_info` (`id`)
            ON DELETE CASCADE
            ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

member_info 테이블은 기본적인 테이블 만드는 방법이다.
DDL(Create, Drop, Alter)문에 대한 설명은 여기서 하지 않겠다.

member_login 테이블이 실제 외래키를 담고 있는 테이블이다.
CONSTRAINT `fk_id` <== 제약조건을 건다는 말이며 그 이름을 fk_id 라고 지정했다
FOREIGN KEY (`id`) <== 현재테이블의 필드명이 id 인것이 외래키라는것을 의미한다.
REFERENCES `member_info` (`id`) <== member_info 테이블의 id 필드를 참조한다는 것을 의미한다.
ON DELETE CASCADE <== 참조키가 삭제되면 외래키도 삭제한다
ON UPDATE CASCADE <== 참조키가 업데이트 되면 외래키도 업데이트를 한다.

현재 테스트 버젼 5.0.37에서는 지원하는 옵션은 4가지가 있다.
CASCADE
  참조키와 동일하게 맞춘다. 즉 참조키값이 삭제되면 해당 테이블의 동일한 레코드도 삭제되며
  참조키값이 업데이트(예 aa => bb 로 바뀐다면)되면 외래키값도 업데이트(aa => bb 로 바뀐다)가 된다.
RESTRICT : 참조키가 삭제되거나 업데이트 되는걸 막는다.
SET NULL : 참조키가 삭제되거나 업데이트 되면 외래키값을 null 로만든다.
NO ACTION : 참조키가 삭제되거나 업데이트 되어도 아무런 동작을 하지 않는다. 이 경우는 외래키의 의미가 없다고 볼수 있다.

그럼 insert 문을 실제 데이터를 입력해 보자.

insert into member_info values('test1','테스터1');
insert into member_login values('test1',now());

위의 sql문을 순서를 바꾸어서 실행하면 에러가 날것이다.
회원정보 테이블(member_info)이 중심테이블이라고 한다면... member_login 테이블은
회원정보 테이블(member_info)에 종속적이라고 할수 있다.
즉 member_info 테이블의 id 값에 있는것이 member_login의 id값이 들어갈수 있는것이다.
그러니.. insert 문 작성시 member_info 부터 입력해야 한다.

현재 테이블 설정이 CASCADE 이니 조금전에 입력한 member_info의 id 값 'test1' 을 update 해보자.

update member_info set id='test2' where id='test1';

이제 member_login 의 데이터를 select 해서보면

select * from member_login 을 해보면..

member_login 을 업데이트를 하지 않았음에도 외래키값이 update 되어있는걸 확인할수 있을것이다.
그럼 삭제는 어떨까?
member_info 의 id='test2' 값을 다시 삭제하면 member_login의 row 데이터도 같이 삭제된것을
볼수 있다.

그럼 왜 외래키가 사용되는지 조금은 감이 오리라 생각된다.
참고로 member_login 테이블의 데이터가 삭제될때는 상관이 없다.
다만 member_login 의 데이터는 insert 또는 update 될때 member_info 의 id 필드를 참조하기때문에
영향을 받는다..

이와같은 방식으로
member_info 의 ID 값이 삭제나 업데이트 될때 제한을 둔다던지(restrict)
member_info 의 ID 값이 삭제나 업데이트 될때 member_info의 ID 값을 Null 을 만들던지(set null) 한다..
다만 no action 은 말 그대로 아무런 동작을 하지 않는것이기에 표면상의 외래키일 뿐이다.

참고로 Alter 문은 아래와 같이..
ALTER TABLE member_login Drop FOREIGN KEY fk_id;
ALTER TABLE member_login ADD CONSTRAINT `fk_id` FOREIGN KEY (`id`) REFERENCES `member_info` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

mysql 백업/복구  (0) 2012.08.10
mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10
mysql event  (0) 2012.08.10
my.cnf  (0) 2012.08.10
트리거에서 테이블명 변수로 사용하여 실행하기  (0) 2012.07.12

Mysql 5.1.17 에서부터는 Event 란 기능을 어느정도 이용할수 있다고 한다.
Event 란 특정 시간에 어떠한 쿼리 프로시저 함수등을 실행 시키는것을 말한다.
우선 root 권한으로 작업을 한다는 가정하에 적는다.

Event 를 사용하기위해서는
1. 서버가 동작중이라면 아래와 같은 SQL문을 통해 실행할수 있다.
    SET GLOBAL event_scheduler = ON;
    SET @@global.event_scheduler = ON;
    SET GLOBAL event_scheduler = 1;
    SET @@global.event_scheduler = 1;
2. my.cnf or my.ini 에 옵션(event_scheduler=On)을 추가하고 mysql 을 시작한다.

반대로 Event 를 사용하지 않으려면
1. 서버가 동작중이라면 아래와 같은 SQL문을 통해 종료할수 있다.

   SET GLOBAL event_scheduler = OFF;
   SET @@global.event_scheduler = OFF;
   SET GLOBAL event_scheduler = 0;
   SET @@global.event_scheduler = 0;

2. my.cnf or my.ini 에 옵션(event_scheduler=Off)을 추가하고 mysql 을 시작한다.

그럼 실제 event 를 만들어 보자.
우선 아래와 같이 test DB에 테이블을 하나 만들어보자

CREATE TABLE `e` (
  `num` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `regdate` datetime NOT NULL,
  PRIMARY KEY (`num`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;



그리고 이벤트를 하나 만들어 보자
아래의 SQL문은 test.e 테이블에 현재시간으로 부터 30초마다 insert 를 실행하는
event 를 생성하는 것이다.

create event IF NOT EXISTS e1
    ON SCHEDULE
        EVERY 30 SECOND
        STARTS CURRENT_TIMESTAMP
    DO insert into test.e set regdate=now();

몇분지나다 보면 test.e 테이블에 데이터가 입력되는것을 확인할수 있을것이다.

EVERY 30 SECOND 의 의미가 30초씩 루프를 돈다는 의미이며 STARTS CURRENT_TIMESTAMP 가
현재 시간부터 시작한다는 의미이다. SECOND 외에도 아래와 같은 옵션으로 올수 있다.
YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND
EVERY 2 MINUTE => 2분마다 DO 구문을 실행
EVERY 1 HOUR => 매일 실행
...

이렇게 입력한 Event 는 mysql.event 테이블에 등록이 된다.
또는 show events; 를 통해 확인할수도 있다. 그외로 information_schema.EVENTS 에서도 확인할수 있다.
mysql.event 를 확인하다보면 created modified 시간이 정확하지만
last_excuted starts ends 는 뭔가 좀 다르다는걸 알수 있다. 이는 그리니치 표준시각을 의미한다.

이런 Event 를 삭제하기 위해서는 아래와 같은 SQL 문을 실행하면 된다.
drop event 이벤트명;
즉 위의 e1 이라는 event 를 삭제하기 위해서는 drop event e1; 인 SQL문을 실행하면 된다.
event는 mysql.event 테이블에 등록된다고 했는데 mysql.event 에서 바로 삭제하는경우
메모리의 영향때문인지 삭제후 똑같은 event 명으로 등록을 한경우 앞전에 사용한 event 가 제대로 지워지지
않고 동작하는 경우를 볼수 있다. 그러니 삭제시는 꼭 drop event 이벤트명; 을 이용하길 바란다.

여하튼 위에서 생성한 e1 쿼리를 좀더 발전시켜 아래와 같이 작성해보자

create event IF NOT EXISTS e2
   ON SCHEDULE
       EVERY 1 MINUTE
       STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
       ENDS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
   DO insert into test.e set regdate=now();

위의 SQL문과 다른점은 ENDS 가 지정되고 + INTERVAL 1 MINUTE 같은 문구가 지정된것이다.
이는 현재시간으로 부터 1 분뒤 부터 Event 가 실행되고 1분마다 do 의 sql 문이 실행되며
현재시간으로부터 5분뒤에 멈춘다는 것이다. 그러니 총 5번의 실행후 멈추게 된다.
예를 들면 13:00:00 이 현재 시간이라고 한다면 13:01:00 부터 이벤트가 실행되며 13:05:00 까지 insert 가
일어나고 동시에 13:05:00 에 이벤트가 종료된다.
이런경우 즉 Ends 가 있는 경우는 event 가 종료되고 mysql.event 테이블에서 해당 event 가 자동삭제된다.

그럼 딱 한번 실행을 위해서는 어떻게 해야 할까?

create event IF NOT EXISTS e2
   ON SCHEDULE
       EVERY 1 MINUTE
       STARTS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
       ENDS CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
   DO insert into test.e set regdate=now();

이렇게 해도 될것이다.
하지만 이는 너무 비효율적이다.

그래서 AT 이라는 지시어가 별도로 있다.
즉 EVERY는 순환을 위해 AT 은 한번 사용을 위해 사용된다.
Unux 계열의 at 과 cron 의 의미와 관련지어 생각하면 될듯 하다.
위의 SQL문은 아래와 같이 수정할수 있다.

create event IF NOT EXISTS e2
   ON SCHEDULE
       AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
    DO insert into test.e set regdate=now();

이 경우에도 Ends 가 붙은것처럼 한번실행하고 나면 mysql.event 에서 삭제된다.
즉 종료 조건이 있는 경우 자동삭제된다고 보면 된다.

물론 아래와 같이 ON COMPLETION PRESERVE 구문을 추가하면 이부분 역시 남겨둘수 있다.

create event IF NOT EXISTS e2
   ON SCHEDULE
       AT CURRENT_TIMESTAMP + INTERVAL 1 MINUTE
        ON COMPLETION PRESERVE
   DO insert into test.e set regdate=now();



Event 는 위의 경우처럼 do 에서 insert 외에도 다양한 구문을 지원한다.
아래는 mysql 에서 제공하는 예제이다.
mysql 프로시저 등을 공부해보신 분이라면 금방이해가 갈듯...

DELIMITER |

CREATE EVENT e
    ON SCHEDULE
      EVERY 5 SECOND
    DO
      BEGIN
        DECLARE v INTEGER;
        DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;

        SET v = 0;

        WHILE v < 5 DO
          INSERT INTO t1 VALUES (0);
          UPDATE t2 SET s1 = s1 + 1;
          SET v = v + 1;
        END WHILE;
    END |

DELIMITER ;

CREATE EVENT e_call_myproc
    ON SCHEDULE
      AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
    DO CALL myproc(5, 27);



Mysql Event 관련 자료를 찾아보기가 어려워서 만들어봤습니다. 잘못된 부분이 있으면 지적해주시면 감사 ^__^

 

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

mysql procedure function  (0) 2012.08.10
mysql innodb  (0) 2012.08.10
mysql event  (0) 2012.08.10
my.cnf  (0) 2012.08.10
트리거에서 테이블명 변수로 사용하여 실행하기  (0) 2012.07.12
SELECT COUNT(0) 은 COUNT(*) 와 같다?  (0) 2011.01.24

 my.cnf 파일을 편집한다.

MySQL의 업그레이드가 끝나면 my.cnf 파일을 편집한다.

다음과 같이 한다 :

[client]
default-character-set=euckr



[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default-character-set=euckr
init_connect=set collation_connection=euckr-korean_ci
init_connect=set names euckr
character-set-server=euckr
collation-server=euckr_korean_ci
character-set-client-handshake = FALSE (이 항목이 4.1.15부터 지원되는 옵션)



[mysql.server]
user=mysql
basedir=/var/lib



[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid



[mysqldump]
default-character-set=euckr

[mysql]
default-character-set=euckr

 

 

간혹 회신에 회신을 거듭하여 메일 본문이 1MB가 넘는 경우가 있더군요.
이럴 경우를 고려해 max_allowed_packet 설정이 넉넉한지 확인해보셨나 모르겠네요.


    vi /etc/my.cnf
        [mysqld]
        set-variable = max_allowed_packet=16M

보다 자세한 내용은 아래 문서를 참고하시면 됩니다.
  http://dev.mysql.com/doc/refman/4.1/en/packet-too-large.html

이 글은 스프링노트에서 작성되었습니다.

.

'Computer > MySQL' 카테고리의 다른 글

mysql innodb  (0) 2012.08.10
mysql event  (0) 2012.08.10
my.cnf  (0) 2012.08.10
트리거에서 테이블명 변수로 사용하여 실행하기  (0) 2012.07.12
SELECT COUNT(0) 은 COUNT(*) 와 같다?  (0) 2011.01.24
MySQL 서버 최적화 참고 문서  (0) 2010.08.16
트리거나 프로시저에서 테이블명을 변수로 받아서 사용해야 할때가 있습니다.
이렇게 될 경우 캐쉬를 사용하지 못하지만,
그래도 긴 명령문을 간략하게 넘길수 있다는 장점은 있습니다.







트리거에서 테이블명 변수로 사용하여 실행하기

-우선 쿼리실행할 프로시져 생성- 
CREATE DEFINER=`user`@`localhost` PROCEDURE `P_SQL_RESULT`(IN `xSql` TEXT) 
LANGUAGE SQL 
NOT DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT '쿼리실행' 
BEGIN 
SET @xSql = xSql; 
PREPARE dSql FROM @xSql; 
EXECUTE dSql ; 
DEALLOCATE PREPARE dSql; 
END 
--------------------------------------------------------------------------------------------- 

 트리그,평션,이벤트등에서 생성한 프로시져를 이용해 실행함 

  SET @nLOGTB = concat('LOG_' , SUBSTRING(NEW.HDATE,1,8)); 
  SET @xSql = CONCAT("INSERT INTO ",@nLOGTB," (aa,bb,cc) VALUES  
              (",new.aa ,",", new.bb,",now())"; 
  CALL P_SQL_RESULT(@xSql); 



.

'Computer > MySQL' 카테고리의 다른 글

mysql event  (0) 2012.08.10
my.cnf  (0) 2012.08.10
트리거에서 테이블명 변수로 사용하여 실행하기  (0) 2012.07.12
SELECT COUNT(0) 은 COUNT(*) 와 같다?  (0) 2011.01.24
MySQL 서버 최적화 참고 문서  (0) 2010.08.16
MySQL DataBase 서버 튜닝 - MySQL Administrator  (0) 2010.08.16
MySQL 대용량 데이터베이스 책 읽고 있는데,

---------------------------------------------
no                        이름
---------------------------------------------
1                          하하하
2                          알찬돌삐
null                      히히히


라고 되어있을때.

SELECT COUNT(no) FROM table 을 할 경우.

2 를 반환합니다.

전 보통

SELECT COUNT(0) FROM table 을 쓰는데,

null 이 올수 없는 컬럼 (0) 이 count 함수안에 올 경우

내부적으로 COUNT(*) 으로 변환되다고 하네요.

COUNT(no) 를 하면 no 에서 null 아닌 것을 카운트하며,

COUNT(*) 를 할 경우 전체 컬럼을 세는것이 아니라....

행의 갯수만 세개 된다고 합니다....




이제까지 COUNT(*) 은 나쁘다 라고 알고 있던것에 대한걸 뒤집는것 같네요.
.

+ Recent posts

티스토리 툴바