一、TableSpace的存储参数
1、本地管理TableSpace的存储参数
需要注意:本地管理TableSpace不能指定默认存储参数,也不能指定MINIMUM_EXTENT
AUTOALLOCATE使用最小盘区为64K的系统管理。
UNIFORM SIZE则为指定SIZE的统一大小盘区,默认值为1M
2、字典管理TableSpace的存储参数
INITIAL 定义该段中第一个盘区以字节计(KorM)的大小
NEXT 定义第二个盘区以字节计的大小(KorM)
PCTINCREASE 指定第二个(NEXT)盘区以后的每个盘区增长百分比
MINEXTENTS 指定在表空间中第一次创建一个段时所分配的盘区数
MAXEXTENTS 确定一个段可以拥有的最大盘区数(可以是UNLIMITED)
修改语句如下:
ALTER TABLESPACE users
DEFAULT STORAGE (
NEXT 100K
MAXEXTENTS 20
PCTINCREASE 0);
注1:不能在一条ALTER语句中同时指定INITIAL、MINEXTENTS的值
注2:表空间默认存储参数修改之后只影响未来数据,对已有不做变更
3、合并字典管理TableSpace的空闲空间
当Oracle的TableSpace中的段被取消时,会重新将盘区标记为空闲,但是任何相邻的空闲盘区并不能重组为更大的空闲盘区,这样就形成了碎片,从而使得分配更大的空闲盘区更加困难。
有一下几种方法进行合并:
1. 当为一个段分配新盘区时Oracle无法找到足够大的空闲盘区时,会自动合并相邻空闲盘区并再次查找;
2. 表空间的PCTINCREASE值不为0时,SMON后台进程定期合并相邻空闲盘区;
3. 一个PCTINCREASE值不为0的段被取消或截断时,会执行限制形式的合并,即使包含该段的TableSpace的PCTINCREASE=0
4. 使用ALTER TABLESPACE ... COALESCE语句手动合并相邻空闲盘区
注:本地管理的TableSpace会由位图自动跟踪相邻空闲空间,因而不必考虑合并。
4、监控空闲空间
SQL> select block_id,bytes,blocks
2 from dba_free_space
3 where tablespace_name = 'WXQ_TBS'
4 order by block_id;
BLOCK_ID BYTES BLOCKS
---------- ---------- ----------
9 65536 8
17 65536 8
25 65536 8
33 65536 8
....
上面的查询说明最先几个就是未合并的空闲空间
在执行 ALTER TABLESPACE wxq_tbs COALESCE; 后,再执行以上查询则
BLOCK_ID BYTES BLOCKS
---------- ---------- ----------
9 65536 32
....
二、修改表空间可用性
1、表空间脱机
使表空间脱机主要是用于以下几种情况:
* 使数据库一部分不可用,而同时允许正常访问数据库的剩余部分
* 执行一次脱机表空间的备份
* 更新、维护一个应用时,使得该应用和它的表组不可用
ALTER 语句中的可选项:
NORMAL(default):正常脱机,若有写错误的结果时,该表空间中没有数据文件可以被当前脱机。Oracle会设置检查点;
TEMPORARY:暂时脱机,即使表空间中有文件错误状态也依然脱机,同时设置检查点。联机时无需介质恢复;
IMMEDIATE:立即脱机,不设置检查点。重新联机时需要介质恢复。NOARCHIVELOG模式中不可使用;
FOR RECOVER:使在恢复中的数据库表空间为表空间point-in-time恢复设置为脱机
注:最好使用NORMAL脱机,这样重新联机时无需恢复,即使RESETLOGS也无需恢复。无法正常脱机才使用TEMPORARY选项。
在使表空间脱机前需要确认以下几点:
* 表空间没有活动的回滚段,否则无法脱机
* 脱机前修改表空间的分配,因为脱机后无法访问其中的对象或排序区域
举例:
ALTER TABLESPACE users OFFLINE NORMAL;
2、表空间联机
ALTER TABLESPACE users ONLINE;
可以单独改变TableSpace中的文件的联机/脱机状态:
ALTER TABLESPACE ... DATAFILE {ONLINE|OFFLINE};
ALTER TABLESPACE ... TEMPFILE {ONLINE|OFFLINE}; --不用列出具体文件地址
当使用该命令时,表空间本身的联机状态并没有改变,只是改变了数据文件的状态。
也可以使用以下语句来改变数据文件的联机状态,但是要输入文件名:
ALTER DATABASE DATAFILE ... {ONLINE|OFFLINE};
ALTER DATABASE TEMPFILE ... {ONLINE|OFFLINE};
三、使用只读表空间
只读表空间的作用:
* 消除执行数据库大量的静态部分的备份和恢复需要
* 提供一种完全保护历史数据的方法
* 防止任何用户对该空间的所有表进行更新
注:可以从只读表空间中取消项,但是不能创建可修改。
1、使表空间只读
ALTER TABLESPACE ... READ ONLY;
在执行该操作前需要满足以下条件:
* 该表空间必须是联机的
* 该表空间必须没有包含任何活动的回滚段
* 不可以对SYSTEM表空间进行该操作
* 该表空间当前必须没有涉及联机备份
注:该操作不必等待事务完成,操作后当前事务仍可以提交或回滚,所有事务完成后成为只读。
2、查找阻止只读操作的事务
若发现表空间停顿很长的时间,需要识别阻止只读操作的事务
SELECT SQL_TEXT, SADDR
FROM V$SQLAREA, V$SESSION
WHERE V$SQLAREA.ADDRESS = V$SESSION.SQL_ADDRESS
AND SQL_TEXT LIKE 'alter tablespace%'; --查找该SQL的会话地址(SADDR)
SELECT SES_ADDR, START_SCNB
FROM V$TRABSACTION
ORDER BY START_SCNB; --找到查找到的SADDR之前SCN的事务,即为阻止事务
在完成READ ONLY操作后,立即对其备份。以后就不必再备份了。
3、使只读表空间可写
ALTER TABLESPACE ... READ WRITE;
需要满足的条件是表空间以及该表空间的所有数据文件都必须是联机的。
具体可以在DBA_TABLESPACES和DBA_DATA_FILES中查询其状态
4、在WORM设备上创建只读表空间
① 在其他设备上创建一个可写的表空间,并创建对象、插入数据
② 修改该表空间以使它只读
③ 将该表空间的数据文件复制到WROM设备上
④ 使该表空间脱机
⑤ 用ALTER TABLESPACE ... RENAME DATAFILE重命名数据文件,使其与WORM上的数据文件名称一致
⑥ 修改控制文件
⑦ 使该表空间重新联机
5、延迟只读表空间中数据文件的打开
设置初始化参数 READ_ONLY_OPEN_DELAYED = TRUE
该设置会在需要读取存储在表空间中的数据时,使表空间的数据文件只在第一次被访问。
这个操作会带来的副作用:
* 打开时检测不到缺少的或损坏的只读文件(访问时才被发现)
* ALTER DATABASE CHECK DATAFILES不检查只读文件
* ALTER TABLESPACE ONLINE不检查只读文件,只在第一次访问上被检查
* V$RECOVER_FILE、V$BACKUP、V$DATAFILE_HEADER不访问只读文件
* V$DATAFILE不访问只读文件,只读文件以“0”大小列出
* V$RECOVER_LOG不访问只读文件,需要的用于恢复的日志没有被添加到列表中
* ALTER DATABASE NOARCHIVELOG不访问只读文件,即使有需要恢复的只读文件也继续进行
注:RECOVER DATABASE和ALTER DATABASE OPEN RESETLOGS会访问只读文件而不管参数。
四、取消表空间
除SYSTEM外的表空间均可被取消
表空间取消后无法恢复,所以最好在撤销表空间前后都进行一次完全备份。
DROP TABLESPACE users INCLUDING CONTENTS; --包括表空间中的段
DROP TABLESPACE users INCLUDING CONTENTS AND DATAFILES; --包括数据文件
-The End-