ORA-30036: 無法按 8 擴展段解決辦法

一、故障現象:

在刪除一個超大表的數據時報錯:ORA-30036:

SQL> delete fromCRT_CURING_PRESS_TEMPHISTORY

 2  whereRECORD_TIME<to_date('2017-06-30','yyyy-mm-dd');

delete from CRT_CURING_PRESS_TEMPHISTORY

1 行出現錯誤:

ORA-30036: 無法按 8 擴展段 (在還原表空間'UNDOTBS1' )

仔細檢查發現是由於undo表空間所在的數據文件已經使用達到32G所致。

二、解決辦法:

1、檢查undo表空間對應的數據文件目錄

SQL>select tablespace_name,file_name fromdba_data_files;

2、查看undo表空間使用率:

SQL>select file_name,bytes/1024/1024from dba_data_files where tablespace_name like 'UNDOTBS%'; 

或者、

SQL>SELECT a.tablespace_name as tablespace_name,

      to_char(b.total/1024/1024,999999.99) as Total,

      to_char((b.total-a.free)/1024/1024,999999.99) as Used,

      to_char(a.free/1024/1024,999999.99) as Free,

      to_char(round((total-free)/total,4)*100,999.99) as Used_Rate

FROM (SELECT tablespace_name, sum(bytes)free FROM DBA_FREE_SPACE GROUP BY tablespace_name) a,

    (SELECT tablespace_name, sum(bytes) total FROM DBA_DATA_FILES GROUP BYtablespace_name ) b

WHERE a.tablespace_name=b.tablespace_name

  ANDa.tablespace_name='UNDOTBS1'

ORDER BY a.tablespace_name;

3等待原UNDO表空間所有UNDO SEGMENT OFFLINE 

SQL>select usn,xacts,status,rssize/1024/1024,hwmsize/1024/1024,shrinks from v$rollstat order by rssize;  

SQL>selectt.segment_name,t.tablespace_name,t.segment_id,t.status from dba_rollback_segst; 

4、新增undo數據文件!

SQL>alter tablespace undotbs1 add datafile'D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF' size 1000m AUTOEXTEND on next200m maxsize unlimited;

5、刪除原有的UNDO表空間

SQL> create pfile from spfile; 

SQL> drop tablespace undotbs1 includingcontents; 

  最後需要在重啓數據庫或者重啓計算機後到存儲數據文件的路徑下刪除數據文件(爲什麼要手動刪除呢:以上步驟只是刪除了ORACLEundo表空間的邏輯關係,即刪除了數據文件在數據字典中的關聯,不會自動刪除項關聯的數據文件)。 

   droptablespace undotbs1 including contents and datafiles;  


新增undo數據文件!

SQL>alter tablespace undotbs1 add datafile'D:\APP\ADMINISTRATOR\ORADATA\ORCL\UNDOTBS02.DBF' size 1000m AUTOEXTEND on next200m maxsize unlimited;

3、原理通透:

UNDO 表空間用於存放UNDO數據,當執行DML操作(INSERT,UPDATEDELETE),oracle會將這些操作的舊數據寫入到UNDO, oracle9i之前,管理UNDO數據時使用(Rollback Segment)完成的.oracle9i開始,管理UNDO數據不僅可以使用回滾段,還可以使用UNDO表空間.因爲規劃和管理回滾段比較複雜,所有oracle database 10g已經完全丟棄用回滾段.並且使用UNDO表空間來管理UNDO數據.

UNDO數據也稱爲回滾(ROLLBACK)數據,它用於確保數據的一致性.當執行DML操作時,事務操作前的數據被稱爲UNDO記錄.UNDO段用於保存事務所修改數據的舊值,其中存儲着被修改數據塊的位置以及修改前數據,

UNDO數據的作用.

1,回退事務

當執行DML操作修改數據時,UNDO數據被存放到UNDO,而新數據則被存放到數據段中,如果事務操作存在問題,就需要回退事務,以取消事務變化.假定用戶A執行了語句UPDATEemp SET sal=1000 WHERE empno=7788後發現,應該修改僱員7963的工資,而不是僱員7788的工資,那麼通過執行ROLLBACK語句可以取消事務變化.當執行ROLLBACK命令時,oracle會將UNDO段的UNDO數據800(工資)寫回到數據段中.

