DBMS_PAGE 包

13.1 使用前提

DBMS_PAGE 包的使用依赖 dbms_binary 包。所以,在创建 DBMS_PAGE 包之前,请先成功创建 dbms_binary 包。

13.2 索引页

dbms_PAGE 系统包的索引页信息。

13.2.1 数据类型

dbms_page 包的索引页部分所用到的变量和记录类型,如下统一说明:

包内变量和记录类型 解释
dph_t 类型 用于承载页类型及数据页头的所有信息包括:记录数、用户记录数、堆栈底部偏移、堆栈顶部偏移、分支号、碎片空间起始偏移、最小记录偏移、最大记录偏移、外部记录信息、已用空间
dpih_t 类型 用于承载索引数据头的所有信息,包括:在 B 树中的层次、索引号、B 树中叶节点所在的段的组号、B 树中叶节点所在的段文件号、B 树中叶节点所在的段的页号、B 树中叶节点所在的段的偏移、B 树中内节点所在段的组号、B 树中内节点所在段的文件号、B 树中内节点所在段的页号、B 树中内节点所在段的偏移
dpich_t 类型 用于承载索引控制头的所有信息,包括:下一个 rowid、索引的已用空间、B 树中所有记录数、目前 identity 值
dps_t 类型 用于承载页空间使用状况的信息,包括:堆底偏移、堆顶偏移、已用字节数、空闲字节数、使用率、堆顶剩余空间、碎片空间大小、碎片空间占总剩余比率、最大可插入记录长度
rec_t 类型 用于承载记录相关信息,包括:记录序号、记录偏移、记录长度、是否被删除、rowid 或聚簇索引 id、回滚地址-文件号、回滚地址-页号、回滚地址-偏移
free_list_t 类型 用于承载单个碎片空间的相关信息,包括:碎片偏移、碎片长度
ctl_bit_arr_t 类型 用于承载控制位的 tinyint 类型的数组
DPH_ARR_T 类型 dph_t 类型的数组
DPIH_ARR_T 类型 DPIH_T 类型的数组
DPICH_ARR_T 类型 DPICH_T 类型的数组
DPS_ARR_T 类型 DPS_T 类型的数组
REC_ARR_T 类型 REC_T 类型的数组
FREE_LIST_ARR_T 类型 FREE_LIST_T 类型的数组

13.2.2 相关方法

DBMS_PAGE 包中的索引页部分所包含的过程和函数详细介绍如下:

  1. data_page_head_load/ data_page_head_get

获取数据页头信息。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_HEAD_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	INFO		OUT		DPH_T 
);

语法如下:

FUNCTION DATA_PAGE_HEAD_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT
)RETURN DPH_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

页号。

  1. data_page_ind_head_load/ data_page_ind_head_get

获取索引数据页头信息。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_IND_HEAD_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	INFO		OUT		DPIH_T
);

语法如下:

FUNCTION DATA_PAGE_IND_HEAD_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT
)RETURN DPIH_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  1. data_page_ind_ctl_head_load/ data_page_ind_ctl_head_get

获取索引控制页头信息。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_IND_CTL_HEAD_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	INFO		OUT		DPICH_T
);

语法如下:

FUNCTION DATA_PAGE_IND_CTL_HEAD_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT
)RETURN DPICH_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  1. DATA_PAGE_SPACE_INFO_LOAD/ DATA_PAGE_SPACE_INFO_GET

获取页空间使用状况信息。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_SPACE_INFO_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	INFO		OUT		DPS_T
);

语法如下:

FUNCTION DATA_PAGE_SPACE_INFO_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT
)RETURN DPS_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  1. data_page_rec_by_slot_no_load/ data_page_rec_by_slot_no_get

获取指定序号的记录。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_REC_BY_SLOT_NO_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	SLOT_NO		IN		SMALLINT, 
	REC			OUT		REC_T
);

语法如下:

FUNCTION DATA_PAGE_REC_BY_SLOT_NO_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	SLOT_NO		IN		SMALLINT
) RETURN REC_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  • slot_no

    记录序号。

  1. data_page_ctl_bit_by_slot_no_load/data_page_ctl_bit_by_slot_no_get

获取指定序号的记录的控制位。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_CTL_BIT_BY_SLOT_NO_LOAD(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	SLOT_NO		IN		SMALLINT, 
	COL_NUM		IN		SMALLINT, 
	CTL_BIT		OUT		CTL_BIT_ARR_T
);

语法如下:

