1. 程式人生 > >Linux 平臺下 誤刪 oracle 資料檔案的恢復方法

Linux 平臺下 誤刪 oracle 資料檔案的恢復方法

1  問題描述

之前寫過一篇刪除oracle home目錄的blog,參考:

本篇是這邊的引深,本來應該是年前整理的,拖到年後了。

模擬現狀:

    資料庫在正常執行,誤操作,直接rm 掉了資料檔案。

測試環境:

[[email protected] trace]$ cat /etc/redhat-release

Red Hat Enterprise Linux Server release 6.1(Santiago)

Oracle 11.2.0.3 單例項。

[[email protected] ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.3.0 Production onWed Aug 27 18:36:32 2014

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise EditionRelease 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Miningand Real Application Testing options

SQL>

這個問題也要分2種情況,一種是歸檔模式,一種是非歸檔模式,歸檔模式處理就容易很多了。但現在很多由開發人員管理的庫是非歸檔,並且也缺乏專業的運維技能,誤操作的概率也會增加很多。

2  建立測試資料

SQL> create tablespace dropspacedatafile '/u01/dropspace01.dbf' size 100m;

Tablespace created.

User created.

Grant succeeded.

SQL> conn ahzhixin/ahzhixin

Connected.

SQL> create table test1 as select * fromall_users;

Table created.

SQL> create table test2 as select * fromall_users;

Table created.

SQL> create table test3 as select * fromall_users;

Table created.

3  歸檔模式處理

3.1            模擬故障

SQL> archive log list;

Database log mode        Archive Mode

Automatic archival          Enabled

Archive destination         /u01/archivelog

Oldest online log sequence     83

Next log sequence to archive   85

Current log sequence        85

SQL>

在作業系統上直接刪除資料檔案:

此時資料庫還是正常執行,我們查詢我們之前建立的幾張表:

SQL> select count(1) from test1;

 COUNT(1)

----------

    31

SQL> select count(1) from test2;

 COUNT(1)

----------

    31

SQL> select count(1) from test3;

 COUNT(1)

----------

    31

--insert 也沒有問題:

SQL> insert into test1 select * fromall_users;

31 rows created.

SQL> commit;

Commit complete.

SQL> select count(1) from test1;

 COUNT(1)

----------

    62

至少從目前看,一切都是正常。  這裡正常也是因為我們的作業系統是Linux,當資料檔案從作業系統級別被rm掉,但之前開啟該檔案的程序仍然持有相應的檔案控制代碼,所以指向的檔案仍然可以讀寫,並且該檔案的檔案描述符可以從/proc目錄中獲得,也可以利用這個控制代碼恢復檔案。

    如果在這個時候,重啟了資料庫或者作業系統,那麼控制代碼就會消失,也就只能通過掃描磁碟進行檔案恢復。

3.2            恢復

dbwr程序會開啟所有資料檔案的控制代碼,在proc目錄中可以查到這些資料檔案的資訊,目錄名是程序PID,fd表示檔案描述符。

檢查dbwr的程序PID:

oracle   9964     1  0 00:49 ?        00:00:03 ora_dbw0_dave

[[email protected] trace]$ cd /proc/9964/fd

[[email protected] fd]$ ls -l

 

這裡的259 就是我們刪掉的資料檔案。

//直接cp該控制代碼檔名回原位置:

[[email protected] fd]$ cp 259/u01/dropspace01.dbf

[[email protected] fd]$

因為資料庫一直是open的,那麼SCN也會不斷的變化,我們cp出來的資料檔案和資料庫當前的資訊不一致,所以我們需要進行recover:

SQL> alter database datafile'/u01/dropspace01.dbf' offline;

Database altered.

SQL> recover datafile'/u01/dropspace01.dbf';

Media recovery complete.

Database altered.

SQL>

恢復正常。

//檔案存在:

[[email protected] u01]$ ls -la/u01/dropspace01.dbf

-rw-r----- 1 oracle oinstall 104865792 Aug27 21:41 /u01/dropspace01.dbf

//重啟資料庫:

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup

ORACLE instance started.

Total System Global Area  814227456 bytes

Fixed Size        2232760 bytes

Variable Size       490737224 bytes

Database Buffers    318767104 bytes

Redo Buffers          2490368 bytes

Database mounted.

Database opened.

SQL>

也正常。 這裡有2個注意的問題:資料庫是歸檔模式,資料庫或者作業系統沒有重啟。這2點非常關鍵。 也正式如此,才讓操作比較簡單。

如果是非歸檔模式,那就要複雜很多了。

在非歸檔模式下,如果刪除了資料檔案,並且又觸發了CKPT,那麼CKPT 會直接把整個例項中斷掉,也就是說,如果是比較繁忙的資料庫,如果誤刪除資料檔案,例項可能會中斷,一旦例項中斷,那麼用之前講的通過控制代碼恢復就沒有可能性了。

當然也有另一種可能性,就是刪除資料檔案之後,可以先通過控制代碼恢復,然後用expdp匯出資料,儘可能的挽救部分資料。 這個動作就是與時間賽跑的過程了。

總之生產環境,操作一定要小心,還有要開歸檔,除非資料允許丟失。

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

AboutDave:

QQ:492913789

Email:[email protected]

Dave 的QQ群:

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

注意:加群必須註明表空間和資料檔案關係 | 不要重複加群

CNDBA_1: 62697850 (空)    CNDBA_2: 62697716 (滿)  CNDBA_3: 283816689

CNDBA_4: 391125754   CNDBA_5:104207940    CNDBA_6: 62697977   CNDBA_7: 142216823(滿)

相關推薦

Linux 平臺 oracle 資料檔案恢復方法

1  問題描述 之前寫過一篇刪除oracle home目錄的blog,參考: 本篇是這邊的引深,本來應該是年前整理的,拖到年後了。 模擬現狀:     資料庫在正常執行,誤操作,直接rm 掉了資料檔案。 測試環境: [[email protec

Linux系統/etc/passwd檔案的解決辦法

在Linux 中 /etc/passwd檔案中每個使用者都有一個對應的記錄行,它記錄了這個使用者的一些基本屬性。系統管理員經常會接觸到這個檔案的修改以完成對使用者的管理工作。 比如說:      root:x:0:0:root:/root

oracle 12cpdb資料檔案導致整個資料庫無法開啟問題

同事誤刪了某個外掛資料庫(PDB)的資料檔案,結果整個資料庫,包括容器資料庫(CDB),以及其他外掛資料庫都用不了了。 1、用sys賬號進入例項,可見容器資料庫處於mounted狀態;插在上面的所有PDB當然也都是mounted。 sqlplus sys/p

詳解:如何恢復MySQL資料庫資料

作者:馬哥Linux運維-Robin 血的教訓,事發經過就不詳述了。直接上操作步驟及恢復思路(友情提示:資料庫的任何操作都要提前做好備份),以下是Mysql資料後的恢復過程: 1. 找到binlog 恢復資料的前提是必須開啟Mysql的binlog日誌,如果binlog日誌沒開啟,請忽略此篇文件。b

ORACLE 表、資料恢復

最近在工作中使用ORACLE,一個失誤刪錯了表,當時心急如焚,因為接觸ORACLE時間不長,也不清楚ORACLE的功能, 同事就去找了下恢復的解決辦法,發現ORACLE刪除表後,是換了個名字,躺到了ORALCE的回收站中。         記錄一下使用的語句,以便以後遇到

【轉】Linux系統不同機器之間拷貝檔案方法

在Linux系統下,不同機器上實現檔案拷貝 一、將本地檔案拷貝到遠端機器: 其中: /home/administrator/      本地檔案的絕對路徑news.txt                          要複製到伺服器上的本地檔案root     

Linux ext4 rm ,用extundelete恢復失敗/報錯,無數血淚教訓!!!附:ext4後的正確處理步驟

目錄 典型使用者故事 Ext4誤刪恢復原理 恢復失敗的主要原因 正確的資料恢復步驟 恢復例項教學 工作室部分恢復案例 技術支援 典型使用者故事 阿里雲WEB伺服器主機,安裝CentOS系統,建立ext4檔案系統。使用者誤刪除MySQL資料庫整個目錄,導

rpm命令的恢復方法

找到 make 安裝包 文件拷貝 post 源碼編譯 OS bin 庫文件 rpm命令不能用了,被依賴的yum也不能使用了, 恢復rpm命令無外乎重裝, 重裝方法1: 使用源碼編譯, 需要gcc ,cmake包,如果沒裝,悲劇了 重裝方法2: 找一臺,和出問題的這臺同樣系

win10系統變數path恢復方法

轉(自己有相似的問題) 注意:千萬千萬不要重啟電腦. 折騰環境變數的時候把path直接給刪掉了 解決方法: 1,win + R,開啟執行,輸入regedit,進入登錄檔。 2.定位至HYEK_LOCAL_MACHINE\SYSTEM\ControlSet001\Control

git 的本地分支恢復方法

1.   git  log  -g 找回之前提交的commit,並記下commit_id 2.   git  branch  newbranch  commit_id 3.   切換到newbranc

linux平臺通過lsof命令恢復oracle資料檔案

背景:測試環境suse12作業系統,開發人員誤刪了/home/oracle下面的資料檔案             oracle狀態看起來一切正常,但資料檔案已經被rm掉。 恢復方法:通過lsof命令找到被刪除的資料檔案,拷貝出來

linux資料檔案恢復

linux下檔案被刪除可以用很多工具進行恢復,例如undelete(適合ext2,ext3)、giis(不能恢復安裝giis之前的檔案)、ext3grep(僅限ext3)、R-linux(支援ext3,但是需要作業系統是32位的)。還有testdisk等等就不一一介紹了。需

乾貨分享丨如何恢復Linuxetc目錄資料

對於運維工作者來說,可能最讓人擔心的,是伺服器宕機; 最讓人無助的,是被DDOS; 而最讓人心驚肉跳的,是rm -rf *這個命令…… 當你執行rm -rf命令時,萬一哪個變數沒賦值 聽說過

linux數據文件恢復

bdb total cover line gen 1.0 code director flash linux下文件被刪除能夠用非常多工具進行恢復。比如undelete(適合ext2,ext3)、giis(不能恢復安裝giis之前的文件)、ext3grep(僅限ext3)

SqlServer無備份資料恢復

系統已上線,給客戶修改bug的時候,使用delete語句刪表資料,沒想到庫沒切換成測試庫。誤刪了正式庫的資料,而且一次備份都沒有做過,玩大了 不扯了,進入主題 網上很多方法,都是針對至少有一次備份的情況下進行資料恢復的,沒有備份就基本上只能找資料恢復公司了。本章將通過日誌來恢復誤刪的資料,若是日誌檔案都沒

Oracle資料閃回恢復

今天在做測試時誤刪了一條資料,因為有關聯的原因,所以要想辦法恢復這條資料,在網上找到了這種方法。 1.首先確定要恢復的時間點 select * from XXX      AS OF TIMESTAMP TO_TIMESTAMP('2018-11-13 15:01:37'

linux系統rm檔案恢復 ext4

[[email protected] extundelete-0.2.4]# extundelete --inode 2 /dev/mapper/VolGroup-lv_home <div class="crayon-pre" style="box-sizing: border-bo

Linux平臺檔案許可權安全基本管理

Linux平臺下的檔案許可權安全基本管理 1.檔案許可權存在的意義 1.檔案許可權是系統最底層的安全設定方式之一; 2.保證檔案可以被可用的使用者來進行相應的操作。 2.檔案許可權的檢視 對於檔案: ls -l file ll file 對於目錄: ls -ld di

oracle資料(delete)

轉:http://www.cnblogs.com/hqbhonker/p/3977200.html 1.開啟Flash儲存的許可權ALTER TABLE tableName ENABLE row movement ; 2.找到這個表在這個時間點的資料 select * from tabl

表空間檔案,造成“ORA-01033: ORACLE 正在初始化或關閉”

C:\Documents and Settings\Administrator>sqlplus /nologSQL*Plus: Release 10.2.0.1.0 - Production on 星期三 5月 12 09:05:56 2010Copyright (c)