ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 存储管理之段收缩、可恢复空间

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

原创 Linux操作系统 作者:物理狂人 时间:2011-12-05 14:33:06 0 删除 编辑
表空间的使用情况监控:
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博客 ” ,链接:https://blog.itpub.net/24104518/viewspace-712745/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: hash join概念
请登录后发表评论 登录
全部评论

注册时间:2010-06-16

  • 博文量
    80
  • 访问量
    159240