当前位置: 主页 > 数据库

oracle 数据库空间-oracle rac连库串的含义

发布时间:2023-02-09 09:45   浏览次数:次   作者:佚名

大家好,我是小斌,今天给大家分享一下Oracle内核技术。 今天给大家分享一下Oracle内核解密的存储篇。 希望对大家学习数据库有所帮助。

1.存储关系

Oracle数据库在逻辑上由一个或多个表空间组成,表空间在物理上由一个或多个数据文件组成; 从逻辑上讲,表空间是由一个或多个段组成的。 在Oracle数据库中,数据是通过为每个不同的数据对象分配不同的段来保存的。 在 Oracle 数据库中,一个段由一个或多个范围组成,这些范围又由连续存储的数据块组成。 BLOCK块是数据库I/O的最小单位。

(1)、ORACLE存储结构

ORACLE 数据库可以划分为称为表空间的逻辑存储单元。 每个表空间可以包含许多 Oracle 逻辑数据块。 DB_BLOCK_SIZE 参数指定逻辑块的大小。 逻辑块大小范围从 2KB 到 32KB,默认大小为 8KB。 一定数量的相邻逻辑块构成一个区域。 为特定逻辑结构分配的一组盘区构成一个段。 在ORALCE的存储过程中,空间是以区为单位分配的,Oracle数据块是逻辑I/O的最小单位。

oracle 一台服务器两个库_oracle rac连库串的含义_oracle 数据库空间

1. ORACLE中的区域

区域,表空间分配的基本单位,如果新建一个表,插入一行数据,那么ORACLE数据库至少为该表分配一个区域。 我们可以通过数据字典DBA_EXTENTS查看表对应的区域。

SELECT EXTENT_ID, --区ID
       FILE_ID, --文件ID
       BLOCK_ID, --第一个块ID
       BLOCKS --块数
  FROM DBA_EXTENTS
 WHERE SEGMENT_NAME = 'EMP' --表名
 ORDER BY EXTENT_ID

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

ORACLE数据库中的表空间有两种:一种是统一区大小; 另一个是系统管理区的大小,所以ORACLE区的大小是由两种表空间决定的。

(1)统一区域大小的表空间

统一区大小表空间是在创建表时将表空间大小指定为统一值。

示例:创建一个zone大小为1M的统一zone表空间

CREATE TABLESPACE LIUXIAOBIN_TBS1 DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS1_01.DBF' SIZE 50M UNIFORM SIZE 1M;

创建表并使用表空间和插入数据

CREATE TABLE LIUXIAOBIN (ID INT,NAME VARCHAR2(20)) TABLESPACE LIUXIAOBIN_TBS1;

oracle 一台服务器两个库_oracle 数据库空间_oracle rac连库串的含义

INSERT INTO LIUXIAOBIN VALUES(1,'liuxiaobin');

观察表块大小、块数等信息

SELECT EXTENT_ID, --区ID
       FILE_ID, --文件ID
       BLOCK_ID, --第一个块ID
       BLOCKS --块数
  FROM DBA_EXTENTS
 WHERE SEGMENT_NAME = 'LIUXIAOBIN' --表名
 ORDER BY EXTENT_ID

oracle 数据库空间_oracle rac连库串的含义_oracle 一台服务器两个库

根据查询可以看出,LIUXIAOBIN表有一个区域,从11号文件的第128块开始,一共128块。

查询数据库的块大小

 SELECT VALUE FROM V$PARAMETER WHERE NAME='db_block_size';

oracle rac连库串的含义_oracle 一台服务器两个库_oracle 数据库空间

根据查询,数据库的最小块大小为8K,因此可知LIUXIAOBIN表占用空间从第11个文件的第128块到第257块为表的第一个区域。

表空间的编号0到127,其中块0和1属于文件头,块2到127属于位图块。 所有的位图块都是用来记录表空间的哪个区域分配给了那个表或者索引等对象。 位图块用126个二进制位表示:0100000.... 0表示该区域没有分配给对象,1表示该区域已经分配给对象。

文件快速转储

DUMP 块 0 和 1:

ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS1_01.DBF' block 0;
ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS1_01.DBF' block 1;

oracle 数据库空间_oracle rac连库串的含义_oracle 一台服务器两个库

