【IT168 专稿】MySQL 5.6引入了一个新功能,即在某些时间数据类型中增加了对微秒的支持。在MySQL 5.6.4中,TIME、TIMESTAMP和DATETIME能够支持秒的小数部分。在创建一个亚秒字段时,可以在括号里定义精度,如TIME(3)、DATETIME(6)等。
很明显,新功能会带来数据类型格式的变化。TIME、TIMESTAMP和DATETIME三种数据类型存在小数部分,或许有1-3字节的长度,最多可以精确到小数点后6位。
非小数部分也发生了变化。因此,DATETIME数据类型仅占用5个字节,而在之前的版本中需要占用8个字节。
下面新建一个示例表,看看新的时间类型是怎么工作的:
CREATETABLE`t` (
`id`int(11) AUTO_INCREMENT,
`t1` time(3),
`t2`timestamp(6),
`t3`datetime(1),
`t4`datetime,PRIMARYKEY(`id`)
) ENGINE=InnoDB
mysql>select*fromt;+----+--------------+----------------------------+-----------------------+---------------------+|id|t1|t2|t3|t4|+----+--------------+----------------------------+-----------------------+---------------------+|1|05:05:10.000|2013-07-0405:05:10.000000|2013-07-0405:05:10.0|2013-07-0405:05:10||2|05:14:24.414|2013-07-0405:14:24.125000|2013-07-0405:14:24.4|2013-07-0405:14:25||3|05:14:32.566|2013-07-0405:14:32.207031|2013-07-0405:14:32.3|2013-07-0405:14:32||4|05:14:34.344|2013-07-0405:14:34.507813|2013-07-0405:14:34.5|2013-07-0405:14:35||5|05:14:45.348|2013-07-0405:14:45.832031|2013-07-0405:14:45.1|2013-07-0405:14:45|+----+--------------+----------------------------+-----------------------+---------------------+
首先,生成一个表定义文件,如下:
./create_defs.pl--db test --table t > include/table_defs.h
然后,重编译工具,并分割包含表t记录的表空间:
./page_parser-f/var/lib/mysql/test/t.ibd
下一步,在InnoDB索引中得到记录:
$ ./constraints_parser-5f pages-1372929630/FIL_PAGE_INDEX/0-30/00000000-00000003.page2>/dev/null--Page id: 3, Format: COMPACT, Records list: Valid, Expected records: (5 5)0000000007DB A6000001A20110 t1"05:05:10.0" "2013-07-0405:05:10.0" "2013-07-0405:05:10.0" "2013-07-0405:05:10.0"
0000000007DE A8000001530110 t2"05:14:24.4140" "2013-07-0405:14:24.125000" "2013-07-0405:14:24.40" "2013-07-0405:14:25.0"
0000000007EC B2000001A40110 t3"05:14:32.5660" "2013-07-0405:14:32.207031" "2013-07-0405:14:32.30" "2013-07-0405:14:32.0"
0000000007ED B3000001A50110 t4"05:14:34.3440" "2013-07-0405:14:34.507813" "2013-07-0405:14:34.50" "2013-07-0405:14:35.0"
0000000007FB BD000001670110 t5"05:14:45.3480" "2013-07-0405:14:45.832031" "2013-07-0405:14:45.10" "2013-07-0405:14:45.0"--Page id: 3, Found records: 5, Lost records: NO, Leaf page: YES
使用LOAD DATA INFILE命令加载dump文件,然后重新传入上面示例的/dev/null中。
以上的过程非常简单,这里有两点需要注意:
·由于格式不同,该工具可以检测字段的格式是新的还是旧的;
·新格式中的TIME类型字段(不管是否包含小数部分)需要给contraints_parser一个提示,如This is -6 option。
在MySQL 5.6.4之前,TIME类型占用3个字节:DD×24×3600 + HH×3600 + MM×60 + SS。MySQL 5.6.4之后,类型仍然占用3个字节,但是格式发生了变化:
TIME的新格式
位描述值
1sign1= non-negative, 0= negative
1unusedreserved for future extensions
10hour0-838
6minute0-59
6second0-59
如果创建的字段没有小数部分,就不能定义字段值的格式,以下表为例:
CREATETABLE`t` (
`id`int(11) AUTO_INCREMENT,
`t1` time ,
`t2` time(3) ,PRIMARYKEY(`id`)
) ENGINE=InnoDBDEFAULTCHARSET=latin1
mysql>select*fromt;+----+----------+--------------+|id|t1|t2|+----+----------+--------------+|1|11:01:17|11:01:17.000||2|11:01:17|11:01:17.125||3|11:01:17|11:01:17.125|+----+----------+--------------+
如果没有小数部分,constraints_parser表现为旧格式。因此,如果从上面的表格中恢复记录,结果将是错误的:
$ ./constraints_parser-5f pages-1373023772/FIL_PAGE_INDEX/0-31/00000000-00000003.page--Page id: 3, Format: COMPACT, Records list: Valid, Expected records: (3 3)000000000807C5000001AC0110 t81"12:32:17" "11:01:17.0"000000000807C5000001AC011C t82"12:32:17" "11:01:17.1250"000000000807C5000001AC0128 t83"12:32:17" "11:01:17.1250"--Page id: 3, Found records: 3, Lost records: NO, Leaf page: YES
因此需要给constraints_parser一个提示-6,那么TIME的值将是正确的:
./constraints_parser-5f pages-1373023772/FIL_PAGE_INDEX/0-31/00000000-00000003.page-6--Page id: 3, Format: COMPACT, Records list: Valid, Expected records: (3 3)000000000807C5000001AC0110 t81"11:01:17.0" "11:01:17.0"000000000807C5000001AC011C t82"11:01:17.0" "11:01:17.1250"000000000807C5000001AC0128 t83"11:01:17.0" "11:01:17.1250"--Page id: 3, Found records: 3, Lost records: NO, Leaf page: YES