Oracle存储空间管理及应用方案.docx
- 文档编号:25585604
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:22
- 大小:121.92KB
Oracle存储空间管理及应用方案.docx
《Oracle存储空间管理及应用方案.docx》由会员分享,可在线阅读,更多相关《Oracle存储空间管理及应用方案.docx(22页珍藏版)》请在冰豆网上搜索。
Oracle存储空间管理及应用方案
Oracle存储空间管理及应用
摘要:
本文详细介绍了Oracle存储架构及其存储体系的管理和应用,包括表空间、回滚段、临时表等,还对其在管理和应用时常见的错误进行了分析探讨
主题词:
Oracle技术表空间数据文件回滚段临时表错误
一、引言
数据库空间的有效使用和维护不仅是数据库管理的重要工作,也是大多数开发人员所关心的内容,它直接关系到数据库性能的发挥。
Oracle提供了不少方法用于数据空间的使用、监控和维护,同时也在各版本中陆续对这方面的功能进行了增强,目的在于简化这方面工作的复杂度,提高应用的运行效率。
本文希望通过系统地介绍这方面的有关概念,让大家能更好地规划使用数据空间,正确使用Oracle提供的有关功能特性,提高应用的执行效率。
二、Oracle数据库的存储体系及有关概念
2.1Oracle数据库的逻辑结构
从应用者的角度来考察数据库的组成。
自下向上,数据库的逻辑结构共有6层:
2.2Oracle数据库的存储结构
数据库的存储结构指逻辑结构在物理上的实现,共有3层
其中:
数据文件:
用于存放所有的数据,以DBF为扩展名。
日志文件:
记录了对数据库进行的所有操作,以LOG为扩展名。
控制文件:
记录了数据库所有文件的控制信息,以CTL为扩展名。
综上,Oracle数据库的数据存储空间在逻辑上分为多个表空间,每个表空间由系统中的一个或多个物理数据文件构成;Oracle存储数据的基本单位是块,其大小在建库时由DB_BLOCK_SIZE参数确定,一个或多个连续的块构成一个区间(EXTENT),它作为数据对象存储的基本单位来使用。
在Oracle中,每个基本数据对象使用的空间称为段(SEGMENT),段存放在唯一的表空间上,每个段实际上是一系列区片(更为准确地是数据块)的集合。
每个简单数据对象对应一个段;对于分区对象如分区表、索引,则每个(子)分区对应一个段,由各个(子)分区共同构成一个完整的数据对象。
名词解释:
表空间(Tablespace):
为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空
间可以包含多个数据文件。
表空间可分为System表空间、非System表空间和回滚段表空间,其中,System表空间是安装数据库时自动建立的,它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段。
除此之外,还能包含用户数据。
段(Segment):
数据库一种逻辑结构,如表段,索引段,回滚段等,段存在于表空间中,并对应一定的存储空间,共有四种类型的段:
Ø表/数据(Table/Data):
保存表数据
Ø索引(Index):
保存索引数据
Ø回滚(Rollback):
保存回滚数据,用于回滚一次事务处理,以及保持读操作一致性
Ø临时(Temporary):
用于满足排序的需要,比如查询和索引创建中的ORDERBY从句
区间(Extent):
段的存储可以分成一个或多个区间,每个区间占用一定数量的数据块(block)
块(Block):
数据库最小的存储单位,由Block参数(db_block_size)指定
三、表空间及数据文件
3.1表空间简介
通常,有以下几种类型的表空间(除数据表空间需用户自己创建外,其它6种表空间在数据库创建时均会默认建立1个):
3.1.1系统表空间(SYSTEM)
系统表空间是每个Oracle数据库都必须具备的部分,是安装数据库时自动建立的。
它包含数据库的全部数据字典,存储过程、包、函数和触发器的定义以及系统回滚段等管理数据库自身所需的信息。
一般来说,应该尽量避免在SYSTEM表中存储非SYSTEM用户的对象。
因为这样会带来数据库维护和管理的很多问题。
一旦SYSTEM表空间损坏了,只能重新生成数据库。
3.1.2临时表空间(TEMP)
临时表空间并不包含真正的数据,临时表空间中存储数据库中动态生成的对象,如排序操作或表连接时的临时数据等;临时表空间也是Oracle用于存储其所有临时表的所在。
在一些非常繁忙的数据库中,可能会存在多个临时表空间。
3.1.3工具表空间(TOOLS)
工具表空间用于保存数据库工具软件所需的数据库对象,如像OracleReports这样的工具软件在工作时就有自己的一组专用表。
OracleReports把这些表存放在数据库中。
大多数DBA都将支持工具运行所需的表存放在这个表空间中。
3.1.4用户表空间(USERS)
用户表空间用于存放用户的私有信息,用户的专用数据库对象。
3.1.5回滚表空间(RBS)
Oracle数据库需要在一个地方保存恢复(Undo)信息。
回滚表空间中存放数据库对象的回滚段,在出现失败和临时终止事务时,可以用回滚段使数据库对象退回到旧值。
3.1.6数据和索引表空间
数据表空间用来存放用户的应用数据,索引表空间用来存放应用数据对象的索引。
索引可以帮助Oracle迅速找到表中存放的数据。
3.2表空间的管理和使用
3.2.1创建表空间
创建表空间的脚本示例如下:
createtablespacets_namedatafile--创建名为ts-name的表空间
'c:
\oracle\oradata\file1.dbf'size100m,--表空间的文件1,大小为100M
'c:
\oracle\oradata\file2.dbf'size100m--表空间的文件2,大小为100M
minimumextent550k--最小区间大小为550K
[logging/nologging]--记录日志/不记录日志
defaultstorage(initial500k--初始大小为500K
next500k--下一个区大小为500K
maxextents500--最大区间数为500个
pctinccease0)--增量为0
[online/offline]--联机/脱机
[permanent/temporary]--永久/临时
【巡检实例】
--创建数据表空间
--数据文件e:
\oracle\oradata\qin\xjgl_data01.dbf,初始尺寸1G,可自动扩展,最大为5G
--存储属性:
初始大小10M,下一个大小10M,增量为0,最大数量为500
createtablespacexjgl_datadatafile'e:
\oracle\oradata\qin\xjgl_data01.dbf'size1000M
autoextendonnext500mmaxsize5000m
defaultstorage(initial10Mnext10Mmaxextents500pctincrease0);
--创建索引表空间(最好跟数据表空间建在不同的磁盘上)
--数据文件:
e:
\oracle\oradata\qin\xjgl_idx01.dbf,初始尺寸500G,可自动扩展,最大为2G
--存储属性:
初始大小5M,下一个大小5M,增量为0,最大数量为400
createtablespacexjgl_idxdatafile'e:
\oracle\oradata\qin\xjgl_idx01.dbf'size500M
autoextendonnext250mmaxsize2000m
defaultstorage(initial5Mnext5Mmaxextents400pctincrease0);
--创建LOB段表空间
--数据文件:
e:
\oracle\oradata\qin\xjgl_idx01.dbf,初始尺寸500G,可自动扩展,最大为1G
--存储属性:
初始大小5M,下一个大小5M,增量为0,最大数量为100
createtablespacexjgl_data_lobsdatafile'e:
\oracle\oradata\qin\xjgl_data_lobs01.dbf'size500M
autoextendonnext250mmaxsize1000m
defaultstorage(initial10Mnext10Mmaxextents100pctincrease0);
3.2.2改变表空间尺寸
为表空间增加新的数据文件其脚本如下所示:
altertablespacexjgl_dataadddatafile'e:
\oracle\oradata\qin\xjgl_data02.dbf'size200m
调整数据文件尺寸其脚本如下所示:
alterdatabasedatafile'e:
\oracle\oradata\qin\xjgl_data01.dbf'resize400m
允许(或禁止)数据文件的自动扩展其脚本如下所示
alterdatabasedatafile'e:
\oracle\oradata\qin\xjgl_data02.dbf'
autoextendonnext10mmaxsize500m;
改变数据文件的可用性其脚本如下所示
alterdatabasedatafile'e:
\oracle\oradata\qin\xjgl_data02.dbf'online[offline]
Ø以上调整通过OracleDBAStudio进行也可
Ø调整数据文件尺寸时,如果是减小,不能减小到小于已用到空间数量
3.2.3改变表空间状态和存储设置
表空间联机其脚本如下所示:
ALTERTABLESPACE"xjgl_data"ONLINE
表空间脱机其脚本如下所示:
ALTERTABLESPACE"xjgl_data"OFFLINENORMAL[TEMPORARY/IMMEDIATE/FORRECOVER]
设置表空间为只读
ALTERTABLESPACE"xjgl_data"READONLY
修改表空间的存储设置
ALTERTABLESPACE"xjgl_data"DEFAULTSTORAGE(…)
整理空间碎片
可通过先将某表空间用export导出,再用import将其导入实现
删除表空间
DROPTABLESPACE“xjgl_data”[includingcontents];
注:
1)表空间非空时,加上includingcontents关键字才可将其删除
2)删除表空间并不是删除正在使用的数据文件,必须使用操作系统删除数据数据文件
3.2.4表空间迁移
可通过下列步骤实现(只适用于非系统表空间。
不能用于回滚段、临时段的表空间)
1)置表空间状态为脱机
altertablespacexjgl_dataoffline;
2)使用操作系统命令来移动文件
$movee:
\oracle\oradata\qin\xjgl_data01.dbfe:
\
3)使用altertablespace来更改数据库中的文件名
alterdatabaserenamefile'e:
\oracle\oradata\qin\xjgl_data01.dbf'to'e:
\xjgl_data01.dbf';
4)重新置表空间状态为联机
altertablespacexjgl_dataonline;
3.3管理数据文件
数据文件是构成表空间和数据库的物理文件,存放在操作系统中。
数据文件管理使用时应注意以下几点:
1)初始化参数DB_FILES(默认为1024)设置一个实例可以建立的最大数据文件数。
当数据文件的个数达到初始化参数DB_FILES的值时,必须修改DB_FILES的值并重新启动数据库使修改生效。
2)归档模式下数据文件可以单独OFFLINE,而非归档模式数据文件不能正常OFFLINE。
3)数据文件的重命名和移植操作有两种方法实现。
对于单个非SYSTEM表空间的数据文件的转移或重命名可以在数据库打开的情况下完成,对于多个表空间或SYSTEM表空间的数据文件的转移或重命名,只能在数据库的MOUNT模式下进行。
4)Oracle没有办法删除已经加载到数据库的数据文件。
只能通过删除表空间的方式将表空间和它包含的全部数据文件删除,不能只删除一个单独的数据文件。
ALTERDATABASEDATAFILE……OFFLINEDROP语句只能使数据文件不再使用,并没有从数据库上真正删除掉数据文件。
5)初始化参数DB_BLOCK_CHECKSUM设置Oracle是否对BLOCK进行校验。
不管是否设置这个值,SYSTEM表空间都会进行校验。
如果设置为TRUE,那么DBWn进程会对每个写回磁盘的BLOCK进行校验计算,结果存放到BLOCK的头部。
Oracle下次读取该块时,会根据这个校验结果验证是否存在磁盘错误
3.4应用开发时的若干注意事项
1)在多磁盘系统,为提高数据库的性能,数据表空间和索引表空间应分别存储,回滚段(RBS)表空间和数据表空间分别存储,系统表(SYSTEM)空间与数据库中其它表空间分别存储。
2)创建表及其它对象时,要为其分配一个表空间,如果未指定表空间,则使用当前系统用户确省的表空间。
一般可以按如下步骤进行
A.用createuser命令建立用户并给其分配默认表空间和临时表空间,如
createuserXJGL_SAidentifiedbyxjgldefaulttablespacexjgl_datatemporarytablespacetemp;
B.给用户授权
grantconnect,resourcetoXJGL_SA;
C.更改以新建的用户(XJGL_SA)登陆
connectxjgl_sa/xjgl;
D.创建表及其它对象
这样建表时若不指定表空间,对象将会默认创建到xjgl_data表空间上
3)若表中存在大型对象LOB数据字段段,为提高数据库检索性能,一般都需要为LOB数据指定专用的表空间,并指定nocache参数(表示不这些LOB数据将不会存贮在内存中,以便在查询时获得最快的访问速度)
4)在建立索引时,如果不指定相应的索引表空间名,那么,该索引就会建立在数据表空间中。
这是程序员经常忽略的一个问题。
应该在建索引时,明确的指明相应的索引表空间(使用usingindextablespace子句)。
如
CREATETABLETEST
(NAMEVARCHAR2(30)PRIMARYKEY
USINGINDEX
TABLESPACExjgl_idx
PCTFREE0STORAGE(…)
AGENUMBER);
5)创建触发器、存储过程、函数和包时都不能为其指定存储空间,它们都会被存储到系统(SYSTEM)表空间中
四、回滚段及临时表的使用
4.1回滚段
4.1.1回滚段概述
回滚段用于存放数据修改之前的值(包括数据修改之前的位置和值)。
回滚段头部包含正在使用的该回滚段事务的信息。
一个事务只能使用一个回滚段来存放它的回滚信息,而一个回滚段可以存放多个事务的回滚信息。
4.1.2回滚段的作用
事务回滚:
当事务修改表中数据的时候,该数据修改前的值(即前影像)会存放在回滚段中,当用户回滚事务(ROLLBACK)时,ORACLE将会利用回滚段中的数据前影像来将修改的数据恢复到原来的值。
事务恢复:
当事务正在处理的时候,例程失败,回滚段的信息保存在重做日志文件中,ORACLE将在下次打开数据库时利用回滚来恢复未提交的数据。
读一致性:
当一个会话正在修改数据时,其他的会话将看不到该会话未提交的修改。
而且,当一个语句正在执行时,该语句将看不到从该语句开始执行后的未提交的修改(语句级读一致性)。
当一个长时间的查询正在执行时,若其他会话改变了该查询要查询的某个数据块,ORACLE将利用回滚段的数据前影像来构造一个读一致性视图。
4.1.3回滚段的种类
系统回滚段:
当数据库创建后,将自动创建一个系统回滚段,该回滚段只用于存放系统表空间中对象的前影像。
非系统回滚段:
拥有多个表空间的数据库至少应该有一个非系统回滚段,用于存放非系统表空间中对象的数据前影像。
非系统回滚段又分为私有回滚段和公有回滚段,私有回滚段应在参数文件的ROLLBACKSEGMENTS参数中列出,以便例程启动时自动使其在线(ONLINE)。
公有回滚段在例程启动时自动在线。
DEFERED(延迟)回滚段:
该回滚段在表空间离线(OFFLINE)时由系统自动创建,当表空间再次在线(ONLINE)时由系统自动删除,用于存放表空间离线时产生的回滚信息。
4.1.4回滚段的使用
分配回滚段:
当事务开始时,ORACLE将为该事务分配回滚段,并将拥有最少事务的回滚段分配给该事务。
事务可以用以下语句申请指定的回滚段:
SETTRANSTRACTIONUSEROLLBACKSEGMENTrollback_segment
事务将以顺序,循环的方式使用回滚段的区(EXTENTS),当当前区用满后移到下一个区。
几个事务可以写在回滚段的同一个区,但每个回滚段的块只能包含一个事务的信息。
回滚段的扩展(EXTEND):
当当前回滚段区的所有块用完而事务还需要更多的回滚空间时,回滚段的指针将移到下一个区。
当最后一个区用完,指针将移到第一个区的前面。
回滚段指针移到下一个区的前提是下一个区没有活动的事务,同时指针不能跨区。
当下一个区正在使用时,事务将为回滚段分配一个新的区,这种分配称为回滚段的扩展。
回滚段将一直扩展到该回滚段区的个数到达回滚段的参数MAXEXTENTS的值时为止
回滚段的回收:
OPTIMAL(最佳大小)参数指明回滚段空闲时收缩到的位置,指明回滚段的OPTIMAL参数可以减少回滚段空间的浪费。
4.1.5回滚段常用操作
创建回滚段
CREATE[PUBLIC]ROLLBACKSEGMENTrollback_segment
[TABLESPACEtablespace]
[STORAGE([INITIALinteger[K|M]][NEXTinteger[K|M]]
[MINEXTENTSinteger]
[MAXTENTS{integer|UNLIMITED}]
[OPTIMAL{integer[K|M]|NULL}])]
注:
Ø回滚段可以在创建时指明PRIVATE或PUBLIC,一旦创建将不能修改。
ØMINEXTENTS必须大于等于2
ØPCTINCREASE必须是0
ØOPTIMAL如果要指定,必须大于等于回滚段的初始大小(由MINEXTENTS指定)
建议:
Ø一般情况下,INITIAL=NEXT
Ø设置OPTIMAL参数来节约空间的使用
Ø不要设置MAXEXTENTS为UNLIMITED
Ø回滚段应创建在一个特定的回滚段表空间内
使回滚段在线
当回滚段创建后,回滚段是离线的,不能被数据库使用,为了使回滚段被事务利用,必须将回滚段在线。
可以用以下命令使回滚段在线:
ALTERROLLBACKSEGMENTrollback_segmentONLINE;
为了使回滚段在数据库启动时自动在线,可以在数据库的参数文件中列出回滚段的名字。
例如在参数文件中加入以下一行
ROLLBACK_SEGMENT=(rbs01,rbs02)
修改回滚段的存储参数
可以使用ALTERROLLBACKSEGMENT命令修改回滚段的存储参数(包括OPTIMAL,MAXEXTENTS)。
ALTERROLLBACKSEGMENTrollback_segment
[STORAGE([NEXTinteger[K|M]]
[MINEXTENTSinteger]
[MAXEXTENTS{integer|UNLIMITED}]
[OPTIMAL{integer[K|M]|NULL}])]
回收回滚段的空间
如果指定了回滚段的OPTIMAL参数,ORACLE将自动回收回滚段到OPTIMAL指定的位置。
用户也可以手动回收回滚段的空间。
语法:
ALTERROLLBACKSEGMENTrollback_segmentSHRINK[TOinteger[K|M]];
如果不指明TOinteger的数值,ORACLE将试图回收到OPTIMAL的位置。
使回滚段离线
为了达到以下两个目的需要回滚段离线:
Ø阻止新的事务使用该回滚段;
Ø该回滚段必须删除。
ALTERROLLBACKSEGMENTrollback_segmentOFFLINE;
如果有事务正在使用该回滚段,运行该命令后,回滚段的状态将是PENDINGOFFLINE。
事务结束后,状态将改为OFFLINE,可以通过V$ROLLSTAT查询回滚段的状态。
删除回滚段
当回滚段不再需要或要重建以改变INITIAL,NEXT或MINEXTENTS参数时,可以将其删除。
DROPROLLBACKSEGMENTrollback_segment;
查询回滚段的信息
所用数据字典:
DBA_ROLLBACK_SEGS
可以查询的信息:
回滚段的标识(SEGMENT_ID)、名称(SEGMENT_NAME)、所在表空间(TABLESPACE_NAME)、类型(OWNER)、状态(STATUS)。
如:
SQL>SELECTsegment_name,tablespace_name,owner,statusFROMdba_rollback_segs;
回滚段的统计信息
所用数据字典:
V$ROLLNAME,V$ROLLSTAT如:
SQL>SELECTn.name,s.extents,s.rssize,s.optsize,s.hwmsize,s.xacts,s.statusFROMv$rollnamen,
v$rollstatsWHEREn.usn=s.usn;
查看回滚段的当前活动事务
所用数据字典:
V$SESSION,V$TRANSACTION。
如
SQL>SELECTs.username,t.xidusn,t.ubafil,t.ubablk,t.used_ublk
FROMv$sessions,v$transactiont
WHEREs.saddr=t.ses_addr;
回滚段的数量规划
对于OLTP系统,存在大量的小事务处理,一般建议:
数量多的小回滚段;每四个事务一个回滚段;每个回滚段不要超过十个事务。
对于批处理,一般建议:
数量少的大回滚段;每个事务一个回滚段。
4.2临时表的使用
4.2.1临时表的基本概念
Oracle临时表用来保存事务或会话期间的中间结果。
在临时表中保存的数据只有对当前会话是可见的,任何会话都不能看到其他会话的数据,即使在当前会话提交数据以后也是不可见的。
一个会话从来不阻塞另一个会话使用临时表。
即使锁定临时表,一个会话也不会阻塞其他会话使用临时表。
临时表将从用户临时表空间中分配空间,或者如果从有定义权的程序中访问,将使用程序所有者的临时表空间。
全局临时表实际上只是表本身的模板,不包含数据。
创建临时表的行为不包括
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle 存储空间 管理 应用 方案
![提示](https://static.bdocx.com/images/bang_tan.gif)