oracle 一台服务器两个库_oracle rac连库串的含义_oracle 数据库空间

位图框图

oracle 一台服务器两个库_oracle 数据库空间_oracle rac连库串的含义

位图块分为两部分:

第一个位图块:Block 2是位图块的结尾

示例:DUMP 块 2:

ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS1_01.DBF' block 2;

oracle rac连库串的含义_oracle 一台服务器两个库_oracle 数据库空间

第二个位图块之后到127个块是真正的位图块;

示例:DUMP 块 3:

ALTER SYSTEM DUMP DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS1_01.DBF' block 3;

oracle 一台服务器两个库_oracle 数据库空间_oracle rac连库串的含义

根据上图,表空间的块3是位图块的第一个块。

块3到127为位图块,一共8K*125=1000K字节,一个字节对应8个二进制位,一共8192000个二进制位,也就是说一个块大小为8K的表空间一共有8192000个areas ,如果表需要分配一个区域,如何在超过800万个区域中找到?

ORACLE采用标记为,如果0、1、2号区被占用,则标记为3,如果3、4、5号被占用,则标记为6,如果4号区被释放,则标记为4,需要分配的表从zone 4开始分配。

注意:如果在ORACLE中启用了闪回,则DROP表区不会被释放,会被标记为不删除,但只会更改名称,并不会真正删除表。

(2) 系统管理区大小

系统管理区的大小,ORACLE会根据表的大小自动调整该区的大小。

例子:

CREATE TABLESPACE LIUXIAOBIN_TS2 DATAFILE 'F:\360Downloads\ORACLE\LIUXIAOBIN_TBS2_01.DBF' SIZE 50M;
CREATE TABLE LUXIAOBIN2(ID INT,NAME VARCHAR2(20)) TABLESPACE LIUXIAOBIN_TS2;

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

SELECT EXTENT_ID, --区ID        FILE_ID, --文件ID        BLOCK_ID, --第一个块ID        BLOCKS --块数   FROM DBA_EXTENTS  WHERE SEGMENT_NAME = 'LUXIAOBIN2' --表名  ORDER BY EXTENT_ID

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

查询此时的块大小:

 SELECT VALUE FROM V$PARAMETER WHERE NAME='db_block_size';

oracle 数据库空间_oracle rac连库串的含义_oracle 一台服务器两个库

向表中插入数据:

INSERT INTO LUXIAOBIN2 SELECT ROWNUM,'BBB' FROM DBA_OBJECTS;
SELECT EXTENT_ID, --区ID
       FILE_ID, --文件ID
       BLOCK_ID, --第一个块ID
       BLOCKS --块数
  FROM DBA_EXTENTS
 WHERE SEGMENT_NAME = 'LUXIAOBIN2' --表名
 ORDER BY EXTENT_ID

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

oracle 一台服务器两个库_oracle rac连库串的含义_oracle 数据库空间

根据查询结构块的大小还是8K不变。 接下来我们继续插入数据,直到块大小发生变化。

INSERT INTO LUXIAOBIN2 SELECT * FROM LUXIAOBIN2;

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

根据以上实验oracle 数据库空间,当表小于1M时,每个分区有8个64K的块; 当表大于1M时,每个分区有128个块,每个区域大小为1M。 继续插入数据表的分区可以达到8M。 有兴趣的朋友可以自己做以下实验。

总结:从空间利用率来看,大面积空间利用率低,小区利用率高。 性能方面,大区全表扫描效率高,小区由于区数多效率低。 因为建议使用系统来管理区域大小,根据表的大小来调整区域大小比较合适。

2. ORALCE 中的段

一个段由一个或多个区域组成,在ORACLE中每个对象都有一个ID,一个段ID,一个表ID。

CREATE TABLE LUXIAOBIN3(ID INT,NAME VARCHAR2(20)) TABLESPACE LIUXIAOBIN_TS2;
CREATE TABLE LUXIAOBIN3(ID INT,NAME VARCHAR2(20)) TABLESPACE LIUXIAOBIN_TS2;
INSERT INTO LUXIAOBIN3 VALUES (1, 'bbb');
SELECT OBJECT_ID, DATA_OBJECT_ID
  FROM DBA_OBJECTS
 WHERE  OBJECT_NAME = 'LUXIAOBIN3'

