成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

客戶的一次疏忽,DBA的一次噩夢

運維 數據庫運維 數據庫
你是否如同作者一樣,有過如下噩夢一般的經歷呢?是否半夜被老板挖起來,只為了客戶的一個小小的誤操作?無論是否在你身上印證過,都可以來看看,作者寫這篇文章之時已經熬了一夜,還能思路如此清晰,值得學習,佩服之~~~

今晚接到老大的電話,泰國的客戶不小心刪除了一些表的數據,現在非常著急,需要恢復數據。其實DBA做的數據庫備份,很大程度是用于數據庫crash掉的時候,恢復數據,而不是三天兩頭的因為客戶誤刪了數據,而去做恢復。

看了客戶的郵件,是有2個表的數據被誤刪除或者誤插入或者誤更新了。總之,操作過一大通,希望恢復到當天下午15:30的數據。上數據庫去查了一下,用備份來恢復,似乎時間不夠,嘗試用戶flashback query,發現已經回不去了:

  1. SQL> SQL> SQL> SELECT count(*) from hr_ttm.TA_ABSDOCS  
  2.   2  AS OF TIMESTAMP TO_TIMESTAMP('2011-06-09 15:29:00','YYYY-MM-DD HH24:MI:SS');  
  3. SELECT count(*) from hr_ttm.TA_ABSDOCS  
  4.                             *  
  5. ERROR at line 1:  
  6. ORA-01555: snapshot too old: rollback segment number 1 with name "_SYSSMU1$" 
  7. too small 

其他也沒有更快的方法了,于是當下決定用logmnr挖數據,

由于數據庫原來就沒有配置utl_file_dir,因此還需要重啟數據庫使得該參數生效。一路做下來,大致算順利,不過也遇到了不少小插曲。下面就是恢復的步驟:

一、備份原表

  1. create table hr_ttm.TA_ABSDOCS_20110610_0010 as 
  2. SELECT * from hr_ttm.TA_ABSDOCS;  
  3.    
  4. create table hr_ttm.TA_ABSDOC_20110610_0010 as 
  5. SELECT * from hr_ttm.TA_ABSDOC; 

二,根據客戶要求,建立新用戶,將恢復的數據導入到這2個表中:

  1. create user hr_ttm2 identified by hr_ttm2 default tablespace MSG_DATA;  
  2. grant connect,resource,dba to hr_ttm2;  

三、把原表數據備份到新用戶下,用于做回滾

  1. create table hr_ttm2.TA_ABSDOCS as 
  2. SELECT * from hr_ttm.TA_ABSDOCS  
  3.    
  4. create table hr_ttm2.TA_ABSDOC as 
  5. SELECT * from hr_ttm.TA_ABSDOC 

四、修改參數,用于挖日志,重啟數據庫

  1. alter system set utl_file_dir='/prodlog/logmnr' scope=spfile;  

五、生成數據字典

  1. exec dbms_logmnr_d.build('dictionary.ora','/prodlog/logmnr');  

做這一步之前注意需要修改LD_LIBRARY_PATH和LIBPATH,使得lib的變量在lib32前面。不然會有報錯ORA-00600: internal error code, arguments: [unable to load XDB library], [], [], [], [], [], [], []

#p#

