//通过视频学习的,表空间及数据文件的具体路径请根据实际情况更改。
//普通表空间的数据文件最大可以扩展到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)
当我们往一个表里面插入大量数据时,如果某条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