2008년 12월 1일 월요일

설정파일 - my.cnf(my.ini)

MySQL에서는 mysqld과 기타 명령어 옵션을 my.cnf또는 my.ini에 기술하는 것이 가능하다. 
(기술해놓지 않아도 명령어군은 동작한다.)  커맨드라인에서 매번 옵션을 지정하는 것은 귀찮지만 그 설정을 파일에 적어두면 일일이 옵션 지정할 필요가 없어진다. 

따라서 my.cnf에는 여러가지 기술을 하게 된다. 
Unix계열 OS에서는 보통 /etc/my.cnf이다.  윈도우즈에서는 c:\my.ini가 많이 사용된다. 

다만  위 기술장소 이외에 있는 파일도 읽어들일 수 있게 되어있다. 
여기에서는 my.cnf의 기술, 읽어들이는 순서, 읽어들여지는 그룹, 서포트하고 있는 옵션에 대해서 정리해본다. 

my.cnf읽는 순서
--default-file=옵션을 사용하고 있는 경우에는(만약 옵션이 이용가능하다면) 지정된 파일만 읽으므로 주의하길 바란다.  이것 이외에는 보통 여러개의 my.cnf파일을 읽어들인다. 
그 기능은 libmysqlclient(libmysql.dll)이 갖추고 있다. 

 여러개의 파일에 같은 옵션이 기술되어 있는 경우에는 나중에 읽어들인 값으로 대체된다. 
또 파일은 전부 존재하지 않으면 안된다. 

파일을 읽는 순서, 검색경로는 버전이 올라가면 변경될 가능성은 있다. 
다음은 각각의 my.cnf가 읽혀지는 순서이다. 

#Unix계열 운영체제 경우 읽는 순서(5.0/5.1)
1. /etc/my.cnf
2. /etc/mysql/my.cnf( 5.1.15-beta이상은 유효. 5.0.45에서는 읽어들이지 않음)
3. $MYSQL_HOME환경변수에 지정된 디렉토리/my.cnf 
4.--defaults-extra-file옵션에 지정된 파일
5.$HOME/.my.cnf(명령어를 실행하는 계정의 홈 디렉토리)
6.DEFAULT_SYSCONFDIR/my.cnf
 (DEFAULT_SYSCONFDIR은 ./configure --sysconfdir=에서 지정한 디렉토리 5.0.21이상)

#윈도우즈에서 읽는 순서(5.0/5.1)
 my.ini하고 my.cnf의 양 파일이 같은 디렉토리에 있는 경우에는 my.ini , my.cnf순으로 읽어들여진다. 
1.c:\my.{ini,cnf}
2.%WINDIR%\my.{ini,cnf}
3.%System%\my.{ini,cnf} (%System%은 kernel32.dll이 존재하는 디렉토리)
4.MYSQL_HOME환경변수에 지정된 디렉토리\my.{ini,cnf}
5.명령어가 존재하는 디렉토리의 한단계위의 디렉토리\my.{ini,cnf}
6.--defaults-extra-file=옵션에 지정된 파일
7.DEFAULT_SYSCONFDIR\my.{ini,cnf}
(DEFAULT_SYSCONFDIR은 컴파일할 때 "/D DEFAULT_SYSCONFDIR="처럼 지정된 디렉토리. 현재 바이너리 배포판은 무효. 5.0.21이상 )

버전 4.1에서는 $MYSQL_HOME환경변수는 읽어들이지 않는다.  그 대신에 datadir/my.cnf(datadir는 컴파일할 때 지정한 디렉토리)를 읽어들인다. 
5.0.21미만에서는 --sysconfdir(DEFAULT_SYSCONFDIR)에서 지정된 디렉토리에서는 찾지 않는다. 

libmysqlclient가 지원하는 옵션 
C언어로 작성된 libmysqlclient에는 my.cnf을 읽어들이는 기능이 있다. libmysqlclient는 my.cnf에 써져 있는 다음의 옵션을 지원한다. (sql-common/client.c에 기술)

compress  통신을 gzip압축한다.  zlib를 지원하면 사용가능
connect-timeout= 접속 타임아웃(초)
host= 호스트 지정
max-allowed-packet=  1개의 통신패킷의 최대 사이즈(바이트)
password= 접속할때의 패스워드
pipe 접속에  named pipe를 사용(윈도우즈만)
port= 서버의 포트
protocol=  [tcp|socket|pipe|memory]
secure-auth  4.1이상  클라이언트 인증에 한정
shared-memory-base-name=  shared memory이름
socket= 소켓파일명
user= 접속유저명
timeout=  connect-timeout과 동일
ssl-ca= CA의 CERTIFICATE 파일지정
ssl-capath= CA의 CERTIFICATE 파일이 존재하는 디렉토리 지정
ssl-cert=  CERTIFICATE파일지정
ssl-cipher= Cipher지정
ssl-key=  SSL키 파일의 지정

character-sets-dir=  charsets/디렉토리 지정
default-character-set=  character set이름 지정

database= 현재 데이터베이스 명
init-command= 서버에 접속후 자동적으로 실행하는 SQL문

disable-local-infile  LOCAL INFILE문 무효
local-infile  LOCAL INFILE 유효
interactive-timeout=  인터랙티브모드 타임아웃(초)
report-data-truncation  DataTruncation을 붙인다. 
report-found-rows  UPDATE실행할 때  mysql_info()가 변경한 레코드수가 아니라 발견한 레코드 수를 리턴하게 함.
multi-queries 클라이언트가  <;>로 연결된 복수의 SQL문을 한번에 보낼 수 있도록 함
multi-results  Result Set를 Multi로 클라이언트가 얻을 수 있도록 함
multi-statements multi-queries와 동일

enable-reads-from-master READ FROM MASTER를 유효로 한다. 
debug[=d:t:o,/tmp/client.trace] 디버그 모드 ./configure --with-debug로 유효화