Oracle表空间管理

库(包括对象:表,视图,索引,同义词)
表空间tablespace -------data file  

段segment 
区extent
内存块block------------- os block 


库里包括用户的对象和schema

左边是逻辑结构

右边是物理结构

通常一个库由多个表空间组成,每个表空间存储不同特性的数据

system      存放数据字典信息,是数据库必须的表空间,同时是每个被创建的表空间,数据库启动也要读取这个表空间

sysaux存放除数据字典之外的一些辅助管理工具,10G新增的表空间,主要就是用来分担system表空间的压力

undo     存放自动管理的回滚段信息,提供事务回滚功能

users    存放用户数据

temp    存放用户排序的临时数据

可选的或者自定义的表空间
index  
example

创建表空间:
create tablespace 表空间名 datafile ‘/path/xxx.dbf‘ size 10m;

创建的步骤:
1,确认拥有创建表空间的权限
    拥有dba角色,sysdba,sysoper,create tablespace拥有这三个权限其一就可以

2,创建smallfile还是bigfile
    --如果一个表为T级别的,smallfile不够存放的,它最大存放256G的大小;
    --所以可以选择bigfile,它可以包括4G个block,如果一个block为8k大小,那么单个文件就可以存放32T的大小;如果一个表为4T,用smallfile要16个表空间来管理,用bigfile就只用1个就可以了

    默认是创建smallfile类型的表空间

SQL> select * from database_properties where PROPERTY_NAME like ‘%TBS%‘;
 --这里面去查看数据库默认属性

DEFAULT_TBS_TYPE     SMALLFILE


SQL> alter database set default bigfile tablespace;

SQL> alter database set default smallfile tablespace;


SQL> create bigfile tablespace b1 datafile ‘/u01/oracle/oradata/orcl/b1.dbf‘ size 100M;
--在默认是smallfile的情况下要创建bigfile,就在创建时加一个bigfile关键字就可以了


SQL> select TABLESPACE_NAME,BIGFILE from dba_tablespaces;

TABLESPACE_NAME                BIG
------------------------------ ---
SYSTEM                         NO
UNDOTBS1                       NO
SYSAUX                         NO
TEMP                           NO
USERS                          NO
EXAMPLE                        NO
T1                             NO
T2                             NO
B1                             YES


3,注意磁盘IO的分配,把datafile分散,不要创建到IO繁忙的磁盘上

4,datafile数据文件的路径要具备oracle写权限

SQL> create tablespace t1 datafile ‘/u01/oracle/oradata/orcl/t1.dbf‘ size 100m;


CREATE TABLESPACE lmtbsb DATAFILE ‘/u02/oracle/data/lmtbsb01.dbf‘ SIZE 50M
    EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

CREATE TABLESPACE lmtbsb DATAFILE ‘/u02/oracle/data/lmtbsb01.dbf‘ SIZE 50M
    EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;

--段空间管理技术
表空间的管理方式:
数据字典管理表空间 DMT (dictionary management tablespace)
       以前一直使用的空间管理方法,到9i后慢慢淘汰
       使用数据字典表uet$和fet$描述表空间的空闲和使用
       当空间被使用或者释放,就会去更新数据字典信息


本地管理表空间    LMT (local management tablespace)
       直接在各个表空间管理空闲和使用
       存储在表空间上的bitmap(位图)来标示空闲和使用
       从9i开始默认使用这种


SQL> create tablespace t2 datafile ‘/u01/oracle/oradata/orcl/t2.dbf‘ size 10m extent management local;


SQL> create tablespace t3 datafile ‘/u01/oracle/oradata/orcl/t3.dbf‘ size 10m extent management dictionary;
create tablespace t3 datafile ‘/u01/oracle/oradata/orcl/t3.dbf‘ size 10m extent management dictionary
*
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace
--不能创建DMT管理的表空间,因为system表空间为LMT,所以不能创建DMT的表空间


SQL> select TABLESPACE_NAME,EXTENT_MANAGEMENT from dba_tablespaces;