六、檢查需要回滾的日志,客戶要求回滾到6月9日15:30之前:

  1. -rw-r-----    1 oracle   oinstall   48868352 Jun 09 14:53 ARC0000025854_0666465023.0001  
  2. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 15:08 ARC0000025855_0666465023.0001  
  3. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 15:17 ARC0000025856_0666465023.0001  
  4. -rw-r-----    1 oracle   oinstall   48910848 Jun 09 15:42 ARC0000025857_0666465023.0001  
  5. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 16:04 ARC0000025858_0666465023.0001  
  6. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:22 ARC0000025859_0666465023.0001  
  7. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:27 ARC0000025860_0666465023.0001  
  8. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 17:47 ARC0000025861_0666465023.0001  
  9. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 20:52 ARC0000025862_0666465023.0001  
  10. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 21:17 ARC0000025863_0666465023.0001  
  11. drwxr-xr-x    2 oracle   oinstall        256 Jun 09 23:02 logmnr  
  12. -rw-r-----    1 oracle   oinstall   48863744 Jun 09 23:07 ARC0000025864_0666465023.0001  
  13. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:28 ARC0000025865_0666465023.0001  
  14. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025866_0666465023.0001  
  15. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025867_0666465023.0001  
  16. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025868_0666465023.0001  
  17. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:29 ARC0000025869_0666465023.0001  
  18. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025870_0666465023.0001  
  19. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025871_0666465023.0001  
  20. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:30 ARC0000025872_0666465023.0001  
  21. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025873_0666465023.0001  
  22. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025874_0666465023.0001  
  23. -rw-r-----    1 oracle   oinstall   48868864 Jun 09 23:31 ARC0000025875_0666465023.0001 

 七、添加歸檔日志

  1. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025854_0666465023.0001',Options=>dbms_logmnr.new);  
  2. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025855_0666465023.0001',Options=>dbms_logmnr.addfile);  
  3. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025856_0666465023.0001',Options=>dbms_logmnr.addfile);  
  4. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025857_0666465023.0001',Options=>dbms_logmnr.addfile);  
  5. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025858_0666465023.0001',Options=>dbms_logmnr.addfile);  
  6. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025859_0666465023.0001',Options=>dbms_logmnr.addfile);  
  7. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025860_0666465023.0001',Options=>dbms_logmnr.addfile);  
  8. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025861_0666465023.0001',Options=>dbms_logmnr.addfile);  
  9. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025862_0666465023.0001',Options=>dbms_logmnr.addfile);  
  10. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025863_0666465023.0001',Options=>dbms_logmnr.addfile);  
  11. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025864_0666465023.0001',Options=>dbms_logmnr.addfile);  
  12. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025865_0666465023.0001',Options=>dbms_logmnr.addfile);  
  13. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025866_0666465023.0001',Options=>dbms_logmnr.addfile);  
  14. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025867_0666465023.0001',Options=>dbms_logmnr.addfile);  
  15. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025868_0666465023.0001',Options=>dbms_logmnr.addfile);  
  16. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025869_0666465023.0001',Options=>dbms_logmnr.addfile);  
  17. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025870_0666465023.0001',Options=>dbms_logmnr.addfile);  
  18. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025871_0666465023.0001',Options=>dbms_logmnr.addfile);  
  19. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025872_0666465023.0001',Options=>dbms_logmnr.addfile);  
  20. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025873_0666465023.0001',Options=>dbms_logmnr.addfile);  
  21. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025874_0666465023.0001',Options=>dbms_logmnr.addfile);  
  22. exec dbms_logmnr.add_logfile(LogFileName=>'/prodlog/logmnr/ARC0000025875_0666465023.0001',Options=>dbms_logmnr.addfile); 

八、開始挖日志

  1. exec dbms_logmnr.start_logmnr(dictfilename=>'/prodlog/logmnr/dictionary.ora');  

九、將logmnr的數據暫時保存在一個表里面,免得再次查詢時候不用再次添加歸檔日志

  1. create table hjm_logmnr nologging as select * from v$logmnr_contents where 1=2;    
  2. insert /*+ append */ into hjm_logmnr select * from v$logmnr_contents;    
  3. /*------做這一步之前注意將nls_date_format改成'yyyy-mm-dd hh24:mi:ss',不然泰文亂碼,時間會變成問號。------*/  