2,讀一致性

用戶檢索數據庫數據時,oracle總是使用用戶只能看到被提交過的數據(讀取提交)或特定時間點的數據(SELECT語句時間點).這樣可以確保數據的一致性.例如,當用戶A執行語句 UPDATE emp SET sal=1000 WHERE empno=7788,UNDO記錄會被存放到回滾段中,而新數據則會存放到EMP段中;假定此時該數據尚未提交,並且用戶B執行SELECT salFROM emp WHERE empno=7788,此時用戶B將取得UNDO數據 800,而該數據正是在UNDO記錄中取得的.

3,事務恢復

事務恢復是例程恢復的一部分,它是由oracleserver自動完成的.如果在數據庫運行過程中出現例程失敗(如斷電,內存故障,後臺進程故障等),那麼當重啓oracle server,後臺進程SMON會自動執行例程恢復,執行例程恢復時,oracle會重新做所有未應用的記錄.回退未提交事務.

4,倒敘查詢(FlashBack Query)

倒敘查詢用於取得特定時間點的數據庫數據, 它是9i新增加的特性,假定當前時間爲上午11:00,某用戶在上午10:00執行UPDATE emp SET sal= 3500 WHERE empno=7788語句,修改並提交了事務(僱員原工資爲3000),爲了取得10:00之前的僱員工資,用戶可以使用倒敘查詢特徵.

使用UNDO參數

 

1,UNDO_MANAGEMENT

 

該初始化參數用於指定UNDO數據的管理方式.如果要使用自動管理模式,必須設置該參數爲AUTO,如果使用手工管理模式,必須設置該參數爲MANUAL,使用自動管理模式時, oracle會使用undo表空間管理undo管理,使用手工管理模式時,oracle會使用回滾段管理undo數據,

 

需要注意,使用自動管理模式時,如果沒有配置初始化參數UNDO_TABLESPACE,oracle會自動選擇第一個可用的UNDO表空間存放UNDO數據,如果沒有可用的UNDO表空間,oracle會使用SYSTEM回滾段存放UNDO記錄,並在ALTER文件中記載警告.

 

2,UNDO_TABLESPACE

 

該初始化參數用於指定例程所要使用的UNDO表空間,使用自動UNDO管理模式時,通過配置該參數可以指定例程所要使用的UNDO表空間.

 

RAC(RealApplication Cluster)結構中,因爲一個UNDO表空間不能由多個例程同時使用,所有必須爲每個例程配置一個獨立的UNDO表空間.

 

3,UNDO_RETENTION

該初始化參數用於控制UNDO數據的最大保留時間,其默認值爲900,9i開始,通過配置該初始化參數,可以指定undo數據的保留時間,從而確定倒敘查詢特徵(FlashbackQuery)可以查看到的最早時間點.

 

建立UNDO表空間,

 

UNDO表空間專門用於存放UNDO數據,並且在UNDO表空間尚不能建立任何數據對象(,索引,)

1,使用CREATE DATABASE命令建立UNDO表空間.

當使用CREATEDATABASE命令建立數據庫時,通過指定UNDO TABLESPACE選項,可以建立UNDO表空間.示例如下:

CREATE DATABASE db01

UNDO TABLESPACE undotbs_01

DATAFILE ‘/u01/oracle/rbdb1/undo0101.dbf’SIZE 30M;

 

注意:UNDO TABLESPACE 子句不是必須的,如果使用自動UNDO管理模式,並且沒有指定該子句,那麼建立數據庫時會自動生成名爲SYS_UNDOTBSUNDO表空間.

 

2,使用CREATE UNDOTABLESPACE命令建立UNDO表空間.

 

CREATE UNDO TABLESPACE undotbs2

DATAFILE ‘D:demoundotbs2.dbf’ SIZE 10M;

 

修改UNDO表空間,

使用ALTER TABLESPACE命令修改UNDO表空間.

當事務用盡了UNDO表空間後,使用ALTER TABLESPACE ADD DATAFILE增加數據文件

UNDO表空間所在的磁盤填滿是,使用ALTER TABLESPACE RENAME DATAFIEL 命令移動數據文件到其他磁盤上.

