应当随时学习,学习一切;应当集中全力,以求知道得更多,知道一切。——高尔基
说c语言是最高效的高级编程语言,我相信大家都不会反对。学习c语言,可以让我们更加了解计算机的底层运行原理,更加了解上层的其他程序的实现原理。下面我将利用c语言结构oracle数据库的块构成原理,了解oracle内部原理的同时,提升自己c语言编程能力。本文将介绍oracle(11g为例)的基础类型定义。
一,基础类型typedeff
//
// Created by root on 22-9-9.
//
#ifndef TEXAMPLE_OTYPE_H
#define TEXAMPLE_OTYPE_H
typedef unsigned char ub1;
typedef signed char sb1;
typedef char eb1;
//#define UB1MAXVAL ((ub1)UCHAR_MAX)
//#define UB1MINVAL ((ub1) 0)
//#define SB1MAXVAL ((sb1)SCHAR_MAX)
//#define SB1MINVAL ((sb1)SCHAR_MIN)
//
//#define MINUB1MAXVAL ((ub1) 255)
//#define MAXUB1MINVAL ((ub1) 0)
//#define MINSB1MAXVAL ((sb1) 127)
//#define MAXSB1MINVAL ((sb1) -127)
//
//#define EB1MAXVAL ((eb1)SCHAR_MAX)
//#define EB1MINVAL ((eb1) 0)
//
//#define MINEB1MAXVAL ((eb1) 127)
//#define MAXEB1MINVAL ((eb1) 0)
//
//#define UB1BITS CHAR_BIT
//#define UB1MASK ((1 << ((uword)CHAR_BIT)) - 1)
typedef sb1 b1;
//#define B1MAXVAL SB1MAXVAL
//#define B1MINVAL SB1MINVAL
typedef unsigned short ub2;
typedef signed short sb2;
typedef short eb2;
typedef sb2 b2;
typedef unsigned int ub4;
typedef signed int sb4;
typedef int eb4;
typedef sb4 b4;
typedef unsigned int uword;
typedef signed int sword;
typedef int eword;
typedef unsigned long ubig_ora;
typedef signed long sbig_ora;
#endif //TEXAMPLE_OCONFIG_H
二,结构类型声明
块头结构声明
struct kcbh{
ub1 type_kcbh;
ub1 frmt_kcbh;
ub1 spare1_kcbh;
ub1 spare2_kcbh;
ub4 rdba_kcbh;
ub4 bas_kcbh;
ub2 wrp_kcbh;
ub1 seq_kcbh;
ub1 flg_kcbh;
ub2 chkval_kcbh;
ub2 spare3_kcbh;
};
段头块事务和区信息结构声明
struct locker_ktech{
ub2 kxidusn;
ub2 kxidslt;
ub4 kxidsqn;
ub4 flag_ktech;
};
struct hwmark_ktech{
ub4 extno_ktehw;
ub4 blkno_ktehw;
ub4 extsize_ktehw;
ub4 blkaddr_ktehw;
ub4 mapblk_ktehw;
ub4 offset_ktehw;
ub4 flblks_ktehw;
ub4 blkcnt_ktehw;
};
struct ktech{
ub4 spare1_ktech;
sword tsn_ktech;
ub4 lastmap_ktech;
ub4 mapcount_ktech;
ub4 extents_ktech;
ub4 blocks_ktech;
ub2 mapend_ktech;
struct hwmark_ktech hwmark_ktech1;
struct locker_ktech locker_ktech1;
};
struct ktemh{
ub4 count_ktemh;
ub4 next_ktemh;
ub4 obj_ktemh;
ub4 flag_ktemh;
};
struct ktetb{
ub4 ktetbdba;
ub4 ktetbnbk;
};
struct ktshc{
ub2 ktshcnxf;
ub2 ktshcnfl;
ub2 ktshcnfb;
ub1 ktshctyp;
};
struct ktsfsxid{
ub2 kxidusn;
ub2 kxidslt;
ub4 kxidsqn;
};
struct ktsfs_seg{
ub2 ktsfsflg;
struct ktsfsxid ktsfsxid1;
ub4 ktsfslhd;
ub4 ktsfsltl;
};
struct ktsfs_txn{
ub2 ktsfsflg;
struct ktsfsxid ktsfsxid1;
ub4 ktsfslhd;
ub4 ktsfsltl;
};
簇/数据块事务和数据信息结构声明
struct ktbitxid{
ub2 kxidusn;
ub2 kxidslt;
ub4 kxidsqn;
};
struct ktbituba{
ub4 kubadba;
ub2 kubaseq;
ub1 kubarec;
};
struct ktbbhitl{
struct ktbitxid ktbitxid1;
struct ktbituba ktbituba1;
ub2 ktbitflg;
union _ktbitun{
sb2 _ktbitfsc;
ub2 _ktbitwrp;
} ktbitun;
ub4 ktbitbas;
};
struct ktbbhcsc{
ub4 kscnbas;
ub2 kscnwrp;
};
struct ktbbh{ //Transaction Fixed Header structure
ub1 ktbbhtyp;
union ktbbhsid{
ub4 ktbbhsg1;
ub4 ktbbhod1;
}ktbbhsid1;
struct ktbbhcsc ktbbhcsc1;
sb2 ktbbhict;
ub1 ktbbhflg;
ub1 ktbbhfsl;
ub4 ktbbhfnx;
struct ktbbhitl ktbbhitl1;
struct ktbbhitl ktbbhitl2;
};
struct kdbh{
ub1 kdbhflag;
sb1 kdbhntab;
sb2 kdbhnrow;
sb2 kdbhfrre;
sb2 kdbhfsbo;
sb2 kdbhfseo;
sb2 kdbhavsp;
sb2 kdbhtosp;
};
struct kdbt{
sb2 kdbtoffs;
sb2 kdbtnrow;
};
struct kdrid{
ub4 dba;
ub2 oid;
};
struct kdbrdh{
ub1 flag;
ub1 lock;
ub1 cols;
ub2 kref;
ub2 mref;
struct kdrid hrid;
struct kdrid nrid;
};
struct kdtrh{
ub1 flag;
ub1 lock;
ub1 cols;
ub1 clki;
};
二,说明
结构体kcbh占用20个字节,用来存储数据块的头信息:数据块类型(例如undo块,数据块,索引块等),scn,dba等;
每个表对应一个数据段,段由区组成,段头信息中存储了段所有区的分布信息。通过读取段头,我们可以抓取到表所有的区数据(也就是数据块的信息)。结构ktech和ktemh可以获取区的统计信息;结构ktetb可以知道每个区的具体位置和大小。
簇/数据块中,簇数据块中,结构ktemh是紧邻结构ktech的,偏移量为92;堆数据块中,结构ktemh是与结构ktech有8字节的偏移量,其总偏移量为100。结构体kdbh中记录:块中表的个数,块中记录行数等信息;结构体kdbt记录表的编号和行数;
三,其他
oracle块有很多类型,我们只针对簇/数据块进行读取,先抓取oracle的数据字典表,根据字典表,可以获取到数据库中其他表的基本信息:表名,表字段个数,表字段名,表字段类型等信息。