2008년 12월 21일 일요일

MySQL통신프로토콜

여기에서는 MySQL 통신프로토콜에 대해서 좀더 알아보기로 한다. 
MySQL에서는 접속할 때라든지 SQL문실행을 할 때의 갖은 처리에 있어서 클라이언트⇔서버 사이에 MySQL독자의 규칙에 따른 패킷송수신을 한다. 

전제조건에 대해서
패킷의 내부라는 것을  보통 MySQL을 사용함에 있어서  의식하는 것은 거의 없다. 
그러나 기술적으로 흥미가 있는 사람은 적지 않을 것이다. 
또  PHP나 PERL등 각종 프로그래밍언어 전용의 컨넥터(DB접속용 드라이버 프로그램)를 개량하고 싶다라고 할 때에는  프로토콜에 대한  이해가 최소한 필요하다. 
MySQL의 C API를 사용하지 않고 드라이버를 만들 때에는 클라이언트측에서 통신내용을 직접 핸들링할 필요가 있기 때문이다. 

여기에서는 다음과 같은 처리를 할 때 ,  어떤 패킷이 송수신되는 것인지 소개해보겠다. 

1. 로그인할 때 
2. 보통 갱신계열의 SELECT문을 실행할 때
3. 보통 검색계열의 SQL문을 실행할 때 
4. Prepared Satement을 실행할 때 
5. 서버사이드 커서를 이용할 때 

예로써 다음과 같은 테이블, 레코드를  test데이터베이스에 만들어 놓았다는 것을 전제로 설명해보겠다. 

    *전제가 되는 테이블과 레코드예 
  CREATE TABLE tb11 ( col1 INTEGER PRIMARY KEY, col2 VARCHAR(10), col3 DATETIME);
  INSERT INTO tb11 VALUES(1, 'abc', NOW() );
  INSERT INTO tb11 VALUES(2, 'def', NOW() );
  INSERT INTO tb11 VALUES(3, 'abc', NOW() );
  INSERT INTO tb11 VALUES(4, 'xyz', NOW() );