oracle 備份恢復 11oracle備份恢復補充

1、冷備份:
    當數據庫的全部可讀寫的物理文件具備相同的系統改變號(SCN)時進行的備份,這個狀態的惟一方法是數據庫正常關閉,
因此也叫一致性備份。使用於歸檔和非歸檔模式;
    優勢:快速簡單(拷貝);容易恢復到備份的時間點上;低度維護高度安全
    缺點:備份時數據庫必須關閉;一致性還原只能恢復到備份時間點;
備份步驟:
    1.查看數據庫物理文件的位置(數據,控制,日誌,參數)文件
    SELECT file_id,online_status,tablespace_name, file_name FROM dba_data_files;
    SELECT file#,status,NAME FROM v$datafile;    
    SELECT * FROM v$controlfile;
    SELECT * FROM v$logfile;
    show parameter spfile;
    2.正常關閉數據庫
    shutdown immediate;
    拷貝各個文件到備份路徑;
    dos:
        copy  C:\oracle\product\10.2.0\oradata\orcldb\*.log  C:\orabackup\back0319\* 
        copy  C:\oracle\product\10.2.0\oradata\orcldb\*.dbf  C:\orabackup\back0319\* --查詢默認不包括TEMP01表空間
        copy  C:\oracle\product\10.2.0\oradata\orcldb\*.ctl  C:\orabackup\back0319\* 
        copy  C:\oracle\product\10.2.0\db_1\database\SPFILEORCLDB.ORA  C:\orabackup\back0319\spfile\* 
    linux:
        cp  /u01/app/oracle/oradata/ipemsdb/datafile/*    /u01/app/ipemsdb_back/datafiles/
        cp  /u01/app/ipemsdb_back/redologs/o1_mf_3_7p5b35yp_.log  /u01/app/oracle/oradata/ipemsdb/onlinelog/
        cp  /u01/app/ipemsdb_back/controlfiles/o1_mf_7p5b2y0c_.ctl  /u01/app/oracle/flash_recovery_area/ipemsdb/controlfile/
    3.備份實驗
    無spfile文件時的錯誤:
        SYS@ orcldb >startup
        ORA-01078: failure in processing system parameters
        ORA-01565: error in identifying file 'C:\oracle\product\10.2.0\db_1/dbs/spfileorcldb.ora'
        ORA-27041: unable to open file
        OSD-04002: ????????????
        O/S-Error: (OS 2) ??????????????????????
    缺失數據文件:
        數據庫裝載完畢。
        ORA-01157: 沒法標識/鎖定數據文件 4 - 請參閱 DBWR 跟蹤文件
        ORA-01110: 數據文件 4: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS01.DBF'
        數據庫啓動到monted狀態
    缺失控制文件和數據文件
        ORA-00205: ?????????, ??????, ???????
        數據庫started狀態
    缺失日誌文件
        數據庫裝載完畢。
        ORA-00313: 沒法打開日誌組 1 (用於線程 1) 的成員
        ORA-00312: 聯機日誌 1 線程 1:
        'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\REDO01.LOG'
注:1.確認好各個物理文件包括個數,名稱,大小,位置等,恢復時要徹底按照原來路徑進行
    2.temp01數據文件及temp表空間不在恢復查詢中
        實驗:
            create table test1(a int);
            insert into test1 values (1);
            commit;
            shutdown immediate;
            --備份數據庫(controlfile,datafile,logfile,spfile)
            startup
            insert into test1 values (2);
            commit;
            shutdown immediate;
            --刪除數據庫物理文件
            startup --啓動報錯,狀態爲nomount
            --恢復物理文件
            alter database open;
            select * from test1;--1
            ORA-38760: 此數據庫實例沒法啓用閃回數據庫:alter database flashback off;
注:正常關閉數據庫,拷貝備份(datafile,controlfile,logfile,spfile),還原備份,啓動數據庫;整個過程不涉及對日誌的操做。          linux

2、熱備份:
    針對7*24數據庫只能用熱備,數據庫的物理文件SCN號處於不一致狀態下進行備份;主要是控制文件和系統數據文件SCN不一致,
只使用於archivelog模式,(只備份數據文件和控制文件)。
    優勢:可在表空間,數據文件級別備份;備份時數據庫仍可用;可達到秒級恢復;
    缺點:不能出錯不然備份不可用;方法複雜難維護
一、備份步驟:
    alter system archive log current;--是歸檔當前的重作日誌文件,無論自動歸檔有沒有打開都歸檔。
    alter tablespace system begin backup;--開始
    --複製備份表空間文件
    alter tablespace system end backup;--結束
    --整庫備份時先備份system表空間,再依次備份其餘的表空間
    alter database backup controlfile to 'orabackup\controlfile.bak';--在線備份控制文件,經過它開庫前須要利用舊控制文件恢復
    alter database backup controlfile to trace as '';--生成udump目錄下控制文件從新生成腳本
    alter system archive log current;--對當前的重作日誌進行歸檔
二、備份恢復實驗:
--2.一、非system表空間數據文件損壞恢復
    archive log list;
    create table test2(b int) tablespace users;
    insert into test2 values (1);
    commit;
    --熱備份users表空間
    insert into test2 values (2);
    commit; 
    alter system switch logfile;--是強制日誌切換,不必定就歸檔當前的重作日誌文件(若自動歸檔打開,就歸檔前的重作日
                                --志,若自動歸檔沒有打開,就不歸檔當前重作日誌。)
    shutdown immediate;
    --刪掉users表空間對應的數據文件
    startup;--啓動時報錯,數據庫狀態爲mounted
    select * from v$recover_file;--查待恢復文件
    alter database datafile 4 offline drop;--文件脫機
    alter database open;--打開數據庫
    --拷回數據文件
    recover datafile 4;--恢復4號文件
    alter database datafile 4 online;
    select * from test2;
--非system表空間數據文件損壞無備份恢復
    alter tablespace users add datafile 'C:\oracle\product\10.2.0\oradata\orcldb\users02.dbf' size 10M;
    create table test3  tablespace users as select * from dba_objects where 1=2; 
    alter table test3 allocate EXTENT (size 5M datafile 'C:\oracle\product\10.2.0\oradata\orcldb\users02.dbf');
    select extent_id,file_id,block_id,blocks from dba_extents where segment_name = 'TEST3';
    insert into test3 select * from dba_objects;
    commit;
    --刪掉test3表所在的數據文件 
    alter system checkpoint;
    select count(1) from test3;
    --系統報錯
    alter database datafile 'C:\oracle\product\10.2.0\oradata\orcldb\users02.dbf' offline;
    --要求該數據文件建立的比控制文件建立的晚
    alter database create datafile 'C:\oracle\product\10.2.0\oradata\orcldb\users02.dbf';
    recover datafile 14;
    alter database datafile 'C:\oracle\product\10.2.0\oradata\orcldb\users02.dbf' online;
    select count(1) from test3;
--system表空間對應的數據文件,或大量數據文件受損恢復
    alter system archive log current;--對當前的重作日誌進行歸檔
    alter tablespace system begin backup;--開始
    --複製備份表空間文件
    alter tablespace system end backup;--結束   
    shutdown immediate;
    --刪除system表空間數據文件
    startup;
    --拷回表空間備份
    recover database; 
    alter database open; 
    --至關於全庫數據文件備份恢復    
--不徹底恢復
    --基於時間time的恢復:能夠將數據庫恢復到過去的某個時間點,用戶誤刪的表恢復,備用機器上恢復後,導給正式服務器  
    create table test4(a int) tablespace users;
    insert into test4 values (1);
    commit;
    alter system archive log current;
    --須要備份除temp外全部表空間的數據文件,由於不徹底恢復須要將全部表空間都恢復到過去的同一個時間點,備
    --份時表空間要一個一個的備份
    insert into test4 values (2);
    commit;
    alter system switch logfile;
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    drop table test4;
    create table test5 (b int);  
    insert into test5 values (1);
    commit;
    alter system archive log current;
    shutdown immediate;
    --用備份的數據文件替換當前數據文件(全部)
    startup mount;
    recover database until time '2015-03-22 14:18:37';
    alter database open resetlogs;
    select * from test4;
    select * from test5;
    --恢復到時間點後,以後的操做都沒了
    --基於SCN的恢復:能夠將數據庫恢復到過去的某個SCN,用戶誤刪的表恢復,備用機器上恢復後,導給正式服務器  
    create table test4(a int) tablespace users;
    insert into test4 values (1);
    commit;
    alter system archive log current;
    --須要備份除temp外全部表空間的數據文件,由於不徹底恢復須要將全部表空間都恢復到過去的同一個時間點,備
    --份時表空間要一個一個的備份
    insert into test4 values (2);
    commit;
    alter system switch logfile;
    select crrent_scn from v$databae;
    drop table test4;
    create table test5 (b int);  
    insert into test5 values (1);
    commit;
    alter system archive log current;
    shutdown immediate;
    --用備份的數據文件替換當前數據文件(全部)
    startup mount;
    recover database until change 800124;
    alter database open resetlogs;
    select * from test4;
    select * from test5;
--回滾數據文件恢復
    show parameter undo  
    shutdown immediate;
    --刪掉undntbs01.dbf
    startup;--ORA-01110: 數據文件 2: 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\UNDOTBS01.DBF'
    alter system set undo_management=manual scope = spfile;
    shutdown immediate;
    startup mount;
    alter database datafile 'C:\oracle\product\10.2.0\oradata\orcldb\UNDOTBS01.DBF' offline drop;
    alter database open;
    drop tablespace undotbs1;
    create undo tablespace undotbs1 datafile 'C:\oracle\product\10.2.0\oradata\orcldb\UNDOTBS01.DBF'  size 50M autoextend on next 1M  maxsize 1024M;
    alter system set undo_management=auto scope = spfile;
    shutdown immediate;
    startup;
--臨時表空間恢復
    --10g後刪掉temp01.dbf後數據庫open時會自動重建
    shutdown immediate;  
    --刪掉temp01.dbf
    startup;
    --9i的恢復方法
    startup mount;
    alter database datafiel 'C:\oracle\product\10.2.0\oradata\orcldb\temp01.DBF' offline drop;
    alter database open;
    drop tablespace temp;
    create temporary tablespace temp datafile 'C:\oracle\product\10.2.0\oradata\orcldb\temp01.DBF'  size 20M autoextend off;
    shutdown immediate;
    startup;
--控制文件損壞後恢復
    --單個控制文件損壞後恢復       
    shutdown immediate;
    --刪掉control01.ctl文件
    startup;
    --將control02.ctl拷貝一份命名爲control01.ctl
    alter database mount;
    alter database open;
    --減小控制文件,修改pfile中控制文件,從pfile啓動數據庫
    startup open pfile = 'C:\oracle\product\10.2.0\db_1\database\initorcldb.ora';
    select name from v$controlfile;
    --多個控制文件被損壞恢復
    --找到最近的udmp目錄下的trc文件,用其中語句重建控制文件    
    alter database backup controlfile to trace;    
    --刪掉控制文件
    startup;
        CREATE CONTROLFILE  DATABASE "ORCLDB" NORESETLOGS  
        LOGFILE
          GROUP 1 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\REDO01.LOG'  SIZE 50M,
          GROUP 2 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\REDO02.LOG'  SIZE 50M,
          GROUP 3 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\REDO03.LOG'  SIZE 50M
        -- STANDBY LOGFILE
        DATAFILE
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\SYSTEM01.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\UNDOTBS01.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\SYSAUX01.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS01.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\EXAMPLE01.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS101.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS102.DBF',
          'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS02.DBF'
        CHARACTER SET ZHS16GBK
        ;   
    alter database open;   --     NORESETLOGS 若是是 RESETLOGS   alter database open resetlogs;
    --當控制文件的命名開啓了OMF時,利用trace文件重建控制文件會報ORA-01503: CREATE CONTROLFILE failed ORA-01276: Cannot add file
    --錯誤,須要註釋掉pfile中的控制文件配置,重建後控制文件回到最初配置位置sql

--日誌文件損壞恢復
    --正常關機狀況非當前聯機日誌文件損壞
    insert into test5 values (123);
    commit;
    select * from v$log;
    --刪掉inactive狀態的日誌
    startup;--ORA-00313: 沒法打開日誌組 3 (用於線程 1) 的成員
    select * from v$log;
    alter database clear logfile group 1;--歸檔模式,從新生成日誌文件
    alter database clear unarchived logfile group 1;--非歸檔模式
    alter database open;
    select * from test5;
    --正常關機狀況下當前聯機current(或全部)日誌文件損壞
    insert into test5 values (10);
    commit;    
    shutdown immediate;
    startup;--
    select * from v$log;
    recover database until cancel;
    alter database open resetlogs;
    select * from test5;    
    --運行時或非正常關閉狀況下已歸檔active日誌被損壞
    insert into test5 values (234);
    commit;
    alter system switch logfile;
    select * from v$log;
    shutdown abort;
    --刪掉active日誌
    startup
    recover database until cancel;
    --默認執行
    --輸入當前日誌文件路徑    
    alter database open resetlogs;
    select * from test5;數據庫

3、閃回
閃回flashback:將數據庫恢復到過去的某個時間點或SCN點的狀態包括,行級,表級,庫級閃回 
1.開啓,關閉閃回
2.行級閃回   
    show parameter undo;--查看閃回設置
    alter system set undo_management = auto;--手動管理閃回功能失效
    alter system set undo_retention = 86400;--閃回時長
    grant connect,resource to scott;
    grant execute on dbms_flashback to scott;
    grant select  any transaction to scott;
    --scott登錄後對錶中數據進行增,改,刪處理並提交
    select versions_startscn,versions_endscn,versions_xid,versions_operation,a from test1  versions between timestamp minvalue and maxvalue;
    --查詢閃回查詢表的時間點
    select operation,undo_sql from flashback_transaction_query where xid = '02001C00C8070000';
    --查詢閃回交易號(事物爲單位)對應的sql語句
    select * from test1 as of scn 3429232;
    --scn狀態時表中的數據
    alter table  test1 enable row movement;--須要對被刪行從新分配rowid
    flashback table test1 to scn  3429248;
        第 1 行出現錯誤:
        ORA-00604: 遞歸 SQL 級別 1 出現錯誤
        ORA-25153: 臨時表空間爲空
        select tablespace_name,file_name from dba_temp_files;
        alter tablespace temp add tempfile 'C:\oracle\product\10.2.0\oradata\orcldb\testtemp.DBF' size  100M  autoextend on;
        --應該是臨時表空間恢復的時候沒有值特殊指定
    flashback table test1 to timestamp to_timestamp('','');
    --行級閃回,當前時間到閃回時間點以前不能有DDL操做,不然閃回失敗,sys用戶的表不支持閃回    
    
3.表級閃回  
    create tablespace yy datafile 'C:\oracle\product\10.2.0\oradata\orcldb\yy01.dbf' size 8m;              
    create table yy1 tablespace yy as select * from dba_objects;    
    select sum(bytes) from dba_extents where segment_name = 'YY1';
    select bytes from dba_free_space where tablespace_name = 'YY';
    drop table yy1;
    alter database  datafile 'C:\oracle\product\10.2.0\oradata\orcldb\yy01.dbf' resize 5m; --報錯
        SYS@ orcldb >alter database  datafile 'C:\oracle\product\10.2.0\oradata\orcldb\y
        y01.dbf' resize 5m;
        alter database  datafile 'C:\oracle\product\10.2.0\oradata\orcldb\yy01.dbf' resi
        ze 5m
        *
        第 1 行出現錯誤:
        ORA-03297: 文件包含在請求的 RESIZE 值之外使用的數據
    show recyclebin
    flashback table yy1 to before drop;    
    select * from yy1;
    drop table yy1 purge;
    purge table yy1;
    purge recyclebin;
    alter database datafile 'C:\oracle\product\10.2.0\oradata\orcldb\yy01.dbf' resize 5m;
    drop tablespace yy including contents and datafiles;
    
    create tablespace yy datafile 'C:\oracle\product\10.2.0\oradata\orcldb\yy01.dbf' size 8m;              
    create table yy1 tablespace yy as select * from dba_objects;    
    select sum(bytes) from dba_extents where segment_name = 'YY1';
    select bytes from dba_free_space where tablespace_name = 'YY';
    drop table yy1;
    show recyclebin
    create table yy2 tablespace yy as select * from dba_objects;
    show recyclebin   --已被清空
    drop table yy1 purge;
    flashback table yy1 to before drop;
    --drop table後表空間未自動釋放(drop table purge),直到表空間中無空閒空間的時候才按FIFO順序清空recyclebin中的表,釋放空間,
    --system表空間被drop的表刪除後不進入recyclebin中    
    
    create table zz (a int) tablespace yy;    
    insert into zz values (11);
    drop table zz;
    create table zz (a int) tablespace yy;    
    insert into zz values (22);
    drop table zz;    
    create table zz (a int) tablespace yy;    
    insert into zz values (33);
    drop table zz; 
    show recyclebin
    flashback tables zz to before drop;
    select * from zz;--33
    flashback table zz to before drop rename to zzz;
    select * from zzz;    
    flashback table zz to before drop rename to zzzz;
    select * from zzzz;  
    --在表空間充足的狀況下屢次drop表後,按照FILO順序進行恢復安全

4.庫級閃回
    show parameter db_recovery_file_dest;--查看閃回數據保存位置
    show parameter db_recovery_file_dest_size;--默認2G
    show parameter db_flashback_retention_target;--閃回數據保存的時間
    select file_type,number_of_files,percent_space_used,percent_space_reclaimable from v$flash_recovery_area_usage;
    --查詢閃回區使用狀況
    shutdown immediate;
    startup mount;
    alter database archivelog;--啓用歸檔模式
    alter database flashback on;--啓用庫級閃回
    alter database open;
    select name,log_mode,flashback_on from v$database;
    --rvwr進行
    alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
    select * from v$flashback_database_log;--查詢當前閃回狀況
    --閃回到時間點
    select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
    drop table test1;
    select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;--最先可用的閃回時間
    shutdown immediate;
    startup mount;
    flashback database to timestamp to_date('2015-03-24 16:42:05','yyyy-mm-dd hh24:mi:ss');
    alter database open resetlogs;
    select * from test1;
    --閃回到SCN
    select current_scn from v$database;
    truncate table test1;
    select oldest_flashback_scn from v$flashback_database_log;
    shutdown immediate;
    startup mount;
    flashback database to  scn 3431724;
    alter database open resetlogs;
    select * from test1;
    --閃回期間不能有恢復重建控制文件,刪除表空間,收縮數據文件操做    
2、LogMiner日誌分析
--logMiner:分析數據庫二進制日誌文件,分析出操做的執行時間點和SCN
    alter database add supplemental log data;--啓用加強信息記錄
    execute dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);--配置logminer運行環境
    exit--從新登陸使得配置生效
    create table TEST2 (a int);
    insert into TEST2 values (1);
    commit;
    select * from v$log;
    execute dbms_logmnr.add_logfile(logfilename=>'C:\oracle\product\10.2.0\oradata\orcldb\REDO03.LOG',options=>dbms_logmnr.new);--創建日誌分析列表,添加分析日誌
    execute dbms_logmnr.add_logfile(logfilename=>'C:\oracle\product\10.2.0\oradata\orcldb\REDO02.LOG',options=>dbms_logmnr.addfile);--添加歸檔文件
    execute dbms_logmnr.add_logfile(logfilename=>'C:\oracle\product\10.2.0\oradata\orcldb\REDO02.LOG',options=>dbms_logmnr.removefile);--刪除歸檔文件
    execute dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--啓動日誌分析
    select username,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents where table_name = 'TEST1';
    --查看分析結果
    execute dbms_logmnr.end_logmnr;
    
ora-38760 :此數據庫沒法啓用閃回數據庫,問題處理
    select flashback_on from v$database;     
    show parameter flash
    show parameter control
    show parameter recovery
    alter database flashback off;
    alter database open;
    
刪掉數據文件:
    使用offline數據文件的方法
    非歸檔模式使用:alter database datafile '...' offline drop;
    歸檔模式使用:  alter database datafile '...' offline;
    10g能夠經過如下命令來刪除一個空的數據文件
    Alter tablespace USERS drop datafile 'C:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCLDB\USERS02.DBF';
    select file_id,file_name,tablespace_name from dba_data_files
    select SEGMENT_NAME,FILE_ID,BLOCKS from dba_extents where file_id=8;
 服務器

相關文章
相關標籤/搜索