某一張表被應用軟件里誤操作把數據都清空了,現在想恢復到清空之間,比如2013年8月13日14點以前,應該怎樣操作?
通過這個問題可以引發一系列的知識點串聯。
1、如果開啟閃回可以使用閃回表。
怎樣查看我的數據庫有沒有開啟flashback
flashback database要求數據庫必須處於歸檔模式,且閃回之后必須使用resetlogs打開數據庫
查看數據庫的歸檔模式及閃回是否啟用
SQL> select log_mode,open_mode,flashback_on from v$database;
LOG_MODE OPEN_MODE FLASHBACK_ON
------------------- ----------------- ------------------------
ARCHIVELOG READ WRITE NO
FLASHBACK_ON為NO,則表示閃回特性尚未啟用
oracle數據庫歸檔模式
Oracle數據庫有聯機重做日志,這個日志是記錄對數據庫所做的修改,比如插入,刪除,更新數據等,對這些操作都會記錄在聯機重做日志里。
模式介紹
如何查看oracle當前處於歸檔模式還是非歸檔模式
1、
selectname,log_mode,open_mode from v$database;
NAME LOG_MODE OPEN_MODE
--------- ------------ -----------------
CKDB ARCHIVELOG READ WRITE
若是歸檔模式,則LOG_MODE=ARCHIVELOG
若是非歸檔模式,則LOG_MODE=NOARCHIVELOG
2、
輸入:archive log list 回車,可以查看是否是歸檔模式
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 31
Current log sequence 33
oracle數據庫如何打開歸檔
oracle數據庫如果不開啟歸檔模式,對於誤操作來說將是災難性的,無法進行恢復操作。下面介紹oracle如何核實是否開啟歸檔模式和如何開啟歸檔模式的方法。
- 開啟歸檔模式
1>首先打開cmd命令窗口輸入:sqlplus / as sysdba登錄數據庫
2>成功登錄數據庫后,輸入命令:select log_mode from v$database用來查看歸檔模式
3>查詢后可以看到log_ mode是noarchivelog說明歸檔模式是不歸檔模式
4>用shutdown immediate或shutdown normal關閉數據庫
5>等待數據庫正常關閉
6>數據庫關閉后,用startup mount啟動數據庫、加載實例但數據庫關閉
7>使用命令:alter database archivelog;打開歸檔日志,執行命令成功后返回數據庫已更改的消息
8>使用命令:alter database open;打開數據庫即可完成整體操作
9>alter system archive log start; (啟用自動歸檔)
10>exit (退出)
11>驗證歸檔日志。重復第一步驟,執行命令:select log_mode v$database,看到執行結果為archivelog
做一次完全備份,因為非歸檔日志模式下產生的備份日志對於歸檔模式已經不可用了.這一步非非常重要!
2.改變歸檔模式到非歸檔模式:
查看oracle是否開啟閃回,查看刪除記錄
查看oracle是否開啟閃回功能,
--FLASHBACK_ON為NO,則表示閃回特性尚未啟用
select log_mode,open_mode,flashback_on from v$database;
查看oracle刪除記錄
select * from user_recyclebin;
經過上述一段艱難的過程,下面來操作閃回:
(一)
如果開啟閃回可以使用閃回表。
select log_mode,flashback_on from v$database;
如果是下面結果則開了閃回
LOG_MODE FLASHBACK_ON
------------ ------------------
ARCHIVELOG YES
可以執行以下命令
alter table 表名 enable row movement; --開啟表行移動
flashback table 表名 to timestamp to_timestamp('20130813 14:00:00','yyyymmdd hh24:mi:ss');
--閃回到2013年8月13日14點
你要是沒開啟,有邏輯備份可以使用imp命令導入數據。
如果沒用邏輯備份,開啟歸檔模式,有物理備份,能夠停機、數據丟失的話,可以采用不完全恢復
用rman登陸
rman target /
執行以下命令
run{shutdown immediate;
startup mount;
set until time = "to_date('20130813 14:00:00','yyyymmdd hh24:mi:ss')";
restore database;
recover database;
alter database open resetlogs;}
切記!做以上任何操作前做好備份,否則出了問題后悔莫及。
而且建議你聯系你們數據庫管理員處理這個問題。
(二)
如果只是1個表的話, 還是比較簡單的。
下面是一個例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
SQL>
CREATE
TABLE
test_fb_table (
2 ID
int
,
3 VAL VARCHAR2(10)
4 );
Table
created.
SQL>
INSERT
INTO
test_fb_table
VALUES
(1,
'TEST'
);
1 row created.
SQL>
commit
;
Commit
complete.
假如 數據被錯誤的刪除/更新
需要檢索某個時間點上,表原有的數據。
SQL>
SELECT
TO_CHAR(sysdate,
'yyyy-mm-dd hh24:mi:ss'
)
FROM
dual;
TO_CHAR(SYSDATE,
'YYYY-MM-DDHH24:MI:SS'
--------------------------------------
2010-11-07 13:01:37
這里刪除掉數據。
SQL>
delete
from
test_fb_table;
1 row deleted.
SQL>
commit
;
Commit
complete.
確認數據已經被刪除。
SQL>
select
*
from
test_fb_table;
no
rows
selected
|
1
2
3
4
5
6
7
|
這里檢索出,指定時間點上,指定表的數據情況。
SQL>
select
*
from
test_fb_table
2
AS
OF
TIMESTAMP
TO_TIMESTAMP(
'2010-11-07 13:01:37'
,
3
'yyyy-mm-dd hh24:mi:ss'
);
ID VAL
---------- --------------------
1 TEST
|
對於你來說, 也就是你需要先
CREATE TABLE 臨時表 AS
select * from 你的那個數據被刪除的表
AS OF TIMESTAMP TO_TIMESTAMP('2013-08-13 14:00:00', 'yyyy-mm-dd hh24:mi:ss');
這樣, 就把當初那個時間點上的, 那個表的數據, 復制到一個 臨時表 里面去了。
然后再
INSERT INTO 你的那個數據被刪除的表 SELECT * FROM 臨時表;
注: 你需要確定一下, 那個 數據被刪除的表 上面, 有沒有觸發器什么的。
有的話, 可能需要暫時 禁用掉, 數據插入完了再恢復。
(三)(沒有dba權限)
如果有數據庫備份和日志備份,才能解決你的問題,將數據恢復到某個時間點。
否則無法實現。
如果有備份,可以讓DBA幫忙恢復一個新數據庫,然后你將此表的數據copy出來到原先的數據庫中。
(四)(沒有dba權限)
需要用閃回表flashback table,你是做不了的,找dba吧