三种方式调整表空间大小:维保数据库时应该考虑。

本文介绍了三种调整Oracle数据库表空间尺寸的方法:增加数据文件大小、添加新的数据文件以及设置自动增长,并展示了如何通过Resumable功能来处理因空间不足导致的SQL语句中断问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//通过视频学习的,表空间及数据文件的具体路径请根据实际情况更改。

//普通表空间的数据文件最大可以扩展到32G。


如何调整表空间的尺寸


(表空间的大小等同它下的数据文件大小之和)

   表空间的操作在sys下

当发生表空间不足的问题时常用的3个解决办法:

 

1)增加数据文件大小(resize)

 

alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize10m;

 

2)增加数据文件(add datafile)

 

alter tablespace timran add datafile'/u01/oradata/timran11g/timran02.dbf' size 20m;

 

3)设置表空间自动增长(autoextend)

 

alter database datafile '/u01/oradata/timran11g/timran01.dbf' autoextendon next 10m maxsize 500m;

随便拓展一个数据文件就可以。

 

例:

SQL>create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size5m;

05:46:08SQL> create table scott.test1 (id int) tablespace timran;

05:47:12SQL> insert into scott.test1 values(1);

05:47:15SQL> insert into scott.test1 select * from scott.test1;

05:47:23SQL> /

05:47:23SQL> /

32768rows created.

05:47:23SQL> /

insertinto scott.test1 select * from scott.test1

*

ERRORat line 1:

ORA-01653:unable to extend table SCOTT.TEST1 by 8 in tablespace TIMRAN

 

//用第一种方法扩充表空间

05:47:23SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf' resize10m;

 

05:48:18SQL> insert into scott.test1 select * from scott.test1;

 

05:48:25SQL> /

 

131072rows created.

 

05:48:26SQL> /

insertinto scott.test1 select * from scott.test1

*

ERRORat line 1:

ORA-01653:unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN

 

//用第二种方法扩充表空间:

 

05:48:57SQL> alter tablespace timran add datafile'/u01/oradata/timran11g/timran02.dbf' size 20m;

 

05:49:04SQL> insert into scott.test1 select * from scott.test1;

 

05:49:13SQL> /

 

524288rows created.

 

05:49:14SQL> /

insertinto scott.test1 select * from scott.test1

*

ERRORat line 1:

ORA-01653:unable to extend table SCOTT.TEST1 by 128 in tablespace TIMRAN

 

//用第三种方法扩充表空间:

 

05:49:15SQL> alter database datafile '/u01/oradata/timran11g/timran01.dbf'autoextend on next 10m maxsize 500m;

 

05:49:33SQL> insert into scott.test1 select * from scott.test1;

 

05:49:37SQL> drop tablespace timran including contents and datafiles;

 

备注: 可恢复空间分配 Oracle的Resumable(可恢复)功能(PPT-II-502)

11g新功能

 

当我们往一个表里面插入大量数据时,如果某条insert语句因表空间的空间不足(没有开启自动扩展),会报 ORA-01653:无法扩展空间的错误,该条SQL语句会中断,白白浪费了时间及数据库资源。为防范这个问题,Oracle设计了一个功能:resumable。在resumable开启的情况下,如果Oracle执行某条SQL申请不到空间了,比如数据表空间,undob表空间,temporary空间等,则会将该事务的语句挂起(suspended),等你把空间扩展后,Oracle又会使该insert语句继续进行。

 

可以通过两个级别设置resumable

 

system级别:初始化参数RESUMABLE_TIMEOUT非0,这将使数据库中所有session使用可恢复的空间分配

session级别:alter session enable|disable resumable [TIMEOUT]; 这将为当前session设置可恢复的空间分配

 

因为resumable是有资源消耗代价的, 所以session级的resumable是比较实际的:

 

注意TIMEOUT的用法,单位为秒, 进一步要理解初始化参数RESUMABLE_TIMEOUT的含义

 

RESUMABLE_TIMEOUT=0,  enablesession时应该指定TIMEOUT。否则使用缺省值7200秒。

RESUMABLE_TIMEOUT<>0, enable session时可以省略TIMEOUT,如果此时指定TIMEOUT会覆盖掉参数RESUMABLE_TIMEOUT值。

 

举例:

 

session 1:

 

1)建个小表空间,固定2m大小,然后建个表属于这个表空间

 

SQL>create tablespace small datafile '/u01/oradata/timran11g/small01.dbf' size 2m;

SQL>create table scott.test(n1 char(1000)) tablespace small;

 

2)向这个表插入数据,表空间满了,使for语句没有完成循环,2000条语句整体失败。

SQL>

begin

fori in 1..2000 loop

insertinto scott.test values('this is test');

endloop;

commit;

end;

/

 

begin

*

第 1 行出现错误:

ORA-01653:表 SCOTT.TEST 无法通过 128 (在表空间 SMALL 中) 扩展

ORA-06512:在 line 3

 

SQL>select count(*) from scott.test;

 

  COUNT(*)

----------

         0

 

3)使能 resumable功能

SQL>alter session enable resumable;

 

4)再重复第2)步,会话被挂起;

 

session 2:

 

5)查看视图的有关信息

 

SQL> select session_id,sql_text,error_number from dba_resumable;

 

SESSION_ID SQL_TEXT                                          ERROR_NUMBER

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

       136 INSERT INTO SCOTT.TEST VALUES('thisis test')              1653

 

SQL>select sid,event,seconds_in_wait from v$session_wait where sid=136;

 

       SID EVENT                                                           SECONDS_IN_WAIT

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

       136 statement suspended, wait error tobe cleared                                 1

 

 

6)加扩表空间,看到session1里挂起的会话成功完成了,不需要干预

 

 

SQL>alter tablespace small add datafile '/u01/oradata/timran11g/small02.dbf' size4m;

 

SQL>select count(*) from scott.test;

 

  COUNT(*)

----------

      2000

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值