FUNCTION DATA_PAGE_CTL_BIT_BY_SLOT_NO_GET(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	SLOT_NO		IN		SMALLINT, 
	COL_NUM		IN		SMALLINT
) RETURN CTL_BIT_ARR_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  • slot_no

    记录序号。

  • col_num

    要取得控制位的个数。

  1. data_page_load_free_list/ data_page_get_free_list

获取所有碎片空间大小及偏移。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_LOAD_FREE_LIST(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	NO			IN		SMALLINT, 
	FREE_LIST	OUT		FREE_LIST_ARR_T 
);

语法如下:

FUNCTION DATA_PAGE_GET_FREE_LIST(
	TS_ID		IN		SMALLINT, 
	FILE_ID		IN		SMALLINT, 
	PAGE_NO		IN		INT, 
	NO			IN		SMALLINT
)RETURN FREE_LIST_ARR_T;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  • no

    要取到第几个空闲页。

  1. data_page_tid_load/ data_page_tid_get

输入表空间号、文件号及页号,获得表 id。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_TID_LOAD(
	TS_ID		IN		SMALLINT,
	FILE_ID		IN		SMALLINT,
	PAGE_NO		IN		INT,
	TID			OUT		BIGINT
);

语法如下:

FUNCTION DATA_PAGE_TID_GET(
	TS_ID		IN		SMALLINT,
	FILE_ID		IN		SMALLINT,
	PAGE_NO		IN		INT
)RETURN INT;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

  1. data_page_tname_load/ data_page_tname_get

输入表空间号、文件号及页号,输出表名。过程和函数功能相同。

语法如下:

PROCEDURE DATA_PAGE_TNAME_LOAD(
	TS_ID		IN		SMALLINT,
	FILE_ID		IN		SMALLINT,
	PAGE_NO		IN		INT,
	TNAME		OUT		VARCHAR(35)
);

语法如下:

FUNCTION DATA_PAGE_TNAME_GET(
	TS_ID		IN		SMALLINT,
	FILE_ID		IN		SMALLINT,
	PAGE_NO		IN		INT
)RETURN VARCHAR;

参数详解

  • ts_id

    表空间 id。

  • file_id

    文件号。

  • page_no

    页号。

13.2.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'dbms_binary');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_PAGE');

例 1 获取数据页头信息的,利用包内类型 DPH_ARR_T 以及过程 DATA_PAGE_HEAD_LOAD,这里假设 0 号表空间的 0 号文件 32 号页是一个数据页:

DECLARE
	INFO DBMS_PAGE.DPH_ARR_T;
BEGIN
	INFO = NEW DBMS_PAGE.DPH_T[1];
	DBMS_PAGE.DATA_PAGE_HEAD_LOAD(0,0,32,INFO[1]);
	SELECT * FROM ARRAY INFO;
END;
/

输出结果(具体数值取决于实际状况):

N_SLOT N_REC HEAP_LOW HEAP_HIGH BRANCH_NO FREE_LIST_OFF REC_MIN_OFF REC_MAX_OFF EXTERNAL USED_BYTE
4 2 155 0 0 98 82 90 <NULL> 152

例 2 获取页内所有用户记录的信息,利用包内类型 DPH_T、REC_T、REC_ARR_T 以及过程 DATA_PAGE_HEAD_LOAD、DATA_PAGE_REC_BY_SLOT_NO_LOAD,这里假设 4 号表空间的 0 号文件 32 号页是一个数据页,并存储了两行记录:

DECLARE
	HEAD DBMS_PAGE.DPH_T;
	INFO dbms_page.REC_ARR_T;
BEGIN
	DBMS_PAGE.DATA_PAGE_HEAD_LOAD(4,0,32,HEAD);
	INFO = NEW dbms_page.REC_T[HEAD.N_REC];
	FOR I IN 1..HEAD.N_REC LOOP
	DBMS_PAGE.DATA_PAGE_REC_BY_SLOT_NO_LOAD(4,0,32,I,INFO[I]);
	END LOOP;
	SELECT * FROM ARRAY INFO;
END;
/

输出结果如下(具体数值取决于实际状况):

slot_no OFFSET len is_del trx_id clu_rowid roll_addr_file roll_addr_page roll_addr_off
1 117 19 0 2705 33559296 0 2 0
2 136 19 0 2706 50336512 0 3 0

13.3 INODE 页