TABLESPACE_NAME                EXTENT_MAN
------------------------------ ----------
SYSTEM                         LOCAL
UNDOTBS1                       LOCAL
SYSAUX                         LOCAL
TEMP                           LOCAL
USERS                          LOCAL
EXAMPLE                       LOCAL
T1                             LOCAL
T2                             LOCAL


相关的视图
dba_tablespace,v$datafile,dba_data_files,v$tablespace

表空间的状态 
只读   read only
读写   read write


SQL> select FILE#,STATUS,ENABLED from v$datafile;

     FILE# STATUS ENABLED
---------- ------- ----------
         1 SYSTEM READ WRITE
         2 ONLINE READ WRITE
         3 ONLINE READ WRITE
         4 ONLINE READ WRITE
         5 ONLINE READ WRITE
         6 ONLINE READ WRITE
         7 ONLINE READ WRITE
         8 ONLINE READ WRITE

SQL> select FILE_NAME,file_id,TABLESPACE_NAME from dba_data_files;

FILE_NAME                                   FILE_ID TABLESPACE
---------------------------------------- ---------- ----------
/u01/oracle/oradata/orcl/example01.dbf            5 EXAMPLE
/u01/oracle/oradata/orcl/users01.dbf              4 USERS
/u01/oracle/oradata/orcl/sysaux01.dbf             3 SYSAUX
/u01/oracle/oradata/orcl/undotbs01.dbf            2 UNDOTBS1
/u01/oracle/oradata/orcl/system01.dbf            1 SYSTEM
/u01/oracle/oradata/orcl/t1.dbf                   6 T1
/u01/oracle/oradata/orcl/t2.dbf                   7 T2
/u01/oracle/oradata/orcl/b1.dbf                   8 B1

--上面两个表做一个等值链接,就可以查看表空间名及其对应的状态
SQL> select d.tablespace_name,d.file_id,f.status,f.enabled from dba_data_files d,v$datafile f where d.file_id=f.file#;

TABLESPACE    FILE_ID STATUS ENABLED
---------- ---------- ------- ----------
SYSTEM              1 SYSTEM READ WRITE
UNDOTBS1            2 ONLINE READ WRITE
SYSAUX              3 ONLINE READ WRITE
USERS               4 ONLINE READ WRITE
EXAMPLE             5 ONLINE READ WRITE
T1                  6 ONLINE READ WRITE
T2                  7 ONLINE READ WRITE
B1                  8 ONLINE READ WRITE

只读与读写
只读的表空间表示表空间上的数据只能被查询,不能做任何修改
当表空间的状态被修改为只读时,将引起这个表空间上的检查点事件
只读表空间上的对象可以被删除(只读表空间不能做DML操作,但可以做DDL操作)

--查询emp表在哪个表空间上
SQL> select table_name,tablespace_name from dba_tables where table_name=‘EMP‘;

TABLE_NAME                     TABLESPACE
------------------------------ ----------
EMP                            USERS

SQL> alter tablespace users read only;

SQL> update scott.emp set sal=sal+1000; --去修改scott.emp不能被修改
update scott.emp set sal=sal+1000
             *
ERROR at line 1:
ORA-00372: file 4 cannot be modified at this time
ORA-01110: data file 4: ‘/u01/oracle/oradata/orcl/users01.dbf‘

SQL> create table scott.emp9 as select * from scott.emp;
create table scott.emp9 as select * from scott.emp
                                               *
ERROR at line 1:
ORA-01647: tablespace ‘USERS‘ is read only, cannot allocate space in it

SQL> drop table scott.emp; --虽然只读了,还是可以drop掉

Table dropped.

SQL> alter tablespace users read write; --再改为读写,就可以执行DML了

------------------------------------------------------------------
表空间的联机和脱机
    online /offline

offline状态的表空间是不可访问的,表示表空间上的所有数据不能被访问,没有与实例进行关联
表空间在offline时也会有检查点事件

SQL> alter tablespace users offline; --把users表空间脱机

SQL> select d.tablespace_name,d.file_id,f.status,f.enabled from dba_data_files d,v$datafile f where d.file_id=f.file#;

