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=|