使用只读表空间
只读表空间:从字面意思理解就是一个只能执行查询等不影响表空间内存储的数据的事务的一个表空间。
那现在来看看它的定义:只读表空间的主要目的是消除执行数据库大量的静态部分的备份和恢复的需要。
因此只读表空间应该有如下特性:
-
任何用户都不可以在表空间创建或修改数据
-
没有回滚段
-
可以随意拷贝,甚至刻录到光盘中
那么如何使一个表空间变成只读状态呢?我们知道任何一个表空间在创建后默认都是可读写状态,我们就需要改变这种状态:ALTER TABLESPACE …… READ ONLY;这条命令需要用户拥有ALTER/MANAGE TABLE 权限。
要设定一个表空间成为只读表空间需要注意几点:
-
表空间必须是联机的
-
表空间没有包括任何的活动回滚段
-
表空间不能是SYSTEM(正是因为SYSTEM总是有活动的回滚段)
-
该表空间没有涉及的联机备份,因为在备份的最后会要求更新表空间中所有的头文件
新特性:在使用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:用户使用的临时排序空间和临时的/永久的表空间