Inode 页用于存储 inode 控制块信息,inode 控制块用于存储段的属性信息,每个 inode 控制块对应一个段。Inode 页结构包括通用页头、inode 页链接、以及 inode 控制块信息。inode 控制块结构包括段号、半满簇中使用页的个数、空闲簇链表、半满簇链表、满簇链表。

13.3.1 数据类型

dbms_page 包的 INODE 页部分所用到的变量和记录类型,如下统一说明:

包内变量和记录类型 解释
inode_ph_t 类型 用于承载 inode 页头的所有信息,包括:所属表空间 id、当前页文件 id、当前页页号、前一个页的文件 id、前一个页页号、后一个页文件 id、后一个页页号、页类型、校验和、lsn
inode_page_link_t 类型 用于承载 inode 页的链接信息,包括:前一个 inode 页的文件 id、页号与偏移量,后一个 inode 页的文件 id、页号与偏移量
inode_t 类型 用于承载 inode 项的所有信息,包括:段 id、半满簇中使用页数、空闲簇个数、第一个空闲簇描述项的文件 id、第一个空闲簇描述项的页号、到下一个空闲簇描述项的偏移量、最后一个空闲簇描述项的文件 id、最后一个空闲簇描述项的页号、到下一个空闲簇描述项的偏移量、半满簇个数、第一个半满簇描述项的文件 id、第一个半满簇描述项的页号、到下一个半满簇描述项的偏移量、最后一个半满簇描述项的文件 id、最后一个半满簇描述项的页号、到下一个半满簇描述项的偏移量、满簇个数、第一个满簇描述项的文件 id、第一个满簇描述项的页号、到下一个满簇描述项的偏移量、最后一个满簇描述项的文件 id、最后一个满簇描述项的页号、到下一个满簇描述项的偏移量
INODE_PH_ARR_T 类型 INODE_PH_T 类型的数组
INODE_ARR_T 类型 INODE_T 类型的数组

13.3.2 相关方法

DBMS_PAGE 包中的 INODE 页部分所包含的过程和函数详细介绍如下:

  1. dbms_page. ipage_head_load/ ipage_head_get

获得 inode 页中页头信息。过程和函数功能相同。

语法如下:

PROCEDURE IPAGE_HEAD_LOAD(
	PAGE	IN		VARBINARY, 
	INFO	OUT		INODE_PH_T
);
FUNCTION IPAGE_HEAD_GET(
	PAGE	IN		VARBINARY
)RETURN INODE_PH_T;

参数详解

  • page

    页内容。

  1. dbms_page. ipage_nth_inode_load/ ipage_nth_inode_get

获得 inode 页中第 n 个 inode 项的信息。过程和函数功能相同。

语法如下:

PROCEDURE IPAGE_NTH_INODE_LOAD(
	PAGE	IN		VARBINARY,
	N		IN		SMALLINT,
	INFO	OUT		INODE_T
);
FUNCTION IPAGE_NTH_INODE_GET(
	PAGE	IN		VARBINARY,
	N		IN		SMALLINT
)RETURN INODE_T;

参数详解

  • page

    页内容。

  • n

    第几个 inode 项。

  1. dbms_page. ipage_all_inodes_load/ ipage_all_inodes_get

获得 inode 页中所有 inode 项的信息。过程和函数功能相同。

语法如下:

PROCEDURE IPAGE_ALL_INODES_LOAD(
	PAGE	IN		VARBINARY,
	INFO	OUT		INODE_ARR_T
);
FUNCTION IPAGE_ALL_INODES_GET(
	PAGE	IN		VARBINARY
)RETURN INODE_ARR_T;

参数详解

  • page

    页内容。

13.3.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包。请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'dbms_binary');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_PAGE');

例 1 获取某 inode 页的页头信息

DECLARE
	PAGE8 VARBINARY;
	info dbms_page.INODE_PH_ARR_T;
BEGIN
	INFO = NEW dbms_page.INODE_PH_T[1];
	DBMS_PAGE.PAGE_LOAD(0,0,8,PAGE8);
	dbms_page.ipage_HEAD_LOAD(PAGE8,info[1]);
	select * from array info;
END;
/

结果如下 (具体数值取决于实际状况):

TSID SELF_FILE_ID SELF_PAGE_NO PREV_FILE_ID PREV_PAGE_NO NEXT_FILE_ID
	NEXT_PAGE_NO PAGE_TYPE CHECKSUM LSN
0 0 8 -1 -1 0 9 17 0 15270

例 2 获取某 inode 项的信息

