利用延時備庫找回被誤刪的資料
很多時候人為誤操作會對Oracle的資料造成影響,比如誤刪資料。當誤操作發生時,通常有四個解決方法:
1.閃回資料庫或閃回表
2.備份恢復
3.logminer挖掘redo
4.使用延時庫
前三種方法都不是很完美:
閃回資料庫影響較大,且事先需要開啟庫上的閃回。
閃回表或閃回版本查詢使用方便,但在繁忙的資料庫中很容易快照過舊。
備份恢復耗時長、影響大
logminer挖掘日誌耗時耗力
此時如果事先有搭建延時備庫的話,則可以很容易的從備庫得到誤刪的資料。以下進行演示。
主庫:
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string BDDEV2
備庫:
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string BDTEST
現有表及資料如下:
SQL> select * from scott.tb_test;
ID AGE TM
---------- ---------- -----------------
1 2 20181203 14:22:14
2 3 20181203 14:22:14
3 4 20181203 14:22:14
4 5 20181203 14:22:14
5 6 20181203 14:22:14
6 7 20181203 14:22:14
7 8 20181203 14:22:14
8 9 20181203 14:22:14
9 10 20181203 14:22:14
10 11 20181203 14:22:14
10 rows selected.
此時備庫是實時應用的:
SQL> SELECT * FROM V$DATAGUARD_STATS;
NAME VALUE UNIT TIME_COMPUTED DATUM_TIME
------------------------------ ------------------------------ ---------------------------------------- ------------------------------ ------------------------------
transport lag +00 00:00:00 day(2) to second(0) interval 12/03/2018 14:23:33 12/03/2018 14:23:33
apply lag +00 00:00:00 day(2) to second(0) interval 12/03/2018 14:23:33 12/03/2018 14:23:33
apply finish time +00 00:00:00.000 day(2) to second(3) interval 12/03/2018 14:23:33
estimated startup time 7 second 12/03/2018 14:23:33
備庫轉為延時庫,延時60分鐘:
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database recover managed standby database disconnect from session delay 60;
Database altered.
主庫修改記錄:
SQL> update scott.tb_test set age = 100,tm = sysdate where id = 10;
1 row updated.
SQL> commit;
Commit complete.
SQL> select * from scott.tb_test;
ID AGE TM
---------- ---------- -----------------
1 2 20181203 14:22:14
2 3 20181203 14:22:14
3 4 20181203 14:22:14
4 5 20181203 14:22:14
5 6 20181203 14:22:14
6 7 20181203 14:22:14
7 8 20181203 14:22:14
8 9 20181203 14:22:14
9 10 20181203 14:22:14
10 100 20181203 14:26:50
10 rows selected.
可看到,修改資料的時間為' 20181203 14:26:50 '。
此時刪除表資料:
SQL> select sysdate from dual;
SYSDATE
-----------------
20181203 14:28:18
SQL> truncate table scott.tb_test;
Table truncated.
SQL> alter system switch logfile;
System altered.
此時主庫中資料已經刪除,備庫中資料還停留在主庫修改資料之前:
SQL> select * from scott.tb_test;
ID AGE TM
---------- ---------- -----------------
1 2 20181203 14:22:14
2 3 20181203 14:22:14
3 4 20181203 14:22:14
4 5 20181203 14:22:14
5 6 20181203 14:22:14
6 7 20181203 14:22:14
7 8 20181203 14:22:14
8 9 20181203 14:22:14
9 10 20181203 14:22:14
10 11 20181203 14:22:14
如果我們要恢復資料到update之後、truncate之前,則要手動前滾備庫到指定時間點:
--備庫操作
重啟備庫到mount:
SQL> startup force mount;
ORACLE instance started.
Total System Global Area 2.1379E+10 bytes
Fixed Size 2262656 bytes
Variable Size 2.0401E+10 bytes
Database Buffers 939524096 bytes
Redo Buffers 36073472 bytes
Database mounted.
手動前滾備庫到指定時間點:
SQL> recover standby database until time '20181203 14:27:00';
ORA-00279: change 108456269 generated at 12/03/2018 14:26:50 needed for thread 1
ORA-00289: suggestion : /opt/app/oracle/archivelog_bdtest/1_248_987097214.dbf
ORA-00280: change 108456269 for thread 1 is in sequence #248
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
前滾完成,開啟備庫:
SQL> alter database open;
Database altered.
SQL> alter session set nls_date_format='yyyymmdd hh24:mi:ss';
Session altered.
SQL> select * from scott.tb_test;
ID AGE TM
---------- ---------- -----------------
1 2 20181203 14:22:14
2 3 20181203 14:22:14
3 4 20181203 14:22:14
4 5 20181203 14:22:14
5 6 20181203 14:22:14
6 7 20181203 14:22:14
7 8 20181203 14:22:14
8 9 20181203 14:22:14
9 10 20181203 14:22:14
10 100 20181203 14:26:50
10 rows selected.
此時就得到了所需資料,只需把資料重新匯入到主庫中即可。
待處理完成後,重新開啟備庫的redo應用:
SQL> alter database recover managed standby database disconnect from session delay 60;
Database altered.
此時備庫又變為了正常的延時庫。
注意:
1.備庫DELAY時間指的是當主庫日誌歸檔後,再延時DELAY指定的時間應用日誌,比如:設定DELAY引數為20分鐘,10:00主庫日誌歸檔,則10:20備庫才會應用此歸檔日誌
2.也可以在LOG_ARCHIVE_DEST_2指定DELAY引數達到同樣的延時目的:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=DEVSTBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DEVSTBY DELAY=60'
3.備庫不能進行實時應用,因為實時應用會使DELAY引數失效,備庫變為ADG
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31544156/viewspace-2222508/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 被誤刪的檔案正確處理方法,快速找回誤刪的檔案
- TSPITR方式資料庫找回誤操作丟失的資料資料庫
- 誤刪了電腦資料怎麼找回來?
- 我把Linux系統上面誤刪的資料找回來了Linux
- 【資料庫資料恢復】HP-UX系統ORACLE資料庫被誤刪除的資料恢復資料庫資料恢復UXOracle
- 資料庫被刪之反思資料庫
- Oracle快速找回被刪除的表Oracle
- 誤刪檔案能找回嗎?簡單誤刪檔案找回教程分享
- LINUX下資料被誤刪除、LINUX下資料被誤格式化後資料恢復Linux資料恢復
- 利用RMAN備份重建資料庫資料庫
- Mongodb資料庫誤刪後的恢復MongoDB資料庫
- Mac 備忘錄( Notes)裡筆記被永久刪除後的找回方法Mac筆記
- 【oracle資料庫資料恢復】誤操作導致的資料庫誤刪除的資料恢復案例Oracle資料庫資料恢復
- 電腦檔案誤刪除了怎麼恢復找回?誤刪電腦資料恢復方法教程資料恢復
- 恢復Oracle資料庫誤刪除資料的語句Oracle資料庫
- 電腦誤刪影片怎麼找回
- 電腦誤刪的照片還能找回嗎?
- 怎麼找回電腦誤刪的檔案
- 【北亞資料恢復】輸入錯誤命令導致MySQL資料庫資料被刪除的資料恢復案例資料恢復MySql資料庫
- 聊聊PG資料庫的防誤刪除問題資料庫
- mysql資料庫誤刪除操作說明MySql資料庫
- 誤刪除儲存SqlServer資料庫資料恢復SQLServer資料庫資料恢復
- mac誤刪檔案怎樣快速找回?Mac
- 【資料庫資料恢復】LINUX環境下ORACLE資料庫誤刪除的資料恢復資料庫資料恢復LinuxOracle
- [Oracle]Oracle資料庫資料被修改或者刪除恢復資料Oracle資料庫
- 寶塔漏洞防禦 防止資料庫被刪的方案資料庫
- Linux實現定時備份MySQL資料庫並刪除30天前的備份檔案LinuxMySql資料庫
- MySQL資料庫表誤刪除恢復(一)MySql資料庫
- 定時備份MySQL資料庫MySql資料庫
- 資料庫系列:主從延時最佳化資料庫
- 防刪庫實用指南 | 只需一步,快速召回被誤刪的表
- BMMySQL定時備份資料庫(全庫備份)的實現meuMySql資料庫
- 利用Java的API實現HBase資料庫的增刪查改JavaAPI資料庫
- Laravel 中利用『模型事件』來實現刪除資料時的連帶刪除Laravel模型事件
- 【北亞資料恢復】分散式儲存hbase和hive資料庫底層檔案被誤刪除的資料恢復案例資料恢復分散式Hive資料庫
- 實現MySQL資料庫的實時備份MySql資料庫
- 資料庫定時備份linux篇資料庫Linux
- mysql資料誤刪後的資料回滾MySql