管理表空间的几个基本准则
另外要提的是当表空间不够用的时候,需要做的是增加表空间所在文件的数据文件的大小,或者新建几个比较大的数据文件,而不是创建很多个比较小的数据文件,这么做理由应该是很好理解的。
值得注意的表空间存储参数:
MINIMUM:CREATE TABLESPACE的一个参数,它能影响表空间段的分配,换句话说是能影响到表空间中空闲空间碎片的一个参数,当为它指定大小后,它能确保所有空闲的或者已分配的盘区的大小一定是它的倍数,以K或者M计算,系统的默认值似乎是64K。
ALTER TABLESPACE语句的限制:ALTER TABLESPACE语句可以用来修改一个表空间的存储参数,但是它不能用来修改INITIAL和MINEXTENTS,一个表空间的默认参数的新值只能影响到将来该表空间为段分配的盘区,而已有分配的还是照创建时的设定值。因此一旦设定了默认参数,最好不要随意修改。
合并表空间中的空闲空间:
先来看看空闲空间是如何存储的:一个表空间的空闲空间是一些相邻的空闲块构成的,这些空闲块的大小不用说当然是由MINIMUM设定的,当需要创建一个新的表空间存储段的时候,系统会在这些连续的空闲块中寻找大小大于新存储段大小的区间进行创建,而当一个表空间存储段被取消时它的空间将直接被标记成空闲块,这样就会造成表空间中,连续的空闲块大小越来越小,越来越不连续,那么在之后需要创建新的表空间段时,就无法保证新的表空间段的空间是连续的块,当然oracle会自动去做合并这个事,那我们可以通过管理来减轻系统的负担。
手动合并空闲的空间:ALTER TABLESPACE ... COALESCE 这个语句用来合所有的空闲空间,起到的作用类似于WINDOWS的磁盘整理,对操作者的权限要求是有 ALTER TABLESPACE 权限(似乎是句废话,但是如果发现无法执行的时候,不妨GRANT ... ALTER TABLESPACE),不过这条语句不能用来合并一个表空间中不同盘区的所有空闲空间,如果要做到所有盘区的空闲空间的整理,除非导出空间数据再重新创建表空间再导入数据,而且最好只有一个盘区。
那么如何才能了解表空间中空闲空间的分布呢(就是如何监控空闲空间)?有几个视图帮我们记录了这些数据:DBA_FREE_SPACE 、 DBA_FREE_SPACE_COALESCE。我们要做的就是在上面做查询,得到某个表空间中空闲空间的分布:SELECT BLOCK_ID, BYTES, BLOCKS, FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME = '**' ORDER BY BLOCK_ID; 结果显而易见。
另外表空间的管理还有 设置表空间是否联机。表空间可以有两种状态:脱机和联机,什么意思?脱机就是证明这表空间虽然存在但是它不能被使用,联机则相反。修改语句就是 : ALTER TABLESPACE ……[ONLINE/OFFLINE]。
使用只读表空间
只读表空间:从字面意思理解就是一个只能执行查询等不影响表空间内存储的数据的事务的一个表空间。
那现在来看看它的定义:只读表空间的主要目的是消除执行数据库大量的静态部分的备份和恢复的需要。
因此只读表空间应该有如下特性:
那么如何使一个表空间变成只读状态呢?我们知道任何一个表空间在创建后默认都是可读写状态,我们就需要改变这种状态:ALTER TABLESPACE …… READ ONLY;这条命令需要用户拥有ALTER/MANAGE TABLE 权限。
要设定一个表空间成为只读表空间需要注意几点:
新特性:在使用ALTER TABLE …… READ ONLY;之前不需要等待表空间完成所有的事务,系统会自动转入过渡的只读模式,该模式将阻止一切新的事务进行,但是允许现有事务进行提交和回滚。
注意:过渡状态只在初始化参数COMPATIBLE(和数据库版本有关的参数)的值为8.1.0以上才会出现,如果是小于8.1.0的值,当READ ONLY语句会在有活动的事务的情况下失败。
小窍门:在执行ALTER TABLE …… READ ONLY;语句之前可以先对每个表先执行 SELECT * FROM ……之类的查询语句,这样可以保证在表空间的数据块可以在随后被最有效的访问,同时也清除了oracle需要检查最近修改块的事务状态的必要,因为最后执行的是查询事务。
两个有用的视图:
V$SESSION:我们可以通过利用它的SQL_TEXT字段来查询一个语句的事务的会话地址
V$TRANSACTION:它记载着当前活动事务的启动SCN,我们可以根据通过上面那张视图查询到的事务会话地址来查询该事务的状态。
延迟只读表空间的打开
当一个非常大的数据库的实质性部分存储在位于低速访问设备(如光盘)的只读表空间中或分级存储时,要考虑将初始化参数READ_ONLY_OPEN_DELAYED设置为TRUE,这将加速某些操作,主要是打开数据库,其原因是在需要读取存储它的数据时,使只读表空间的数据文件只在第一次被访问。但是,这么做有缺点:表空间中只读文件不会被再访问到,除非是RECOVER TABLESPACE和ALTER TALESPACE OPEN RESETLOGS因为它们忽视初始化参数可以继续访问只读文件。
既然表空间可以改为只读状态,那么一定也有办法把只读状态的表空间转为可读写状态:
ALTER TABLESPACE ……READ AND WRITE;需要的权限和改只读的一样,条件就是该只读表空间必须是联机的。
取消表空间(删除表空间)
如果不需要一个表空间及其内容,我们就需要在数据库中取消这个表空间,语句:DROP TABLESPASE ……【INCLUDING CONTENTS】;需要DROP TABLESPACE权限。如果这个表空间本来就是空的(没有表、视图及其他结构)则不需要INCLUDING CONTENTS字句。不过这个语句并不会删除与表空间关联的数据文件,如果在取消表空间时也想把和表空间有关联的数据文件一并删除就需要如下语句:DROP TABLESPACE …… INCLUDING CONTENTS AND DATAFILES;
一个重要的包DBMS_SPACE_ADMIN:
这个包为本地管理的所有表空间提供带有故障诊断和修复功能的管理程序。
包含的管理程序有:
SEGMENT_VERIFY:验证该段盘区映射的一致性
SEGMENT_CURRUPT:标注该段为损坏或有效,以便执行恰当的错误恢复
SEGMENT_DROP_CORRUPT:取消一个当前标注为损坏的段(不回收空间)
SEGMENT_DUMP:卸下一个给定段的段头部和盘区映射
TABLESPACE_VERIFY:验证该表空间中段的位图和盘区映射是否同步
TABLESPACE_REBUILD_BITMAPS: 重建适当的位图
TABLESPACE_FIX_BITMAPS:在位图中标注适当的数据块地址范围为空闲或已用
TABLESPACE_REBUILED_QUOTAS:为给定表空间重建限额
TABLESPACE_MIGERATE_FROM_LOCAL:将一个本地管理的表空间移植为字典管理的表空间
TABLESPACE_MIGRATE_TO_LOCAL:将一个字典管理的表空间移植为本地管理的表空间
TABLESPACE_RELOCATE_BITMAPES:将位图重定位到指定的目的地
TABLESPACE_FIX_SEGMENT_STATES:修改移植被放弃的表空间中数据段的状态
一些有关表空间信息的表或视图:
V$TABLESPACE:来自控制文件的所有表空间的名称和编号
DBA_TABLESPACE,USER_TABLESPACE:所有用户的表空间说明
DBA_SEGMENTS,USER_SEGMENTS:所有用户表空间种段的信息
DBA_EXTENTS,USER_EXTENTS:所有用户表空间中数据盘区的信息
DBA_FREE_SPACE,USER_FREE_SPACE:所有用户表空间中的空闲盘区的信息
V$DATAFILE:关于所有数据文件的信息,包括所属表空间和表空间号
V$TEMPFILE:关于所有临时文件的信息,包括所属表空间和表空间号
DBA_DATA_FILES:显示属于表空间的数据文件
DBA_TEMP_FILES:显示属于表空间的临时文件
V$TEMP_EXTENT_MAP:所有本地管理的临时表空间中所有盘区的信息
V$TEMP_EXTENT_POOL:由每个实例缓存和使用临时表空间(本地管理的)的状态
V$TEMP_SPACE_HEADER:显示每个临时文件的已用/空闲空间
DBA_USERS:所有用户默认的和临时表空间
DBA_TS_QUOTAS:列出所有用户表空间限额
V$SORT_SEGMENT:关于一个给定实例的每个排序段的信息,只有在表空间是TEMPOARY:类型时更新
V$SORT_USER:用户使用的临时排序空间和临时的/永久的表空间