DECLARE
	PAGE8 VARBINARY;
	info dbms_page.INODE_arr_T;
BEGIN
	INFO = NEW dbms_page.INODE_T[10];
	DBMS_PAGE.PAGE_LOAD(0,0,8,PAGE8);
	dbms_page.IPAGE_NTH_INODE_LOAD(PAGE8,1,info[1]);
	select * from array info;
END;
/

执行结果,显示 info 中的内容是一个 INODE_T 记录类型的查询结果,INODE_T 中的信息是获取的某 inode 页中的某个 inode 项的信息(具体数值取决于实际状况)

例 3 获取某 inode 页中所有 inode 项信息

DECLARE
	PAGE8 VARBINARY;
	INFO DBMS_PAGE.INODE_ARR_T;
BEGIN
	DBMS_PAGE.PAGE_LOAD(0,0,8,PAGE8);
	DBMS_PAGE.IPAGE_ALL_INODES_LOAD(PAGE8,INFO);
	SELECT * FROM ARRAY INFO;
END;
/

执行结果,显示 info 中的内容也就是一个 INODE_arr_T 数组的查询结果,INODE_arr_T 数组中的信息是获取的某 inode 页中所有 inode 项的信息(具体数值取决于实际状况)

13.4 描述页

描述页是用来显示簇信息的页。主要包括簇的上一个链接簇描述项的文件 ID、上一个链接簇描述项的页号、上一个链接簇描述项的偏移、下一个链接簇描述项的文件 ID、下一个链接簇描述项的页号、下一个簇链接描述项的偏移、簇使用情况、本簇所属段 ID 和页使用情况等信息。

13.4.1 数据类型

dbms_page 包的描述页部分所用到的变量和记录类型,如下统一说明:

包内变量和记录类型 解释
desc_item_t 类型 用于记录描述项信息。包括:
上一个链接簇描述项的文件 ID、
上一个链接簇描述项的页号、
上一个链接簇描述项的偏移、
下一个链接簇描述项的文件 ID、
下一个链接簇描述项的页号、
下一个簇链接描述项的偏移、
簇使用情况、
本簇所属段 ID、
页使用情况
DESC_ITEM_ARR_T 类型 DESC_ITEM_T 类型数组

13.4.2 相关方法

DBMS_PAGE 包中的描述页部分所包含的过程和函数详细介绍如下:

  1. spage_nth_desc_load/spage_nth_desc_get

获得描述页的第 nth 个描述项信息。

语法如下:

PROCEDURE SPAGE_NTH_DESC_LOAD(
	PAGE		IN		VARBINARY, 
	NTH			IN		SMALLINT, 
	DESC_ITEM	OUT		DESC_ITEM_T
);
FUNCTION SPAGE_NTH_DESC_GET(
	PAGE				VARBINARY, 
	NTH					SMALLINT
)RETURN DESC_ITEM_T;

参数详解

  • page

    调用接口获取,要判定是否是描述页。

  • nth

    用户输入的第 nth 个描述项。

  1. spage_all_desc_load/spage_all_desc_get

    获得描述页的所有描述项信息,一次最多可以查看 256 个描述页信息。

语法如下:

PROCEDURE SPAGE_ALL_DESC_LOAD(
	PAGE		IN		VARBINARY, 
	DESC_ITEM	OUT		DESC_ITEM_ARR_T
); 
FUNCTION  XDESC_ALL_DESC_GET(
	PAGE				VARBINARY
)RETURN DESC_ITEM_ARR_T;

参数详解

  • page

    调用接口获取,要判定是否是描述页。

13.4.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'dbms_binary');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_PAGE');

例 1 获取 0 号描述页的第 0 个描述项信息

DECLARE
	PAGE VARBINARY;
	DESC_ITEM DBMS_PAGE.DESC_ITEM_T;
	DESC_ITEM_ARR DBMS_PAGE.DESC_ITEM_ARR_T;
BEGIN
	DBMS_PAGE.PAGE_LOAD(0, 0, 0, PAGE); //0,0,0分别表示表空间号、文件号、页号
	DESC_ITEM_ARR = NEW DBMS_PAGE.DESC_ITEM_T[1];
	DBMS_PAGE.SPAGE_NTH_DESC_LOAD(PAGE,0,DESC_ITEM_ARR[1]);
  SELECT * FROM ARRAY DESC_ITEM_ARR;
END;
/

将打印如下信息(具体数值取决于实际状况):

