pageId: 0
========================
文件头
---------------------
16 magic
16 salt (如果不使用加密,这16字节就是magic,如果使用了加密,那么是随机生成的)
16 magic (如果使用了加密,那么这16字节是对magic加密后的值)
StaticHeader
---------------------
4 pageSize 默认是2048(2K)
1 WRITE_VERSION 常量3
1 READ_VERSION 常量3
1994 保留
(这4项的写入在org.h2.store.PageStore.writeStaticHeader())
(以上7项刚好是2k)
pageId: 1
========================
VariableHeader
---------------------
4 CRC
8 writeCount
4 logKey
4 logFirstTrunkPage
4 logFirstDataPage
2024 保留(补够2k)
pageId: 2 (是pageId 1的冗余,当1发生错误时会使用2)
========================
VariableHeader
---------------------
4 CRC
8 writeCount
4 logKey
4 logFirstTrunkPage
4 logFirstDataPage
2024 保留(补够2k)
page 1和2是可变的,随着数据的不断写入,前5个字段会不断的更新
pageId: 3
========================
PageFreeList
pageId: 4
========================
metaIndex
pageId: 5
========================
PageStreamTrunk
每个PageFreeList有自己的pageId,
PageFreeList也是一种page,
PageFreeList的pageId由此公式计算:
pageId = PAGE_ID_FREE_LIST_ROOT + i * freeListPagesPerList
= 3 + i * freeListPagesPerList
= 3 + i * ((pageSize - DATA_START) * 8)
= 3 + i * ((pageSize - DATA_START) * 8)
= 3 + i * ((pageSize - 3) * 8)
i>=0
假设一个page的size是128字节,那么减去头三个字节后就是剩下的字节数,再乘以8以表示bit位数
一个bit就能代表一个pageId,
那么一个PageFreeList能表示的page个数是:
(128 - 3) * 8 = 1000
假设PageFreeList自己的pageId是3,那么从它分配出来的pageId范围是
3+1 到 3+1000-1
下一个PageFreeList的pageId从1003开始
PageFreeList: pageId = 3
PageFreeList: pageId = 1003
PageFreeList: pageId = 2003
PageFreeList: pageId = 3003
PageFreeList: pageId = 4003
PageFreeList: pageId = 5003
PageFreeList: pageId = 6003
PageFreeList: pageId = 7003
PageFreeList: pageId = 8003
PageFreeList: pageId = 9003
PageFreeList: pageId = 10003
PageFreeList: pageId = 11003
PageFreeList: pageId = 12003
PageFreeList: pageId = 13003
PageFreeList: pageId = 14003
PageFreeList: pageId = 15003
PageFreeList: pageId = 16003
第一个PageFreeList的pageId是4,分配给metaIndex
java.lang.Error
at org.h2.store.PageFreeList.allocate(PageFreeList.java:138)
at org.h2.store.PageStore.allocatePage(PageStore.java:1125)
at org.h2.store.PageStore.update(PageStore.java:1064)
at org.h2.index.PageDataIndex.getPage(PageDataIndex.java:233)
at org.h2.index.PageDataIndex.<init>(PageDataIndex.java:84)
at org.h2.table.RegularTable.<init>(RegularTable.java:86)
at org.h2.store.PageStore.openMetaIndex(PageStore.java:1585)
at org.h2.store.PageStore.openNew(PageStore.java:308)
at org.h2.store.PageStore.open(PageStore.java:290)
at org.h2.engine.Database.getPageStore(Database.java:2129)
at org.h2.engine.Database.open(Database.java:582)
at org.h2.engine.Database.openDatabase(Database.java:221)
at org.h2.engine.Database.<init>(Database.java:216)
at org.h2.engine.Engine.openSession(Engine.java:59)
at org.h2.engine.Engine.openSession(Engine.java:167)
at org.h2.engine.Engine.createSessionAndValidate(Engine.java:145)
at org.h2.engine.Engine.createSession(Engine.java:127)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:136)
at java.lang.Thread.run(Thread.java:662)