Dbspace布局 -- informix体系架构笔记
目标 :
1、了解块(chunk)的布局;
2、了解保留页结构;
3、了解块可用列表页(chunk free-list page)的用途;
4、了解partition页的结构;
5、了解partition number(partnum);
6、了解物理日志和逻辑日志结构;
root dbspace空间
root dbspace是Informix数据库第一个且是重要的dbspace,它包含系统的第一个chunk(root chunk),跟其它dbspace一样,可为root dbspace增加附加chunk。由于root dbspace不能被删除,故应当显式地为其指定初始chunk。
最好不要把业务库放置于root dbspace上,而应该放置于特别指定的dbspace或者多个dbspace上,以使数据分布在多个磁盘上。
在初始化时,物理日志和最少3个逻辑日志均位于root dbspace上,在实际应用时,需要把它们移至独立的dbspace上以获取更好的性能。
root chunk布局
保留页(reserved pages)
root chunk前12页称为系统保留页,用于保存在检查点时更新的系统信息。从第三个保留页开始,页使用半冗余对方式,各半冗余对使用不同的结构,半冗余对中的页交替保存最新的信息。oninit轮换读取半冗余对中页的信息,以确保数据库宕机未能写入半冗余对中的页时,另一个页可以做为备份启动。
块可用列表页(chunk free-list page)
每个chunk的系统保留页后的1页为块可用列表页,它包含该chunk里的空闲页信息。
Tblspace tblspace
Tblspace tblspace是描述dbspace内所有tblspace位置和结构的页的集合。每个页都是相同的格式,包含以下主要组件:
区段的数量和位置;
字段的数量和描述;
一列索引键信息;
数据库名和表名。
Tblspace tblspace在root dbspace上的初始大小是250页。
Database Tblspace
Database tblspace 是一个包含系统中所有数据库的列表,包含以下组件:
数据库名(database name)
数据库所有者(database owner)
数据库创建时间
数据库在systables中的tblspace编号
数据库日志类型标识
查找database tblspace的物理位置,可以使用oncheck -pe 命令,在输出的结果中,sysmaster:sysdatabases 的位置即是。
非root chunk布局
Dbspace上的第一个chunk和其它chunk的区别仅仅是在dbspace建立时第一个chunk上含有50页的tblspace tblspace。Root dbspace的其它chunk布局与dbpsace中的其它chunk一致。
保留页(Reserved pages)
非root chunk上的前2页为保留页,但未用。
块可用列表页(chunk free-list page)
在所有的chunk上,在保留页之后的页是块可用列表页。
Tblspace tblspace
每个dbspace均包含tblspace tblspace(又称partition table)。Dbspace的第一个tblspace tblspace区段位于该dbpsace的第一个chunk上,tblspace tblspace亦跟其它表一样可以扩展。Tblspace tblspace的初始区段和扩展区段大小均是50页。
Root Reserved Page概述
页0(page 0)
页0包含Informix的版权信息,和系统初始化时间。
可通过oncheck -pr 输出中的PAGE_PZERO部分或者oncheck -pP 1 0 查看该页信息。
参数配置页(configuration page)
页1为参数配置页,包含上次服务器正常启动的系统配置文件信息。
该页包含配置文件中绝大部分的参数和配置值,但有些合法的参数并未列出。
可通过oncheck -pr输出中的PAGE_CONFIG部分或者oncheck -pP 1 1 查看该页信息。
检查点、日志页(checkpoint/logical log pages)
页2和页3为第一个半冗余对,为检查点、日志页。当前检查点、日志页包含最后检查点的位置和时间、各逻辑日志的位置和状态。
注意的是:冗余对中仅其中一个页是当前使用页,仅当前页损坏时才使用另一页。故当我们提到主chunk保留页、dbspace保留页或者检查点、日志保留页时,均是指冗余对中当前使用页。判断是否是当前页使用的是timestamp,使用oncheck -pr输出时,也是仅输出当前使用页。
可通过oncheck -pr 输出中的PAGE_1CKPT & PAGE_2CKPT部分或者oncheck -pP 1 2 和oncheck -pP 1 3查看该页(对)信息。
近似相同的半冗余对页(A Pari of Nearly-Identical Pages)
如下图所示,检查点、逻辑日志信息均存在于两个页中。这两个页的信息的区别在于:当前页包含最新的信息,另一个是以往的信息。(所有半冗余对均是这个差别)
检查点结构 与 检查点记录
区分检查点结构(位于 检查点、日志保留页)与检查记录这两者的区别很重要。
检查点记录是写到逻辑日志上的。检查点的最后一步即是将检查点记录写入到当前逻辑日志文件上。
在任何时刻,磁盘上的逻辑日志上可以存在多个检查点记录。但在这些记录中,只有最近的检查点对于快速恢复是重要的。在检查点、日志页上的检查点结构包含在系统关闭或者宕机后指引快速恢复至最重要最近的检查点记录的信息。
检查点结构
Validating PAGE_1CKPT & PAGE_2CKPT...
Using check point page PAGE_1CKPT.
Time stamp of checkpoint 0x383e2
Time of checkpoint 04/12/2011 11:34:13
Physical log begin address 1:263
Physical log size 25000 (p)
Physical log position at Ckpt 1152
Logical log unique identifier 5
Logical log position at Ckpt 0x107e018 (Page 4222, byte 24)
Checkpoint Interval 207
DBspace descriptor page 1:4
Chunk descriptor page 1:6
Mirror chunk descriptor page 1:8
检查点时间戳:16进制,是检查点的最后时刻。检查点、日志页上的时间戳仅比检查点结构上的检查点时间戳大一点点。
检查点时间:实际的检查点时间。使用的是localtime()。
物理日志开始地址:DEC:DEC(chunk number:page offset),物理日志开始的位置。
物理日志大小:DEC,物理日志的大小,单位是页。
检查点时物理日志位置:DEC,检查点时物理日志位置指的是最后的检查时,物理日志相对于物理日志地址开始地址的偏移。快速恢复(fast recovery)的第一步即是物理恢复(physical recovery)开始于此(即:检查点物理日志位置)。从该页开始,物理日志上页的页完成时间戳(page-ending timestamp)大于检查点时间戳的页复制回它们正确的地址上(即,它们物理恢复)。物理恢复结束是在物理日志上所有页的页完成时间戳小于检查点时间戳。
逻辑日志唯一识别符:DEC,包含最近检查点记录的逻辑日志唯一ID。
检查点时逻辑日志位置(LOGPOS):HEX,在逻辑日志唯一识别符标识的逻辑日志上的具体位置。包含最近的检查点记录。
Dbspace描述页:DEC:DEC(chunk number:page offset),最后检查点使用的当前dbspace保留页地址。
Chunk描述页:DEC:DEC(chunk number:page offset),最后检查点使用的当前chunk保留页地址。
镜像Chunk描述页:DEC:DEC(chunk number:page offset),最后检查点使用的当前镜像chunk保留页地址。
逻辑日志文件结构
逻辑日志文件结构在 检查点、日志保留页中是同一种结构。
Log file number 5
Unique identifier 5
Log contains last checkpoint: Page 4236, byte 24
Log file flags 0x13 Log file in use
& Current log file
& Log written to archive tape
Physical location 1:45263
Log size 5000 (p)
Number pages used 4237
Date/Time file filled -
Time stamp -
逻辑日志文件编号:DEC,逻辑日志文件在系统中的编号。
唯一识别符:DEC,逻辑日志唯一识别符。
包含最近检查点的逻辑日志:DEC,最近检查点记录的具体逻辑日志页号和字节偏移量
逻辑日志文件标识:HEX,使用逻辑或(OR),各单独标识的含义如下:
0x01 Log file in use
0x02 Current log file
0x04 Backed up
0x08 Newly added (archive required)
0x10 Log has been written to an archive tape
0x20 Log is a temporary log file
使用oncheck -pr输出中含有翻译结果。
逻辑日志物理地址:DEC:DEC(chunk number:page offset),该逻辑日志文件的开始物理地址。
逻辑日志大小:DEC,该逻辑日志文件的大小,单位是页。
逻辑日志已使用页数:DEC,该逻辑日志文件已经使用的页数。Informix恢复机制并不信任该值。
逻辑日志填充时间:DATE和TIME,基于localtime()。
时间戳标识:HEX,逻辑日志完成时的全局系统时间戳标识。
逻辑日志唯一识别符 和 逻辑文件编号
逻辑日志备份后得用逻辑日志文件,但使用新的识别符。
Dbspace页(dbspace pages)
页4和页5为第二个半冗余对,为dbspace页。当前dbspace页包含所有dbspace的状态、位置、数据和创建时间等。
Dbspace保留页结构
Validating PAGE_1DBSP & PAGE_2DBSP...
Using DBspace page PAGE_1DBSP.
DBspace number 1
DBspace name rootdbs
Flags 0x40001 No mirror chunks
Number of chunks 1
First chunk 1
Date/Time created 01/31/2011 06:03:52
Partition table page number 14
Pagesize (k) 2
Logical Log Unique Id 0
Logical Log Position 0x0
Oldest Logical Log Unique Id 5
Last Logical Log Unique Id 0
DBspace archive status
Archive Level 0
Real Time Archive Began 04/11/2011 21:27:38
Time Stamp Archive Began 172828
Logical Log Unique Id 5
Logical Log Position 0x942e4
Dbspace编号(dbspace number):DEC,dbspace编号,从1开始。
Dbspace名称(dbspace name):CHAR,dbspace名称。
标识(flags):HEX,dbspace标识。
标识,参考管理员参考大全里的onstat -d解释。
Flag Value Description
0x00000000 Mirror not allowed and dbspace is unmirrored
0x00000001 Mirror is allowed and dbspace is unmirrored
0x00000002 Mirror is allowed and dbspace is mirrored
0x00000004 Down
0x00000008 Newly mirrored
0x00000010 Blobspace
0x00000020 Blobspace on removable media
0x00000040 Blobspace is on optical media
0x00000080 Blobspace is dropped
0x00000100 Blobspace is the optical STAGEBLOB
0x00000200 Space is being recovered
0x00000400 Space is fully recovered
0x00000800 Logical log is being recovered
0x00001000 Table in dbspace is dropped
0x00002000 Temporary dbspace
0x00004000 Blobspace is being backed up
0x00008000 Sbspace
0x00010000 Physical or logical log changed
0x00020000 Dbspace or chunk tables have changed
0x00040000 Dbspace or blobspace contains large chunk
0x00080000 Chunk in this dbspace has been renamed
0x00100000 Temporary dbspace used by only by shared disk secondary server. It is one of the dbspaces listed in the SDS_TEMPDBS onconfig parameter on the SD server.
0x00200000 Temporary dbspace for the shared disk Secondary server. This is listed in the DBSPACETEMP onconfig variable on the shared disk secondary server.
0x00400000 The DBspace was externally backed up.
包含chunk数(number of chunks): DEC,该dbpsace包含的chunk总数。
首chunk(first chunk):DEC,该dbspace的第一个chunk编号;
创建时间:(date/time created):datetime,该dbspace的创建时间;
Tblspace位置(Partition table page number):DEC,该dbspace的tblspace在chunk上的位置。
页大小(page size):DEC,该dbspace的默认页大小。
主chunk页(primary chunk pages)
页6和页7为第三个半冗余对,为主chunk页。包含所有主chunk的信息(路径、大小、偏移和状态等)。
主chunk保留页结构
Validating PAGE_1PCHUNK & PAGE_2PCHUNK...
Using primary chunk page PAGE_1PCHUNK.
Chunk number 1
Flags 0x30040 Chunk is online
Chunk path /opt/informix/dbs/rootdbs
Chunk offset 0 (p)
Chunk size 100000 (p)
Number of free pages 40211
DBspace number 1
Chunk编号(chunk number):DEC,chunk编号,从1开始。
Flags标识(flags):HEX,chunk标识。(有些flags并未找到相应的文档,参考dbspace的flags理解)
0x0010 Mirror chunk
0x0020 Chunk is off-line
0x0040 Chunk is on-line
0x0080 Chunk is being recovered
0x0100 Chunk is newly mirrored
0x0200 Chunk is belongs to a blobspace
0x0400 Chunk is being dropped
0x0800 Chunk is part of an optical stageblob
0x1000 Chunk is inconsistent with the rest of the system
0x2000 Chunk has been chained
0x4000 Chunk belongs to an subspace
Chunk路径(chunk path):CHAR,chunk文件路径。
Chunk偏移量(chunk offset):DEC,chunk开始位置相对于文件/设备的开始偏移量,单位是页。
Chunk大小(chunk size):DEC,chunk的大小,单位是页。
空闲页总数(number of free pages):DEC,块空闲页总数,单位是页。
所属dbpsace编号:(dbspace number):DEC,chunk所属的dbspace编号。
镜像chunk页(mirror chunk pages)
页8和页9为第四个半冗余 对,为镜像chunk页。其结构和主chunk页结构相同,保存所有镜像chunk的信息。
结构与主chunk页相同,仅chunk大小为0,镜像chunk不存在空闲页。
备份页(archive pages )
页10和页11(0xa和0xb)为第五个半冗余对,为备份页。保存服务器最近的备份信息。
备份保留页结构
Validating PAGE_1ARCH & PAGE_2ARCH...
Using archive page PAGE_1ARCH.
Archive Level 0
Real Time Archive Began 04/11/2011 21:27:38
Time Stamp Archive Began 0x2a31c
Logical Log Unique Id 5
Logical Log Position 0x942e4
备份级别(archive level):DEC,备份级别,仅0,1,2
备份开始时间(real time archive began):datetime,备份时检查点开始时间点,localtime()
备份开始时间戳(time stamp archive began):HEX,备份时检查点开始时间点的时间戳;
逻辑日志唯一ID(logical log unique id):DEC,包含备份时检查点记录的逻辑日志;
逻辑日志位置(logical log position):HEX,包含备份时检查点记录的逻辑日志上的具体位置;
块可用列表页(chunk free-list page)
每个chunk都需要有个机制用于跟踪其上可用空间。在保留页后的一个页即块可用列表页(chunk free-list page),每个可用列表条目(结构)包含两个元素:开始页,大小。
当分配页面时,从可用列表上减去空间,调整偏移;
空间回收(删除表,alter操作等)时,从可用列表项中增加空间,调整偏移,或者增加条目;
附加的块可用列表页:
在第一个块可用列表页填充满后,需要附加的块可用列页。附加的块可用列表页以联接的方式与第一个块可用列表页联接,该联接仅是第一个块可用列表页与附加的块可用列表页之间的联接。
Tblspace tblspace(root dbspace上)
在每个dbspace的初始chunk中,第一个块可用列表后的一块连续页称为tblspace tblspace(partition table)。Tblspace tblspace是用于描述dbpace上表信息的位置的页。Tblspace tblspace上的一个页用于描述tblspace tblspace本身(root dbspace上的0x100001描述tblspace tblspace本身,即将自己也当作一个表)。Tblspace tblspace上的页称为partition页(partition page)。
Partition编号(partnum)
以sysmaster:systables表的partnum为例:
0x001 00002
前3位(1.5字节)为001为dbspace编号,后5位(2.5字节)00002为逻辑页编号(tblspace blspace中的页)
Partition页布局
每个partition页均包含5个slot,
Slot 1:partition结构
Slot1存储的partition结构包含的是表的常规信息。
一些通用tblspace信息做为表统计信息存储于partition结构中,也存储于做为优化器使用的系统编目(system catalog)中。事实上,在一些update statistics操作中,一部分表partition页信息复制到系统编目中,另一部信息则需要从tblspace页中获取。虽然系统编目中的信息在表增长的过程中变成过期,但在partition页上的信息是准确的。然而,优化器(optimizer)仅访问系统编目中的信息,而不访问partition页中的信息。
可通过oncheck -pt database_name:table_name 或者oncheck -pt partnumber的方式查看其结构:
TBLspace Report for demodb:informix.t1
Physical Address 2:527
Creation date 04/12/2011 20:54:28
TBLspace Flags 800901 Page Locking
TBLspace contains VARCHARS
TBLspace use 4 bit bit-maps
Maximum row size 73
Number of special columns 3
Number of keys 0
Number of extents 1
Current serial value 1
Current SERIAL8 value 1
Current BIGSERIAL value 1
Current REFID value 1
Pagesize (k) 2
First extent size 8
Next extent size 8
Number of pages allocated 8
Number of pages used 2
Number of data pages 1
Number of rows 1
Partition partnum 2097212
Partition lockid 2097212
物理地址(physical address):DEC:DEC,这个并不是partition编号,也不是与tblspace区段相关。不同于其它元素,物理地址并不是partition结构的一部分。它是物理位置(chunk编号 和 偏移)。
创建时间(creation date):datetime,表的创建时间,localtime();
Tblspace标识(tblspace flags):DEC,该标识与页标识,dbspace标识,chunk标识类似,使用 逻辑或(OR)计算(有些flag没有相关信息)。
0x0001 Page-level locking
0x0002 Row-level locking
0x0004 Tblspace is a Bundlespace (OnLine secure)
0x0008 Partition marked for DDR replication
0x0010 Partition dropped (shared memory only)
0x0020 System-defined temporary table
0x0040 User-defined temporary table
0x0080 Tblspace used for sorting
0x0100 Contains VARCHAR column(s)
0x0200 Contains BLOBspace BLOB column(s)
0x0400 Contains partition-resident BLOB column(s)
0x0800 Requires 4-bit bitmap
0x1000 Contains optical BLOB column(s)
0x2000 Partition required for system to function - do not drop
0x4000 Temp table being used for special function - do not update bitmaps
0x8000 Partition is being appended to
行最大大小(Maximum row size):DEC,行的最大大小,在包含varchar字段时,每个varchar字段需要增加1个字节。
特殊字段数(Number of special columns):DEC,blob和varchar的字段个数;
键(索引)数(Number of keys):DEC,键(索引)数;
区段总数(Number of extents):DEC,分离的区段总数;
当前序号(Current serial value):DEC,使用了serial字段时,当前的序号;
当前序号8(Current SERIAL8 value):DEC,使用了serial8字段时,当前的序号;
当前大序号(Current BIGSERIAL value):DEC,使用了bigserial字段时,当前的序号;
当前REFID号(Current REFID value):DEC,使用了refid字段时,当前的序号;
页大小(Pagesize (k)):DEC,表的页大小;
首区段大小(first extent size):DEC,表的第一个区段大小,首区段最小为4页,默认为8页。或是在建表的时候指定的大小。
下一区段大小(next extent size):DEC,当前表的下一区段大小;
已分配页总数(Number of pages allocated):DEC,所有区段页的总数;
已使用页总数(Number of pages used):DEC,已分配页中已使用页的总数;
数据页总数(Number of data pages):DEC,已使用页中的数据页总数;
行总数(Number of rows):DEC,表中行的总数;
Partition编号(Partition partnum):DEC,前已经讲述,此处以10进制显示;
Partition锁(Partition lockid):DEC,当锁定表时,其实锁定的是partition编号(在表和partition编号一一对应时)。当使用分片表时,partition锁代替所有分片上的partition编号。
Partition页位置
Informix基于表的partition编号确定表partition页的位置,partition编号存储于systables.partnum。读取partition页时,服务器检查从partition结构的前4字节(包含partition number)中判断是否正确读取。
以下为一个示例:
1.服务器接收到访问表demodb.t1请求;
2.为了获取表demodb.t1的partition页,服务器需要知道partition编号(partnum)。服务器从表systables的字段partnum中查找结果;
3.根据partnum,可以获知dbspace编号和逻辑页编号(partnum由这两个组成,Informix从tblspace tblspace中读取特定的partition页)
4.Informix处理器从partition页的slot 1(partition结构)的第一个元素(即上面提到的partnum),和第2步从systables表中查询到的partnum对比。
5.若两者相匹配,则本次操作是成功的。若是不匹配,informix往消息日志里写入断言失败的信息并返回错误号242和134给客户端。
Slot 2:包含数据库名,所有者,表名,NLS(有的话);
Slot 3:包含对每个特殊字段(blob,varchar等)的描述,每个特殊字段使用8字节;
Slot 4:(键、索引的partition页上才有记录)包含key descriptor,用于描述索引信息;
Slot 5:包含区段列表信息。每8字节描述一个区段,包含区段的开始地址和逻辑页开始数。
区段slot(slot 5)
Partition页的第5个slot是区段slot,每8字节为一条目,每一条目描述表中的一个区段。每一条目分开4字节的两部分:区段的开始逻辑页编号 和 该页的物理地址。
以上第二个区段为例:8 0 0 0 ea 8 0 0,
转换后可知,该区段开始的逻辑页编号为0x8,开始位置为0x8ea,该区段的大小可从下一逻辑页编号(0x20) 减去0x8得到 0x18(即10进制的24页)。 (注意:在不同版本的数据库上,该输出格式可能不一样,原理应是相近的,示例使用的是IDS11.50FC8,第4个区段的物理地址0x4e23转换成10进制为2 00003即该页相对于第一个区段所在的chunk偏移为2,即chunk编号增加2,开始页为编号为3的页,由于第一个区段所有的chunk编号为2,故第4个区段的物理地址为4:3)
准备就绪的条目(on deck or cap entry),在已经使用的区段条目后是准备就绪条目,准备接收下一区段的物理地址。该条目包含空的物理地址和将分配的区段开始逻辑页编号。
表也可能有slot 6,用于描述因alter导致的不同版本的区段信息,该slot不出现在当前的主partition页中,而是在单独的tblspace tblspace上(联接主partition页)。
若是表进行了更改(alter)操作,需要附加的slot用于保存版本信息。
原表更改(in-place alter)指的是alter table操作更改表结构不需要重建表,而是在tblspace tblspace上的附加页上记录表更改信息。附加页是partition页的扩展,且该页上仅有一个slot即slot 6。该逻辑页编号填充该表partition页上pg_next字段。
已经更改的表(altered table)上的一个记录要更新(update),如果当前页有足够的空间供当前页的所有记录转换至新版本,那么当前页所有的记录都将更新至新版本。如果当前页没有足够的空间供当前页的所有记录转换至新版本,那么仅该记录被更新且被移到其它有相同版本的页中。版本号记录在数据页(data page)上的pg_next字段上。
虽然表可以更改很多次,数据库使用versioning来描述区段中的那些页包含更新页。
每个表仅可以进行255次的原表更改,其tblspace上至多含 有255个版本的页。
Slot 6包含以下信息(存在版本差异):
2字节:版本号;
2字节:当前版本标识;
4字节:当前版本更改开始的逻辑页;
4字节:保存新的描述(descriptor)信息的tblspace tblspace逻辑页编号
4字节:更改前的行大小
4字节:更改后的行大小
4字节:未知
物理日志
在灾难情况下使用
物理日志在顺畅运行的环境里并不体现出重要的用途,它的重要性体现在备份机制和快速恢复机制,这两个机制能保障在电源失败和磁盘失效时能非常快捷的恢复。
物理日志大小影响检查点间隔
过小的物理日志大小设置可能造成检查点过于频繁。
物理日志页结构(physical log page)
物理日志页的结构看起来跟数据页或者索引页很相似,仅以下不同。
页标识含0x800(pg_flags)
确定页是物理日志页的最确切方法是检查页的页标识。若是页标识包含0x800,那么这个页就是物理日志页。
页地址并非物理位置
比较页地址(page address)与物理地址(physical location),若是两者不区配,则表明该页为物理日志页或者是未初始化的页。
逻辑日志
逻辑日志由一组连续的日志页组成,每个页偏移等于逻辑日志页编号(从0开始)。
请记住日志文件(log file)是chunk上的一个区段(extent),是可以复用的。日志文件只是作为逻辑日志(logical log)的临时存放区域,逻辑日志是唯一的,备份到磁带上的是逻辑日志而不是日志文件(这里说的备份指的是逻辑日志备份)。
逻辑日志可以包含日志文件大小内任意页数。
当逻辑日志缓冲区刷新时,逻辑日志缓冲区信息顺序写入到逻辑日志中。
逻辑日志页结构(logical log page)
逻辑日志页没有slot表(各日志记录各自记录日志长度)。逻辑日志记录非常灵活,可以从一个页跨越到另一个页中(一个日志记录必须在一个日志文件中,不可跨日志文件)。逻辑日志页头的特别之处:
Pg_nslots:未用,因为逻辑日志页上没有真正意义上的slot。
Pg_frcnt:固定为0,即便该页未必完全填充(pg_frptr是准确的)。
逻辑日志缓冲区填充逻辑日志页是完全填充(至页的最后一个字节),故经常有跨逻辑日志页的日志记录。因此绝大多数页是完全充满的,特别是使用缓冲型日志时。
然而,在使用非缓冲型日志时,检查点或是提交确认的日志记录时,在缓冲区的最后一个页并未完全填充。刷新回日志文件时,该页设置结束,不允许其它记录追加。Pg_frcnt设置为0的原因:在逻辑日志缓冲区刷回日志文件前,刷新处理器更新缓冲区最后一页上的pg_frcnt为0,使该页看起来是满的,以阻止其它处理器写入该页。
Pg_next:在逻辑页中,该元素包含逻辑日志维一ID;
Pg_prev:在逻辑页中,该元素包含页偏移(与逻辑页编号类似);该页偏移仅在日志中。
逻辑日志位置(logical log position(logpos))
如图所示,该记录开始位置为0x80字节,位于逻辑日志页0x600中,故其logpos为0x00600080,其前5位为该逻辑日志页的偏移,后3位为记录在该页的起点。
需要注意的是,logpos并不指明具体的日志(uniqid或是日志文件编号)。Logpos仅在特定的逻辑日志中唯一。
练习:
在online.log中,每次检查点有类似于以下信息,如何在逻辑日志中找到它?
23:03:32 Checkpoint Completed: duration was 0 seconds.
23:03:32 Wed Apr 13 - loguniq 6, logpos 0x610018, timestamp: 0x40180 Interval: 363
答:从系统保留页中的检查点、日志页上,可以找到loguniq 6的物理地址,然后从0x610页中,定位0x18(24)字节偏移,即是该次检查点记录。
实际上也可以通过onstat -l的输出获取对应信息。通过onlog来查看逻辑日志记录,如练习中所示,可通过onlog -l -n 6的输出,然后定位到0x610018
addr len type xid id link
610018 44 CKPOINT 1 6 0 0
2c000000 06004200 10000000 00000000 ,.....B. ........
00000000 00000000 01000000 00000000 ........ ........
7b010400 00000000 00000000 {....... ....