PREV_FILE_ID PREV_PAGE_NO PREV_OFFSET NEXT_FILE_ID NEXT_PAGE_NO NEXT_OFFSET STATE SEGID DES_BITMAP
-1 -1 -1 0 2048 148 1202 0 0000000000000111

例 2 获取 0 号描述页的第 0 到第 5 个描述项

DECLARE
	PAGE VARBINARY;
	I SMALLINT;
	DESC_ITEM_ARR DBMS_PAGE.DESC_ITEM_ARR_T;
BEGIN
	DBMS_PAGE.PAGE_LOAD(0, 0, 0, PAGE);
	DESC_ITEM_ARR = NEW DBMS_PAGE.DESC_ITEM_T[6];
	FOR I IN 1..6 LOOP
		DBMS_PAGE.SPAGE_NTH_DESC_LOAD(PAGE,I-1,DESC_ITEM_ARR[I]);
	END LOOP;
	SELECT * FROM ARRAY DESC_ITEM_ARR;
END;
/

将打印如下信息(具体数值取决于实际状况):

PREV_FILE_ID PREV_PAGE_NO PREV_OFFSET NEXT_FILE_ID NEXT_PAGE_NO NEXT_OFFSET STATE SEGID DES_BITMAP
-1 -1 -1 0 2048 148 1202 0 0000000000000111
-1 -1 -1 -1 -1 -1 1202 1 0011111111111111
-1 -1 -1 -1 -1 -1 1202 3 0111111111111111
0 2048 340 -1 -1 -1 1202 4 0010100000000001
-1 -1 -1 -1 -1 -1 1202 5 0011111111111111
-1 -1 -1 -1 -1 -1 1202 7 0011111111111111

例 3 获取 0 号页所有的描述项

DECLARE
	PAGE VARBINARY;
	DESC_ITEM_ARR DBMS_PAGE.DESC_ITEM_ARR_T;
BEGIN
	DBMS_PAGE.PAGE_LOAD(0, 0, 0, PAGE);
	DBMS_PAGE.SPAGE_ALL_DESC_LOAD(PAGE, DESC_ITEM_ARR);
	SELECT * FROM ARRAY DESC_ITEM_ARR;
END;
/

将打印 0 号页所有的描述项的信息,记录格式同上图。

13.5 控制页

让用户更直观的查看数据库表空间的控制页的信息。

13.5.1 数据类型

dbms_page 包的控制页部分所用到的变量和记录类型,如下统一说明:

