北京赛车pk10直播开奖
首頁
登錄 | 注冊

undo表空間使用率

undo表空間是Oracle數據庫非常重要的表空間,它的使用率也是DBA關注的重點,但是在繁忙的生產系統中,很容易看到undo表空間使用率非常高的情況,甚至達到100%。那么,undo表空間大小應該設置多大?undo塊是怎樣進行分配的?undo表空間使用率很高的時候應該怎么處理?本文針對上述問題進行說明。

      一、undo表空間大小設置
            1、首先根據數據庫和業務的情況,先預設一個undo 表空間的大小;
            2、待數據庫運行一段時間后,可以按照如下方法估算下合理的undo表空間大小:
                  計算公式:UR*(USP*DBS)
                                  UR表示undo_retention參數值
                                  UPS表示每秒產生的undo塊數量
                                  DBS表示數據庫塊大小

  1. SELECT (UR * (UPS * DBS)) AS "Bytes"
  2.   FROM (select max(tuned_undoretention) AS UR from v$undostat),
  3.        (SELECT undoblks / ((end_time - begin_time) * 86400) AS UPS
  4.           FROM v$undostat
  5.          WHERE undoblks = (SELECT MAX(undoblks) FROM v$undostat)),
  6.        (SELECT block_size AS DBS
  7.           FROM dba_tablespaces
  8.          WHERE tablespace_name =
  9.                (SELECT UPPER(value)
  10.                   FROM v$parameter
  11.                  WHERE name = 'undo_tablespace'));

二、自動管理的undo塊的分配算法

1、如果當前extent中還有空閑塊,在需要空間時會繼續使用本extent中的下一個空閑塊;

2、當前extent使用完后,如果下一個extent是expired,就跳轉到下一個extent的第一個數據塊;

3、如果下一個extent不是expired,就從undo表空間申請空間,如果undo表空間中存在空閑的空間,就分配新的extent加入到undo

segment,然后跳轉到新的undo extent的第一個數據塊;

4、如果undo表空間沒有空閑的空間,就從offine的undo segment中偷取(steal)expired的extent,將offine的undo segment中的

expired的 extent分配給當前的undo segment,并跳轉到新加入的extent的第一個數據塊;

5、如果在offine的undo segment中沒有expired的extent,就從online的undo segment中偷取expired的extent加入到當前undo

segment,并跳轉到新加入的extent的第一個空閑塊;

6、如果online的segment中沒有expired的extent,就擴展undo表空間數據文件(如果開啟了自動擴展),添加新的extent到當前的

undo segment;

7、如果undo表空間數據文件不能擴展,調低10%的retention值,然后偷取現在變為expired的undo extent;

8、從任意一個offine的undo segment中偷取unexpired的extent;

9、嘗試重用當前段中unexpired的extent,如果所有的extent處于currently busy(事務未提交),轉入到第10步;

10、嘗試重用任意一個online的undo segment中的unexpired extent;

11、如果上述所有的步驟都失敗,拋出ORA-30036 unable to extend segment by %s in undo tablespace '%s'。

從以上undo塊的分配算法可以看出,當undo表空間的使用率很高的時候,不一定就要增加undo表空間的大小,因為oracle會重用expired

的extent或者unexpired的extent。即使undo表空間使用率到達100%,數據庫也不一定會報錯。

undo表空間的使用率可以采用下面的方法查詢:

  1. SELECT /* + RULE */ df.tablespace_name "Tablespace",
  2. df.bytes / (1024 * 1024) "Size (MB)",
  3. SUM(fs.bytes) / (1024 * 1024) "Free (MB)",
  4. Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free",
  5. Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used"
  6. FROM dba_free_space fs,
  7. (SELECT tablespace_name,SUM(bytes) bytes
  8. FROM dba_data_files
  9. GROUP BY tablespace_name) df
  10. WHERE fs.tablespace_name (+) = df.tablespace_name
  11. GROUP BY df.tablespace_name,df.bytes
  12. UNION ALL
  13. SELECT /* + RULE */ df.tablespace_name tspace,
  14. fs.bytes / (1024 * 1024),
  15. SUM(df.bytes_free) / (1024 * 1024),
  16. Nvl(Round((SUM(fs.bytes) - df.bytes_used) * 100 / fs.bytes), 1),
  17. Round((SUM(fs.bytes) - df.bytes_free) * 100 / fs.bytes)
  18. FROM dba_temp_files fs,
  19. (SELECT tablespace_name,bytes_free,bytes_used
  20. FROM v$temp_space_header
  21. GROUP BY tablespace_name,bytes_free,bytes_used) df
  22. WHERE fs.tablespace_name (+) = df.tablespace_name
  23. GROUP BY df.tablespace_name,fs.bytes,df.bytes_free,df.bytes_used
  24. ORDER BY 4 DESC;