TABLESPACE    FILE_ID STATUS ENABLED
---------- ---------- ------- ----------
SYSTEM              1 SYSTEM READ WRITE
UNDOTBS1            2 ONLINE READ WRITE
SYSAUX              3 ONLINE READ WRITE
USERS               4 OFFLINE DISABLED
EXAMPLE             5 ONLINE READ WRITE
T1                  6 ONLINE READ WRITE
T2                  7 ONLINE READ WRITE
B1                  8 ONLINE READ WRITE

SQL> update scott.emp set sal=sal+1000;
update scott.emp set sal=sal+1000
             *
ERROR at line 1:
ORA-00376: file 4 cannot be read at this time
ORA-01110: data file 4: ‘/u01/oracle/oradata/orcl/users01.dbf‘


SQL> alter tablespace users online;   --再改回online状态

特殊的三种类型表空间:
system      必须online      必须read write
sysaux      可以offline     不能read only
undo       不能offline 不能read only

-------------------------------
表空间的改名

哪些表空间不能改名
1,system ,sysaux 不能改名
2,database_properties下地默认的用户表空间和默认的temp表空间不要去改,因为正在使用

SQL> select PROPERTY_NAME,PROPERTY_VALUE from database_properties where PROPERTY_NAME like ‘%DEFAULT%‘;

PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ----------------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   USERS
DEFAULT_TBS_TYPE               SMALLFILE

SQL> alter tablespace t1 rename to t3;

================================================================

表空间大小的改变

DBA很基本的一个管理工作就是要确保空间够用


表空间的大小由数据文件之和所决定


改变表空间大小有三种方法:
1,启动自动扩展
2,手工改变数据文件大小 resize
3, 为表空间增加一个数据文件

SQL> select TABLESPACE_NAME,FILE_NAME,AUTOEXTENSIBLE from dba_data_files;

TABLESPACE FILE_NAME                                AUT
---------- ---------------------------------------- ---
EXAMPLE    /u01/oracle/oradata/orcl/example01.dbf   YES
USERS      /u01/oracle/oradata/orcl/users01.dbf     YES
SYSAUX     /u01/oracle/oradata/orcl/sysaux01.dbf    YES
UNDOTBS1   /u01/oracle/oradata/orcl/undotbs01.dbf   YES
SYSTEM     /u01/oracle/oradata/orcl/system01.dbf    YES
T1         /u01/oracle/oradata/orcl/t1.dbf          NO
T2         /u01/oracle/oradata/orcl/t2.dbf          NO
B1         /u01/oracle/oradata/orcl/b1.dbf          NO


--下面这句是官档上的一个例子
ALTER TABLESPACE users
    ADD DATAFILE ‘/u02/oracle/rbdb1/users03.dbf‘ SIZE 10M
      AUTOEXTEND ON      --打开自动扩展
      NEXT 512K       --每次扩展多大
      MAXSIZE 250M;      --扩展的最大值


SQL> alter database datafile ‘/u01/oracle/oradata/orcl/t1.dbf‘ autoextend on; --把t1.dbf打开自动扩展


SQL> alter database datafile ‘/u01/oracle/oradata/orcl/t2.dbf‘ autoextend on next 1m maxsize 1G;
--把t2.dbf打开自动扩展,并指定一次扩展1M,最大扩展到1G;


SQL> select FILE_NAME,AUTOEXTENSIBLE,INCREMENT_BY,MAXBYTES/1024/1024 max from dba_data_files;

FILE_NAME                                AUT INCREMENT_BY        MAX
---------------------------------------- --- ------------ ----------
/u01/oracle/oradata/orcl/example01.dbf   YES           80 32767.9844
/u01/oracle/oradata/orcl/users01.dbf     YES          160 32767.9844
/u01/oracle/oradata/orcl/sysaux01.dbf    YES         1280 32767.9844
/u01/oracle/oradata/orcl/undotbs01.dbf   YES          640 32767.9844
/u01/oracle/oradata/orcl/system01.dbf    YES         1280 32767.9844
/u01/oracle/oradata/orcl/t1.dbf          YES            1 32767.9844
/u01/oracle/oradata/orcl/t2.dbf          YES          128       1024
/u01/oracle/oradata/orcl/b1.dbf          NO            0          0
--可以从t1和t2每次扩展的单位得知:默认自动扩展1个block,128个block就是1M


