一次帶大字段表記錄暴增(LOBSEGMENT)引發的悲劇

事件起因:ORACLE主庫進行例行週期性停機後應用相關人員確認數據交換程序時未發現交換異常,
導致該交換程序連接其中一個數據庫成功,連接另外一個數據庫失敗,因此不斷的向連接成功的數據庫的狀態控制表中寫入交換異常的數據,而控制表中有CLOB字段記錄所有的出錯信息。該程序在週末跑了約24H,導致產生120W條垃圾數據,耗費表空間10G以上。

故障定位處理過程:
1、發現監控系統報告USERS表空間99%使用率
我們通過如下語句查USERS表空間有哪些對象
 
  1. 故障定位處理過程: 
  2. 1、發現監控系統報告USERS表空間99%使用率 
  3. 我們通過如下語句查USERS表空間有哪些對象 
  4. select owner,segment_name,segment_type,bytes from dba_segments a where a.tablespace_name='USERS' 
  5. …………………… 
  6. 8   SNDFC   SYS_LOB0000077141C00012$$   LOBSEGMENT  18817744896 
  7. 17  SNDFC   SYS_LOB0000094212C00003$$   LOBSEGMENT  10583277568 
  8. 15  SNDFC   SYS_LOB0000092081C00012$$   LOBSEGMENT  2824863744 
  9. 13  SNDFC   SYS_LOB0000077219C00003$$   LOBSEGMENT  2618294272 
  10. 12  SNDFC   SYS_LOB0000077219C00008$$   LOBSEGMENT  38797312 
  11. 24  SNDFC   SYS_IL0000077219C00003$$    LOBINDEX    26214400 
  12. 19  SNDFC   SYS_IL0000077141C00012$$    LOBINDEX    8388608 
  13. 18  SNDFC   SYS_LOB0000077029C00008$$   LOBSEGMENT  4194304 
  14. 14  SNDFC   SYS_LOB0000077192C00007$$   LOBSEGMENT  3145728 
  15. 23  SNDFC   SYS_IL0000077219C00008$$    LOBINDEX    131072 
  16. 28  SNDFC   SYS_IL0000094212C00003$$    LOBINDEX    131072 
  17. 21  SNDFC   SYS_IL0000077227C00008$$    LOBINDEX    65536 
  18. 22  SNDFC   SYS_IL0000077227C00004$$    LOBINDEX    65536 
  19. 26  SNDFC   SYS_IL0000092081C00012$$    LOBINDEX    65536 
  20. 27  SNDFC   SYS_IL0000094212C00008$$    LOBINDEX    65536 
  21. 25  SNDFC   SYS_IL0000077192C00007$$    LOBINDEX    65536 
  22. 29  SNDFC   SYS_IL0000077029C00008$$    LOBINDEX    65536 
  23. 20  SNDFC   SYS_IL0000077087C00005$$    LOBINDEX    65536 
  24. 9   SNDFC   SYS_LOB0000077087C00005$$   LOBSEGMENT  65536 
  25. 16  SNDFC   SYS_LOB0000094212C00008$$   LOBSEGMENT  65536 
  26. 10  SNDFC   SYS_LOB0000077227C00008$$   LOBSEGMENT  65536 
  27. 11  SNDFC   SYS_LOB0000077227C00004$$   LOBSEGMENT  65536 
  28.  
  29. 很驚奇的發現裏面竟然沒有數據表,顯然SYS_LOB0000077141C00012$$等幾個大的對象佔據了存儲空間。 
  30. 因爲屬性是LOBSEGMENT,馬上想到是大對象的表發生了大量的數據增長。 
  31.  
  32. 於是動用如下SQL語句,查處大字段對象: 
  33. SELECT A.TABLE_NAME, 
  34.        A.COLUMN_NAME, 
  35.        B.SEGMENT_NAME, 
  36.        B.SEGMENT_TYPE, 
  37.        B.TABLESPACE_NAME, 
  38.        B.BYTES / 1024 / 1024, 
  39.        B.BLOCKS, 
  40.        B.EXTENTS 
  41.   FROM USER_LOBS A, USER_SEGMENTS B 
  42. WHERE A.SEGMENT_NAME = B.SEGMENT_NAME 
  43. ORDER BY B.BYTES DESC
  44.  
  45. 查詢結果如下: 
  46. TABLE_NAME          COLUMN_NAME SEGMENT_NAME            SEGMENT_TYPE    TABLESPACE_NAME     B.BYTES/1024/1024 
  47. SNDFC_EXCHANGE_LOG_INFO     ERROR_TRACE SYS_LOB0000077141C00012$$   LOBSEGMENT  USERS           17946 
  48. SNDFC_SEND_CONTROL_HISTORY  CONTENT     SYS_LOB0000094212C00003$$   LOBSEGMENT  USERS           10093 
  49. TMP_SNDFC_EXCHANGE_LOG_INFO ERROR_TRACE SYS_LOB0000125221C00012$$   LOBSEGMENT  IN_SNDFC_DATA       5857 
  50. SNDFC_EXCHANGE_LOG_HISTORY  ERROR_TRACE SYS_LOB0000092081C00012$$   LOBSEGMENT  USERS           2694 
  51. SNDFC_SEND_CONTROL      CONTENT     SYS_LOB0000077219C00003$$   LOBSEGMENT  USERS           2497 
  52. SNDFC_SEND_CONTROL      ERR_TRACE   SYS_LOB0000077219C00008$$   LOBSEGMENT  USERS           37 
  53. SNDFC_COM_RESOURCE      FILE_BLOB   SYS_LOB0000077029C00008$$   LOBSEGMENT  USERS           4 
  54. SNDFC_NOTICE_FILE       DOC_CONTENT SYS_LOB0000077192C00007$$   LOBSEGMENT  USERS           3 
  55. BIN$pIfKdb4Sv0LgQBqsDaM1Tg==$0  ERROR_TRACE SYS_LOB0000125215C00012$$   LOBSEGMENT  IN_SNDFC_DATA       0.6875 
  56. SNDFC_AUTO_PORT_BARRIER_LOG EXCEPTION_STACK SYS_LOB0000102643C00011$$   LOBSEGMENT  IN_SNDFC_DATA       0.375 
  57. TMP_SAVE_TABLEDDL       TABLE_SQL   SYS_LOB0000117696C00002$$   LOBSEGMENT  IN_SNDFC_DATA       0.125 
  58. TMP_SAVE_INDEXDDL       INDEX_SQL   SYS_LOB0000117779C00002$$   LOBSEGMENT  IN_SNDFC_DATA       0.0625 
  59. SNDFC_SEND_CONTROL_HISTORY  ERR_TRACE   SYS_LOB0000094212C00008$$   LOBSEGMENT  USERS           0.0625 
  60. SNDFC_SEND_CONTROL_HIS      CONTENT     SYS_LOB0000077227C00004$$   LOBSEGMENT  USERS           0.0625 
  61. SNDFC_SEND_CONTROL_HIS      ERR_TRACE   SYS_LOB0000077227C00008$$   LOBSEGMENT  USERS           0.0625 
  62. SNDFC_ENTRY_RESOURCE        FILE_BLOB   SYS_LOB0000077087C00005$$   LOBSEGMENT  USERS           0.0625 
  63. BIN$pHyd9j2iK0vgQBqsDaNWjQ==$0  ERROR_TRACE SYS_LOB0000124975C00012$$   LOBSEGMENT  IN_SNDFC_DATA       0.0625 
  64.  
  65. 根據以上查詢,顯然SNDFC_EXCHANGE_LOG_INFO表上的SYS_LOB0000077141C00012$$對象作用了17G的空間。 
  66. 正巧應用值班人員反饋某業務的數據交換程序出錯,而出錯的交換表中正巧有大字段對象,再一確認就是SNDFC_EXCHANGE_LOG_INFO表。 
  67. 查該表總記錄數和事件發生當天記錄數: 
  68. SQL> Select Count(*) From  sndfc_exchange_log_info t Where to_char(modi_date,'yyyymmdd')='20110529'
  69.  
  70.   COUNT(*) 
  71. ---------- 
  72.    1492157 
  73.  
  74. SQL> Select Count(*) From  sndfc_exchange_log_info t; 
  75.  
  76.   COUNT(*) 
  77. ---------- 
  78.    2043454 
  79. 該表保存一個月的記錄,總記錄數量204W,但該天的記錄數量達到149W,顯然存在問題。 
  80. 怎麼處理這149W條記錄,必須新建一張臨時表sndfc_exchange_log_info_new,然後把需要的記錄移動到該表, 
  81. 把sndfc_exchange_log_info重命名爲sndfc_exchange_log_info_old 
  82. TRUNCATE原先的sndfc_exchange_log_info_old表釋放空間,然後把sndfc_exchange_log_info_new重命名 
  83. 爲sndfc_exchange_log_info(注意主鍵和索引等約束)。 

其實表數據的刪除還是比較容易的,但是最悲劇的是我們的DATAGUARD環境磁盤非常緊缺。 爲了移動sndfc_exchange_log_info的數據,必須增大USERS表空間,而增大USERS表空間備庫相應目錄就會不足, 昨天爲了處理備庫相應目錄不足問題已經頗費周折,在此簡單回顧下。

鏈接:http://yunlongzheng.blog.51cto.com/788996/578973

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