Oracle的存储结构关系(随便看)

本文深入探讨了Oracle数据库的整体结构,包括数据库、表空间、段、盘区、数据块等核心概念,以及如何通过存储规范优先原则进行层级化的存储控制。文章详细介绍了不同类型的段,如普通表、分区表、集群表、索引、索引组织表等,并阐述了索引、表空间和段级别的存储控制。此外,还讨论了数据存储管理、块大小设置、extent分配与释放、数据库块特性以及Oracle如何高效管理数据存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Oracle的存储结构关系

Posted on  2012-09-17 21:42  虫师 阅读( 2198) 评论( 1编辑  收藏

 

oracle数据库的整体结构                                                          

 

数据库的结构关系

  其实,我前面一篇讲表空间的时候就介绍了数据库的结构,只是那个图只是简单的层次关系,这张图片看上去挺封复杂的,只要关注几个概念就行了。

Database(数据库) :数据库是按照数据结构来组织、存储和管理数据的仓库。

Tablespaces(表空间) :表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表, 所以称作表空间。

Segments (段): 段是表空间的重要组织结构,段是指占用数据文件空间的通称,或数据库对象使用的空间的集合;段可以有表段、索引段、回滚段、临时段和高速缓存段等。 

extents (盘区):是数据库存储空间分配的一个逻辑单位,它由连续数据块所组成。第一个段是由一个或多个盘区组成。当一段中间所有空间已完全使用,oracle为该段分配一个新的范围。

Data Block (数据块)oralce 管理数据文件中存储空间的单位,为数据库使用的I/O的最小单位,其大小可不同于操作系统的标准I/O块大小。

 

Storage Clause Precedence)存储规范优先

 

  Oracle 在存储控制上可以分为三个方式。oracle缺省级别、表空间级别、段级别,可以理解中央、省级、县级。从中央到地方的法规条例。比如为了发展经济,对于招商引资的规范。中央规定可以实行招商引资,某省比较穷,为了吸引投资商,规定降低企业所得税。某县为了吸引资源,可以规定对于投资商土地免费使用5年,不征收土地使用税。那么某投资商来本县后首先适用县级规定。

具体规定:

1、不管你在哪个层面上修改存储方式,修改的参数是对未来要分配的存储extents (盘区)起作用。

2、一些参数只能在指定的级别上进行修改。有些参数只能表空间级别设置,有些参数只能在段级别设置。

 

 

Types of segments (段的类型)                                                                        

 

  因为关于表空间的一些基本知识我在另一节里做过专门介绍,这里我们认识一下段都有哪些常见类型。

Table 

  对于一个只有几百条几千条数据,一个学校的学生成绩表,那么一张表就是一个segments 

Table partition : 

  如果一张表非常大,里面存储了几千万条、上亿条记录,那么对这一张表进行操作,效率就非常低了。分区表是将大表的数据分成称为分区的许多小的子集。假如一张表是存放中国13亿人口信息的表,那么这么多条记录是有规律的,可以基于某一个字段将其分开。那么可以根据省级行政区可以划分34个分区,每个分区实际上就是一个独立的表,但在逻辑上这些分区又同属于一张表。

如果一张表是普通的表,只点一个segments;如果一张表是partition的表,可能占多个segments

Cluster 

  Oracle中普通的表称为堆表(heap table),堆表中的数据是无序存放的,往往在使用一段时间后,数据就变得非常无序。如下图所示,索引中相同的key对应的数据存放在不同的block中,这时,如果要通过索引查询某个key的数据,就需要访问很多不同的block,代价非常高。 

我们发现很多表与表,他们的数据有相关性,因为我们访问一个表里的数据,往往要访问另一些表里的数据。我们可以把这些数据物理上存储在一块。

Index 

索引是与表和聚集相关的一种选择结构,就当于我们一本书的目录,可以快快速的定位某章某节的页数。索引可以建立在一个表的一列或多列上,那就可以大大提高对表的查询。那么一个index也可能会占一个多个segments 

 

Index-organized table :

  索引组织表(IOT),就是存储在一个索引结果中的表。存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可放在任何地方),IOT中 暗则按主键存储和排序。对你的应用来说,IOT表和一个“常规”表并无差别。使用堆组织表时,我们必须为表和表主键上的索引分别留出空间。而IOT不存在主键的空间开销,因为所引就是数据,数据就是所引。

  IOT带来的好处不仅节约磁盘空间的占用,更重要的是大幅度降低了I/O,减少了访问缓冲区缓存(尽管从缓冲区缓存获取数据比硬盘要快得多,但缓冲区缓存并不是免费,而且也绝不是廉价的。第个缓冲区缓存获取都需要缓冲区缓存的多个闩,而闩是串行化设备,会限制应用的扩展能力)

Index partition 

      对于tablepartition ,那么对一个大的index有也partition 

  分区所引可以分为全局分区索引与本地分区索引,其中本地索引又可以分为本地前缀索引和本地非前缀索引。

