8.0.12-debug
xxd
Mysql
数据页存储, 可以参见 https://segmentfault.com/a/1190000037436803
2.系统表是什么? 跟自己创建的表有何不同?
mysql.schemata
,mysql.tables
, mysql.indexes
3.DD存储在哪些地方?
这里是针对Mysql 8的数据字典,
Mysql 8之前, 数据字典存储结构如下图,
从图中可以看出, DD信息存储在多个地方,
这种存储方式存在以下问题:
Mysql 8 对数据字典进行了重新设计, 并且使用InnoDB存储,
SET SESSION debug='+d,skip_dd_table_access_check'; SELECT name, schema_id, hidden, type FROM mysql.tables where schema_id=1 AND hidden='System';
可以看到DD中存储了很多系统表,
+------------------------------+-----------+--------+------------+ | name | schema_id | hidden | type | +------------------------------+-----------+--------+------------+ | catalogs | 1 | System | BASE TABLE | | character_sets | 1 | System | BASE TABLE | | collations | 1 | System | BASE TABLE | | columns | 1 | System | BASE TABLE | | dd_properties | 1 | System | BASE TABLE | | events | 1 | System | BASE TABLE | | index_stats | 1 | System | BASE TABLE | | indexes | 1 | System | BASE TABLE | | schemata | 1 | System | BASE TABLE | | tables | 1 | System | BASE TABLE | | tablespace_files | 1 | System | BASE TABLE | | tablespaces | 1 | System | BASE TABLE | +------------------------------+-----------+--------+------------+
2.通过 ibd2sdi
工具查看
ibd2sdi test.ibd
2.SDI如何组织?
3.SDI举例
{ "mysqld_version_id":80012, "dd_version":80012, "sdi_version":1, "dd_object_type":"Table", "dd_object":{ "name":"x", "columns":[ { "name":"id", "type":4, ... }, { "name":"DB_TRX_ID", "type":10, ... }, { "name":"DB_ROLL_PTR", "type":9, ... } ], ... "indexes":[ { "name":"PRIMARY", "hidden":false, ... } ], ... } }
上文中, 我们说过在每个表的独立表空间中, 存储了这个表相关的DD对象序列化后的信息。在这一节, 我们学习如何查看SDI信息。
CREATE TABLE `x` ( `id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci
2.查看这表的独立表空间文件, 通过 xxd x.ibd x.txt
查看这个表空间的数据页, 这里我们主要看第4页, 这1页存储了这个表相关的数据字典序列化信息,
000c000: 723e 3b3c 0000 0003 ffff ffff ffff ffff r>;<............ 000c010: 0000 0000 0128 06fc 45bd 0000 0000 0000 .....(..E....... 000c020: 0000 0000 0004 0002 04d2 8004 0000 0000 ................ 000c030: 0172 0001 0001 0002 0000 0000 0000 0000 .r.............. 000c040: 0000 ffff ffff ffff ffff 0000 0004 0000 ................ 000c050: 0002 00f2 0000 0004 0000 0002 0032 0100 .............2.. 000c060: 0201 0f69 6e66 696d 756d 0003 000b 0000 ...infimum...... 000c070: 7375 7072 656d 756d cb80 0000 10ff f100 supremum........ 000c080: 0000 0200 0000 0000 0000 0900 0000 0016 ................ ........ ........ 000fff0: 0000 0000 0070 0063 723e 3b3c 0128 06fc .....p.cr>;<.(..
对于一个表空间而言, 可能会有多个数据字典对象, 这些对象序列化后会以B+树的方式组织, 我们看一下具体的存储结构,
整体页存储结构:
我们再看下每个记录的具体存储:
记录说明:
存储结构如下图所示,
3.SDI记录遍历流程
注意: 游标以每个记录的内容开始, 例如最小记录的开始位置为00c063, 而不是00c05e。计算的下一个记录位置, 也是内容开始的位置。
4.如何查看SDI压缩后的数据
#!/usr/bin/env python # -*- coding=utf-8 -*- # import os import sys import json import time import datetime import hashlib import zlib reload(sys) sys.setdefaultencoding("utf-8") def help(): f = open("./test.data") l = f.readline() d = zlib.compress(l) f2 = open("./tmp.data", 'w+') f2.write(d) help()
0xffff fffe
是data dicitonary的表空间, 也就是mysql.ibd0xffff fffd
是临时表空间, 也就是ibtmp1.ibd0xffff fffc
, 0xffff fff0
]是为日志准备的0xffff ffef
, 0xffff ff70
]是undo log0x0000 0002
, 0xffff ff6f
]是可以正常使用的表空间sys/sys_config
表空间2.DD表空间存储
2.思考