//通過視頻學習的,表空間及數據文件的具體路徑請根據實際情況更改。
//普通表空間的數據文件最大可以擴展到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