博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle 备份恢复 11oracle备份恢复补充
阅读量:5876 次
发布时间:2019-06-19

本文共 14844 字,大约阅读时间需要 49 分钟。

hot3.png

一、冷备份:

    当数据库的所有可读写的物理文件具有相同的系统改变号(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),还原备份,启动数据库;整个过程不涉及对日志的操作。          

二、热备份:

    针对7*24数据库只能用热备,数据库的物理文件SCN号处于不一致状态下进行备份;主要是控制文件和系统数据文件SCN不一致,
只使用于archivelog模式,(只备份数据文件和控制文件)。
    优点:可在表空间,数据文件级别备份;备份时数据库仍可用;可达到秒级恢复;
    缺点:不能出错否则备份不可用;方法复杂难维护
1、备份步骤:
    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、备份恢复实验:
--2.1、非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中的控制文件配置,重建后控制文件回到最初配置位置

--日志文件损坏恢复

    --正常关机情况非当前联机日志文件损坏
    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;

三、闪回

闪回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;
    --闪回期间不能有恢复重建控制文件,删除表空间,收缩数据文件操作    
二、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;
 

转载于:https://my.oschina.net/peakfang/blog/2245471

你可能感兴趣的文章
js判断checkbox是否选中
查看>>
多系统盘挂载
查看>>
MySQL函数怎么加锁_MYSQL 函数调用导致自动生成共享锁问题
查看>>
MR1和MR2的工作原理
查看>>
Eclipse中修改代码格式
查看>>
GRUB Legacy
查看>>
关于 error: LINK1123: failure during conversion to COFF: file invalid or corrupt 错误的解决方案...
查看>>
python实现链表
查看>>
java查找string1和string2是不是含有相同的字母种类和数量(string1是否是string2的重新组合)...
查看>>
Android TabActivity使用方法
查看>>
Eclipse的 window-->preferences里面没有Android选项
查看>>
《麦田里的守望者》--[美]杰罗姆·大卫·塞林格
查看>>
央行下属的上海资信网络金融征信系统(NFCS)签约机构数量突破800家
查看>>
[转] Lazy evaluation
查看>>
常用查找算法总结
查看>>
被神话的大数据——从大数据(big data)到深度数据(deep data)思维转变
查看>>
修改校准申请遇到的问题
查看>>
Linux 进程中 Stop, Park, Freeze【转】
查看>>
文件缓存
查看>>
远程协助
查看>>