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