使用ALTER DATABASE OFFLINE/ONLINE使表空間脫機/聯機.

當數據庫處於ARCHIVELOG模式時,使用ALTER TABLESPACE BEGIN BACKUP/END BACKUP命令備份UNDO表空間.

 

切換UNDO表空間.

啓動例程並打開數據庫後,同一時刻特定例程只能使用一個UNDO表空間,切換UNDO表空間是指停止例程當前使用的UNDO表空間,並啓動其他UNDO表空間,下面以啓用undotbs2表空間爲例,說明切換UNDO表空間的方法.

ALTER SYSTEM SET undo_tablespace=undotbs02;

RAC(Real Application Cluster)機構中,不同例程必須使用獨立的UNDO表空間,而不能共用同一個UNDO表空間.

 

刪除UNDO表空間.

當前例程正在使用的UNDO表空間是不能被刪除的,如果確定要刪除當前例程正在使用的UNDO表空間,應首先切換UNDO表空間.然後刪除相應的UNDO表空間.

DROP TABLESPACE undotbs1;

 

1,確定當前例程正在使用的UNDO表空間.

Show parameter undo_tablespace

 

2,顯示數據庫的所有UNDO表空間.

SELECT tablespace_name FROMdba_tablespacesWHERE contents=’UNDO’;

3,顯示UNDO表空間統計信息.

 

使用自動UNDO管理模式時,需要合理地設置UNDO表空間的尺寸,爲例合理規劃UNDO表空間尺寸,應在數據庫運行的高峯階段蒐集UNDO表空間的統計信息.最終根據該統計信息確定UNDO表空間的尺寸.通過查詢動態性能視圖V%UNDOSTAT,可以蒐集UNDO統計信息.

 

SELECT TO_CHAR(BEGIN_TIME,’HH24:MI:SS’)BEGIN_TIME,

TO_CHAR(END_TIME,’HH24:MI:SS’) END_TIME,

UNDOBLKS

FROM V$UNDOSTAT;

 

BEGIN_TIME用於標識起始統計時間,END_TIME用於標識結束統計時間,UNDOBLKS用於標識UNDO數據所佔用的數據塊個數.oracle每隔10分鐘生成一行統計信息.

 

4,顯示UNDO段統計信息.

 

使用自動UNDO 管理模式時,oracle會在UNDO表空間上自動建立10UNDO,通過查詢動態信息視圖V$ROLLNAME,可以顯示所有聯機UNDO段的名稱,通過查詢動態性能視圖V$ROLLLISTAT,可以顯示UNDO段的統計信息.通過在V$ROLLNAMEV$ROLLLISTAT之間執行連接查詢,可以監視特定UNDO段的特定信息.

 

SELECT a.name, b.xacts, b.writes, b.extents

FROM v$rollname a, v$rollstat b

WHERE a.usn=b.usn;

 

Name用於標識UNDO段的名稱,xacts用於標識UNDO段所包含的活動事務個數,

Writes用於標識在undo段上所寫入的字節數,extents用於標識UNDO段的區個數.

5,顯示活動事務信息.

當執行DML操作時,oracle會將這些操作的舊數據放到UNDO段中,動態性能視圖v$session用於顯示會話的詳細信息,動態性能視圖v$transaction用於顯示事務的詳細信息,動態性能視圖v$rollname用於顯示聯機UNDO段的名稱.通過在這3個動態性能視圖之間執行連接查詢,可以確定正在執行事務操作的會話,事務所使用的UNDO,以及事務所佔用的UNDO塊個數.

Col username format a10

Col name format a10

SELECT a.username, b.name, c.used_ublk

FROM v$session a, v$rollname b,v$transaction c

WHERE a.saddr=c.ses_addr AND b.usn=c.xidusn

AND a.username='CURE';

6,顯示UNDO區信息

數據字典視圖dba_undo_extents用於顯示UNDO表空間所有區的詳細信息.包括UNDO區尺寸和狀態等信息.

SELECT extend_id, bytes, status FROMdba_undo_extents

WHERE segment_name’_SYSSMU5$’;

其中,extent_id用於標識區編號,bytes用於標識區尺寸,status用於標識區狀態(ACTIVE:表示該區處於活動狀態,EXPIRED:標識該區未用).


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章