oracle维护表空间和数据文件(二)

2014-11-24 15:21:36 · 作者: · 浏览: 4
占用)
在每一个数据文件的头,都会有一个bitmap 位图,来表示空间的占用情况。一个bit代表一个extent,占用1 未占用 0;locally-managed也是串行,不能并行,但是 每个表空可以自己管理,所有就相当于并行。如果SYSTEM表空间用的是local-managed ,其他表空间就只能是 local-managed的了。以后就要用local-managed 方式管理表空间。
如果由于历史的原因 dictionary 管理的 SYSTEM tablespace 想变成locally managed:需要执行如下命令:
[sql]
DBMS_SPACE_ADMIN.TABLESPACE_MIGRANTE_TO_LOCAL('SYSTEM');
注意:做这个命令前的准备工作: 1:全备份数据库 2:确保临时表空间不是SYSTEM
自己管理的tablespace 有两个表管理这些数据:
?疑问 每个表空间口有自己的 DEBIT和CREDIT表吗?
DEBIT表:记录所有已经被分配的extent
CREDIT表:记录所有空闲的extent
当申请空间的时候,oracle就去查询这些表,然后分配空间,当向表中
插入数据的时候,就是在申请空间。
2: data-dictionary 的管理。
当自己的表中插入数据的时候,oracle要去查询数据字典(执行很多隐含sql)然后分配空间。因为数据字典只有一个:对数据字典的访问必须是序列化的,不能并发,如果通过数据字典,管理表空间, 容易造成数据库的开销过大,所以这种方式有点过时,中央集群的管理方式是 data-dictionary,地方似的管理是新出的管理表空间的方式。
PS :大事中央管,小事自己管。 中央集权制放掉,搞自治
 3:undo tablespace:
主要是用来存储undo segment; 就是再对一个表或者表空间做修改的时候,undo 就是做事先进行备份。undo一定是 loacally mananged  以后有专门一章进行讲解;
5:temporary tablespaces:
就是oracle的临时存储用的,比如做一些大型的排序,在内存中做肯定不行,内存不够,这个时候就需要在临时表空间中进行排序操作。临时的中转站。有一个全局的临时表空间可以被大家共用,只用于存放临时的信息,可以 data-dictionary方式,但是推荐使用locally -mananged管理方式.
强烈建议,在创建数据库的时候额外指定 临时表空间。如果没有指定,默认是 SYSTEM这样做事很危险的。所以要指定。
有两种方式指定 default temporary tablespace:
1:创建数据库的使用 create database的时候。
 DEFAULT TEMPORARY TABLESPACE temp  TEMPFILE '路径/文件名' SIZE 400M
2: 可以使用 alter database 的时候。
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE default_temp2;(这个要首先创建表空间)
6: 查询默认的临时表空间
[sql]
desc database_properties;
col property_name format a20;
col property_value format a20;
select property_name,property_value from database_properties;
7 :如何看一个表空间的 类型:
[sql]
SQL> select tablespace_name,contents,extent_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN
------------------ --------- ----------
SYSTEM PERMANENT LOCAL
SYSAUX PERMANENT LOCAL
UNDOTBS1 UNDO LOCAL
TEMP TEMPORARY LOCAL
USERS PERMANENT LOCAL
EXAMPLE PERMANENT LOCAL
USER_TEMP TEMPORARY LOCAL
MY_SPACE PERMANENT LOCAL
TS_MYDB PERMANENT LOCAL
PENG PERMANENT LOCAL
已选择10行。
8:修改默认表空间
下面进行新加一个表空间:
[sql]
SQL> create temporary tablespace mytemp tempfile 'D:\APP\TOPWQP\ORADATA\ORCL\my
temp.DBF' size 100M extent management local;
表空间已创建。
SQL>
SQL> ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp;
ALTER DATABASE DEFAULT TEMPORYARY TABLESPACE mytemp
*
第 1 行出现错误:
ORA-02231: ALTER DATABASE 选项缺失或无效
SQL>
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE mytemp;
数据库已更改。
SQL>
默认临时表空间就修改了,可以通过如下命令查询:
[sql]
SQL> select property_name,property_value from database_properties;
PROPERTY_NAME PROPERTY_VALUE
-------------------- --------------------
DICT.BASE 2
DEFAULT_TEMP_TABLESP MYTEMP
ACE
DEFAULT_PERMANENT_TA USERS
BLESPACE
一个数据库可以有多个临时表空间,但是只有一个default的表空间。
9: 表空间只读设置:
ALTER TABLESPACE mytemp READ ONLY;
执行这条语句:oracle将做如下操作:
1:引起 checkpoint;
2:数据变成只读操作
3:依然可以从表空间中删除一个object(table index 等) 
这个在实际中用的不多,我简