十、導出腳本,用腳本做回滾,注意SQL_UNDO中的delete語句末尾有rowid,不能直接用,需要用正則表達式替換掉。

  1. spool TA_ABSDOCS_undosql.txt  
  2. select regexp_replace(replace(SQL_UNDO,'"HR_TTM"','"HR_TTM2"'),'and ROWID.+;',';')  
  3. from hjm_logmnr  
  4. WHERE 
  5. SEG_NAME = 'TA_ABSDOCS' AND 
  6. SEG_OWNER = 'HR_TTM'   
  7. order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss'desc;  
  8. spool off 
  9.    
  10.    
  11. spool TA_ABSDOC_undosql.txt  
  12. select regexp_replace(replace(SQL_UNDO,'"HR_TTM"','"HR_TTM2"'),'and ROWID.+;',';')  
  13. from hjm_logmnr  
  14. WHERE 
  15. SEG_NAME = 'TA_ABSDOC' AND 
  16. SEG_OWNER = 'HR_TTM'   
  17. order by to_char(TIMESTAMP,'yyyy-mm-dd hh24:mi:ss'desc;  
  18. spool off 

去掉腳本的頭部的語句和末尾返回多少多少行的文字,在hr_ttm2下執行這2個腳本,實現數據回滾。

另外,我們來看一下:

  1. SQL> select to_char(max(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss'),to_char(min(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss')  
  2. from hjm_logmnr  
  3. WHERE 
  4. SEG_NAME = 'TA_ABSDOC' AND 
  5. SEG_OWNER = 'HR_TTM'   2    3    4    5    
  6.   6  /  
  7.    
  8. TO_CHAR(MAX(TIMESTA TO_CHAR(MIN(TIMESTA  
  9. ------------------- -------------------  
  10. 2011-06-09 21:20:26 2011-06-09 15:31:54  
  11.    
  12. SQL>   
  13. SQL>   
  14. SQL>   
  15. SQL>   
  16. SQL> l  
  17.   1  select to_char(max(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss'),to_char(min(TIMESTAMP),'yyyy-mm-dd hh24:mi:ss')  
  18.   2  from hjm_logmnr  
  19.   3  WHERE 
  20.   4  SEG_NAME = 'TA_ABSDOC' AND 
  21.   5* SEG_OWNER = 'HR_TTM' 
  22. SQL> l4  
  23.   4* SEG_NAME = 'TA_ABSDOC' AND 
  24. SQL> c/TA_ABSDOC/TA_ABSDOCS  
  25.   4* SEG_NAME = 'TA_ABSDOCS' AND 
  26. SQL>   
  27.    
  28. TO_CHAR(MAX(TIMESTA TO_CHAR(MIN(TIMESTA  
  29. ------------------- -------------------  
  30. 2011-06-09 21:20:26 2011-06-09 15:37:39 

歸檔日志是從14:53開始,而這2個表的變動,是在15:30之后才有的(min(TIMESTAMP是在15:30之后)。
也就是說從14:53分到15:30之前,這2個表一直是沒動過的。因此,可以跟客戶說,2個表的數據恢復到15:00的。

抬頭一看,東方既白。唉,又熬了個通宵。

【小邊碎語】以上是作者在月初的一次噩夢一般的經歷,無論是否在你身上印證過,都可以來看看,作者真不愧是專業級人物,思路超清晰,值得學習和借鑒。

 

【編輯推薦】

  1. Oracle SQL:經典查詢練手第一篇
  2. Oracle SQL:經典查詢練手第二篇
  3. Oracle SQL:經典查詢練手第三篇
  4. Oracle SQL:經典查詢練手第四篇
  5. Oracle SQL:經典查詢練手第五篇

 

 

 

責任編輯:艾婧 來源: OracleBlog
相關推薦

2021-12-27 10:08:16

Python編程語言

2020-10-24 13:50:59

Python編程語言

2011-04-07 11:20:21

SQLServer

2012-08-28 09:21:59

Ajax查錯經歷Web

2021-11-01 17:29:02

Windows系統Fork

2017-02-28 11:13:36

華為

2020-10-18 12:53:29

黑科技網站軟件

2015-07-17 10:04:33

MKMapView優化

2022-03-23 15:43:26

Android客戶端架構

2021-04-02 06:18:27

Docker鏡像

2018-01-15 14:50:49

APP轉讓App賬號

2023-03-29 09:36:32

2025-03-17 10:01:07

2020-03-10 07:51:35

面試諷刺標準

2017-08-24 17:37:18

DNS緩存分析

2009-02-06 09:50:00

DHCP地址分配

2021-12-06 19:29:17

LRU內存算法

2020-03-18 13:07:16

華為

2017-01-23 12:40:45

設計演講報表數據

2024-05-13 08:37:17

炫技H5UI
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩欧美在 | 免费观看av| 97精品国产97久久久久久免费 | 久久久看| 麻豆视频在线免费观看 | 福利片在线观看 | 91视视频在线观看入口直接观看 | 国产精品电影网 | 欧美日韩精品免费 | 亚洲网站观看 | 日本黄色的视频 | 久久33 | 一区二区三区四区在线免费观看 | 伊人精品久久久久77777 | 欧美一级欧美三级在线观看 | 欧美久久一区 | 国产高清精品在线 | 亚洲国产精品久久 | 免费永久av | 亚洲综合大片69999 | 久久久久国产精品 | 国产传媒在线播放 | 亚洲一区二区在线免费观看 | 亚洲在线| 99av成人精品国语自产拍 | 国产一区二区影院 | 91久久国产 | 国产真实乱全部视频 | 久久久亚洲一区 | 卡通动漫第一页 | 不卡一区| 不卡av在线 | 一区二区三区免费 | 在线视频91| 日日夜夜精品视频 | 九九精品视频在线 | 国产成人免费视频网站高清观看视频 | 在线欧美小视频 | 国产精品一区二区在线 | 久久人人国产 | 久久国产99 |