SQL> alter database datafile ‘/u01/oracle/oradata/orcl/b1.dbf‘ autoextend on;
--把前面建的bigfile表空间给打开自动扩展

SQL> select FILE_NAME,AUTOEXTENSIBLE,INCREMENT_BY,MAXBYTES/1024/1024 max from dba_data_files;

FILE_NAME                                AUT INCREMENT_BY        MAX
---------------------------------------- --- ------------ ----------
/u01/oracle/oradata/orcl/example01.dbf   YES           80 32767.9844
/u01/oracle/oradata/orcl/users01.dbf     YES          160 32767.9844
/u01/oracle/oradata/orcl/sysaux01.dbf    YES         1280 32767.9844
/u01/oracle/oradata/orcl/undotbs01.dbf   YES          640 32767.9844
/u01/oracle/oradata/orcl/system01.dbf    YES         1280 32767.9844
/u01/oracle/oradata/orcl/t1.dbf          YES            1 32767.9844
/u01/oracle/oradata/orcl/t2.dbf          YES          128       1024
/u01/oracle/oradata/orcl/b1.dbf          YES            1   33554432
--可以看到没有限制的maxsize的都是无限制,并且可以看了bigfile b1.dbf的最大值很大

手工resize数据文件

--下面是官档的一个例子
ALTER DATABASE DATAFILE ‘/u02/oracle/rbdb1/stuff01.dbf‘
   RESIZE 100M;


--查看数据文件的大小
SQL> select file_name,bytes+8192 from dba_data_files;

FILE_NAME                                BYTES+8192
---------------------------------------- ----------
/u01/oracle/oradata/orcl/example01.dbf    104865792
/u01/oracle/oradata/orcl/users01.dbf      108797952
/u01/oracle/oradata/orcl/sysaux01.dbf     272637952
/u01/oracle/oradata/orcl/undotbs01.dbf     31465472
/u01/oracle/oradata/orcl/system01.dbf     513810432
/u01/oracle/oradata/orcl/t1.dbf           104865792
/u01/oracle/oradata/orcl/t2.dbf            10493952
/u01/oracle/oradata/orcl/b1.dbf           104865792

使用ll /u01/oracle/oradata/orcl/ 直接在操作系统上去查看大小 

--从上面的结果发现dba_data_files里记录的大小都要加上8192(一个块的大小)就和操作系统上的大小一致;这与linux系统有关,用来记录操作系统信息的


SQL> select file_name,bytes/1024/1024 Mbytes from dba_data_files;

FILE_NAME                                    MBYTES
---------------------------------------- ----------
/u01/oracle/oradata/orcl/example01.dbf          100
/u01/oracle/oradata/orcl/users01.dbf         103.75
/u01/oracle/oradata/orcl/sysaux01.dbf           260
/u01/oracle/oradata/orcl/undotbs01.dbf           30
/u01/oracle/oradata/orcl/system01.dbf           490
/u01/oracle/oradata/orcl/t1.dbf                100
/u01/oracle/oradata/orcl/t2.dbf                  10
/u01/oracle/oradata/orcl/b1.dbf                 100

resize大小 可以分为增加大小 和 减少大小

增加大小:如果数据库controlfile定义的maxdatafiles的最大数据文件个数达到最大值,可以使用resize去增加大小; bigfile 表空间不允许增加datafile

减少大小:要考虑数据的大小总和,不能减小到比数据大小和小的值

增加:

SQL> alter tablespace b1 resize 180m;   --bigfile 表空间可以这样resize,因为bigfile表空间只允许一个datafile,所以可以这样

Tablespace altered.

SQL> alter tablespace t1 resize 180m; 
alter tablespace t1 resize 180m
*
ERROR at line 1:
ORA-32773: operation not supported for smallfile tablespace T1
--smallfile表空间不能这样写,因为smallfile表空间允许多个datafile,而resize操作是针对datafile的,所以不能这样


