存储管理之段收缩、可恢复空间

本文介绍了Oracle数据库中表空间的使用情况监控方法,包括如何扩展表空间、创建表及插入数据的影响,并详细展示了段收缩的过程及其效果。此外,还讨论了如何管理可恢复空间,通过设置可恢复选项来处理表空间满的问题。
表空间的使用情况监控:
SQL> select tablespace_name,sum(bytes)/1024/1024 "free(M)" from dba_free_space g
roup by tablespace_name;

TABLESPACE_NAME                   free(M)
------------------------------                  ----------
UNDOTBS1                                     284.9375
SYSAUX                                           14.5625
USERS                                             4.375
SYSTEM                                           6.5
EXAMPLE                                         22.3125

扩展users表空间到100m
SQL> alter database datafile 4 resize 100m;

数据库已更改。

SQL>
SQL> select tablespace_name,sum(bytes)/1024/1024 "free(M)" from dba_free_space g
roup by tablespace_name;

TABLESPACE    free(M)
---------- ----------
UNDOTBS1     284.9375
SYSAUX        14.5625
USERS          94.375
SYSTEM            6.5
EXAMPLE       22.3125

创建T1表,插入数据,查看表空间变化
SQL> create table t1 as select * from dba_objects;

表已创建。

SQL> insert into t1 select * from t1;

已创建50646行。

SQL> select tablespace_name,sum(bytes)/1024/1024 "free(M)" from dba_free_space g
roup by tablespace_name;

TABLESPACE    free(M)
---------- ----------
UNDOTBS1     284.9375
SYSAUX        14.5625
USERS          82.375
SYSTEM            6.5
EXAMPLE       22.3125

段收缩测试:
SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1

收集统计信息
SQL> exec dbms_stats.gather_table_stats('SCOTT','T1');

PL/SQL 过程已成功完成。

SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1                                   1524

启动行移动
SQL> alter table t1 enable row movement;

表已更改。

删除5000行数据,查看表的块数量
SQL> delete from t1 where rownum<50000;

已删除49999行。

SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1                                   1524


此时没有改变,即使收集统计信息后,也没有改变,因为删除并不释放数据块
SQL> exec dbms_stats.gather_table_stats('SCOTT','T1');

PL/SQL 过程已成功完成。

SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1                                   1524

然后进行段收缩操作
SQL> alter table t1 shrink space ;

表已更改。

SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1                                   1524

SQL> exec dbms_stats.gather_table_stats('SCOTT','T1');

PL/SQL 过程已成功完成。

SQL> select table_name,blocks from user_tables where table_name='T1';

TABLE_NAME                         BLOCKS
------------------------------ ----------
T1                                    706

这样发现块数量减少到了706达到了释放块的目的

管理可恢复空间
创建不能自动扩展的表空间
SQL> create tablespace test datafile 'd:\test.dbf' size 1m
  2  /

表空间已创建。

SQL> create table tt as select * from user_tables;

表已创建。

SQL> alter table tt move tablespace test;

表已更改。

SQL> insert into tt select * from tt;

已创建5行。

SQL> insert into tt select * from tt;

已创建10行。

SQL> insert into tt select * from tt;

已创建20行。

SQL> insert into tt select * from tt;

已创建40行。

SQL> insert into tt select * from tt;

已创建80行。

SQL> insert into tt select * from tt;

已创建160行。

SQL> insert into tt select * from tt;

已创建320行。

SQL> insert into tt select * from tt;

已创建640行。

SQL> insert into tt select * from tt;

已创建1280行。

SQL> insert into tt select * from tt;
insert into tt select * from tt
*
第 1 行出现错误:
ORA-01653: unable to extend table SCOTT.TT by 8 in tablespace TEST

此时没有打开可恢复功能,于是该操作将被回滚掉

然后打开可恢复功能
SQL> commit;

提交完成。

SQL> alter session enable resumable;

会话已更改。

SQL> insert into tt select * from tt;
这时发现这个插入操作将被挂起

在另一个session,查看test.dbf的文件号
SQL> col file_name format a50;
SQL> select file_name,file_id from dba_data_files;

FILE_NAME                                             FILE_ID
-------------------------------------------------- ----------
F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\USERS01          4
.DBF

F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\SYSAUX0          3
1.DBF

F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\UNDOTBS          2
01.DBF

F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\SYSTEM0          1
1.DBF

FILE_NAME                                             FILE_ID
-------------------------------------------------- ----------

F:\ORACLE\PRODUCT\10.2.0\DB_1\ORADATA\ORCL\EXAMPLE          5
01.DBF

D:\TEST.DBF                                                 6

已选择6行。

将test.dbf扩展到10M
SQL> alter database datafile 6 resize 10m;

数据库已更改。


然后回到之前的session
SQL> insert into tt select * from tt;

已创建2560行。
挂起的操作此时完成了

另外可以设置挂起时间,10秒
SQL> alter session enable resumable timeout 10;

会话已更改。

。。。。。。

然后挂起10秒后,还没有处理该问题就报错

SQL> insert into tt select * from tt;

已创建5120行。

SQL>
SQL> insert into tt select * from tt;

已创建10240行。

SQL> insert into tt select * from tt;
insert into tt select * from tt
*
第 1 行出现错误:
ORA-30032: the suspended (resumable) statement has timed out
ORA-01653: unable to extend table SCOTT.TT by 128 in tablespace TEST



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24104518/viewspace-712745/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24104518/viewspace-712745/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值