Lesson 5 Managing Database Storage Strucures
目标Objectives :
- 了解表和列中的数据如何存储在块中
- 定义数据文件和表空间的目的
- 创造和管理表空间
- 获取表空间的信息
- 熟悉Automatic Storage Management [ASM]的主要概念与功能
存储架构:

一个数据库被分成若干逻辑存储单元 称为表空间。每个表空间有很多逻辑数据块。DB_BLOCK_SIZE变量确定了块大小。范围在2-32KB。默认大小为8KB。一定数量的连续的逻辑存储块形成了一个Extend区,一定数量的分配给一个特定逻辑存储结构的Extend又形成为一个段Segment,Oracle数据块是逻辑IO中最小的单元。
逻辑架构:
数据库Database --->表空间Tablespace ---> 段Segment ---> 区Extent ---> 块 Block
表数据是怎样存储的:
创建出一个表时,会创建段来保存它的数据。表空间包括一些特定的段。逻辑上,一个表装着几行 列的值。一个行最终存储在数据块在行碎片中。因为有些时候一整个行不一定能存在一个位置。这种情况发生在插入一个过大的行元素或者更新存在的行数据但新数据超过现有的空间。
- 行的格式及容量
Oracle 使用一个或多个行片段来存储表的每一行数据的前255 列。当一个数据块可以容纳一个完整的数据行时(且表的列数小于等于 256),那么此行就可以使用一个行片段来存储。当插入一个数据行,或更新已有数据行时,数据行容量大于数据块容量,那么 Oracle 将使用多个行片段来存储此行。大多数情况下,每个数据行只存储于一个行片段中,且在同一数据块内。当 Oracle 必须使用多个行片段来存储同一数据行时(且每个行片段位于不同的数据块内),此行将在多个数据块间构成行链接。当一个表超过 255 列时,每行第255 列之后的数据将作为一个新的行片段存储在相同的数据块中,这被称为块内链接。由多个行片段组成的行进行块内链接时,使用各行片段的 rowid 进行链接。当一个行为块内链接时,用户可以从同一数据块中访问此行的全部数据。如果一个数据行位于同一数据块内,那么访问此行不会影响 I/O 性能,因为访问此行不会带来额外的 I/O 开销。无论链接或非链接的行片段,都包含一个行头,及此行部分或全部的数据。一行内某一列的数据也有可能跨多个行片段,甚至跨多个数据块。一个行片段由行头及列数据构成。列数据部分包含了各列的列长及列值。而行头内包含以下内容:行管理开销,列数,簇键ID(如果是簇表),行片段链接的ROWID(如果有链接)。行头位于行数据之前,包含以下信息:
• 行管理开销
• 行片段链接的ROWID(如果有链接)
• 列数
• 簇键ID(如果是簇表)
如果一行能被存储于一个数据块中,那么其行头所需容量将不少于3 字节。在行头信息之后依次储存的是各列的列长及列值。列长存储于列值之前,如列值不超过250 字节,那么 Oracle 使用1 字节存储其列长;如列值超过250 字节,则使用3 字节存储其列长。列数据所需的存储空间取决于此列的数据类型。如果某列的数据类型为变长的,那么存储此列值所需的空间可能会随着数据更新而增长或缩小。为了节约存储空间,如果某列值为空,那么数据库中只存储其列长(值为 0),而不存储任何数据。对位于一行末尾的空列值,数据库中将列长也忽略不予存储。另外,每行还要占用数据块头中行目录区的2 字节空间。簇表内的行需要存储与非簇表行相同的信息。除此之外,簇表内各行还需要存储其所属的簇键。
- 行片段的 rowid
Oracle 使用 rowid 记录每个行片段的存储位置和地址。每个行片段得到一个 rowid 之后,这个值将会保持不变,直到其所属行被删除或经过 Oracle 工具导出并再次导入。对于簇表来说,如果某行的簇键值发生改变,那么此行除了保存原有的 rowid 之外,还将为新簇键值存储一个额外的 rowid 指针。由于行片段在其生命周期内拥有固定的 rowid,因此在 SELECT,UPDATE,及 DELETE 等 SQL 语句中可以充分利用 rowid 的这个特性。
剖析数据库块:
块头Block Header:块头包括段类型(表or索引),数据块地址,表目录,行目录,事务处理槽。块头从顶向下生长延伸。
行数据:在块中存储的行所包含的实际数据,从底向上扩展。
空余空间:在块的中间位置,提供了块头和行数据存储的生长空间,当插入新的行或列数据更新为更大的值时,行数据会占据新的空间。当行目录需要更多行词目或者比初始定义时需要更多的事务处理插槽时,块头会向下扩展数据空间。块中的空闲空间会被Oracle服务按需合并。
表空间和数据文件
Oracle数据库的数据逻辑角度上存储在表空间中,物理角度上存储在数据文件中。
表空间:-只能属于一个数据库; -由多个数据文件构成; -更深程度上被分成存储的逻辑单元。
数据文件: -只能属于一个表空间和一个数据库; -是计划对象数据的存放仓库。
*表可以跨多个数据文件,但只属于一个表空间。
一个表可以属于多个数据文件,但只属于一个表空间;一个数据文件只能属于一个表空间;一个表空间只能属于一个数据库。
Oracle托管文件(OMF)
按数据库对象而不是文件名的顺序来分类文件操作
变量:
DB_CREATE_FILE_DEST: 定义了提供给数据文件和临时文件的默认文件系统目录的位置
DB_CREATE_ONLINE_LOG_DEST_n(最多5个):重做日志文件和控制文件产生的位置
DB_RECOVERY_FILE_DEST:定义了RMAN备份的位置
表空间上的空间管理
本地管理表空间:LMT
- 空间增长由表空间内部托管
- bitmap 记录
- 每字节与一个块和一组块相一致
- 推荐使用表空间的本地托管
字典管理表空间:
- 空间增长由数据字典管理
- 当增长的空间被分配或未分配时会更新对应的表
- 这些表空间仅支持向后兼容
字典管理:oracle将此表空间中的在数据字典中管理,简单举一例,就是如果oracle要在分配一个新的segment,他要查找这个表空间中有哪些连续的block是可用的,就会查询相应的数据字典。这些信息存放在数据字典里。
本地管理:上面所说的信息放在数据文件本身,可以想象oracle在数据文件的开头,放了几个数据块,这些数据块指向其它的数据块,并且包含了这些数据块的使用情况的信息。所以oracle在做同样的事情,就查这些块了,不用查数据字典了。
创建新的表空间
扩展管理:本地托管
类型:永久Permanent Undo No√
状态:读写
Datafiles
添加数据文件到表空间:一个表空间必须含有至少一个文件。
大文件表空间用在特殊的大数据库环境下,比如ASM或其他逻辑卷组管理支持支持RAID和动态可扩展逻辑卷组的环境,一般不要选大文件表空间。