oracle 数据库空间_oracle 一台服务器两个库_oracle rac连库串的含义

此时表ID和段ID是一样的。 我们继续实验。

truncate table LUXIAOBIN3 
SELECT OBJECT_ID, DATA_OBJECT_ID

oracle rac连库串的含义_oracle 一台服务器两个库_oracle 数据库空间

  FROM DBA_OBJECTS  WHERE  OBJECT_NAME = 'LUXIAOBIN3'

oracle rac连库串的含义_oracle 数据库空间_oracle 一台服务器两个库

根据上面的实验,我们可以得出结论,TRUNCATE表的ID不会变,段的ID会变oracle 数据库空间,ID值会加1。

3. ORACLE中的块

oracle数据块是oracle数据库的存储基础。 它由几个字节的磁盘空间组成。 数据块是oracle数据库的最小逻辑单元。 数据块可以定义为2k、4k、8k、16k、32k甚至更大。 默认的oracle block size是8k,通常我们称它为oracle block。 当然,正常情况下,oracle block应该是os block的整数倍。 当然,具有标准尺寸的块称为标准块,不同于标准块的块称为非标准块。 该块包含两部分信息,一是管理信息,二是用户数据。

Oracle 块大小在初始化参数文件 (init.ora) 中的 db_block_size 中设置。 块是处理更新、插入和选择数据事务的最小单位。 当用户从表中选择数据时,会在oracle块上读取或提取数据。 意思是:os每次执行I/O,都以os block为单位; oracle每次执行I/O都是以oracle block为单位。

(1) 数据块结构

oracle 一台服务器两个库_oracle 数据库空间_oracle rac连库串的含义

块结构描述如下:

块头:存储一些基本信息,如物理位置、块所属的段类型(数据段、索引段、回滚段等)

B 表目录:如果block中存放的数据是表数据,则表目录会存放这张表的相关信息

C 行目录:如果块中存储的数据是表数据,则行目录存储数据行的相关信息。

块头、表目录和行目录构成了块的头信息(开销)。 这部分并不存储数据库中的实际数据,而是用来记录区块的逻辑结构,这部分占用的空间并不固定,大约在84-107字节之间。

D行记录:实际存放数据的区域,这部分空间已经被使用。

E 空闲空间:未使用的区域,用于插入新行或更新现有行。 (这里有一个行迁移的概念:就是当update操作时,block中的空闲空间不足以保存修改后的数据,那么这条记录会被保存到另一个空间足够的block中,并且只有一个指向新块会保留原块上的rowid,这就是行迁移row migration)

(2) 自由空间

空闲空间的使用,插入时会减少块的空闲空间,更新时也会减少块的空闲空间。 当使用 DELETE 语句删除块中的记录或使用 UPDATE 语句将列的值更改为较小的值时,Oracle 将释放部分空闲空间。 释放的空闲空间不一定是连续的。 通常,Oracle 不会合并块中不连续的空闲空间。 因为合并数据块中不连续的空闲空间会影响数据库的性能。 只有当用户进行数据插入(INSERT)或更新(UPDATE)操作,但找不到连续的空闲空间时,Oracle才会合并数据块中不连续的空闲空间。

(3) 空闲空间的管理

对于块中的空闲空间,Oracle提供了两种管理方式:自动管理和手动管理

行链接和迁移

Row Chaining:如果我们向数据库中插入(INSERT)一行数据,而这一行数据很大,一个数据块无法存储一整行,Oracle会将一行数据分成若干段,存储若干个数据块,这个过程称为行链接(Row Chaining)。

行迁移:数据块中有一条记录。 用户执行 UPDATE 来更新这条记录。 此 UPDATE 操作使此记录更长。 这时Oracle在这个数据块中查找,却找不到一条可以容纳的记录,无奈之下,Oracle只能将整行数据移动到一个新的数据块中。 原数据块中保留了一个“指针”,这个“指针”指向新的数据块。 正在移动的记录的 ROWID 保持不变。

无论是行链接还是行迁移,都会影响数据库的性能。 当Oracle读取这样一条记录时,Oracle会扫描多个数据块并执行更多的I/O。 它使 I/O 翻倍。

oracle 数据库空间_oracle 一台服务器两个库_oracle rac连库串的含义