레이블이 mysql기본구조인 게시물을 표시합니다. 모든 게시물 표시
레이블이 mysql기본구조인 게시물을 표시합니다. 모든 게시물 표시

2008년 12월 9일 화요일

MySQL기본구조 - frm파일

frm파일
테이블의 정의정보는 .frm(Format) 파일에 기록된다. 
.frm파일은 sql/table.cc의 open_binary_frm()에서 읽혀진다. 

.frm파일의 최초의 2바이트 [0xfe01]은 보통의 frm파일이라는 것을 나타낸다. 
.frm파일의 3바이트째는 frm파일의 버전을 나타낸다. 

 .frm파일의 내용
 shell$ hexdump -c data/mysql/user.frm | head 
 00000000  fe 01 09 09 03 00 00 10 01 00 00 30 00 00 e7 00  | .........0.... |

MySQL버전 3.22 ~ 4.0의 경우, 3바이트째는 [0x07], 버전 4.1~5.1에서 작성한 테이블은 [0x09]가 된다. 
또, frm버전은 SHOW TABLE STATUS의 Version에서도 확인가능하다. 

 SHOW TABLE SATUS실행결과
mysql> SHOW TABLE STATUS LIKE 'user'\G
***************************** 1. row ***************************
Name: user
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 4
Avg_row_length: 48
Data_length: 240
Max_data_length: 281474976710655
Index_length: 2048
Data_free: 48
Auto_increment: NULL
Create_time: 2008-12-09 22:02:16
Update_time: 2008-12-10 22:02:16
Check_time: NULL
Collation: utf8_bin
Checksum: NULL
Create_options:
Comment: Users and global privileges
1 row in set (0.00 sec)

.frm파일과 SHOW TABLE STATUS실행결과에서는 frm파일의 버전값이 다르다. 
그 차이는 헤더파일을 확인하면 알수 있다.  frm파일버전은 헤더파일에는 다음과 같이 기술되어있다. 

헤더파일(mysql_version.h, sql/unireg.h)
 #define DOT_FRM_VERSION 6
 #define FRM_VER DOT_FRM_VERSION
 #define FRM_VER_TRUE_VARCHAR (FRM_VER+4) /* 10 */

SHOW TABLE STATUS에서 보여지는 버전은 DOT_FRM_VERSION을 기본으로  가산된 값을 표시하고 있고 frm파일의 3바이트째는 [그 가산값 -1]이 된다.
VIEW테이블인 경우에는 .frm최초의 바이트는 다음과 같이 TYPE=VIEW부터 시작된다. 

.frm파일의 내용(view테이블의 경우)
shell$ hexdump -C data/mysql/v.frm | head
00000000 54 59 50 45 3d 56 49 45 57 0a 71 75 65 72 79 3d  | TYPE=VIEW.query=|






   

2008년 12월 4일 목요일

MySQL기본구조3

파일의 배치
MySQL서버등의 명령어를 인스톨한 곳을 「basedir」, MySQL데이터를 저장하는 곳을 「datadir」라고 부른다.  basedir, datadir 둘다 MySQL서버 옵션으로 존재하고 변경가능하다. 

MySQL서버가 사용하는 파일은 다음과 같다. 
  [basedir] -----
                      + share/mysql/charsets/
                      + share/mysql/english/
  [datadir] -----
                      +mysql/

[datadir]/mysql/은 권한테이블이 저장되어있는 중요한 디렉토리이다. 이 디렉토리 아래에 결정된 파일이 없으면 서버는 기동되지 않는다. 
[datadir]/ 이하는 작성된 디렉토리는 서버가 「데이터베이스」라고 인식한다. 
예를 들어 「test」라는 데이터베이스가 존재한다고 하면 즉 [datadir]/test/ 디렉토리가 존재하는 것을 말한다. 

예를 들어 「test」데이터베이스에 「a」라는 테이블을 작성하면 [datadir]/test/a.frm파일이 작성된다.  frm파일은  테이블정의가 기록되는 파일이다. 
데이터와 인덱스등은 MyISAM, InnoDB, NDB라는 스토리지엔진의 차이에 따라 작성하는 룰도 달라진다. 

사용되는 빈도가 높은 MyISAM의 경우에 [datadir]/test/a.MYD, [datadir]/test/a.MYI파일이 작성된다. 

「mysql」데이터베이스 아래의 권한테이블은 MyISAM이지 않으면 않된다. 


MySQL기본구조2

MySQL서버의 기본구조

MySQL서버의 기본구조는 다음과 같다.

1. 하나의 프로세스가  접속대기, 데이터관리, 쿼리 처리를 전부 실행한다. (NDB는 제외)
2. 하나의 프로세스가 전부 데이터베이스를 관리
3. 멀티 쓰레드를 사용해서 처리를 분담. 접속대기와 I/O처리등  자식 쓰레드를 작성해서 분담한다. 
4. 하나의 클라이언트에 하나의 자식 쓰레드를 생성. 클라이언트가 서버에 접속하면 그 클라이언트를 위해 한개의 쓰레드가 생성된다.
5. 데이터 보존형식이 여러개 존재한다.  이것은 테이블단위로 임의 선택,혼재 가능하다. 
 이것을  「스토리지엔진」,「테이블형」이라고 불린다.  스토리지엔진에는 MyISAM, InnoDB, NDB, MEMORY(HEAP)등이 있다. 
6.클라이언트인증은 패스워드 인증. 인증에는 사용자명, 호스트명(IP address),패스워드가 사용된다. 
7. 오퍼레이팅 시스템의 계정하고 MySQL서버관리 유저에는 관련성이 없다. 
  ( 즉. "OS 계정은 이것이니까 접속유저는 이렇게 하지 않으면 안돼!", "OS계정은 이것이니까 사용하는 데이터베이스는 이것이 된다." 라는 건 없다. )
8.버전4.1이상에서는 클라이언트하고 서버가 사용하는 캐릭터셋(문자코드)가 틀린경우에는 서버가 문자코드변환을 실행한다. 캐릭터셋은 mysqld프로세스 단위, 데이터베이스 단위, 테이블 단위, 필드단위로 지정가능하다.  혼용도 가능하다. 

통신형태
서버와 클라이언트간의 통신방법은 아래와 같다. 
  • TCP/IP
  • 소켓파일(Unix계열)
  • named pip(NT계열)
  • shared memory(NT계열)
Unix계열 운영체제에서는 특히 지정이 없는 한 localhost서버에 대한 접속은 소켓파일로 실행된다.  다만 예외는 존재한다. Connector/J는 localhost서버에 TCP/IP접속한다. 

윈도우즈에서는 통상 TCP/IP가 사용된다.  named pipe, shared memory를 사용하는 경우에는 클라이언트 명령에 지정할 필요가 있다. 

MySQL에는 「localhost」을 지정하는 경우와 「127.0.0.1」을 지정한 경우에 다른 취급을 하게된다.  클라이언트가 127.0.01의 서버에 접속하려한다면 TCP/IP를 사용한다. 

통신방법지시예
shell$ mysql -hlocalhost     <--소켓통신
shell$ mysql -h127.0.0.1     <--TCP/IP통신

shell$ mysql -hlocalhost -S/tmp/mysql.socket  <--소켓통신 파일지정
shell$ mysql -hlocalhost --protocal=pipe   <--named pipe로 접속
shell$ mysql -hlocalhost --pipe   <-- named pipe로 접속
shell$ mysql -hlocalhost --protocal=memory --shared-memory-base-name=MySQL <--shared memory로 접속