包内变量和记录类型 解释
PH_T 类型 页头记录类型,包括:表空间 ID、本文件 ID、本文件的 PAGE NO、前一个文件的 FILE ID、前一个文件的 PAGE NO、下一个文件的 FILE ID、下一个文件的 PAGE NO、文件类型、CHECKSUM 检查点、LSN 该页实际刷盘的位置信息。当表空间 ID,文件 ID 均为 0,那 PAGE NO 从 0-6 均是控制页,分别为 0 号控制页,1 号 ID 页,2 号 SEQ 页,3 号提交事务的 last_lcn 页,4 号系统信息页,5 号复制关系已处理的 LCN 页,6 号保留页。PAGE NO 是从 0 开始,若 PAGE NO 为-1 代表该页为空。若 FILE ID 为-1 则代表该项所代表的 FILE 为空
P0_TSH_T 类型 0 号控制页的表空间头记录类型,包括:LSN、空闲的 INODE 页的数量、INODE FREE 链表中第一个文件号、INODE FREE 链表中第一个页号、INODE FREE 链表中第一个页偏移、INODE FREE 链表中最后一个文件号、INODE FREE 链表中最后一个页号、INODE FREE 链表中最后一个页偏移、全满的 INODE 页的数量、INODE FULL 链表中第一个文件号、INODE FULL 链表中第一个页号、INODE FULL 链表中第一个页偏移、INODE FULL 链表中最后一个文件号、INODE FULL 链表中最后一个页号、INODE FULL 链表中最后一个页偏移、空闲簇的数量、空闲簇链表中第一个文件号、空闲簇链表中第一个页号、空闲簇链表中第一个页偏移、空闲簇链表中最后一个文件号、空闲簇链表中最后一个页号、空闲簇链表中最后一个页偏移、半满簇的数量、半满簇链表中第一个页 ID、半满簇链表中第一个 PAGE NO、半满簇链表中第一个页的偏移、半满簇链表中最后一个页 ID、半满簇链表中最后一个 PAGE NO、半满簇链表中最后一个页的偏移、SYSINDEX 的根页的位置、SYSOBJ 的根页、页大小、一个簇里含有页个数、LOG 日志文件大小
P0_FH_T 类型 0 号控制页的文件头记录类型,包括:一个文件中页的数量、空闲页的页号
P1_INFO_T 类型 1 号控制页的描述项记录类型,包括:下一个段 ID、下一个表 ID、下一个视图 ID、下一个用户 ID、下一个索引 ID、下一个存储过程 ID、下一个函数 ID、下一个角色 ID、下一个文件 ID、下一个触发器 ID、下一个约束 ID、下一个模式 ID、下一个序列 ID、下一个 POLICY ID、下一个 DBLINK ID、下一个事务 ID、下一个跟踪 ID、下一个事件 ID、下一个 OPERATOR ID、下一个警告 ID、下一个作业 ID、下一个作业步骤 ID、下一个作业调度 ID、下一个异步复制 ID、下一个包 ID、下一个作业步骤 ID、下一个密码引擎 ID、下一个 OBJECTTYPE ID、下一个 SYNONY ID、下一个 BLOB ID、下一个 MAL ID、下一个 TAG ID、下一个 GROUP ID、下一个 INST ID、下一个 REP ID、下一个未被使用的组 ID、下一个 NEW TRX ID
SEQ_ITEM_T 类型 2 号控制页的 SEQ 记录类型,包括:该页的使用情况、SEQ 的值
CPAGE_SEQ_HEAD_T 类型 2 号控制页的页头信息类型,包括:申请下一页所在的表空间 ID、申请下一页所在的文件 ID、申请下一页的 PAGENO、页中已使用的 SEQ 项的数量
CPAGE_SEQ_INFO_T 类型 每个页中使用多少个 SEQ 项的数量类型,包括:该页所在的表空间 ID、该页所在的文件 ID、该页的页号、该页中已使用的 SEQ 项的数量
P3_HEAD_T 类型 3 号控制页页头记录类型,包括:LAST_LCN 页的表空间 ID、LAST_LCN 页的文件 ID、LAST_LCN 页的文件号、LAST LCN 的数量
P3_ITEM_T 类型 3 号控制页的描述项记录类型,包括:该页的使用情况、前一个 LCN 的 ID、前一个 TRX 的 ID、前一个 LCN
P4_DES_T 类型 4 号控制页的描述项记录类型,包括:版本号、大小写敏感、编码方式、空串是否等同于 NULL、SITE MAGIC 站点魔数、PRIKEY 解密服务主密钥的 RSA 私钥文件路径、SVR KEY 服务器主密钥、SYSTEM DB KEY 系统数据库的 key、数据库模式、LOG REP TYPE 复制实例类型日志、COORDINATOR ADDR 协调器地址、COORDINATOR PORT 协调器端口、时区
P5_HEAD_T 类型 5 号控制页页头记录类型,包括:LOG FILE1 的长度以 KB 为单位、LOG FILE2 的长度以 KB 为单位、LOG WRITE FILE 的 SEQ、LOG READ FILE 的 SEQ、LOG READ FILE 的 OFFSET、复制关系已处理的 LAST LCN 的数量
P5_ITEM_T 类型 5 号控制页的描述项记录类型,包括:该项是否已被使用、REP ID2、上一个 LCN 项
PH_ARR_T 类型 PH_T 类型的数组
P0_FH_ARR_T 类型 P0_FH_T 类型的数组
P1_INFO_ARR_T 类型 P1_INFO_T 类型的数组
CPAGE_SEQ_HEAD_ARR_T 类型 CPAGE_SEQ_HEAD_T 类型的数组
CPAGE_SEQ_INFO_ARR_T 类型 CPAGE_SEQ_INFO_T 类型的数组
SEQ_ITEM_ARR_T 类型 SEQ_ITEM_T 类型的数组
P3_HEAD_ARR_T 类型 P3_HEAD_T 类型的数组
LAST_LCN_PAGE_HEAD_ARR_T 类型 P3_HEAD_T 类型的数组
P3_ITEM_ARR_T 类型 P3_ITEM_T 类型的数组
P4_DES_ARR_T 类型 P4_DES_T 类型的数组
P5_HEAD_ARR_T 类型 P5_HEAD_T 类型的数组
P5_ITEM_ARR_T 类型 P5_ITEM_T 类型的数组

13.5.2 相关方法

