테이블의 정의정보는 .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=|