Oracle_高级功能 数据库存储结构
Posted Brad Miller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle_高级功能 数据库存储结构相关的知识,希望对你有一定的参考价值。
数据库存储结构
分为:物理存储结构和逻辑存储结构。
物理结构和逻辑结构分开,对物理数据的存储不会影响对逻辑结构的访问。
1.物理存储结构
数据库文件
os block
2.逻辑存储结构
tablespace 表空间
segment 段
extend 扩展区
db block 数据块(8k)
2.1创建表空间
create tablespace <ts_name> datafile ‘<file>‘ size <n> reuse autoextend on next <n>;
举例:
create tablespace ts_finds datafile ‘E:apporadataorcl s_finds01.DBF‘ size 100M
reuse autoextend on next 10M;
2.2 修改表空间
--增加数据文件
alter tablespace <ts_name> add datafile ‘<file>‘ size <n>
reuse autoextend on next <n>;
举例:
alter tablespace ts_finds add datafile ‘E:apporadataorcl s_finds02.DBF‘ size 10M
reuse autoextend on next 10M;
--扩展已有数据文件的大小
alter database datafile ‘<file>‘ resize <n>;
举例:
alter database datafile ‘E:apporadataorcl s_finds02.DBF‘ resize 50M;
2.3 删除表空间
drop tablespace <ts_name> including contents;
举例:
drop tablespace ts_finds including contents;
3.关系
Tablespace -->data file
Segment
extent -->
db block -->os block
一个Tablespace可以有多个data file(最多64K个),一个data file只能属于一个Tablespace;
一个Tablespace可以有多个Segment,一个Segment只能属于一个Tablespace;
一个Segment可以有多个extent,一个extend只能属于一个Segment;
一个extent可以有多个db block(一般是8个),一个db block只能属于一个extent;
一个db block可以有多个os block(db block是8k,os block一般是2k),一个os block只能属于一个db block;
一个data file可以存储多个Segment,一个Segment可以存储在多个data file中;
一个data file包含多个extent,一个extent只能属于一个data file中。
4.数据字典
select * from dba_tablespaces;
select * from dba_data_files;
select * from dba_temp_files;
select * from dba_segments where segment_name=‘EMP‘;
select * from dba_extents where segment_name=‘EMP‘;
select * from dba_extents where file_id=4
--清空回收站
purge recyclebin;
5、数据库文件
数据库文件包括:数据文件、临时文件、控制文件、联机重做日志文件。
数据文件是磁盘上的一个物理文件,由Oracle 数据库创建,
并包含如表和索引之类的数据结构。
临时数据文件是一个属于临时表空间的数据文件,主要用于排序操作。
控制文件是一个跟踪数据库的物理组件的根文件。
联机重做日志文件是一组包含对数据所做的更改记录的文件。
数据按Oracle 专有格式写入这些文件,且不能由其他程序读取。
6.数据文件
数据文件就是用来存表、索引等具体数据记录的数据库文件。
数据文件头包含数据文件的元数据,例如数据文件大小和检查点SCN。
每个文件头包含一个绝对文件号和一个相对文件号。
绝对文件号唯一地标识数据库内的数据文件。
相对文件号唯一地标识表空间内的数据文件。
当Oracle 数据库刚创建一个数据文件时,分配的磁盘空间已格式化,但不包含任何用户数据。
但是,数据库会保留此空间,将来用于容纳其相关联的表空间中的数据段。
随着表空间中的数据增长,Oracle 数据库将用数据文件中的可用空间来为段分配扩展区。
扩展区要么是已使用的,即包含段数据;要么空闲的,即可以重用。
datafile
datafile header
extend used
extend free
extend free(之前被使用,现在已释放)
7、控制文件
数据库控制文件是一个二进制文件,仅与一个数据库相关联。
每个数据库有一个唯一的控制文件(如果有多个的话,内容是相同,为了备份)。
控制文件是Oracle 数据库用来查找数据库文件,并从总体上管理数据库状态的根文件。
select * from v$database
控制文件包含以下信息:
数据库名称和数据库唯一标识符(DBID)
创建数据库的时间戳
有关数据文件、 联机重做日志文件、和归档重做日志文件的信息
表空间信息
RMAN备份
控制文件用于数据库的启动和恢复。
在数据库使用期间, Oracle 数据库不断读取和写入控制文件,
并且只要数据库处于打开状态,控制文件就必须是可用的,以便可以写入。
Oracle 数据库对同一数据库启用多个完全相同的控制文件,并同时打开和写入。
通过在不同的磁盘上多路复用控制文件,数据库可以实现冗余,从而避免单点故障。
如果控制文件变得不可用,则当数据库实例尝试访问已损坏的控制文件时,会遭遇失败。
当其他的当前控制文件副本存在时,可以重新装入数据库并打开,而不需进行介质恢复。
如果数据库的所有控制文件都丢失了,那么,实例会失败,且需要进行介质恢复。
只有数据库可以修改控制文件中的信息。
查询 V$DATABASE获取数据库名称和 DBID。
8、联机重做日志
联机重做日志由两个或多个预分配文件组成,用于存储数据库发生的更改。
联机重做日志用于记录对数据文件的更改。
数据库维护联机重做日志文件,以防止数据丢失。
具体来说,在一个实例失败后,
联机重做日志文件使Oracle 数据库可以恢复已提交但尚未写入数据文件的数据。
Oracle 数据库将每个事务同步地写入重做日志缓冲区,然后将其写入到联机重做日志。
Oracle 数据库使用联机重做日志的唯一目的是为了恢复。
联机重做日志有一个重做线程。
一个联机重做日志包含两个或更多联机重做日志文件。
Oracle 数据库一次只使用一个联机重做日志文件来存储从重做日志缓冲区写入的记录。
正在由日志写入器(LGWR) 进程写入的联机重做日志文件称为当前联机重做日志文件。
当数据库停止向一个联机重做日志文件写入,并开始向另一个写入时,发生日志切换。
切换发生在当前联机重做日志文件已满,且必须继续写入时。
也可以手动强制日志切换。
日志写入器以循环方式写入联机重做日志文件。
当日志写入器填满最后一个可用的联机重做日志文件时,该进程又向第一个日志文件写入,
如此反复使用。
联机重做日志文件包含重做记录。重做记录由一组更改向量组成,
每个向量描述对某数据块的一个更改。
例如,对emp表中的sal的更新,将生成一个重做记录,
描述对该表的数据段块、 回滚段数据块、和回滚段的事务表的更改。
重做日志记录了与更改相关的所有元数据,包括如下:
更改的SCN和时间戳
变更事务的事务 ID
事务提交时的SCN和时间戳(如果它已提交)
所做更改的操作类型
被修改的数据段的名称和类型
select * from v$logfile;
select * from v$log;
--手动强制日志切换
alter system switch logfile;
9、db block数据块
一个逻辑数据块对应于特定字节数的物理磁盘空间,比如 8 KB。
Oracle 数据库以数据块(也称为 Oracle 块或页)为单位,来管理数据库数据文件中的逻辑存储空间。
数据块是Oracle 数据库可以使用和分配的最小存储单位。
9.1 数据块和操作系统块
在物理级别,存储在磁盘文件中的数据库数据由操作系统块组成。
操作系统块是操作系统可以读取或写入的最小数据单位。
数据块与操作系统块的逻辑分离具有以下含义:
应用程序不需要确定磁盘上的数据的物理地址。
数据库数据可以在多个物理磁盘上进行存储和备份。
9.2 数据块大小 默认8K,
db_block_size 初始化参数在数据库被创建时设置其数据块大小。
不能更改数据库的块大小,除非重新创建数据库。
如果数据块和操作系统块的大小不同,则数据块大小必须是操作系统块大小的整数倍。
select * from v$parameter where lower(name)=‘db_block_size‘;
9.3 数据块格式
每个数据块有一个格式或内部结构,使得数据库能够跟踪块中的数据和可用空间。
9.3.1 数据块开销(块头)
Oracle 数据库使用块开销来管理块本身。块开销不能用来存储用户数据。
块开销包含关于块的一般信息,包括磁盘地址和段类型。
对于事务管理块,其块头包含活动的和历史的事务信息。
块开销的某些部分是大小固定的,但总的大小是可变的。
平均起来,块开销总计在 84到107字节左右。
9.3.2 行格式
块的行数据部分包含实际数据,如表行或索引键条目等。
正如每个数据块具有一个内部的格式,每一行也有一个行格式,使得数据库能够跟踪行中的数据。
Oracle 数据库以可变长度记录形式来存储行。
行包含在一个或多个行片断中。每个行片断有一个行头和列数据。
行头
行头至少占用3个字节。
Oracle数据库使用行头来管理存储在块中的行片断。
数据块中通常每行只包含一个行片断。
如果整个行可以插入到一个数据块中,则Oracle数据库将该行存储为一个行片断。
但是,如果所有行数据不能插入一个单一的块,或者一个更新导致现有的行不能容纳在原来的块中,
则数据库将该行存储为多个行片断。
Oracle 数据库在一个行片断中只能存储 255 的列。
因此,如果你在具有1000个列的表中插入行,则数据库将创建 4个行片断,通常会链接多个块。
列数据
在行头之后的列数据部分存储行中的实际数据。
行片断通常按create table语句中列的顺序来存储列,但这个顺序并不总是能保证的。
如,long类型列总是在最后。
对行片断中的每一列, Oracle 数据库独立地存储列长度和列数据。所需的空间取决于数据类型。
如果列的数据类型是可变长度的,则用于容纳一个值所需的空间可能在其数据被更新时会增长和收缩。
每一行都在数据块标头的行目录中有一个槽位。槽位指向行的开始部分。
9.3.3 Rowid格式
Oracle 数据库使用一个rowid唯一地标识一行。
在内部,rowid 是一个结构,用于保存数据库访问行所需要的信息。
一个 rowid 并不物理地存储在数据库中,
而是从存储数据的文件和块推导而来的。
这种rowid 类型使用每个行的物理地址的 64进位编码。
编码的字符为 A-Z、a-z、0-9、+、和/。
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
一个扩展 rowid 以一个四段式格式显示,OOOOOOFFFBBBBBBRRR,
此格式分为以下几个组件
OOOOOO 数据对象号标识段,。数据库中的每个段都被分配了一个数据对象号。同一段中的模式对象具有相同的数据对象号。
FFF 表空间相对数据文件号,标识包含行的数据文件
BBBBBB 数据块号标识包含行的块。块号是相对于他们的数据文件的,而不是其表空间。因此,具有相同块号的两行,可以驻留在同一表空间的不同数据文件中。
RRR 行号标识块中的行。
select rowid,e.* from scott.emp e;
select rowid,e.* from scott.dept e;
select * from dba_extents where segment_name=‘DEPT‘;
select * from dba_extents where segment_name=‘EMP‘;
CX= 2*64+23=151 =144
CH =2*64+7=135 =128
select
dbms_rowid.rowid_object(rowid) obj#,
dbms_rowid.rowid_relative_fno(rowid) rfile#,
dbms_rowid.rowid_block_number(rowid) block#,
dbms_rowid.rowid_row_number(rowid) row#,
dbms_rowid.rowid_to_absolute_fno(rowid,‘SCOTT‘,‘EMP‘) file#
from scott.emp;
9.4 数据块的空间管理
随着数据库从底向上不断填充数据块,在行数据和块头之间的可用空间就会逐渐减少。
在更新期间,当将一个尾部空值更改为非空值时,可用空间也会变少。
数据库会管理数据块中的可用空间,以优化性能并避免空间浪费。
9.4.1 数据块中的可用空间百分比
pctfree 存储参数设置了为更新现有的行而保留的可用空间最小百分比。
pctfree 对于防止行迁移并避免空间浪费非常重要。
数据库不断将行添加到块,将导致行数据朝着块头方向向上不断增长,而块头本身又朝行数据方向向下不断扩大。
设置pctfree 存储参数确保至少10%的数据块是空闲的。
insert 语句和update(由小改大)语句 会占用空间;
delete 语句和update(由大改小)语句 会释放空间。
释放的空间将产生磁盘碎片。
只有在满足以下条件时,Oracle 数据库才会自动且透明地合并数据块中的可用空间,
INSERT或UPDATE语句试图使用的块,包含足够的可用空间来容纳新的行片断。
可用空间已被碎片化,以至于该行片断不能插入到块中的某一个连续区域。
create table EMP
(
EMPNO NUMBER(4) not null,
ENAME VARCHAR2(10),
JOB VARCHAR2(9),
MGR NUMBER(4),
HIREDATE DATE,
SAL NUMBER(7,2),
COMM NUMBER(7,2),
DEPTNO NUMBER(2)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
10、extend 扩展区
扩展区是一组逻辑上连续的数据块,被分配来用于存储特定类型的信息。
一般由8(128/1024)个db block组成一个extend。
扩展区是数据库存储空间分配的逻辑单位,由多个连续数据块组成。
在一个扩展区中的数据块在逻辑上是连续的,但在物理上可能是分散分布。
10.1 分配扩展区
在默认情况下,在数据段被创建时,数据库会为数据段分配一个初始扩展区。
一个扩展区总是包含在一个数据文件中。
如果初始扩展区满了,并需要更多空间时,则数据库自动为该段分配一个增量扩展区。
一个增量扩展区是为该段创建的后续扩展区。
分配算法取决于表空间是本地管理的还是字典管理的。
对于本地管理表空间,数据库搜索一个数据文件的位图,以查找相邻的可用数据块。
如果该数据文件中没有足够的空间,则数据库到另一个数据文件中查找。
一个段的扩展区始终位于同一表空间中,但可能在不同的数据文件中。
新分配给扩展区的块,旧数据并未清空,只有当Oracle 数据库开始使用这些块时,
才会根据需要将其格式化。
10.2 释放扩展区
使用 DROP 命令删除表或索引时,表或索引段的扩展区会返回给表空间。
截断表 truncate table emp;
truncate与delete区别:
truncate属于DDL语言,delete属于DML语言;
truncate不记redo_log,delete记redo_log;
truncate只能用于删除全表数据,delete可以根据where条件来删除;
truncate速度快,delete只能用于少量(10万行)数据的删除;
truncate删除完成后数据不能恢复,delete可以恢复;
truncate是回收原有的extend,重新分配一个新的extend,delete不影响原有的extend。
10.3 扩展区的存储参数
每一个段是由扩展区表示的存储参数来定义的。
这些参数控制 Oracle 数据库如何为段分配可用空间。
tablespace USERS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
11、segment 段
段是为一个特定数据库对象(如一个表)分配的一组扩展区。
EMP表的数据存储在其自己的数据段中,而该表的每个索引存储在其自己的索引段中。
会消耗存储空间的每个数据库对象都由单个段组成。
每个段属于且仅属于一个表空间。
一个段的所有扩展区存储在相同的表空间中。
在一个表空间中,一个段可以包括多个数据文件中的扩展区。
单个扩展区绝不会跨越多个数据文件。
11.1 用户段
在数据库中的单个数据段用于存储一个用户对象的数据,如表、索引。
默认情况下,数据库使用延迟的段创建,当创建表和索引时,仅更新数据库元数据。
在用户向表或分区中插入第一行时,数据库才创建表和索引段等。
延迟的段创建使系统能够避免不必要地使用数据库资源。
表段与其索引段可以不在同一个的表空间中。
11.2 临时段
临时段是系统创建的,用于查询时的排序操作。
临时段在临时表空间内,还对应有一个临时数据文件。
Oracle 数据库在用户会话期间,根据需要为查询分配临时段,并在查询完成后将其删除。
除了会记录在临时段上的空间管理操作,临时段的更改不会记录在联机重做日志中。
数据库在分配给用户的临时表空间中创建临时段。
表空间的默认存储特性决定了临时段中的扩展区特征。
12、tablespace 表空间
表空间是段的逻辑存储容器。
段是占用存储空间的数据库对象,如表和索引。
在物理级别,表空间将数据存储在一个或多个数据文件或临时文件中。
数据库必须有SYSTEM和 SYSAUX表空间。
用户需要创建至少一个表空间来存储应用程序数据。
表空间类型:
本地管理表空间 (默认值)
数据库使用表空间本身中的位图来管理扩展区。
因此,本地管理表空间需要预留表空间的一部分用于位图。
在一个表空间中,数据库可以使用自动段空间管理 (ASSM) 或手动段空间管理 (MSSM)来管理段 。
字典管理表空间
数据库使用数据字典来管理扩展区。
12.1 本地管理表空间
本地管理表空间在数据文件头中维护一个位图,以跟踪数据文件体中的可用空间和已用空间。
每一位对应一组块。当空间被分配或释放时,Oracle 数据库更改位图值,以反映数据块的新状态。
本地管理表空间优势:
避免使用数据字典来管理扩展区
如果消耗或释放一个扩展区会导致在数据字典表或撤消段中消耗或释放空间,则在字典管理的表空间中会发生递归操作。
自动跟踪相邻的可用空间
通过这种方式,数据库消除了合并空闲扩展区的需要。
自动确定本地管理扩展区的大小
在本地管理表空间中所有的扩展区可以具有相同的大小,并覆盖对象存储选项。
Oracle 强烈建议使用自动段空间管理的本地管理表空间。
默认情况下,Oracle 数据库将所有新创建的用户表空间设置为本地管理表空间。
字典管理表空间已经过时,不再使用了。
12.2 SYSTEM表空间
SYSTEM表空间是在数据库被创建时就包括的一个必要的管理性表空间。
Oracle 数据库使用SYSTEM来管理数据库。
SYSTEM表空间包括以下信息,全部都由SYS 用户所拥有
数据字典
包含数据库管理信息的表和视图
已编译的存储对象,如触发器、 过程、和包等
默认情况下,Oracle 数据库将所有新创建的用户表空间设置为本地管理表空间。
在SYSTEM为本地管理表空间的数据库中,不能创建字典管理表空间 (这已经过时)。
12.3 SYSAUX表空间
SYSAUX 表空间是SYSTEM表空间的一个辅助表空间。
SYSAUX 表空间为未驻留在SYSTEM表空间的数据库元数据提供了一个集中的位置。
它减少了在种子数据库和用户定义的数据库中缺省创建的表空间数量。
12.4 UNDOTBS1表空间
撤消表空间是为系统管理的撤消数据而保留的一个本地管理表空间。
与其他永久表空间类似,撤消表空间也包含数据文件。
在这些文件中的撤消块被分组为一些扩展区。
新安装的 Oracle 数据库会自动创建一个撤消表空间。
撤消保留期是 Oracle 数据库在覆盖旧的撤消数据之前尝试对其保留的最小时间量。
撤消保留很重要,因为长时间运行的查询可能需要旧数据块前镜像以提供读取一致性。
此外,某些 Oracle 闪回功能也可能会依赖于撤消数据的可用性。
应该尽可能保留旧的撤消数据。
事务提交后,撤消数据对于回滚或恢复事务不再是必需的。
如果撤消表空间还有足够空间用于新事务,数据库可能会保留旧的撤消数据。
当可用空间偏低时,数据库开始覆盖已提交事务的旧撤消数据。
12.5 TEMP 临时表空间
临时表空间仅包含在会话期间存在的瞬态数据。永久模式对象不能驻留在临时表空间中。
数据库临时表空间数据存储在临时文件中。
临时表空间可以提高不适合在内存中进行的多个排序操作的并发性。
这些表空间也提高了在排序过程中空间管理的效率。
以上是关于Oracle_高级功能 数据库存储结构的主要内容,如果未能解决你的问题,请参考以下文章