星期四, 11月 14, 2013

[轉載] 可恢复的空间分配 Resumable space allocation  (for 10g+)

Ref: http://yangyuncheng1010.blog.163.com/blog/static/1374484152011283753100/

Oracle 10g之前,當我們正在進行大批量資料的插入操作(例如500000條記錄),而導致磁碟空間耗盡的時候,整個操作被終止並且回滾,可能已經處理了大量的資料,只剩下1000條記錄,之前的操作全部回滾,又要消耗非常多的資源

為了避免這種情況,Oracle10g推出了一個新的技術

Resumable space allocation

一個大的操作導致空間耗盡時,讓該操作暫停並且掛起,我們添加新的空間以後,再次恢復該操作

空間耗盡的情況還是挺多的

1、磁碟空間耗盡

2、被操作的表的extents個數達到最大

3、執行操作用戶的quota達到最大

4、能夠被掛起的使用者必須具有resumable系統許可權

SQL> show parameter resumable_timeout

NAME                                       TYPE        VALUE

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

resumable_timeout                   integer       0

這個參數表示掛起時間超過設定以後,回滾事務,如果設置為0,表示不啟用掛起,直接回滾。

SQL> alter system set resumable_timeout=10;

系統已更改。

SQL> show parameter resumable_timeout

NAME                                       TYPE        VALUE

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

resumable_timeout                    integer     10

測試:

SQL> create user test identified by test;

用戶已創建。

SQL> grant resource,connect,resumable to test;

授權成功。

SQL> alter user test quota 1M on yyc ;

用戶已更改。

SQL> alter system set resumable_timeout=0;

系統已更改。

SQL> show parameter resumable_timeout

NAME                                         TYPE        VALUE

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

resumable_timeout                    integer     0

SQL> grant select on dba_users to test;

授權成功。

SQL> conn test/test

已連接。

SQL> create table test tablespace yyc as select * from dba_users;

表已創建。

插入資料:

SQL> insert into test select * from test;

已創建1856行。

SQL> commit;

提交完成。

SQL> insert into test select * from test;

已創建3712行。

SQL> select count(*) from test;

  COUNT(*)

----------

      7424

SQL> insert into test select * from test;

insert into test select * from test

*

1 行出現錯誤:

ORA-01536: 超出表空間 'YYC' 的空間限額

SQL> select count(*) from test;

  COUNT(*)

----------

      7424

插入不成功的會話直接回滾。

SQL> alter system set resumable_timeout=5;

系統已更改。

SQL> insert into test select * from test;

insert into test select * from test

*

1 行出現錯誤:

ORA-30032: 掛起的 (可恢復) 語句已超時

ORA-01536: 超出表空間 'YYC' 的空間限額

提示超時。

設置長時間超時:

SQL> alter system set resumable_timeout=500;

系統已更改。

SQL> insert into test select * from test;

插入資料掛起

修改空間限額:

SQL> alter user test quota 20m on yyc;

用戶已更改。

插入成功:

SQL> insert into test select * from test;

已創建7424行。

SQL> commit;

提交完成。

提示:在掛起時可以查看v$session_wait查看掛起。dba_resumable可以查看到正在掛起的語句。

 

沒有留言:

LinkWithin-相關文件

Related Posts Plugin for WordPress, Blogger...