但是,如果undo表空間使用率非常高,且遭遇了ORA-01555或者ORA-30036,就需要進行分析。首先要分析undo表空間的大小設置是否合理,可以使用上文中估算undo表空間合理大小的算法進行計算。如果undo表空間已經足夠大,但是還是遭遇ORA-01555或者ORA-30036,就需要從以下幾個方面進行排查:

1、對于ORA-01555需要查看查詢語句的運行時間是不是太長,undo_retention設置是否過小;

2、對于ORA-30036需要排查事務是否過大,undo_retention設置是否過大;

3、對于ORA-30036還需要關注以下信息:

--查看是否有長時間被占用的undo塊

  1. select begin_time,
  2.      end_time,
  3.      undoblks,
  4.      tuned_undoretention,
  5.      maxquerylen,
  6.      maxqueryid
  7.   from v$undostat;
  8.  如果有長時間被占用的undo塊,在10g版本中需要關注Bug 5387030
  9.  
  10.  
  11. --查詢正在被使用的undo表空間的比例
  12. SELECT
  13.       ((SELECT (NVL(SUM(bytes),0))
  14.            FROM dba_undo_extents
  15.            WHERE tablespace_name='<UNDO_TABLESPACE_NAME>'
  16.            AND status IN ('ACTIVE','UNEXPIRED')) * 100)/
  17.          (SELECT SUM(bytes)
  18.           FROM dba_data_files
  19.           WHERE tablespace_name='<UNDO_TABLESPACE_NAME>')
  20.          "PCT_INUSE"
  21.      FROM dual;
  22. --查看分配給undo表空間的extent的狀態
  23. SELECT DISTINCT STATUS, SUM(BYTES)/1024/1024, COUNT(*)
  24.   FROM DBA_UNDO_EXTENTS where tablespace_name = \'UNDOTBS1\' GROUP BY STATUS;
  25. --查詢正在使用undo段的事務及使用的undo表空間的大小
  26. select start_time,
  27.        username,
  28.        s.MACHINE,
  29.        s.OSUSER,
  30.        r.name,
  31.        ubafil,
  32.        ubablk,
  33.        t.status,
  34.        (used_ublk * p.value) / 1024 blk, --使用undo表空間的大小
  35.        used_urec,
  36.        s1.SQL_ID,
  37.        s1.SQL_TEXT
  38.   from v$transaction t, v$rollname r, v$session s, v$parameter p,v$sql s1
  39.  where xidusn = usn
  40.    and s.saddr = t.ses_addr
  41.    and p.name = 'db_block_size'
  42.    and s.SADDR=s1.ADDRESS(+)
  43.  order by 1;

對于ORA-01555,最優的解決辦法是縮短查詢語句的運行時間,需要對sql進行優化,對于ORA-30036,盡量將大事務進行拆分,分批提交。



2019 monjeep.com webmaster#monjeep.com
12 q. 0.013 s.
京ICP備10005923號
北京赛车pk10直播开奖
阅读赚钱支持提现的 网上现在能干啥赚钱 梦幻西游赚钱停多少级号 在家做啥生意赚钱 免费软件凭什么赚钱 小说站 广告赚钱吗 普通扑克透视赌博眼镜 徐州承包快递片区赚钱吗 用手机免费赚钱一天赚钱10元 天龙八部游戏一年赚钱