一、冷备份:
当数据库的所有可读写的物理文件具有相同的系统改变号(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;