本地索引的分区和其对应的表分区数量相等,因此每个表分区都对应着相应的索引分区。使用本地索引,不需要指定分区范围因为索引对于表而言是本地的,当本地索引创建时,Oracle会自动为表中的每个分区创建独立的索引分区。 

全局索引以整个表的数据为对象建立索引,索引分区中的索引条目既可能是基于相同的键值但是来自不同的分区,也可能是多个不同键值的组合。 全局索引既允许索引分区的键值和表分区键值相同,也可以不相同。全局索引和表之间没有直接的联系,这一点和本地索引不同。

Undo segment 

回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。回滚段的头部包含正在使用的该回滚段事务的信息。一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。

Temporary segment   

当Oracle处理一个查询时,经常需要为SQL语句的解析与执行的中间结果(intermediate stage)准备临时空间。Oracle会自动地分配被称为临时段(temporary segment)的磁盘空间。例如,Oracle在进行排序操作时就需要使用临时段。当排序操作可以在内存中执行,或Oracle设法利用索引就执行时,就不必创建临时段。

LOB segment 

Large  object LOB) 大大的对象,我们知道数据库不但可以存数据,有些可以存储视频声音图片等文件,对于这种类型的文件一个大小几MB,几十MB很正常。当然,有些数据库是不支持LOB数据块的,可以在表里存一个指针,来指向某个文件下的视频声音文件。

Nested table 

嵌套表,表中表,和LOB思想很类似,就是在表里存一个指针,指针指向另外一张表。

Bootstrap segment 

关于引导段,暂时没找到相关解释。^_^

 

 

Extent alloc & dealloc(盘区分配与释放)                         

 

  盘区是段下面的一个存储单位,一个盘区在物理上是一段连续的数据块。

 

一个数据文件有一个文件头,点用了若干个数据块,这这个文件头里记录着盘区的分配与释放的信息。在这个文件中有些盘区是被使用的,有些盘区是空闲的。

什么时候创建盘区

创建

扩展

改变(改大)

什么时候释放盘区

删除

改变(改小)

 

 

Database Block(数据库块)                                    

 

最小单位的输入/输出

数据块由操作系统中的一个或多个块组成

数据块是表空间的基本单位

DB_BLOCK_SIZE 文件来表示缺省块的大小

 

查看oracle 块的大小:

[ora10@localhost dbs]$ strings spfileora10.ora | grep -i db_block
*.db_block_size=8192  (8KB)

 

 

  在早期的数据库中,oracle只支持一种数据块的大小。从9i版本支持了改变大小的设置。但也不是任用户随便改动的,规定范围在2KB32KB之间,必须是倍数增加的,也就是2KB\4KB\8KB\16KB\32KB 五种大小。

  需要注意的是,块大小的设置是在数据库创建时候设置的,一旦设置好是不可更改的。类似于我们磁盘的存储格式,FAT16FAT32NTFS.... ,要想改变存储格式只能数数据全部格式化掉。

 

Hearder : 块头记录一些控制信息,帮助oracle定位这个块,块与块之间的串联信息。

Free space :处于重现状态的这空间。

Data :已经写入数据的空间。数据存放数据的方式是自底往上的,就像现实中的一个箱子。

 

Orcale 是如何管理数据的存储的                                    

 

High-Water Mark

对一一个新建立的表,表中包含很多数据块,water mark 原始指向表中的第一个数据块。

water mark随着插入的数据“向前”移动。当把插入的数据删除掉一些,water mark 并不会“向后”移动。也就是water mark 的位置表示历史的最高水位。

 

那么我们要想插入一些数据时,oralce是按什么样的规则输选择插入位置呢?

 

  首先会先查找灰色的,灰色部分表示就已经插入数据的块,但这些块并不是已经被完全占满了,有些或多或少的都会留下一些空间,关于留空间的规则,后面细说。如果插入一个很小的数据,灰色被占的数据块中可以完全插入的,就会被插在这一部分。

  如果数据比较大,查找了所有被占用块都无法插入,那么将会选择“曾经”插入过数据的空白块进行插入,也就是上图浅灰色部分。

  如果数据非常大,曾经插入数据的空白块都无法插入,那么只好动用从未被插入过数据的空白块进行插入。当然water mark 也就会“向前”移动。

 

OK下面就来具体分析,每个数据块,是否允许插入数据的规则。

 

   块头(数据块的头)不在百分比的范围内,当剩余空间大于20%的时候,那这个块就是纳入freelist中,当我要插入一条数据时,freelist是会扫描这个块的,检查其它是否可以存放要插入的数据。当小于20%的这间时,说明这个块已经满了,会从freelist中去掉,插入数据时不作为扫描的对象。

  一个小于20%空闲的块会从freelist上摘除,那么一个块在什么情况下会被重新挂到freelist上呢?对于一个已经从freelist上摘除的块,可以能由于删除更新操作,其空间会得到释放,当占用空间小于40%时,也就是空闲空间大于60%时,这个块被有认为是空间的块又会被重现挂到freelist上。

 

 

 

