1. 개요

MySQL Version : 5.1.x

MySQL Server / Application Client 환경(C/S 환경)

 

MySQL 서버와 서버에 접속하는 클라이언트가 분리되어 있는 환경에서, 클라이언트 측에서 대용량의 쿼리 파일을 입력하기 위해 흔히 사용하는 쿼리가 LOAD DATA 쿼리이다.

 

해당 쿼리를 사용하다 발생하는 에러 중에 The used command is not allowed with this MySQL Version 이란 에러가 있다.

 

이 에러를 발생시키는 방법으론 클라이언트 동작 중에 서버의 MySQL 을 동작 중지 후, 재실행 시키면 클라이언트 프로그램에서 다시 서버에 연결하였을 때 LOAD DATA 쿼리에서 에러를 내뱉는다.

 

본 에러는 클라이언트가 서버에 접속할 때 local-infile 옵션이 해제가 되어 발생하는 문제로 흔히 mysql -u root -p --local-infile=1 database 와 같은 형태로 해결이 가능하다.

 

2. C/C++ 기반 Application 조치

개요에서 제시한 해결 방법은 mysql.exe 를 사용하여 접속할 때나 사용 할 수 있는 방법이지, Application 접속에서는 다른 방법을 사용하여야 한다.

mysql에서는 connection 전에 설정 값을 추가 할 수 있는 mysql_option 이란 함수가 존재한다.

 

본 함수는 mysql_init()와 mysql_real_connect() 사이에 호출하여야 한다.

// mysql_options
int mysql_options(MYSQL *mysql, enum mysql_option option, const void *argument)
/* 인수 */
// mysql : MYSQL 핸들
// option : 사용자가 설정하고자 하는 옵션
// argument: 옵션 값(정수 일 경우, 포인터로 가리킨다)

/* 리턴 */
// 성공 : 0
// 실패 : Non-zero

 

 

infile-local 옵션을 주기 위해서는 다음과 같이 설정하면 된다

 

int nOption = 1;
mysql_init( &Mysql );
mysql_options(&Mysql, MYSQL_OPT_LOCAL_INFILE, &nOption);
mysql_real_connect(...)

 

 

이 외의 다른 옵션들에 대해서는 http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html 를 참조한다.

 

 

 

'Database > Mysql' 카테고리의 다른 글

processlist unauthenticated user 해결 방법  (0) 2013.07.03

 

 

 

 

 

 

 

 

1. 개요

Web Server와 Database가 분리되어 있는 환경에서 발생하는 문제점으로 이 문제를 해결하지 않고 그대로 놔 두게 되면 max_connections 값만큼 프로세스를 차지하게 되어 다음 연결부터는 too many connections 라는 문구를 보게 될 것이다.

 

2. 원인

mysql 서버의 경우 ip주소로 클라이언트 접속이 들어오게 되면 해당 ip에 대한 resolving을 수행하게 된다. 즉, 접속한 네가 누구냐? 라고 묻게되는 건데 문제는 이 질의에 대해 정상적으로 대답을 하게 되면 show processlist 상에 ip 부분이 이름으로 나오게 되지만 네트워크 환경이 느려 dns server의 대답이 늦어지게 된다면 그만큼 connection을 유지하고 있는 문제가 발생하게 된다.

 

3. 해결

mysql 구동시 --skip-name-resolve

 

혹은 my.cfg 파일에서

[mysqld]

...

skip-name-resolve

skip-host-cache

 

두 줄을 추가해 주고 데몬을 재시작 하면 된다.

'Database > Mysql' 카테고리의 다른 글

LOAD DATA local 이슈  (1) 2013.07.17

+ Recent posts