步骤;
1.点击管理栏,点存储栏下的表空间
2.点击创建(可选择类似创建来创建与现存表空间类型相同的新的表空间。)
3.输入表空间名字
4.在扩展管理目录下,选择本地管理。Oracle不推荐使用字典管理
5.类型选择永久。
6.状态选择读写。
7.添加数据文件。
8.输入数据文件名字,接受默认文件目录,输入文件大小。
9.选择自动扩展大小。
10.接受其他默认选项,完成。
本地管理的表空间的存储
本地管理下的表空间扩展会以以下两种方式之一进行分配:
· 自动:Automatic/Autoallocate: 不能选择扩展空间的大小,不能将临时表空间设置为自动分配。
· 一致:Uniform:依规定的大小一致进行扩展,默认为1MB,所有临时表空间扩展都是一致性的。不能将UNDO表空间设置为 Uniform 扩展
本地管理的表空间存储下的段空间管理可被分为以下类别:
· 自动:数据库使用bitmaps来管理段内的空闲空间。
· 手动:段内使用free list来管理空闲空间
使用本地管理表空间的优点
- 避免递归循环的空间管理操作。在字典管理表空间中如果正在延伸区中使用或者释放空间,会引起在undo段或数据字典表中的另一个操作来使用或者释放空间。
- 因为本地管理表空间不在数据字典表中记录剩余可用空间,减少了这些表的资源竞争
- 本地管理扩展区自动地寻找临近空间,消除了合并空闲扩展区的需要
- 本地管理下的拓展区大小可以被系统自动确定
- 对拓展bitmap的更改不会生成undo信息,因为这并不更新数据字典内的表。(除非特殊情况比如表空间的quota定额信息)
*将字典管理转化为本地管理的方法:
用DBMS_SPACE_ADMIN. TABLESPACE_MIGRATE_TO_LOCAL
使用PL/SQL 完成表空间转换(转换前使用RMAN冷备)。
exec dbms_space_admin.tablespace_migrate_to_local('USER');
在转换SYSTEM表空间前,保证其他表空间已经转换完成。如果先转换SYSTEM表空间,则其他表空间会处于只读模式。dbms_space_admin.tablespace_migrate_to_local可联机使用,用户可以修改的选择数据,但是DML若要分配一个新区,则要转换完成前会处理阻塞状态。
如果使用 dbms_space_admin 将表空间从字典管理转换为本地管理 ,则没有切换到自动段空间管理特性的选项。所有字典管理的表空间都使用默认的段空间管理方式,并且在转换为本地管理时,不能更改为自动段空间管理。另外,若当前字典管理表空间存在空间碎片,使用 dbms_space_admin不能进行消除。
记录Logging
对表空间内对象的更改会被写入重做日志redo log。如果记录功能不可用,那么任何对象的创建和任何后续的对这些对象直接加载路径的插入操作都不会被写入重做日志,这些对象也会因此在数据丢失事件中无法被恢复。所以当一个对象在记录不可用时被创建,如果想让他们能被恢复必须备份这些对象。
块信息Block Information
这个区域显示了块中用于表空间被生成时的尺寸,只读属性,更改块尺寸的初始参数(DB_nK_CHANGE_SIZE)然后其他的值会作为选项被列出。
在预设数据库上的表空间
下列表空间被创建在预设数据库上:
SYSTEM:用来管理数据库,包括数据字典和包含着关于DB管理信息的表。都包含在SYS schema中并且只能被SYS用户和具有DBA权限的用户访问。
SYSAUX:是SYSTEM的辅助表空间,一些ORACLE早些版本需要使用SYSTEM表空间的组件和产品现在使用SYSAUX表空间。所有ORACLE 10g和后续版本 的数据库必须要有SYSAUX。在EM上,可以看到当前表空间部件的饼状图,点击管理页面下的表空间,选择SYSAUX然后点击编辑,点击占用选项。
TEMP:执行一个需要创建临时段(比如大的分类或者创建一个索引时)的SQL声明时,你的临时表空间会被使用。就像每个用户被分配了一个用来存储生成的数据对象的默认表空间一样,每个用户也被分配了一个临时表空间。最佳实践是给数据库定义一个用来分配给任一个新用户的默认临时表空间,除非有其他规定。在预设的数据库里,TEMP表空间是被规定作为默认临时表空间的。这意味着如果当用户创建时没有特殊规定临时表空间,Oracle数据库会分配这个TEMP表空间给用户。
UNDOTBS1:回滚表空间用来为数据库服务存储撤销信息。如果数据库使用了自动还原管理,那么必须保证有一个准确的回滚表空间在任何时间是活动的。这个表空创建在数据库创建时。(存放更改前的信息)
USERS:这个表空间用来存储永久的用户对象和数据。在预设数据库中,USER表空间是给所有非系统用户所创建对象的默认表空间。SYS和SYSTEM用户的默认永久表空间仍然是SYSTEM。(不定义时,也自动放入USER表空间。)
EXAMPLE:包含着在创建数据库时可被安装的sample schema样本模式,它们为示例提供了一个共同的平台,Oracle文档和课程包含基于sample schema的例子。
*为了简化管理,通常表空间都有单独的索引。
调整表空间Altering a Tablespace
创建完毕表空间之后,可以在系统更改的需要下使用多种方式调整表空间:
重命名Renaming:
更改状态Changing the status:共有三种状态。
读写;
只读:改为只读后现有数据处理可被提交或回滚,新的DML语言无法进行操作。特别地,SYS和SYSAUX表空间不能被改为只读;
离线:
1.正常Nomal:数据文件无错误发生时正常离线,数据库通过给所有数据文件激活检查点来确保数据都写入磁盘。
2.临时Temporary:即使有一两个数据文件错误也可临时离线,Oracle数据库把威力显得数据文件离线,并为其激活检查点。如果没有文件离线但是使用了临时离线指令,不需要介质恢复。然而如果一个或多个表空间中的文件因为写错误离线,并且将表空间临时离线,那么表空间需要介质恢复才能回到online状态。
3.立刻Immediate:不设数据文件检查点而立刻离线。需要介质恢复media recovery才能回到在线状态。不能将运行在NOARCHIVELOG模式下。
4.待恢复For Recover:此设定已被否决,语法为了支持向后兼容。
更改大小Changing the size:
- 增加数据文件:
- 更改现有数据文件大小:
如果将数据文件大小改到比已使用大小还小,得到错误信息:ORA-03297:file contains used data beyond requested RESIZE value.
存储选项Storage options:
Thresholds:更改存储空间达到临界状态时的警报阈值点。可使用默认阈值,自定义阈值和关闭警报阈值。
表空间的操作Actions with Tablespace
选择actions菜单,可以:增加数据文件,类似创建,执行DDL语句,进行本地管理(只能从字典管理的表空间单向转化为本地管理):更改为只读或可写;置为在线;重组织(启动重组精灵);运行Segment Advisor;显示依赖关系;显示表空间内容;执行离线。
删除表空间Dropping Tablespace
从数据库中删除不需要的表空间和它包含的段。必须有DROP_TABLESPACE系统权限。
删除表空间时,控制文件中的与数据库相关的文件指针会被删除。
不能删掉一个包含任何活动中的段的表空间,比如,表空间中的一个表正在被使用,或者表空间包含需要回滚的undo数据,这个表空间就无法被删除。最好将表空间离线之后再删掉。
查看表空间信息
两种方式:1.EM 2.视图
在数据库处于装载状态时只能使用v$tablespace v$datafile v$tempfile
收集存储信息
查看表空间部件
Enlarging the Database 数据库扩容
方式:
- 创建新的表空间
- 向已有表空间增加数据文件
- 增加数据文件大小
- 提供数据文件的自动扩展
ASM功能:
- 是便携的。高性能集群文件系统。
- 管理数据库文件
- 将数据在磁盘间传播来平衡负载
- 镜像化数据
- 解决许多存储管理的挑战
提供对单独的SMP ( Symmetric Multi Processing)机器和跨节点集群的RAC( Real Application Cluster)的管理支持。
- 条带化文件而非逻辑卷组
- 提供在线磁盘冲配置和动态调节平衡
- 允许提供可调节的动态平衡速度
- 提供文件冗余
- 只支持Oracle数据库文件
- 支持集群
- 自动安装
ASM 理念:
ASM并没有消除之前存在的数据库功能部件,已有的数据库可以一直操作。可以创建新的文件为ASM文件,让之前的文件继续老方式管理,或者可以迁移为ASM。
图表显示了使用ASM的数据库内部不同存储部件存在的依赖关系。
浙公网安备 33010602011771号