SQL> alter database datafile ‘/u01/oracle/oradata/orcl/t1.dbf‘ resize 180m;
--把t1增加到180m;所以smallfile表空间只能使用alter database datafile针对datafile去进行resize

缩小:
    缩小表空间大小之前要计算数据大小

先计算表空间的可用空间:
SQL> select tablespace_name,bytes/1024/1024 ,USER_BYTES/1024/1024 from dba_data_files;

TABLESPACE BYTES/1024/1024 USER_BYTES/1024/1024
---------- --------------- --------------------
EXAMPLE                100              99.9375
USERS               103.75             103.6875
SYSAUX                 260             259.9375
UNDOTBS1                30              29.9375
SYSTEM                 490             489.9375
T1                     180             179.9375
T2                      10               9.9375
B1                     180              179.875
T3                     100              99.9375
--bytes是总大小,user_bytes是真正的可用空间(总大小减去了无数据后的大小)

SQL> select tablespace_name,bytes/1024/1024 from dba_free_space where tablespace_name=‘USERS‘;

TABLESPACE BYTES/1024/1024
---------- ---------------
USERS                .0625
USERS              99.6875
--查看users上的free空间

把上面的可用空间减去free空间就得到了数据占用的空间


SQL> alter database datafile ‘/u01/oracle/oradata/orcl/users01.dbf‘ resize 1m;
alter database datafile ‘/u01/oracle/oradata/orcl/users01.dbf‘ resize 1m
*
ERROR at line 1:
ORA-03297: file contains used data beyond requested RESIZE value
--把users表空间缩小为1M,报错说里面的数据大于要缩小的值

SQL> alter database datafile ‘/u01/oracle/oradata/orcl/users01.dbf‘ resize 5m; --上面计算的数据大小为4M左右,所以缩小为5成功


小实验:表空间上写满的情况

SQL> alter database datafile ‘/u01/oracle/oradata/orcl/t1.dbf‘ resize 1m;
--把t1.dbf改小为1m

SQL> create user t1 identified by t1 default tablespace t1;
--创建一个用户t1,密码为t1,并且默认表空间为t1

SQL> select username,DEFAULT_TABLESPACE from dba_users;
--这条语句可以查看每个用户及其对应的默认表空间

SQL> grant connect,resource to t1;
--授权给t1连接和建表的权限

SQL> conn t1/t1
Connected.
SQL> create table t1 (id number,name varchar2(30));

--下面写一个小存储过程,循环插入1000条数据
SQL> begin
 2 for i in 1..1000 loop
 3 insert into t1 values (i,‘a||i‘);
 4 end loop;
 5 end;
 6 /

PL/SQL procedure successfully completed.

SQL> insert into t1 select * from t1;

1000 rows created.

SQL> /

2000 rows created.

SQL> /

4000 rows created.

SQL> /

8000 rows created.

SQL> /

16000 rows created.

SQL> /
insert into t1 select * from t1
*
ERROR at line 1:
ORA-01653: unable to extend table T1.T1 by 8 in tablespace T1
--数据不能插入进去了,因为大小不够

第三种增大的方法:
    对一个表空间增加数据文件

SQL> alter tablespace t1 add datafile ‘/u01/oracle/oradata/orcl/t11.dbf‘ size 5m;
--对t1表空间增加一个数据文件,大小为5m;再去做上面的插入实验,就又可以再插入一定量的数据


一个表空间对应多个数据文件
一是不方便管理
二是一次检查点的代价比较高
也有好处就是增加数据文件分散存放,对均衡IO有好处

----------------------------------------------------------

表空间的数据文件的重命名和重定位

SQL> alter tablespace t1 offline;
--先脱机表空间


SQL> ho cp /u01/oracle/oradata/orcl/t11.dbf /u01/oracle/oradata/
--物理上拷贝

SQL> alter tablespace t1 rename datafile ‘/u01/oracle/oradata/orcl/t11.dbf‘ to ‘/u01/oracle/oradata/t11.dbf‘;
--逻辑上重定位