DBMS_PAGE 包中的控制页部分所包含的过程和函数详细介绍如下:

  1. PAGE_LOAD

加载数据页。

语法如下:

PROCEDURE PAGE_LOAD(
	TS_ID		IN		INT, 
	FI_ID		IN		INT, 
	PAGE_NO		IN		INT, 
	PAGE		OUT		VARBINARY
);

参数详解

  • TS_ID

    表空间 ID。

  • FILE_ID

    文件号。

  • PAGE_NO

    页号。

  • PAGE

    页内容。

  1. PAGE_HEAD_INFO

获得通用页头信息。过程和函数功能相同。

语法如下:

PROCEDURE PAGE_HEAD_LOAD (
	PAGE		IN		VARBINARY,
	PH_INFO		OUT		PH_T
);
FUCNTION PAGE_HEAD_GET (
	PAGE		IN		VARBINARY
) RETURN PH_T;

参数详解

  • PAGE

    页内容。

  1. CTL_page0_ts_head_LOAD/ CTL_page0_ts_head_GET

获得 0 号页表空间头的信息。

语法如下:

PROCEDURE CTL_PAGE0_TS_HEAD_LOAD (
	GHEAD		OUT		P0_TSH_T
);
FUNCTION   CTL_PAGE0_TS_HEAD_GETRETURN P0_TSH_T;
  1. CTL_page0_fh_LOAD/ ctl_page0_fh_get

获得 0 号页文件头的信息。

语法如下:

PROCEDURE CTL_PAGE0_FH_LOAD (
	FHEAD		OUT		P0_FH_T
);
FUNCTION   CTL_PAGE0_FH_GETRETURN P0_FH_T;
  1. ctl_page1_des_LOAD/ ctl_page1_des_GET

获得 1 号控制页的描述信息。

语法如下:

PROCEDURE	CTL_PAGE1_DES_LOAD (
	P1DES		OUT		P1_INFO_T
);
FUNCTION   CTL_PAGE1_DES_GETRETURN P1_INFO_T;
  1. cpage_seq_head_LOAD/ cpage_seq_head_GET

获得 seq 页的 seq 页头信息。

语法如下:

PROCEDURE CPAGE_SEQ_HEAD_LOAD (
	PAGE2		IN		VARBINARY,
	P2DES		OUT		CPAGE_SEQ_HEAD_T
);
FUNCTION CPAGE_SEQ_HEAD_GET (
	PAGE2		IN		VARBINARY
) RETURN CPAGE_SEQ_HEAD_T;

参数详解

  • page2

    seq 页内容。

  1. seq_item_all_LOAD/ seq_item_all_GET

获得该页的所有 seq 项的信息。

语法如下:

PROCEDURE SEQ_ITEM_ALL_LOAD (
	PAGE2		IN		VARBINARY, 
	P2DES		OUT		SEQ_ITEM_ARR_T
);
FUNCTION SEQ_ITEM_ALL_GET (
	PAGE2		IN		VARBINARY
) RETURN SEQ_ITEM_ARR_T;

参数详解

  • page2

    seq 页内容。

  1. ctl_page_seq_count_n_LOAD/ ctl_page_seq_count_n_GET

获得系统中从 offset_n 开始往后 n 页的 seq 页信息并返回(最多 100 页)。

语法如下:

PROCEDURE CTL_PAGE_SEQ_COUNT_N_LOAD (
	OFFSET_N	IN		SMALLINT	DEFAULT 0,
	N			IN		SMALLINT	DEFAULT 100,  
	SEQCOUNT	OUT		CPAGE_SEQ_INFO_ARR_T
);
FUNCTION CTL_PAGE_SEQ_COUNT_N_GET (
	OFFSET_N	IN		SMALLINT	DEFAULT 0,
	N			IN		SMALLINT	DEFAULT 100 
) RETURN CPAGE_SEQ_INFO_ARR_T;

参数详解

  • offset_n

    页偏移量。

  • n

    从 offset_n 开始往后 n 页。

  1. CPAGE3_HEAD_GET/CPAGE3_HEAD_LOAD

获得 3 号控制页的页头格式信息并返回。

语法如下:

PROCEDURE CPAGE3_HEAD_LOAD(
	P3_HEAD		OUT		P3_HEAD_T
);
FUNCTION  CPAGE3_HEAD_GET RETURN P3_HEAD_T;
  1. LAST_LCN_PAGE_HEAD_LOAD /LAST_LCN_PAGE_HEAD_GET