<think>嗯,用户问的是Oracle 11g日志文件中出现“bad magic 1”的问题。我需要先回忆一下这个错误通常是什么原因引起的。记得“bad magic”一般和文件头有关,可能文件头损坏或者格式不正确。Oracle的数据文件、控制文件或者日志文件的头部有特定的magic number,用来标识文件类型和状态。如果这个值不对,就会报这个错误。 接下来要考虑可能的原因。首先可能是文件损坏,比如存储故障、突然断电或者硬件问题。然后是文件被误操作,比如用文本编辑器打开二进制文件并保存,这样会破坏文件头。还有可能是Oracle软件的问题,比如版本不兼容或者软件bug,但这种情况相对少见。 用户需要解决这个问题,我得给出具体的解决步骤。首先应该检查告警日志和跟踪文件,确认错误发生的具体文件和位置。然后验证文件是否存在,权限是否正确。如果是数据文件损坏,可能需要从备份恢复,或者尝试使用DBV工具检查数据块。如果是控制文件的问题,可能需要从备份恢复控制文件,或者重建控制文件。对于日志文件,可能需要清除日志组或进行不完全恢复。 另外,还要提醒用户预防措施,比如定期备份、使用RAID、避免直接修改Oracle文件等。如果用户不太确定,建议联系Oracle支持,特别是生产环境的问题,不能随便处理。 需要确保回答结构清晰,分步骤说明可能的原因和解决方法。同时注意使用中文,避免使用Markdown格式,保持口语化但专业。还要检查是否有遗漏的情况,比如是否还有其他原因导致“bad magic 1”,或者是否有更简便的解决方法。可能还要提到使用RMAN进行恢复,因为这是Oracle推荐的备份恢复工具。另外,如果文件头损坏但数据部分完好,是否有办法跳过文件头直接恢复数据?可能需要更深入的技术步骤,但考虑到用户可能不是专家,步骤不宜太复杂,建议优先从备份恢复。</think>Oracle 11g日志文件出现"bad magic 1"错误的分析与解决方法: 一、错误本质 该错误属于Oracle数据库文件头校验失败问题。"magic"指Oracle文件头部的魔术字节(Magic Number),用于标识文件类型和有效性。当文件头部标识值不符合预期时(如控制文件/数据文件/日志文件被篡改或损坏),就会触发"bad magic"错误。 二、常见原因 1. 文件物理损坏 - 存储介质故障(磁盘坏道、RAID失效) - 异常关机导致的写入中断 - 文件系统损坏(如未正常卸载) 2. 人为操作失误 - 使用非Oracle工具直接修改数据库文件 - 误覆盖/删除关键文件 - 使用`dd`命令不当复制文件 3. 软件层面问题 - Oracle软件bug(需检查是否存在相关补丁) - 版本不兼容(如混合使用不同版本的文件) 三、诊断步骤 1. 定位具体文件 ```sql SELECT NAME, STATUS FROM V$DATAFILE; -- 检查数据文件状态 SELECT MEMBER FROM V$LOGFILE; -- 检查日志文件路径 ``` 2. 验证文件完整性 ```bash dbv FILE=损坏文件全路径 USERID=sys/password ``` 观察输出中的"Total Pages Marked Corrupt" 3. 检查操作系统日志 ```bash dmesg | grep -i error # Linux系统 /usr/sbin/smartctl -a /dev/sdX # 检查磁盘SMART状态 ``` 四、解决方案 1. 控制文件损坏 ```sql -- 尝试使用备份控制文件 STARTUP NOMOUNT; ALTER DATABASE MOUNT BACKUP CONTROLFILE; ``` 2. 数据文件损坏 ```sql -- 尝试离线恢复 ALTER DATABASE DATAFILE '文件路径' OFFLINE; RECOVER DATAFILE '文件路径'; ALTER DATABASE DATAFILE '文件路径' ONLINE; ``` 3. 日志文件损坏 ```sql -- 清除并重建日志组 ALTER DATABASE CLEAR LOGFILE GROUP 组号; -- 若含未归档日志则需加UNARCHIVED关键字 ``` 4. 终极恢复方案(需有效备份) ```bash rman target / RUN { RESTORE CONTROLFILE FROM AUTOBACKUP; ALTER DATABASE MOUNT; RESTORE DATABASE; RECOVER DATABASE; ALTER DATABASE OPEN RESETLOGS; } ``` 五、预防措施 1. 配置每日物理备份 ```bash crontab -e # 添加:0 2 * * * /backup_script.sh ``` 2. 启用数据保护模式 ```sql ALTER DATABASE FORCE LOGGING; ALTER DATABASE FLASHBACK ON; ``` 3. 定期验证备份 ```bash rman VALIDATE CHECK LOGICAL DATABASE; ``` 遇到此错误时,建议按以下顺序处理: 1. 立即停止数据库写入操作 2. 确认存储硬件状态 3. 尝试从最近的有效备份恢复 4. 如无有效备份,联系Oracle技术支持(MOS账户需提前准备) 注意:生产环境重大故障建议优先联系专业DBA处理,避免因操作不当导致数据永久丢失。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值