SQL> alter tablespace t1 online;
--表空间联机


SQL> select tablespace_name,file_name from dba_data_files where tablespace_name=‘T1‘;

TABLESPACE_NAME      FILE_NAME
-------------------- ----------------------------------------
T1                   /u01/oracle/oradata/orcl/t1.dbf
T1                   /u01/oracle/oradata/t11.dbf
--再次查找视图就发现已经重定位了

-------------------------------------------------------------------

表空间的删除

有些表空间不能直接删除
    system表空间
    undo表空间
    默认的用户表空间和临时表空间
SQL> drop tablespace t2;
--删除没有数据的表空间,直接这样删除
SQL> drop tablespace t1;
drop tablespace t1
*
ERROR at line 1:
ORA-01549: tablespace not empty, use INCLUDING CONTENTS option
--有数据的表空间,报错


SQL> drop tablespace t1 including contents;
--连同表空间的数据一起删除


但要注意,上面的删除,物理文件还存在

SQL> create tablespace t1 datafile ‘/u01/oracle/oradata/orcl/t1.dbf‘ reuse;


SQL> drop tablespace t1 including contents and datafiles;
--这样连同物理数据文件也一起删除
------------------------------------------------------------
临时表空间:

查看默认临时表空间

SQL> select * from database_properties where property_name like ‘%TEMP%‘;

创建临时表空间

SQL> create temporary tablespace temp2 tempfile ‘/u01/oracle/oradata/orcl/temp02.dbf‘ size 30m ;
--注意两个关键字;temporary,tempfile

关于临时表空间的删除,增加和缩小都是和上面讲的过程一样

修改默认临时表空间
SQL> alter database default temporary tablespace temp2;

SQL> alter database default temporary tablespace temp;

查看用户的默认临时表空间
SQL> select username,TEMPORARY_TABLESPACE from dba_users;

默认临时表空间的限制:
    不能被删除,除非有一个新的可用的临时表空间
    临时表空间不能脱机
    也不能转换为永久表空间

临时表空间组   10G引入的
SQL> create temporary tablespace temp3 tempfile ‘/u01/oracle/oradata/orcl/temp03.dbf‘ size 30m tablespace group temp_group;
--创建一个临时表空间temp3,并创建了temp_group这个组


SQL> alter tablespace temp2 tablespace group temp_group;
--把temp2加入到temp_group组 

SQL> alter database default temporary tablespace temp_group;
--把数据库默认临时表空间指定为这个临时表空间组

SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEMP_GROUP                     TEMP2
TEMP_GROUP                     TEMP3
--查看临时表空间组的信息

SQL> alter tablespace temp2 tablespace group ‘‘;
--把temp2移出临时表空间组

SQL> select * from dba_tablespace_groups;

GROUP_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEMP_GROUP                     TEMP3

----------------------------------------------------------------------


undo
       记录事务提交前的映像


Undo records are used to:

      Roll back transactions when a ROLLBACK statement is issued --事务回滚
      Recover the database      --恢复数据库

      Provide read consistency --读一致性

      Analyze data as of an earlier point in time by using Oracle Flashback Query   --闪回查询

      Recover from logical corruptions using Oracle Flashback features
--闪回恢复 

 


事务的回滚和前滾

回滚:没有提交的事务回滚

前滚:已经提交的事务,还没有来得及写入到数据文件中去;在启动数据库时会进行smon进程的实例恢复,读取undo的段头,找到相应信息,去redo日志中找记录,重新做一次

 


DML操作

insert   delete   update 三种操作产生的undo信息哪个最多,哪个最少

insert 最少,它只需要在undo里记录一个rowid(行记录),rollback时,直接干掉这行就可以

update 居中,在undo里记录行里修改的那一部分,rollback时,把原数据改回去就可以

delete 最多,在undo里记录整行,rollback时,把记录的整行数据insert回去


SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS1 --默认的undo表空间


--创建undo表空间
SQL> create undo tablespace undo1 datafile ‘/u01/oracle/oradata/orcl/undo1.dbf ‘size 50m;