获得系统中从 offset_n 开始往后 n 页的 seq 页信息(最多 100 页)。

语法如下:

FUNCTION LAST_LCN_PAGE_HEAD_GET (
	OFFSET				INT			DEFAULT 0,
	NUM					SMALLINT	DEFAULT 100
) RETURN LAST_LCN_PAGE_HEAD_ARR_T;
PROCEDURE LAST_LCN_PAGE_HEAD_LOAD (
	OFFSET				INT			DEFAULT 0,
	NUM					INT			DEFAULT 100,
	P_HEAD_ARR 	OUT		LAST_LCN_PAGE_HEAD_ARR_T
);

参数详解

  • OFFSET

    页偏移量。

  • NUM

    从 offset_n 开始往后 n 页。

  1. LAST_LCN_PAGE_ITEM_LOAD /LAST_LCN_PAGE_ITEM_GET

获得相应页的 item 信息。

语法如下:

FUNCTION LAST_LCN_PAGE_ITEM_GET (
	TS_ID					SMALLINT, 
	FILE_ID					SMALLINT, 
	PAGE_NO					INT
) RETURN P3_ITEM_ARR_T;
PROCEDURE LAST_LCN_PAGE_ITEM_LOAD (
	TS_ID					SMALLINT,
	FILE_ID					SMALLINT,
	PAGE_NO					INT,
	P3_ITEM_ARR		OUT		P3_ITEM_ARR_T
);

参数详解

  • TS_ID

    表空间号。

  • FILE_ID

    文件号。

  • PAGE_NO

    页号。

  1. CPAGE3_LCN_MAX_CNT_GET

返回一个 last lcn 页能存的最大 last lcn item 项的个数。

语法如下:

FUNCTION CPAGE3_LCN_MAX_CNT_GET RETURN INT;
  1. CPAGE4_DES_LOAD/CPAGE4_DES_GET

获得 4 号控制页的描述信息。

语法如下:

PROCEDURE CPAGE4_DES_LOAD(
	P4_INFO		OUT		P4_DES_T
);
FUNCTION  CPAGE4_DES_GET RETURN P4_DES_T;
  1. CPAGE5_HEAD_LOAD/CPAGE5_HEAD_GET

获得 5 号控制页的页头格式信息。

语法如下:

PROCEDURE CPAGE5_HEAD_LOAD(
	P5_HEAD		OUT		P5_HEAD_T
);
FUNCTION	CPAGE5_HEAD_GETRETURN P5_HEAD_T;
  1. CPAGE5_ITEM_load/ CPAGE5_ITEM_GET

获得 5 号控制页的描述信息。

语法如下:

PROCEDURE CPAGE5_ITEM_LOAD ( 
	P5DES		OUT		P5_ITEM_ARR_T
);
FUNCTION	 CPAGE5_ITEM_GETRETURN P5_ITEM_ARR_T;

13.5.3 举例说明

使用包内的过程和函数之前,如果还未创建过系统包,请先调用系统过程创建系统包。

SP_CREATE_SYSTEM_PACKAGES (1,'dbms_binary');
SP_CREATE_SYSTEM_PACKAGES (1,'DBMS_PAGE');

例 取得通用页头信息 0-3

DECLARE
PAGE0 VARBINARY;
PAGE1 VARBINARY;
PHINFO DBMS_PAGE.PH_T;
PHINFO_ARR DBMS_PAGE.PH_ARR_T;
BEGIN
PHINFO_ARR = NEW DBMS_PAGE.PH_T[4];
FOR I IN 1..4 LOOP
	DBMS_PAGE.PAGE_LOAD(0,0,I-1,PAGE0);
	//DBMS_PAGE.PAGE_HEAD_LOAD(PAGE0,PHINFO);
	PHINFO_ARR[I] = DBMS_PAGE.PAGE_HEAD_GET(PAGE0);
END LOOP;
SELECT * FROM ARRAY PHINFO_ARR;
END;
/

结果如下:

TS_ID SELF_FILE_ID SELF_PAGE_NO PREV_FILE_ID PREV_PAGE_NO NEXT_FILE_ID NEXT_PAGE_NO PAGE_TYPE CHECKSUM LSN
0 0 0 -1 -1 -1 -1 19 0 13971
0 0 1 -1 -1 -1 -1 -1 0 14681
0 0 2 -1 -1 -1 -1 -1 0 1
0 0 3 -1 -1 -1 -1 99 0 1
微信扫码
分享文档
扫一扫
联系客服