--修改默认的undo表空间
SQL> alter system set undo_tablespace=undo1;


--undo表空间的删除
SQL> drop tablespace undo1; 
drop tablespace undo1
*
ERROR at line 1:
ORA-30013: undo tablespace ‘UNDO1‘ is currently in use
--默认的undo表空间,不能删除

SQL> alter system set undo_tablespace=undotbs1;
SQL> drop tablespace undo1;
--切换默认undo表空间,再删除就可以


undo表空间的重命名:
    和表空间的重命名一样
    但这里有一点要注意

SQL> show parameter undo_t

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

SQL> alter tablespace undotbs1 rename to undo1;
--把undotbs1改为undo1

SQL> show parameter undo_t

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1
--查看这里,名字还是原来的


SQL> ho strings /u01/oracle/10g/dbs/spfileorcl.ora |grep undo_t
*.undo_tablespace=‘UNDO1‘
--但查看spfile里的参数,已经被修改了

 

 

 

 

SQL> select TABLESPACE_NAME,CONTENTS,RETENTION from dba_tablespaces;

TABLESPACE_NAME                CONTENTS RETENTION
------------------------------ --------- -----------
SYSTEM                         PERMANENT NOT APPLY
UNDOTBS1                       UNDO      NOGUARANTEE
SYSAUX                         PERMANENT NOT APPLY
TEMP                           TEMPORARY NOT APPLY
USERS                          PERMANENT NOT APPLY
EXAMPLE                        PERMANENT NOT APPLY
T2                             PERMANENT NOT APPLY
B1                             PERMANENT NOT APPLY
T3                             PERMANENT NOT APPLY
TEMP2                          TEMPORARY NOT APPLY
TEMP3                          TEMPORARY NOT APPLY

not apply:表示不是undo表空间,别的表空间没有这个属性

undo表空间有下面两种属性:
guarantee:保证:   在undo表空间不够时,新的undo数据不能覆盖那些inactive又没有expired的undo 块;直接报错

noguarantee:不保证: undo表空间不够时,新的undo数据可以覆盖


SQL> show parameter undo_retention

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_retention                       integer     900
--设置undo表空间的历史数据保留多久,单位为秒

 


undo表空间的大小计算公式:
undo_tablespace_size = undo_retention * 每秒的块的峰值 * db_block_size + db_block_size


SQL> select sum(undoblks)/sum((end_time-begin_time)*10800) from v$undostat;

SUM(UNDOBLKS)/SUM((END_TIME-BEGIN_TIME)*10800)
----------------------------------------------
                                    .242178251

 

SQL> select (900*0.242178251*8192+8192)/1024/1024 from dual;

(900*0.242178251*8192+8192)/1024/1024
-------------------------------------
                           1.71062833


SQL> select * from v$rollname;

       USN NAME
---------- ------------------------------
         0 SYSTEM     --系统回滚段,存放system表空间的undo数据
         1 _SYSSMU1$
         2 _SYSSMU2$
         3 _SYSSMU3$
         4 _SYSSMU4$
         5 _SYSSMU5$
         6 _SYSSMU6$
         7 _SYSSMU7$
         8 _SYSSMU8$
         9 _SYSSMU9$
        10 _SYSSMU10$
--分段了十个非系统段,存放不是system表空间的undo数据


SQL> alter rollback segment "_SYSSMU10$" offline;


SQL> alter rollback segment "_SYSSMU10$" online;


SQL> select segment_name,segment_type from dba_segments where segment_type like ‘%DEFE%‘;

no rows selected

SQL> alter tablespace users offline;

Tablespace altered.

SQL> select segment_name,segment_type from dba_segments where segment_type like ‘%DEFE%‘;

SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
1.61249
DEFERRED ROLLBACK


SQL> alter tablespace users online;


SQL> show parameter undo_m

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
--自动的管理方式,手动过时,不再讨论

 

本文出自 “8221017” 博客,请务必保留此出处http://8231017.blog.51cto.com/8221017/1392222

Oracle表空间管理,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。