2.4手工非一致性备份(热备份)的执行方式及热备份的监控(v$backup)...7
2.5dbv(dbverify)检查数据文件是否有坏块...9
第三章:手工完全恢复...9
3.1完全恢复;...10
3.2完全恢复的步骤...10
3.3手工完全恢复可以基于三个级别...10
3.4恢复过程可以查看的视图:...10
3.5非归档模式下只能做全备的完整还原,还原后仍会缺失联机日志文件...11
3.6归档模式下手工完全恢复的实验...11
3.7手工完全恢复特点小结:...18
第四章:手工不完全恢复(归档模式)...20
4.1不完全恢复的特点:...20
4.2不完全恢复(Incompleterecover)适用环境:...20
4.3不完全恢复的基本类型:...20
4.4不完全恢复的操作步骤(恢复模式对象的传统方法):...21
4.5、logminer工具的使用...21
4.6不完全恢复范例:...21
第五章:闪回flashback.41
5.1flashback的功能:...41
5.2flashback分类:(DBA-IIPPT:253)...42
第六章:RMAN(recovermanagement恢复管理器)概述...55
6.1rman的定义和功能:55
6.2rman的优点:...56
6.3rman的架构:...56
6.4rman连接目标库方法...56
6.5、查看rman的默认配置,修改rman的配置信息...57
6.6rman备份的分类:...61
6.7rman的命令格式:...61
第七章:rman(备份)...62
7.1rman备份分类:...62
7.2rman归档方式备份常用语法:...62
7.3增量备份:63
7.4块变更跟踪(blockchangetracking)64
7.5数据恢复顾问DRA.65
第八章:rman完全恢复...66
8.1recover恢复:...66
8.2完全恢复:...67
第九章:rman不完全恢复...77
9.1rman不完全恢复的三个标准模式:...77
第十章:目录库和辅助库...91
10.1创建目录库(Catalogdatabase)的必要性...91
10.2Catalogdatabase的配置...92
10.3RMAN存储脚本...93
10.4虚拟专用目录(ppt85-86)94
10.5AuxiliaryDatabase.94
第十一章:rman维护...95
11.1rman使用和维护...95
11.2list命令一览...95
11.3crosscheck:...95
11.4report报告命令一览...96
11.5delete删除备份命令一览...97
第二部分优化oracle数据库...97
第十二章Oracle资源管理...97
12.1为什么要使用Oracle资源管理器...97
12.2Oracle资源管理的基本概念:PPT:406.98
12.3一个资源管理中创建组、计划、及指令的例子:...99
12.4其他的资源指令和阀值...102
12.5配置测试使用者组自动切换...103
第十三章Oracle自动任务调度...104
13.1Oracle任务调度概述...104
13.2理解以下概念:...105
13.3例子...106
13.4通过调度程序窗口控制一个计划...108
13.5Window和JobClass.109
第十四章AWR与警报系统...110
14.1Oracle数据库采样ASH和AWR。...110
14.3ADDM(AutomaticDatabaseDianosticMonitor)111
14.4自动维护作业AutoTask.113
14.5使用服务器生成警报系统...113
第十五章:Oracle性能调优...114
15.1SQL的硬解析和软解析...114
15.211g内存管理...118
15.3查看Oracle的执行计划:...120
15.4SQL计划管理SPM..121
15.5DatabaseReplay(数据库重放)...122
附录Oracle一周备份计划范例...122
1)保护数据,避免因为各种故障而丢失数据
1)userprocessfailure:pmon自动处理
2)usererrors:需要dba通过备份恢复
3)instancefailure:smon自动处理
4)mediafailure:必须通过备份和日志恢复(介质恢复)
1)根据生产环境的恢复周期,制定详细的备份计划,然后严格执行
1)逻辑备份与恢复面向object
2)物理备份与恢复面向mediafailure(直接面向磁盘上的数据文件)
逻辑备份与恢复
1)传统的导入导出:exp/imp:
2)数据泵导入导出:expdp/impdp
//逻辑备份就是热备(数据库打开时)数据库对象某一时刻状态,不能运用在mediafailure(介质)上,逻辑备份的恢复就是还原备份,没有recover的概念,只有restore(还原)的概念。
物理备份与恢复
1)手工备份与恢复,通过OS的命令,完成备份与还原,然后再运用日志进行恢复。
2)自动备份与恢复,利用oracle的备份恢复工具rman(或其他备份恢复软件),还原与恢复过程自动完成。
//物理备份从方式上可以有一致性备份(冷备)和非一致性备份(热备)
//完整的备份方案应该以物理备份为主,逻辑备份辅助(用于备份一些重要的表)
//逻辑备份比较适合不同平台之间的迁移,而物理备份是从哪来到哪去。
mediafailure后,需要运用日志进行recover,
1)完全恢复:利用完整备份或部分备份,可以将datafile恢复到failure前得最后一次commit,不会出现数据丢失。
归档模式:redolog写入archivelog
非归档模式:没有archivelog,redolog循环覆盖
手工冷备手工热备RMAN冷备RMAN热备完整还原完全恢复不完全恢复----------------------------------------------------------------------------归档模式:yesyesyesyesyesyesyes
非归档模式:yesnoyesnoyesnono
*考点:
1)非归档模式运行时必须备份那些文件:控制文件和整个数据文件集,并且必须首先干净的关闭数据库(冷备)
2)当处于非归档模式下时,在丢失数据文件后唯一的选择是执行完整的数据库还原,而不能进行恢复。
3)非归档模式下,RMAN只能做冷备。
1)数据库全备:备份database的所有数据块(datafiles、controlfile)
2)部分备份:只备份单个表空间或datafile(archivelog模式)
3)一致性备份(冷备份):在数据库正常关闭情况下做备份,数据库处于一致性状态。
4)非一致性备份(热备份):database在open状态下备份。
1)备份和还原使用os命令
2)恢复用sqlplus命令:recover
有关的视图:v$datafile\v$datafile_header\v$controlfile\v$logfile\dba_tablespaces\dba_data_files
1)检查需要备份的数据文件
SQL>selectnamefromv$datafile;
SQL>selectfile_id,file_name,tablespace_namefromdba_data_files;
2)检查要备份控制文件
SQL>selectnamefromv$controlfile;
3)在线redo日志不需要做备份
注意:对只读的表空间不能做热备份,临时表空间不需要备份
1)在备份前要进入backupmode(backup模式),
即:执行beginbackup(在数据文件上生成检查点,写入scn,将来恢复的时候以此scn为起点)
SQL>alterdatabasebeginbackup;//对整个库做热备份
SQL>alterdatabaseendbackup;
SQL>altertablespaceusersbeginbackup;//对表空间做备份
SQL>altertablespaceusersendbackup;
2)备份期间利用v$backup监控
例;
SQL>altertablespacetestbeginbackup;
SQL>selectfile#,checkpoint_change#fromv$datafile_header;
FILE#CHECKPOINT_CHANGE#
----------------------------
12414314
22414314
32414314
42414314
52414314
62430480//在备份期间,scn不发生变化
72414314
SQL>select*fromv$backup;
FILE#STATUSCHANGE#TIME
---------------------------------------------------------
1NOTACTIVE0
2NOTACTIVE0
3NOTACTIVE0
4NOTACTIVE0
5NOTACTIVE0
6ACTIVE24304802012-07-3011:07:19
7NOTACTIVE0
STATUS是ACTIVE,表示可以备份相应的数据文件。
$cptest01.dbftest01.bak
备份完毕,执行endbackup
SQL>altertablespacetestendbackup;
6NOTACTIVE24304802012-07-3011:07:19
*考点:不能备份临时表空间,甚至不能将它们置于备份模式。
在手工备份前,应该检查datafile是否有坏块,备份完后对备份也做检查
[oracle@timranadmin]$dbv
DBVERIFY:Release11.1.0.6.0-ProductiononMonJul3011:11:072012
KeywordDescription(Default)
----------------------------------------------------
FILEFiletoVerify(NONE)
STARTStartBlock(FirstBlockofFile)
ENDEndBlock(LastBlockofFile)
BLOCKSIZELogicalBlockSize(8192)
LOGFILEOutputLog(NONE)
FEEDBACKDisplayProgress(0)
PARFILEParameterFile(NONE)
USERIDUsername/Password(NONE)
SEGMENT_IDSegmentID(tsn.relfile.block)(NONE)
HIGH_SCNHighestBlockSCNToVerify(NONE)
(scn_wrap.scn_baseORscn)
[oracle@timranadmin]$
针对某个datafile做坏块检查
[oracle@timranadmin]$dbvfile=/u01/oradata/timran11g/system01.dbf
通过备份、归档日志、currentredo,将database恢复到failure前的最后一次commit状态。
1)restore:还原所有或部分datafile
2)recover:利用归档日志和当前的redo日志做恢复
recoverdatabase:关键文件(系统表空间、undo数据文件、控制文件)损坏或数据库的大部分datafile丢失,只能mount状态完成
recovertablespace:非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成
recoverdatafile:非关键文件损坏,单个或几个datafile丢失,可以在mount或open状态完成
什么是关键数据文件:如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!
考点:那些数据文件是关键文件:三个;1)system01.dbf,2)undotablespace,3)controlfile
1)v$recover_file:查看需要恢复的datafile
2)v$recovery_log:查看recover需要的redo日志
3)v$archvied_log:查看已经归档的日志
(因为只备数据文件和控制文件),需要在mount下发出
alterdatabaseclearlogfilegroup<组号>.(如果是在RMAN下还原,这一过程是自动完成的)。
前提:1)有一套datafile全备,2)使用当前控制文件,(当前控制文件是好的)3)自备份以来的归档日志和当前联机日志是完整的,
范例1:recoverdatabase
说明:由于mediafailure适用于系统表空间出了问题即system01.dbf损坏。或丢失了大部分datafile,
sys:
SQL>select*fromscott.test;
ID
----------
1
在这个状态下先在os下做一个数据文件和控制文件的冷备。
SQL>shutdownimmediate
[oracle@timran~]$cp/u01/oradata/timran11g/*.dbf/u01/back1
[oracle@timran~]$cp/u01/oradata/timran11g/*.ctl/u01/back1
[oracle@timran~]$startup
SQL>insertintoscott.testvalues(2);
SQL>commit;
2
SQL>select*fromv$log;
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCHIVEDSTATUSFIRST_CHANGE#FIRST_TIME
--------------------------------------------------------------------------------------------------
11167524288001NOCURRENT24143132012-7-309
21165524288001YESINACTIVE23609762012-7-291
31166524288001YESINACTIVE23822452012-7-292
SQL>altersystemswitchlogfile;
SQL>altersystemarchivelogcurrent;
SQL>/
------------------------------------------------------------------------------------
11170524288001NOCURRENT24360252012-7-301
21168524288001YESINACTIVE24360112012-7-301
31169524288001YESINACTIVE24360172012-7-301
SQL>insertintoscott.testvalues(3);
3
1)模拟介质失败
[oracle@timran~]$rm/u01/oradata/timran11g/*.dbf//数据库在打开的情况下就删掉了所有dbf文件
SQL>shutdownabort//数据库直接abort了
ORACLEinstanceshutdown.
2)启动database
SQL>startup
ORACLEinstancestarted.
ORA-01157:cannotidentify/lockdatafile1-seeDBWRtracefile
ORA-01110:datafile1:'/u01/oradata/timran11g/system01.dbf'
SQL>selectfile#,errorfromv$recover_file;
FILE#ERROR
---------------------------------------------------------------------------
1FILENOTFOUND
2FILENOTFOUND
3FILENOTFOUND
4FILENOTFOUND
5FILENOTFOUND
6FILENOTFOUND
7FILENOTFOUND
SQL>selectfile#,checkpoint_change#fromv$datafile;
12436025
22436025
32436025
42436025
52436025
62436025
72436025
62430480
3)启动失败,控制文件和数据文件头的scn不一致,需要做介质恢复。
注意:
//此例是数据库open状态在os下直接删除了所有数据文件,所以这里最好不要做日志切换,否则情况复杂。
//控制文件记录的scn应大于需恢复的数据文件头部的scn,这样才能满足完全恢复的条件。
首先还原所有数据文件
[oracle@timran~]$cp/u01/back1/*.dbf/u01/oradata/timran11g
4)恢复database
可以先查看一下恢复时需要的归档日志
SQL>colarchive_namefora50;
SQL>select*fromv$recovery_log;
THREAD#SEQUENCE#TIMEARCHIVE_NAME
----------------------------------------------------------------------------------------
1##########2012-07-3009:39:31/u01/disk1/timran/arch_1_782662700_167.log
1##########2012-07-3013:11:22/u01/disk1/timran/arch_1_782662700_168.log
SQL>recoverdatabase
ORA-00279:change2414314generatedat07/30/201209:39:32neededforthread1
ORA-00289:suggestion:/u01/disk1/timran/arch_1_782662700_167.log
ORA-00280:change2414314forthread1isinsequence#167
13:21:13Specifylog:{
auto
5)打开数据库
SQL>alterdatabaseopen;
6)验证
范例2:recovertablespace(状态:databaseopen)
说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复
这种情形非常实用,通常是某个非关键表空间不可访问了,并没有造成oracle宕掉,只需要针对个别有问题的tablespace或datafile去做单独的恢复操作,
也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。
恢复表空间(删除了tablespace的所有的datafile)
1)了解一下当前状态,有个test表空间,
FILE_IDFILE_NAMETABLESPACE_NAME
------------------------------------------------------------------------------------------
4/u01/oradata/timran11g/users01.dbfUSERS
3/u01/oradata/timran11g/sysaux01.dbfSYSAUX
2/u01/oradata/timran11g/undotbs01.dbfUNDOTBS1
1/u01/oradata/timran11g/system01.dbfSYSTEM
5/u01/oradata/timran11g/example01.dbfEXAMPLE
7/u01/oradata/timran11g/abcd01.dbfABCD
6/u01/oradata/timran11g/test01.dbfTEST
SQL>connscott/scott
Connected.
SQL>createtablet1(namechar(10))tablespacetest;
SQL>insertintot1values('a');
SQL>select*fromt1;
NAME
--------------------------------------------------
a
2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件
[oracle@timran~]$rm/u01/oradata/timran11g/test01.dbf
[oracle@timran~]$
3)查证该表空间上的表不可访问了
SQL>altersystemflushbuffer_cache;//清除databuffer
SQL>conn/assysdba//换个session登陆,访问t1表,内存里已经没有了,只好做哦物理读,所以报错!
SQL>select*fromscott.t1;
select*fromscott.t1
*
ERRORatline1:
ORA-01116:errorinopeningdatabasefile6
ORA-01110:datafile6:'/u01/oradata/timran11g/test01.dbf'
ORA-27041:unabletoopenfile
LinuxError:2:Nosuchfileordirectory
Additionalinformation:3
4)看看scn的情况
13550907
23550907
33550907
43550907
53550907
63550339
60
5)数据库open下,使用备份还原这个表空间下的数据文件
[oracle@timran~]$cp/u01/back1/test01.dbf/u01/oradata/timran11g
6)表空间offline
SQL>altertablespacetestoffline;//注意:当前的数据库状态是open,数据字典里还有这个表空间。
7)恢复tablespace
SQL>recovertablespacetest;
ORA-00279:change2430480generatedat07/30/201211:07:19neededforthread1
ORA-00280:change2430480forthread1isinsequence#167
13:33:28Specifylog:{
8)表空间online
SQL>altertablespacetestonline;//注意:此时数据库状态一直是open的。
9)验证
范例3:(recoverdatafile,databasemount或open状态)
恢复datafile,同范例2不同的是:datafile是在数据库mount状态下恢复的(当然也可以open下进行)
1)模拟环境:
SQL>insertintoscott.t1values('b');
b
2)在open状态下删除datafile
3)关闭数据库
SQL>shutdownabort
4)用备份还原该datafile
[oracle@timran~]$cp/u01/backup/test01.dbf/u01/oradata/timran11g
5)mount下恢复datafile
SQL>startupmount
13:48:33SQL>recoverdatafile6;
13:48:47Specifylog:{
7)打开数据库
8)验证
(关键文件损坏,数据库abort,恢复一定是在mount下)
os:使用cp还原所有dbf
1)recoverdatabase;
2)alterdatabaseopen;
(非关键文件,一般是open下恢复)
os:使用cp还原该表空间XXX下的所有数据文件
1)altertablespaceXXXoffline;
2)recovertablespaceXXX;
3)altertablespaceXXXonline;
(非关键文件,databasemountoropen)
1)recoverdatafile6,8;
1)alterdatabasedatafile6,8offline;
2)recoverdatafile6,8;
3)alterdatabasedatafile6,8online;
完全恢复的条件:
1.有一个备份
2.有一个备份
3.控制文件是新的,是当前的控制文件
2)想跳过坏日志而继续恢复所有其他工作是不可能的,前滚没有这个功能(考点)。
3)必须以sysdba身份连接进行不完全恢复,普通用户或sysoper都不行(考点)。
2)在做完全恢复时,丢失了归档日志或当前onlineredolog(考点)
3)当误删除了表空间时(有备份)
4)丢失了所有的控制文件,使用备份的控制文件恢复时
2)基于scn(untilchange):使整个数据库恢复到过去的某个SCN前
2)基于cancel(untilcancel):使整个数据库恢复到归档日志或当前日志的断点前
3)基于误删除表空间(使用备份的controlfile):使整个数据库恢复到误删除表空间前
2)对现在的database做新全备
5)将恢复出来的table做逻辑备份(exp)
6)再将全备还原
7)将导出的表导入database(imp)
范例1:
1)环境:scott用户在test表空间下有个t1表
SQL>createtablet1(idint)tablespacetest;
SQL>insertintot1values(1);
SQL>insertintot1values(2);
SQL>insertintot1values(3);
2)误删除了t1表,并purge了。
SQL>droptablet1purge;
11131524288001YESINACTIVE18758932012-6-131
21132524288001YESINACTIVE18963852012-6-131
31133524288001NOCURRENT19169732012-7-181
SQL>selectnamefromv$archived_log;
--------------------------------------------------------------------------------
...
/u01/disk1/timran/arch_1_782662700_129.log
/u01/disk1/timran/arch_1_782662700_130.log
/u01/disk1/timran/arch_1_782662700_131.log
/u01/disk1/timran/arch_1_782662700_132.log
/u01/disk1/timran/arch_1_782662700_133.log//droptablet1purge这个动作的日志条目记录在此归档日志里了。
/u01/disk1/timran/arch_1_782662700_134.log
/u01/disk1/timran/arch_1_782662700_135.log
116rowsselected
3)通过logmr找出误操作的ddl命令的timestamp或san
SQL>showparameterutl
NAMETYPEVALUE
-----------------------------------------------------------------------------
create_stored_outlinesstring
utl_file_dirstring/home/oracle/logmnr(先建上这个目录)
SQL>executedbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);
SQL>executedbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_782662700_133.log',options=>dbms_logmnr.new);
SQL>executedbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_782662700_134.log',options=>dbms_logmnr.addfile);
SQL>executedbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);
SQL>selectusername,scn,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss'),sql_redofromv$logmnr_contentsWHERElower(sql_redo)like'droptable%';
USERNAMESCNTO_CHAR(TIMESTAMP,'YYYY-MM-DDHSQL_REDO
---------------------------------------------------------------------------------------------------------------------
SCOTT19172502012-07-1816:44:55droptabletestpurge;
SCOTT19172672012-07-1816:45:01droptablestudentpurge;
SCOTT19180002012-08-0117:28:29droptablet1purge;
SQL>executedbms_logmnr.end_logmnr;
4)关闭数据库,删除所有dbf,准备做不完全恢复
[oracle@timran~]$cd/u01/oradata/timran11g
[oracle@timran~]$rm*.dbf
5)还原所有备份的数据文件
[oracle@timran~]$cp/u01/back1/*.dbf./
17:31:43SQL>startup
TotalSystemGlobalArea285212672bytes
FixedSize1218968bytes
VariableSize75499112bytes
DatabaseBuffers201326592bytes
RedoBuffers7168000bytes
Databasemounted.
ORA-01113:file1needsmediarecovery
17:33:07SQL>recoverdatabaseuntiltime'2012-08-0117:28:29';
ORA-00279:change1917581generatedat07/18/201216:46:34neededforthread1
ORA-00289:suggestion:/u01/disk1/timran/arch_1_782662700_133.log
ORA-00280:change1917581forthread1isinsequence#133
17:33:17Specifylog:{
Logapplied.
Mediarecoverycomplete.
7)resetlogs方式打开数据库
SQL>alterdatabaseopenresetlogs;
8)验证
9)看看resetlogs后,日志sequence重置了(重置是指sequence又从一开始了)()。
110524288001YESUNUSED0
210524288001YESUNUSED0
311524288001NOCURRENT19180002012-8-117
SQL>recoverdatabaseuntilchange1918000;
这里不多赘述了。
范例2:在做完全恢复时,丢失了部分归档日志
1)模拟环境
SQL>insertintot1values(111);
112524288001YESINACTIVE19188292012-8-117
213524288001YESACTIVE19188312012-8-117
314524288001NOCURRENT19188382012-8-117
SQL>insertintot1values(444);
115524288001YESINACTIVE19188292012-8-117
216524288001YESACTIVE19188312012-8-117
317524288001NOCURRENT19188382012-8-117
SQL>insertintot1values(777);
111//这个动作的日志条目记录在sequence1里
444//这个动作的日志条目记录在sequence4里
777//这个动作的日志条目记录在sequence7里
2)模拟数据文件介质损坏,并需要恢复的归档日志有断点
[oracle@timran~]$rmuser01.dbf假设users表空间的datafile损坏
3)再模拟某归档日志损坏
[oracle@timran~]$cd/u01/disk1/timran
[oracle@timran~]$ll
总计359672
-rw-r-----1oracleoinstall102408-0116:52arch_1_782662700_139.log
-rw-r-----1oracleoinstall4689408008-0117:07arch_1_782662700_140.log
-rw-r-----1oracleoinstall60876808-0117:48arch_1_790191207_1.log
-rw-r-----1oracleoinstall102408-0117:48arch_1_790191207_2.log
-rw-r-----1oracleoinstall614408-0117:48arch_1_790191207_3.log
-rw-r-----1oracleoinstall4966408-0117:49arch_1_790191207_4.log
-rw-r-----1oracleoinstall102408-0117:49arch_1_790191207_5.log
-rw-r-----1oracleoinstall1126408-0117:49arch_1_790191207_6.log
-rw-r-----1oracleoinstall153608-0117:49arch_1_790191207_7.log
[oracle@timran~]$mvarch_1_790191207_4.logarch_1_790191207_4.delete
-rw-r-----1oracleoinstall4966408-0117:49arch_1_790191207_4.delete//日志不连续了,假设在sequence4断掉了
4)尝试对某数据文件的完全恢复
ORA-01157:cannotidentify/lockdatafile4-seeDBWRtracefile
ORA-01110:datafile4:'/u01/oradata/timran11g/users01.dbf'
[oracle@timran~]$cp/u01/back1/users01.dbf/u01/oradata/timran11g/users01.dbf//还原单个数据文件,企图基于datafile的完全恢复
06:09:07SQL>recoverdatafile4;
有如下报错:
......
ORA-00308:cannotopenarchivedlog'/u01/disk1/timran/arch_1_790191207_4.log'
ORA-27037:unabletoobtainfilestatus
//完全恢复失败,因为缺少归档日志:(/u01/disk1/timran/arch_1_790191207_4.log),只能做基于cancel的不完全恢复。
5)使用备份还原所有的datafile
6)进行基于cancel的不完全恢复
SQL>recoverdatabaseuntilcancel;
ORA-00279:change1918785generatedat08/01/201217:48:41neededforthread1
ORA-00289:suggestion:/u01/disk1/timran/arch_1_790191207_4.log
ORA-00280:change1918785forthread1isinsequence#4
17:56:15Specifylog:{
//选auto不好使,再来一遍选cancel.
17:56:21SQL>recoverdatabaseuntilcancel;
17:56:23Specifylog:{
cancel
Mediarecoverycancelled.
//选择cancel,在丢失的归档日志前终止recover
7)resetlogs打开数据库
111
不完全恢复中的复杂性是恢复数据文件的时候使用备份的控制文件。
1)为什么会使用备份的控制文件主要有三种情况:
第一种:控制文件全部丢失。(当然还有trace方法)
第二种:全备与当前控制文件不匹配,比如全备后又增/删了表空间。
2)使用备份的控制文件恢复数据库的语法:
recoverdatabaseusingbackupcontrolfile;//符合条件时,实现完全恢复
recoverdatabaseuntil[time|change]usingbackupcontrolfile;//不完全恢复
然后会有如下选项:
Specifylog:{
AUTO:是指自动的使用archivelog前滚恢复,但一般不包括currentlog的恢复;
filename:输入当前文件的路径和文件名,是指currentlog的恢复
CANCEL:退出。
考点:
2)使用backupcontrolfile子句的恢复数据库之后,一律要使用alterdatabaseopenresetlogs打开数据库。
范例1:
环境:当前控制文件损坏,数据文件损坏,有全备但之后增加了表空间,并备份了配套的控制文件。
模式:所有数据文件备份(老)------(新建表空间abcd)-----备份控制文件(次新)------日志文件(新)
分析:新建表空间数据文件损坏,全备里没有该数据文件的备份及控制文件描述,当前控制文件又丢失,只能用备份的控制文件恢复。
1)环境:
SQL>select*fromv$tablespace;
TS#NAMEINCBIGFLAENC
0SYSTEMYESNOYES
1SYSAUXYESNOYES
4USERSYESNOYES
6EXAMPLEYESNOYES
8TESTYESNOYES
2UNDOTBS1YESNOYES
3TEMPNONOYES
GROUP#THREAD#SEQUENCE#BYTESMEMBERSARCSTATUSFIRST_CHANGE#FIRST_TIME
-----------------------------------------------------------------------------------------------------
117524288001NOCURRENT66765742013-01-1713:55:19
215524288001YESINACTIVE66765492013-01-1713:54:14
316524288001YESINACTIVE66765622013-01-1713:54:48
SQL>createtablespaceabcddatafile'/u01/oradata/timran11g/abcd01.dbf'size5m;
SQL>createtablescott.a1(namechar(10))tablespaceabcd;
SQL>insertintoscott.a1values('a');
SQL>select*fromscott.a1;
2)备份控制文件
19:17:55SQL>alterdatabasebackupcontrolfileto'/u01/oradata/timran11g/con.bak1';
3)模拟abcd01.dbf损坏
[oracle@timran~]$rm/u01/oradata/timran11g/abcd01.dbf//数据库open状态,删除abcd01.dbf数据文件
SQL>altersystemflushbuffer_cache;//dbbuffer清空
SQL>conn/assysdba//换个session查看a1表物理读失败
已连接。
select*fromscott.a1
第1行出现错误:
ORA-00376:此时无法读取文件3
ORA-01110:数据文件3:'/u01/oradata/timran11g/abcd01.dbf'
4)关闭数据库
SQL>shutdownabort;
5)恢复所有数据文件备份,准备做不完全恢复
[oracle@timrantimran11g]$cd/u01/oradata/timran11g
[oracle@timrantimran11g]$rm*.ctl
[oracle@timrantimran11g]$rm*.dbf
[oracle@timrantimran11g]$cp/u01/back1/*.dbf./
[oracle@timrantimran11g]$cpcon.bak1control01.ctl
[oracle@timrantimran11g]$cpcon.bak1control02.ctl
[oracle@timrantimran11g]$cpcon.bak1control03.ctl
ORACLE例程已经启动。
TotalSystemGlobalArea422670336bytes
FixedSize1300352bytes
VariableSize331352192bytes
DatabaseBuffers83886080bytes
RedoBuffers6131712bytes
数据库装载完毕。
ORA-01589:要打开数据库则必须使用RESETLOGS或NORESETLOGS选项
SQL>colnamefora50;
SQL>selectfile#,checkpoint_change#,namefromv$datafile;
FILE#CHECKPOINT_CHANGE#NAME
------------------------------------------------------------------------------
16676574/u01/oradata/timran11g/system01.dbf
26676574/u01/oradata/timran11g/sysaux01.dbf
36676601/u01/oradata/timran11g/abcd01.dbf
46676574/u01/oradata/timran11g/user01.dbf
56676574/u01/oradata/timran11g/example01.dbf
66676574/u01/oradata/timran11g/test01.dbf
76676574/u01/oradata/timran11g/undotbs01.dbf
16676343
26676343
30
46676343
56676343
66676343
76676343
SQL>
可以看出:1)file3在控制文件里记录是abcd01.dbf,而与之对应的数据文件3是不存在的,2)备份的数据备份的scn比控制文件scn的还老。
6)使用备份控制文件恢复
SQL>recoverdatabaseusingbackupcontrolfile;
ORA-00283:恢复会话因错误而取消
ORA-01157:无法标识/锁定数据文件3-请参阅DBWR跟踪文件
//此错是因为老备份里没有abcd表空间,但只要控制文件里记录了abcd就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。
SQL>alterdatabasecreatedatafile'/u01/oradata/timran11g/abcd01.dbf';
---再次使用备份控制文件恢复
ORA-00308:无法打开归档日志'/u01/disk1/timran/arch_1_804846837_9.log'
ORA-27037:无法获得文件状态
//archive日志前滚结束了,但当前日志里还有信息需要恢复
//注意:对于这个例子来说,一定要看清提示:如果当前日志没有归档,则直接要输入filename不能输入auto,否则open时会失败。
SQL>recoverdatabaseusingbackupcontrolfile;//再次做恢复
指定日志:{
/u01/oradata/timran11g/redo03.log//把蛇头(当前日志)给它。
已应用的日志。
完成介质恢复。
7)resetlogs打开数据库
----------------------------------------
范例2:(属于第一种情况)
环境:当前控制文件损坏,新建表空间在备份控制文件之后。
模式:全备(老)-----备份控制文件(次新)-----新建表空间timran------日志文件(新)
分析:整个恢复过程中datafile结构有了变化,变化发生在备份控制文件之后,新增了表空间timran,控制文件备份里没有此表空间记录,但日志里有。
1)环境
SQL>droptablespaceabcdincludingcontentsanddatafiles;
SQL>alterdatabasebackupcontrolfileto'/u01/oradata/timran11g/con.bak2';
SQL>createtablespacetimrandatafile'/u01/oradata/timran11g/timran01.dbf'size5m;
SQL>createtablescott.r1(idint)tablespacetimran;
SQL>insertintoscott.r1values(1);
------------------------------------------------------------------------
14TIMRANYESNOYES
SQL>select*fromscott.r1;
111524288001NOCURRENT66771192013-01-1714:08:18
310524288001YESUNUSED0
2)模拟新建数据文件损坏
[oracle@timrantimran11g]rmtimran01.dbf
SQL>altersystemflushbuffer_cache;
SQL>conn/assysdba
ORA-01116:打开数据库文件3时出错
ORA-01110:数据文件3:'/u01/oradata/timran11g/timran01.dbf'
ORA-27041:无法打开文件
3)关闭数据库
4)还原所有数据文件,以老控制文件替换当前控制文件
[oracle@timrantimran11g]$cpcon.bak2control01.ctl
[oracle@timrantimran11g]$cpcon.bak2control02.ctl
[oracle@timrantimran11g]$cpcon.bak2control03.ctl
5)启动数据库
16677122/u01/oradata/timran11g/system01.dbf
26677122/u01/oradata/timran11g/sysaux01.dbf
46677122/u01/oradata/timran11g/user01.dbf
56677122/u01/oradata/timran11g/example01.dbf
66677122/u01/oradata/timran11g/test01.dbf
76677122/u01/oradata/timran11g/undotbs01.dbf
6)使用备份控制文件恢复数据库
ORA-00279:更改6676343(在01/16/201314:11:39生成)对于线程1是必需的
ORA-00289:建议:/u01/disk1/timran/arch_1_804846837_4.log
ORA-00280:更改6676343(用于线程1)在序列#4中
/u01/oradata/timran11g/redo01.log
ORA-01244:未命名的数据文件由介质恢复添加至控制文件
ORA-01112:未启动介质恢复
16678002/u01/oradata/timran11g/system01.dbf
26678002/u01/oradata/timran11g/sysaux01.dbf
36677999/u01/oracle/dbs/UNNAMED00003//注意这个问题,老控制文件不知道之后的timran01.dbf
46678002/u01/oradata/timran11g/user01.dbf
56678002/u01/oradata/timran11g/example01.dbf
66678002/u01/oradata/timran11g/test01.dbf
76678002/u01/oradata/timran11g/undotbs01.dbf
16678002
26678002
46678002
56678002
66678002
76678002
7)重命名数据文件
SQL>alterdatabasecreatedatafile'/u01/oracle/dbs/UNNAMED00003'as'/u01/oradata/timran11g/timran01.dbf';
//上面的命令一石二鸟,自动完成了两个动作1)加了一个数据文件timran01.dbf,2)重命名控制文件UNNAMED00003为timran01.dbf
36677999/u01/oradata/timran11g/timran01.dbf
ORA-00279:更改6677999(在01/17/201314:20:50生成)对于线程1是必需的
ORA-00289:建议:/u01/disk1/timran/arch_1_804953298_1.log
ORA-00280:更改6677999(用于线程1)在序列#1中
8)resetlogs打开数据库
9)验证
范例3恢复删除的表空间(属于第二种情况)
环境:用户使用正常操作命令删除了表空间及其数据文件,但之后又希望恢复删除的表空间。全备里有这个表空间的数据文件。
模式:全备(老)------控制文件备份(次新)-----删除表空间------所需日志(新)
分析:当用户使用droptablesapcexxxincludingcontentsanddatafiles这条DDL语句后,数据库的结构发生了变更,涉及了三个地方。
a)控制文件
b)该表空间下的数据文件
c)系统表空间(数据字典)(数据字典和DDL操作有关)
特别提醒的是:当前的控制文件里已经没有该表空间的信息了,所以不能使用当前的控制文件做恢复。恢复这个表空间要满足三个条件:
a)要有该表空间的数据文件备份
c)使用备份的控制文件,而这个控制文件里含有该表空间的信息。
1)背景:
5UNDOTBS2YESNOYES
SQL>createtablescott.t1(idint)tablespacetest;
SQL>insertintoscott.t1values(1);
2)记录下当前scn
SQL>selectcurrent_scnfromv$database;
CURRENT_SCN
-----------
7222848
3)备份控制文件
SQL>alterdatabasebackupcontrolfileto'/u01/oradata/timran11g/con.bak'
4)删除表空间及数据文件
SQL>droptablespacetestincludingcontentsanddatafiles;
5)删除所有数据文件和当前控制文件,还原所有数据文件及备份的控制文件
[oracle@timrantimran11g]$cpcon.bakcontrol01.ctl
[oracle@timrantimran11g]$cpcon.bakcontrol02.ctl
[oracle@timrantimran11g]$cpcon.bakcontrol03.ctl
ORA-01589:要打开数据库则必须使用RESETLOGS或NORESETLOGS选
SQL>recoverdatabaseuntilchange7222848usingbackupcontrolfile;
7)以不完全恢复方式打开数据库
范例4(针对第三种情况)略
利用flashbacklog或undodata对database可以恢复到过去某个点,可以作为不完恢复的补充
1)flashbackdrop
2)flashbackquery(新添flashbackdatabasearchive)
3)flashbacktable
4)flashbackversionquery
5)flashbacktransaction
6)flashbackdatabase
1)每个用户都有一个回收站,droptable时(非purge),实际上把table改名后放入了recyclebin(回收站)。
SQL>showparameterrecyclebin
recyclebinstringON
//如果参数设为off就取消了用户的回收站,那么当你droptable就相当于purge了。
SQL>connscott/scott;
SQL>select*fromtab;
TNAMETABTYPECLUSTERID
-----------------------------------------------
DEPTTABLE
EMPTABLE
BONUSTABLE
SALGRADETABLE
TESTTABLE
T01TABLE
T02TABLE
SQL>droptablet01;
SQL>showrecycle;
ORIGINALNAMERECYCLEBINNAMEOBJECTTYPEDROPTIME
T01BIN$qrJLbL74ZgvgQKjA8Agb/A==$0TABLE2011-08-17:06:52:38
2)
假设如果回收站里有两个t01表,注意闪回和清除缺省含义createtablea(namechar(10));insertintoavalues('timran');droptablea;
看以下两条语句:
SQL>flashbacktablet01tobeforedrop;//闪回的是最新的那个t01的表(考点)。
SQL>purgetablet01;//清除的是最老的那个t01表(考点)。
避免混淆可以直接点出回收站里的表名
SQL>flashbacktable"BIN$qrJLbL74ZgvgQKjA8Agb/A==$0"tobefroedrop
SQL>purgetable"BIN$qrJLbL74ZgvgQKjA8Agb/A==$0"
SQL>purgerecyclebin;//清空回收站
3)如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名.
SQL>droptabletest;SQL>createtabletestasselect*fromemp;
BIN$qrJLbL76ZgvgQKjA8Agb/A==$0TABLE
06:56:50SQL>showrecycle;
TESTBIN$qrJLbL76ZgvgQKjA8Agb/A==$0TABLE2011-08-17:06:56:36
SQL>flashbacktabletesttobeforedrop;
flashbacktabletesttobeforedrop
ORA-38312:originalnameisusedbyanexistingobject
SQL>flashbacktabletesttobeforedroprenametotest_old;
//闪回drop语句中使用了重命名
renamebtoa;//把b表重命名为a
4)system表空间的表没有闪回drop,droptable系统表空间的表会直接被删除(考点)
SQL>createtabletestasselect*fromuser_tables;
SQL>droptabletest;SQL>showrecycle;
5)如果一个表上面有索引和约束,drop后再闪回表,索引和约束还在吗?
SQL>createtablet(idint,namechar(10));
SQL>altertabletaddconstraintpk_tprimarykey(id);
SQL>insertintotvalues(1,'sohu');
SQL>insertintotvalues(2,'sina');
SQL>select*fromt;
IDNAME
--------------------
1sohu
2sina
-----看一眼约束和索引
SQL>select*fromuser_indexes;
SQL>select*fromuser_constraints;
SQL>droptablet;
BIN$yF3hbvIcioTgQAB/AQAJlg==$0TABLE
-----表被drop到回收站,再看一眼约束和索引
SQL>select*fromuser_indexes;//索引不见了
SQL>select*fromuser_constraints;//约束有,但乱码
SQL>flashbacktablettobeforedrop;
闪回完成。
-----再看约束和索引
SQL>select*fromuser_indexes;//索引回来了,但乱码
SQL>select*fromuser_constraints;//约束也在,但乱码
-----分别重命名索引和约束
SQL>alterindex"BIN$yF3hbvIbioTgQAB/AQAJlg==$0"renametopk_t;
SQL>altertabletrenameconstraint"BIN$yF3hbvIaioTgQAB/AQAJlg==$0"topk_t;
ok!
1)要点:
查询的语法:
select…asofscn|timestamp
2)例:
createtablescott.student(snoint,snamechar(10),sageint);
insertintoscott.studentvalues(1,'Tom',21);
insertintoscott.studentvalues(2,'Kite',22);
insertintoscott.studentvalues(3,'Bob',23);
insertintoscott.studentvalues(4,'Mike',24);
commit;
/
SQL>select*fromscott.student;
SNOSNAMESAGE
------------------------------
1Tom21
2Kite22
3Bob23
4Mike24
selectcurrent_scnfromv$database;//取scn1
deletescott.studentwheresno=1;
select*fromscott.student;
selectcurrent_scnfromv$database;//取scn2
updatescott.studentsetsage=50;
2Kite50
3Bob50
4Mike50
selectcurrent_scnfromv$database;取scn3
scott:
select*fromstudentasofscn取scn1;
createtablestudent2asselect*fromscott.studentasofscn取scn1;
droptablestudent;
renamestudent2tostudent;
select*fromstudent;
语法:
flashbacktable
deletestudent;
altertablestudentenablerowmovement;
flashbacktablestudenttoscnXXXXX
注意:sys的表不能闪回。
3)闪回归档查询补充11g新特性FLASHBACKARCHIEVE
3.1)概念:
无限期的存储表行的前镜像,通过后台进程FBDA,捕捉必要的数据并将其保存在归档上,然后可以使用常规闪回查询命令查询需要的数据,但闪回可以回朔到多年以前。
闪回归档要求创建一个或多个表空间,然后为每个归档指定保留期并指定归档保护的表和一个可选的配额,指定原有的表空间技术上是可行的,但是oracle建议它们与常规的数据分开更好。
3.2)一道考题的问题:有两个版本的答案,我们来实验一下:
题目:
Notetheoutputofthefollowingquery;
SQL>SELECTflashback_archieve_name,statusFROMdba_flashback_archieve;
FLASHBACK_ARCHIEVE_NAMESTATUS
FLA1
YouexecutedthefollowingcommandtoenableFlashbackDataArchiveonthe
EXCHANGB_PATEtable:
ALTERTABLEexchange_rateFLASHBACKARCHIEVE;
Whatistheoutcomeofthiscommand
A.ThetableusesthedefaultFlashbackDataArchive.
B.TheFlashbackDataArchiveIscreatedIntheSYSAUXtablespace.
C.TheFlashbackDataArchiveiscreatedinthesametablespacewherethetablesarestored.
D.ThecommandgeneratesanerrorbecausenoflashbackDataArchivenameisspecifiedandthereisnodefaultFlashbackDataAchieve.
答案:a或d都有
分析:
首先需要建一个表空间,然后当建立flashbackarchive在这个表空间上时你可以带上关键字default,这样status状态就会显示出default,
(这个题却没有显示出default,说明前面flashbackarchive的时候没有加default关键字)然后,你指定表使用这个表空间时不用做任何说明就可以了,所以这个答案应该是d
下面是我做的测试,看看default有与没有的差异:
SQL>createtablespacefda_tbs1datafile'/u01/oradata/timran11g/fda_tbs01.dbf'size5m;
SQL>CREATEFLASHBACKARCHIVEdefaultfda1TABLESPACEfda_tbs1QUOTA10MRETENTION1YEAR;
闪回档案已创建。
SQL>SELECTflashback_archive_name,statusFROMdba_flashback_archive;
FLASHBACK_ARCHIVE_NAME-----------------------------------STATUS-------
FDA1DEFAULT
SQL>altertablescott.empflashbackarchive;
表已更改。
SQL>dropflashbackarchivefda1;
闪回档案已删除。
SQL>CREATEFLASHBACKARCHIVEfda1TABLESPACEfda_tbs1QUOTA10MRETENTION1YEAR;
FDA1
altertableempflashbackarchive
ORA-55608:默认的闪回归档不存在
考点:设置闪回数据归档有两个先决条件:1)使能automaticundomanagent(设置undo自动管理)2)tablespace要ASSM()的。
1)要点:
select…from…versionsbetween
createtablet3(idint,namechar(10));
insertintot3values(1,'tim');
insertintot3values(2,'mike');
insertintot3values(3,'brain');
insertintot3values(4,'cade');
selectto_char(sysdate,'yyyy-mm-ddhh24:mi:ss')fromdual;
updatet3setname='nelson'whereid=4;
deletet3whereid=2;
updatet3setid=id+100;
SQL>selectversions_starttime,versions_endtime,versions_xid,versions_operation,id,namefromt3versions
betweentimestampminvalueandmaxvalue;
SQL>selectversions_xid,versions_operation,id,namefromt3versionsbetweentimestampminvalueandmaxvalue;
VERSIONS_XIDVERSIONS_OPERATIONIDNAME
-----------------------------------------------------------------------------------
03000800F3010000U104nelson
03000800F3010000U103brain
03000800F3010000U101tim
04000A0076010000D2mike
08002000F9010000U4nelson
1tim
2mike
3brain
4cade
*考点:闪回版本查询不能用于外部表、临时表或V$视图。原因是这些对象都不生成撤销数据。(临时表的撤销是基于session的)。
闪回事务查询可以提供撤销查询语句。从flashback_transaction_query这个视图里查询引起数据变化的事务,和撤销事务的SQL语句
也就是查询operation和undo_sql列。
可以和闪回版本查询结合起来使用。
SQL>descflashback_transaction_query;
SQL>selectundo_sqlfromflashback_transaction_querywherexid=hextoraw('事务号');
接上例:
SQL>selectundo_sqlfromflashback_transaction_querywherexid=hextoraw('03000800F3010000');//产生逆操作
UNDO_SQL
update"SYS"."T3"set"ID"='4'whereROWID='AAANByAABAAAO/yAAD';
update"SYS"."T3"set"ID"='3'whereROWID='AAANByAABAAAO/yAAC';
update"SYS"."T3"set"ID"='1'whereROWID='AAANByAABAAAO/yAAA';
//执行上面语句,原操作(updatet3setid=id+100;)就撤销了//做了个逆操作,还原以前的状态。
SQL>update"SYS"."T3"set"ID"='4'whereROWID='AAANByAABAAAO/yAAD';
SQL>update"SYS"."T3"set"ID"='3'whereROWID='AAANByAABAAAO/yAAC';
SQL>update"SYS"."T3"set"ID"='1'whereROWID='AAANByAABAAAO/yAAA';
1)概念:
闪回数据库针对的是逻辑错误(比如删除一个用户,删除一个表),如果数据库发生了物理损坏或介质丢失,闪回数据库将无能为力,闪回数据库不能代替传统完全恢复(考点)
也不能代替传统的不完全恢复。
使用闪回数据库,需要开启闪回日志,闪回日志存放在闪回恢复区里。
一旦启用了闪回数据库,某些块的影像会从dbbuffer复制到SGA的一个新的存储区域中,即闪回缓冲区,然后再由后台进程(RecoverWriteRVWR)(闪回快照)
将此闪回恢复区的内容刷新到磁盘和闪回日志。这一切并没有改变LGWR的常规作用。与重做日志不同的是RVWR不是记录数据库变化的日志,而是记录完整块影像的记录。(PPT-311)
*考点:不同于重做日志,不能多路复用和归档闪回日志。它们是自动创建和管理的。
2)闪回日志放在闪回恢复区里
闪回恢复区(flashbackrecoveryarea)是一个非常重要的概念,它不仅存放闪回日志,更是跟所有恢复有关的文件(归档日志),比如RMAN的默认位置。
rman对这个区域有部分自动管理的功能。
SQL>showparameterrecovery_file
db_recovery_file_deststring/u01/flash_recovery_area
db_recovery_file_dest_sizebiginteger2G
*考点:设置db_recovery_file_dest之前必须先设置db_recovery_file_dest_size
3)配置闪回数据库的基本步骤:
3.1)配置成归档方式
闪回数据库必须配备成归档方式,是因为闪回日志里只记录了快照,这些快照可以使数据库回退到某个SCN点,而回退快照的SCN仅比你指定的SCN提前一点,
然后会运用归档日志或当前日志前滚一小段,当到达指定的san之前时停住。然后在此SCN前resetlogs打开数据库。
3.2)配置闪回恢复区
showparameterdb_recovery_file_dest
showparameterdb_flashback_retention_target(retention保留期)
注意单位是分钟,缺省1440相当于24小时
3.4)启用数据库闪回要在mount状态
alterdatabaseflashbackon;
alterdatabaseopen;
archiveloglist查看日志模式
showparameterrecover查看恢复文件(闪回恢复区)
在mount状态下
alterdatabaseflashbackon;(打开闪回数据库日志)
打开数据库
4.1)取当前SCN
7248690
4.2)删除scott用户
SQL>dropuserscottcascade;
4.3)准备到mount下去闪回数据库
SQL>shutdownimmediate;
SQL>flashbackdatabasetoscn7248690;
4.4)只读方式打开,确认scott已经被闪回
SQL>alterdatabaseopenreadonly;(不能贸然打开数据库,要在只读状态下打开,这时scn是不变的,数据库是只读的)
SQL>select*fromscott.emp;
4.5)重新以resetlogs方式打开数据库(属于不完全恢复)
提醒:要在mount下闪回数据库
flashbackdatabasetotimestampto_char('2012-03-0219:11:11','yyyy-mm-ddhh24:mi:ss');
flashbackdatabasetoscn1264788;
alterdatabaseopenreadonly;
startupforce;
alterdatabaseopenresetlogs;//一旦resetlogs打开,若想再一次做闪回,只能闪回比当前更早的scn(见ppt-315page)。
5)那些操作适合或不适合闪回数据库
适合:
找回dropuser
在某个用户操作影响到整个数据库时
错误的truncate表
不适合:
使用了备份的控制文件或trace文件
drop表空间的操作
段重组后的表
6)关于闪回日志的信息有两个视图:
v$flashback_database_log;和v$flashback_database_stat;
相比来看,v$flashback_database_log信息对于flashdatabase更有帮助。
descv$flashback_database_log;
OLDEST_FLASHBACK_SCN保留的最低系统改变号
FLASHBACK_SIZE当前闪回日志的大小(单位:字节)
*考点:闪回数据库要求归档日志模式,并使用alterdatabaseopenresetlogs来创建数据库的一个化身(incarnation)。
1)RecoveryManager
2)通过oracle提供的包,建立备份和恢复的serverprocess,在oracleserver上做备份和恢复(rman是一个工具,真正干活的是serverprocess)
3)rman备份database、tablespace、datafile、controlfile、spfile、archivelog
4)支持归档和非归档
5)在归档模式下支持一致性备份(冷备)和非一致性备份(热备)
6)非归档只支持一致性备份(冷备)
1)非归档方式的RMAN只能冷备,并在mount下做,但手工备份在mount下cp出来的备份是不能用的(手工冷备份必须在数据库关闭时进行,不能在mount下备份)。
2)非归档方式的RMAN恢复只能还原最后一次备份。
1)不备份数据文件中unallocateblock(未分配的块)(备份segment高水位线以下的block),节省空间(考点)
2)备份时自动检查数据文件是否有坏块,并可以标记坏块,跳过坏块,因为RMAN是ORACLEBLOCK级备份技术
3)可以实现增量备份(上次备份的就不备了,从上次之后的开始备份)
4)备份和恢复都是用rman的命令来完成
1)可连接三类数据库:targetdatabase:需要备份的目标库,axuiliarydatabase复制数据库(辅助库),catalogdatabase目录数据库。
2)存储设备:disk、tape(sbt磁带机)存放备份文件的设备
3)channel:目标库和存储设备之间备份通道(服务进程)默认最少启动一个channel,可同时启动多个channel,并发操作。
4)serverprocess:用于备份和恢复
5)rman的元数据:记录备份的信息(一般放在目标库的controlfile里)//元数据metadata管理数据的数据
6)catalogdatabase:集中管理、存放备份的元数据,还可以存储备份脚本
7)MML:mediamanagelayer介质管理层:用于管理磁带机的库文件或驱动(磁带库的驱动)
1)本地连接
RMAN工具和targetdatabase在同一台服务器
[oracle@timran~]$rmantarget///斜杠是省略了用户名和密码
2)远程连接
RMAN客户端通过ORACLE_NET连接targetdatabase在targetdatabase启动监听,在client配置tnsnames.ora。
C:\DocumentsandSettings\timran>rmantargetsys/system@timran11g
1)查看rman的默认配置
RMAN>showall;
db_unique_name为TIMRAN11G的数据库的RMAN配置参数为:
CONFIGURERETENTIONPOLICYTOREDUNDANCY1;#default//冗余策略(redundancy冗余configure安装retention保留)
CONFIGUREBACKUPOPTIMIZATIONOFF;#default//优化(optimization最优化)对没有变化的就不进行备份;
CONFIGUREDEFAULTDEVICETYPETODISK;#default
CONFIGURECONTROLFILEAUTOBACKUPON;#default
CONFIGURECONTROLFILEAUTOBACKUPFORMATFORDEVICETYPEDISKTO'/U01/MYRMAN/%F';#default
CONFIGUREDEVICETYPEDISKPARALLELISM1BACKUPTYPETOBACKUPSET;#default
CONFIGUREDATAFILEBACKUPCOPIESFORDEVICETYPEDISKTO1;#default
CONFIGUREARCHIVELOGBACKUPCOPIESFORDEVICETYPEDISKTO1;#default
CONFIGUREMAXSETSIZETOUNLIMITED;#default
CONFIGUREENCRYPTIONFORDATABASEOFF;#default
CONFIGUREENCRYPTIONALGORITHM'AES128';#default
CONFIGURECOMPRESSIONALGORITHM'BZIP2';#default
CONFIGUREARCHIVELOGDELETIONPOLICYTONONE;#default
CONFIGURESNAPSHOTCONTROLFILENAMETO'/u01/oracle/dbs/snapcf_timran11g.f';#default
2)解释以上各行参数
第一行:CONFIGURERETENTIONPOLICYTOREDUNDANCY1;#default
备份策略保持分为两个保持策略:两者只能选一,互斥。(见ppt47)
一个冗余策略,规定至少有几个冗余的备份。
恢复窗口备份保存策略:
例如,假如我们指定恢复窗口是7天,假设今天是星期一,此前存在3个全备及归档日志。第一个全备是5天前生成的,第二个全备是十天前生成的,而最早一个全备是15天前备份的,
那么十天前生成的备份及之后的归档日志必须保留,而15天前的那个备份会成为废弃备份(obsolete)(见PPT-48)。
下面的命令将恢复窗口配置为7天:
RMAN>configureretentionpolicytorecoverywindowof7days;
冗余备份保存策略:
使用这种保存策略,RMAN会从最新备份开始保留N个数据备份,其余的废弃(obsolete)。
例如,如果有三个备份,而冗余数是2,那么最早的那个备份将被废弃。下面的命令将备份策略设置为2:
RMAN>configureretentionpolicytoredundancy2;
设置NONE可以把使备份保持策略失效,Clear将恢复默认的保持策略
RMAN>configureretentionpolicytonone;//RMAN此后不会将任何备份集或备份镜向标记为obsolete状态。
RMAN>configureretentionpolicyclear;
RMAN>configureretentionpolicytorecoverywindowof5days;
至少需要有三个冗余的备份存在,如果多余三个备份以上的备份将标记为冗余
RMAN>configureretentionpolicytoredundancy3;
第二行:CONFIGUREBACKUPOPTIMIZATIONOFF;#default
设置备份优化选项(optimization)可以在配置中设置备份的优化,如:
RMAN>configurebackupoptimizationon;
如果优化设置打开,它只使用于归档日志,只读或脱机表空间的数据文件,因为这些文件是不会变化的,备份集运行一个优化算法。
考点:备份优化选项依赖于RETENTIONPOLICY策略,如果启用优化,在已有足够相同文件副本的情况下,RMAN将不创建额外的文件副本。
第三行:CONFIGUREDEFAULTDEVICETYPETODISK;#default
设备类型有两种,可以是磁盘(DISK),或者磁带(STB),默认为磁盘。
第四行:CONFIGURECONTROLFILEAUTOBACKUPOFF;#default//如果备份了系统表空间(system01.dbf)了,不论这个参数是on还是off,控制文件都会备份
设置控制文件自动备份(autobackupon)//在on状态下,备份任何文件时都会备份控制文件;在增加表空间和删除表空间时也会备份控制文件。
RMAN>CONFIGURECONTROLFILEAUTOBACKUPon;
newRMANconfigurationparameters:
CONFIGURECONTROLFILEAUTOBACKUPON;
newRMANconfigurationparametersaresuccessfullystored
off:默认情况下,在备份system表空间时,会备份控制文件和spfile
on:在做任何文件的备份时,会自动备份控制文件和spfile,并且数据库的物理结构发生变化时,也自动备份controlfile。
第五行:CONFIGURECONTROLFILEAUTOBACKUPFORMATFORDEVICETYPEDISKTO'%F';#default//device(设备地址)
可以用如下的配置指定控制文件的备份路径与格式,format指明备份文件的路径和文件名
RMAN备份文件格式备份文件可以自定义各种各样的格式,如下:
%c备份片的拷贝数
%D位于该月中的第几天(DD)
%M位于该年中的第几月(MM)
%n数据库名称,向右填补到最大八个字符
%p该备份集中的备份片号,从1开始到创建的文件数
%U一个唯一的文件名,代表%u_%p_%c
%s备份集的号
%T年月日格式(YYYYMMDD)
第六行:CONFIGUREDEVICETYPEDISKPARALLELISM1BACKUPTYPETOBACKUPSET;#default//并行度,缺省为1,及一个通道
指定在以后的备份与恢复操作中并行度为2,即同时开启2个通道进行备份与恢复(ppt100)
并行的数目决定了开启通道的个数,当然也可以在RUN中指定通道来决定备份与恢复的并行程度。如果在RUN中指定了通道配置,将采用RUN指定的通道数(考点),
如果没有指定通道,就采用默认并行度。
run{
allocatechannelc1devicetypedisk;
allocatechannelc2devicetypedisk;
backupdatabaseplusarchivedlogdeleteinput;
}
需要注意的一点是,在BACKUP命令中有一个FILESPERSET(每个备份集中有几个文件)参数,该参数是指RMAN建立的每个备份片中所能包含的文件的最大数,该参数默认值为64,
如果在执行BACKUP命令时没有指定该参数值,那么RMAN会仅使用第一个通道来执行备份,其他通道将处于空闲状态。关于通道数与FILESPERSET值之间也有一个大小关系,
逻辑稍显复杂,总之一条,FILESPERSET值不要小于你设定的通道数。
第七行:CONFIGUREDATAFILEBACKUPCOPIESFORDEVICETYPEDISKTO1;#default//
第八行:CONFIGUREARCHIVELOGBACKUPCOPIESFORDEVICETYPEDISKTO1;#default//
备份也可以有镜像,这两个参数都是设置备份冗余度(一个是数据文件的,一个是归档日志的),如为2就备份相同的2份(ppt101),注意:TOSTB和TODISK相互不受影响(ppt-102)
第九行:CONFIGUREMAXSETSIZETOUNLIMITED;#default
该配置限制通道上备份集的最大尺寸,单位支持Bytes、KB、MB、GB,默认值是unlimited,
第十行:CONFIGUREENCRYPTIONFORDATABASEOFF;#default
第十一行:CONFIGUREENCRYPTIONALGORITHM',';#default
加密,Transparent(透明的)encryption透明的加密带钱夹,Passwordencryption:不带钱夹,ppt-107
第十二行:CONFIGURECOMPRESSIONALGORITHM'BZIP2';#default
压缩,这是11g新增的参数ppt(104-106),注意rman本来就不备份Unallocatedblock(HWM以上),COMPRESSION指的是压缩Unusedblock(压缩高水位线以下的块)
第十三行:CONFIGUREARCHIVELOGDELETIONPOLICYTONONE;#default
对于归档文件,一般来说,如果你仅是单实例的话(不是DataGuard环境),archivefile备份完之后就没有什么用处了,可以删除,
但很多人不习惯在这里设置参数,更愿意使用脚本删除归档文件。(见最后一章Oracle一周备份计划)
第十四行:CONFIGURESNAPSHOTCONTROLFILENAMETO'/u01/oracle/dbs/snapcf_timran11g.f';#default
rman备份控制文件和同步catalog的时候,需要建立一个controlfile的快照,这个参数指定快照存放位置。
第十五行:这行就没有列出,实际上也挺重要,所谓自动分配通道
RMAN>CONFIGURECHANNELDEVICETYPEDISKFORMAT'/u01/myrman/%U';
为什么没有出现,这是因为很多人更愿意在运行块里手工的指定来指定
allocatechannelc1typediskformat='/u01/myrman/%U'
...}
如果两处都指定,run{}方式优先于configurechannel配置方式。(考点)
1)backupset:不备份datafile里unallocate的块(HWM以上)、可以实现增量备份(可以备份到disk和tape)。
如果只启用一个channel,默认会把所有备份的datafile放入到一个backupset里,并且生成一个备份片(backuppiece,在OS下看到)
2)copy(镜像):实际上和手工cp是类似的,备份datafile所有的数据块,不能实现增量备份(但可以作为增量备份的0级备份),只能备份到disk(磁盘),
不能备份到tape(磁带),恢复时速度快。直接作用于recover,不用进过restore;
1)交互式(也叫standalone方式)
RMAN>shutdownimmediate;
RMAN>startupforcemount;
RMAN>alterdatabaseopen;
RMAN>sql'altersystemswitchlogfile';
RMAN>sql'select*fromscott.emp';//对select不显示结果
2)批处理方式(也叫job方式)
RMAN>run{
shutdownimmediate;
startupmount;
allocatechannelc1typedisk;
allocatechannelc2typedisk;
backupdatabaseformat'/u01/myrman/%d_%s.bak';
3)基于EM方式(WEB方式)
1)归档:可以做一致性和非一致性备份
2)非归档:一致性备份
1)备份全库:
RMAN>backupdatabaseformat='/u01/myrman/timran_%s.bak'filesperset3;//
RMAN>backupdatabaseplusarchivelogdeleteinput;//备份全库及控制文件、参数文件与所有归档日志,并删除旧的归档日志
2)备份表空间:
RMAN>backuptablespaceusersformat'/u01/myrman/users_%s.bak'tag=userbak;
RMAN>backuptablespacesystemplusarchivelogdeleteinput;//备份指定表空间及归档日志,并删除旧的归档日志
3)备份数据文件
RMAN>backupdatafile3,5format'/u01/myrman/%d_%s.bak';//备份数据文件,可以多个,以“,”分开。
RMAN>backuparchivelogalldeleteinput;
4)手动备份控制文件:
RMAN>backupcurrentcontrolfile;
5)手动备份参数文件
RMAN>backupspfile;
RMAN>listbackup;//列出backupset
*考点:RMAN从不备份联机重做日志文件、临时文件等。它只备份数据文件,归档日志文件,控制文件和spfile参数文件。
1)RMAN>copydatafile4to'/u01/myrman/users_%s.bak';
2)RMAN>backupascopytablespace'TEST'format='/u01/myrman/%d_test_%s.bak';//都用backup语法。统一格式
RMAN>listdatafilecopyall;//列出映像集
*考点:RMAN可在不执行restore情况下直接使用镜像副本,而backupset在recover前必须先restore。
(见ppt-117)(10gPPT-108)
只备份发生变化的block(rman在备份时会记录datablock的scn,下次备份时通过比较前次备份数据块上的scn来确定该数据块是否发生变化)
1)差异增量备份(Differentialincrementalbackup):以上次以来同级别或低级别的备份作为基础备份//
2)累积增量备份(Cumulativeincrementalbackup):以上次以来比自己级别低的备份作为基础备份
提示:10g以后,增量备份只有0级和1级,原来的2级以上的级别保留兼容,单不推荐使用。0级备份就是all相当于全备。
7.3.1差异和累计综合运用的一周备份计划。
Level0Level0
||
|-------------------------------------------------------|
||||||<------||
|<--------------------------------------|||
||||<------||||
|<----------------------|||||
||<------||||||
|<------|||||||
||||||||
LVL011c11c110
DAYSunMonTueWedThuFriSatSun
1)如果没有备份过0级备份,那么第一次1级备份(差异或累计)就当做0级备份。
2)非归档情况下的恢复就只有还原备份这一步,在RMAN下的方法是:
startupforcemount;
restoredatabase;
alterdatabaseopenresetlogs;
如果有增量备份,在restore第二句后,加上recoverdatabasenoredo;这个命令有两个作用,1)定位所有级别为1的累计或差异增量备份并使用它们,2)不要应用日志。
这当然有一个好处就是可以顺便检查坏块,如果想要增量备份能快些,oracle还提供了一个机制,叫做块变更跟踪。
块变更跟踪在后台启动一个进程叫CTWR,这个进程向变更跟踪文件中记录每个已更改的块的地址。如果启用了块跟踪,增量备份时就去检查块跟踪文件,
这样比遍历整个数据文件要快的多。
SQL>alterdatabaseenableblockchangetrackingusingfile'/u01/oradata/timran11g/change_tracking.dbf';
SQL>alterdatabasedisableblockchangetracking;
考点:使能块变更跟踪,才可以对之后的0级增量备份有效。
DRA是一个诊断和恢复数据库的工具,通过两个途径操作,一个是RMAN界面,另一个是OEM,它依赖于自动诊断知识库(ADR)和HealthMonitor
例:
1)先以RMAN备份一个表空间
RMAN>backuptablespacesysauxformat'/u01/myrman/%d_%s.bak';
2)关闭数据库,将sysaux01.dbf暂时换个名字。
[oracle@timrantimran11g]$mvsysaux01.dbfsysaux01.bak
ORA-01157:无法标识/锁定数据文件2-请参阅DBWR跟踪文件
ORA-01110:数据文件2:'/u01/oradata/timran11g/sysaux01.dbf'
3)数据库在mount模式下连接rman,看DRA给出的建议报告
[oracle@timrantimran11g]$rmantarget/
RMAN>listfailure;
4)RMAN>advisefailure;
策略:修复操作包括无数据丢失的完全介质恢复
修复脚本:/u01/diag/rdbms/timran11g/timran11g/hm/reco_3505864154.hm
5)RMAN>repairfailure;
修复脚本:/u01/diag/rdbms/timran11g/timran11g/hm/reco_1197260073.hm
修复脚本的内容:
#restoreandrecoverdatafile
restoredatafile2;
recoverdatafile2;
是否确实要执行以上修复(输入YES或NO)y
执行修复脚本
启动restore于2013-03-1214:19:36
使用通道ORA_DISK_1
通道ORA_DISK_1:正在开始还原数据文件备份集
通道ORA_DISK_1:正在指定从备份集还原的数据文件
通道ORA_DISK_1:将数据文件00002还原到/u01/oradata/timran11g/sysaux01.dbf
通道ORA_DISK_1:正在读取备份片段/u01/myrman/TIMRAN11_1.bak
通道ORA_DISK_1:段句柄=/u01/myrman/TIMRAN11_1.bak标记=TAG20130311T212425
通道ORA_DISK_1:已还原备份片段1
通道ORA_DISK_1:还原完成,用时:00:00:45
完成restore于2013-03-1214:20:22
启动recover于2013-03-1214:20:22
正在开始介质的恢复
介质恢复完成,用时:00:00:07
完成recover于2013-03-1214:20:29
修复故障已完成
是否要打开数据库(输入YES或NO)y
数据库已打开
1)先listfailure,然后再advisefailure.次序不能错,修复问题的顺序是list,advise,repair
2)所有模式下都可以使用DRA,nomount下修复控制文件,mount或open下修复数据文件。
3)DRA目前只能在单实例下运行,RAC不可以使用它。
1)归档:完全恢复和不完全恢复
2)非归档:只能恢复到最后一次备份状态
----先对数据库做一个冷备(如果是archived模式,热备也可以)
RMAN>listbackup;
备份集列表
===================
-----------------------------------------------------------------
22Full635.16MDISK00:01:292013-01-1515:49:14
BP关键字:22状态:AVAILABLE已压缩:NO标记:TAG20130115T154745
段名:/u01/myrman/TIMRAN11_24.bak
备份集22中的数据文件列表
-------------------------------------------
1Full66341972013-01-1515:47:29/u01/oradata/timran11g/system01.dbf
4Full66341972013-01-1515:47:29/u01/oradata/timran11g/user01.dbf
6Full66341972013-01-1515:47:29/u01/oradata/timran11g/test01.dbf
23Full621.61MDISK00:01:392013-01-1515:49:27
BP关键字:23状态:AVAILABLE已压缩:NO标记:TAG20130115T154745
段名:/u01/myrman/TIMRAN11_25.bak
备份集23中的数据文件列表
2Full66341972013-01-1515:47:29/u01/oradata/timran11g/sysaux01.dbf
5Full66341972013-01-1515:47:29/u01/oradata/timran11g/example01.dbf
7Full66341972013-01-1515:47:29/u01/oradata/timran11g/undotbs01.dbf
24Full9.67MDISK00:00:112013-01-1515:49:44
BP关键字:24状态:AVAILABLE已压缩:NO标记:TAG20130115T154933
段名:/u01/myrman/c-3416564781-20130115-08
SPFILEdb_unique_name:TIMRAN11G
RMAN>
说明:
1)两个通道C1,C2对应了两个备份集22,23
2)由于设定了CONFIGURECONTROLFILEAUTOBACKUPON,所以备份控制文件和参数文件和到一个备份集24里了。
案例1:system表空间损坏或数据库大部分datafile丢失(recoverdatabase,必须在mount下)
[oracle@timran~]$sqlplusscott/scott
SQL>createtablet1(idint);
2)关闭数据库
3)删除所有数据文件,模拟关键表空间损坏,然后启动数据库
[oracle@timran~]$rm/u01/oradata/timran11g/*.dbf
VariableSize83887720bytes
DatabaseBuffers192937984bytes
12:07:10SQL>selectfile#,errorfromv$recover_file;
4)利用rman做完全恢复
[oracle@timran~]$rmantarget/
recoverdatabase;
5)验证:
12:14:31SQL>conn/assysdba
12:14:34SQL>select*fromscott.t1;
案例2:恢复表空间(open状态)。因数据文件的所在的介质损坏,需要将其表空间恢复到一个新的物理位置。
SQL>createtablescott.emp1asselect*fromscott.empwhererownum<3;
SQL>select*fromscott.emp1;
EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO
7369SMITHCLERK790217-DEC-8080020
7499ALLENSALESMAN769820-FEB-81160030030
2)模拟损坏,删除数据文件。
[oracle@timran~]$rm/u01/oradata/timran11g/user01.dbf
3)清除dbbuffer,证实物理读失败
select*fromscott.emp1
[oracle@timrantimran11g]$mkdir/u01/oradata/timran11g/dir1
5)使用RMAN恢复表空间
sql'alterdatabasedatafile4offline';
setnewnamefordatafile4to'/u01/oradata/timran11g/dir1/user01.dbf';
restoretablespaceusers;
switchdatafile4;
recovertablespaceusers;
sql'alterdatabasedatafile4online';
//setnewnamefor和switchdatafile是一对。
//restore和recover也是一对,当然将tablespaceusers换成datafile4也是可以的。
5)验证
7369SMITHCLERK79021980-12-1700:00:0080020
7499ALLENSALESMAN76981981-02-2000:00:00160030030
6)待介质更换完成后,可以将表空间迁移回原来位置。
SQL>altertablespaceusersoffline;
[oracle@timran~]$mv/u01/oradata/timran11g/dir1/user01.dbf/u01/oradata/timran11g
SQL>altertablespaceusersrenamedatafile'/u01/oradata/timran11g/dir1/user01.dbf'to'/u01/oradata/timran11g/user01.dbf';
SQL>altertablespaceusersonline;
7)再验证
案例3:新建表空间(rman备份没有这个表空间),datafile被破坏
SQL>createtablespacelxdatafile'/u01/oradata/timran11g/lx01.dbf'size5m;
SQL>createtablescott.t2(idint)tablespacelx;
SQL>insertintoscott.t2values(1);
SQL>select*fromscott.t2;
2)删除t2表所在的数据文件
[oracle@timran~]$rm/u01/oradata/timran11g/lx01.dbf
3)清除dbbuffer,t2表物理读失败。
select*fromscott.t2
ORA-01110:数据文件3:'/u01/oradata/timran11g/lx01.dbf'
4)利用rman恢复数据文件(注意:rman备份里没有lx01.dbf)
sql'alterdatabasedatafile3offline';
restoredatafile3;
recoverdatafile3;
sql'alterdatabasedatafile3online';
使用目标数据库控制文件替代恢复目录
sql语句:alterdatabasedatafile3offline
启动restore于2013-01-1811:23:32
分配的通道:ORA_DISK_1
通道ORA_DISK_1:SID=130设备类型=DISK
创建数据文件,文件号=3名称=/u01/oradata/timran11g/lx01.dbf//对比手工恢复,RMAN自动建立了新的lx01.dbf文件
没有完成还原;所有文件均为只读或脱机文件或者已经还原
完成restore于2013-01-1811:23:35
启动recover于2013-01-1811:23:35
介质恢复完成,用时:00:00:01
完成recover于2013-01-1811:23:36
sql语句:alterdatabasedatafile3online
5)验证
案例4:应用增量备份技术进行恢复
清除所有rman备份
RMAN>deletebackup;
RMAN>deletedatafilecopyall;
在users表空间上建表
SQL>createtablescott.t3(idint);
SQL>insertintoscott.t3values(100);
SQL>select*fromscott.t3;
100
2)建立0增量备份,利用image备份作为0级增量备份
RMAN>copydatafile4to'/u01/myrman/users_%s.bak';
SQL>insertintoscott.t3values(200);
200
3)建立1级差异增量备份
RMAN>backupincrementallevel1format'/u01/myrman/users_inc_1_%s.bak'datafile4;
SQL>insertintoscott.t3values(300);
300
4)建立1级累计增量备份
RMAN>backupincrementallevel1cumulativeformat'/u01/myrman/users_cul_1_%s.bak'datafile4;
5)列出刚才备份的datafile4(第一次,immage备份,第二次,差异增量1级,第三次,累计增量1级。)
RMAN>listdatafilecopyall;
数据文件副本列表
=======================
------------------------------------------------------------
34A2013-01-1812:08:4166831292013-01-1812:08:40
名称:/u01/myrman/users_44.bak
标记:TAG20130118T120830
RMAN>listbackupofdatafile4;
41Incr139.81MDISK00:00:102013-01-1812:09:54
BP关键字:41状态:AVAILABLE已压缩:NO标记:TAG20130118T120944
段名:/u01/myrman/users_inc_1_46.bak
备份集41中的数据文件列表
41Incr66831882013-01-1812:09:53/u01/oradata/timran11g/user01.dbf
43Incr139.81MDISK00:00:112013-01-1812:11:48
BP关键字:43状态:AVAILABLE已压缩:NO标记:TAG20130118T121137
段名:/u01/myrman/users_cul_1_48.bak
备份集43中的数据文件列表
41Incr66832672013-01-1812:11:46/u01/oradata/timran11g/user01.dbf
6)删除数据文件4
select*fromscott.t3
ORA-01116:打开数据库文件4时出错
ORA-01110:数据文件4:'/u01/oradata/timran11g/user01.dbf'
7)恢复数据文件
restoredatafile4;
recoverdatafile4;
sql语句:alterdatabasedatafile4offline
启动restore于2013-01-1812:24:17
通道ORA_DISK_1:SID=134设备类型=DISK
通道ORA_DISK_1:将数据文件00004还原到/u01/oradata/timran11g/user01.dbf
通道ORA_DISK_1:正在读取备份片段/u01/myrman/users_cul_1_48.bak
通道ORA_DISK_1:段句柄=/u01/myrman/users_cul_1_48.bak标记=TAG20130118T121137
通道ORA_DISK_1:还原完成,用时:00:00:03
完成restore于2013-01-1812:24:21
启动recover于2013-01-1812:24:21
介质恢复完成,用时:00:00:00
完成recover于2013-01-1812:24:21
sql语句:alterdatabasedatafile4online
//注意两点:1)使用image做0级增量备份,image没有还原步骤。2)使用了1级累计增量,但没有使用1级差异增量。
基于time、基于scn和基于sequence:
做一套全库备份
RMAN>backupdatabaseformat'/u01/myrman/%s.bak'
SQL>createtablescott.t1(idint);
select*fromscott.t1;
117524288001NOCURRENT66890192013-01-1813:45:25
215524288001YESINACTIVE66890142013-01-1813:45:22
316524288001YESINACTIVE66890162013-01-1813:45:23
SQL>truncatetablescott.t1;//此动作记录在当前日志,即sequence7里了。
117524288001YESACTIVE66890192013-01-1813:45:25
218524288001YESACTIVE66892692013-01-1813:49:17
319524288001NOCURRENT66892712013-01-1813:49:19
SQL>insertintoscott.t1values(2);//此动作记录在当前日志,即sequence9里了。
准备工作:
如果是第一次做,先要建好logmnr目录,存放数据字典文件dict.ora
$mkdir/home/oracle/logmnr
设置logmnr参数指向logmnr目录
SQL>altersystemsetutl_file_dir='/home/oracle/logmnr'scope=spfile;
开始使用PL/SQLAPI方式日志挖掘
2.1)建立数据字典文件dict.ora
2.2)添加日志分析
SQL>executedbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_804846837_7.log',options=>dbms_logmnr.new);
2.3)执行分析
2.4)查看分析结果
SQL>selectusername,scn,to_char(timestamp,'yyyy-mm-ddhh24:mi:ss'),sql_redofromv$logmnr_contentsWHEREsql_redolike'%t1%';
-----------------------------------------------------------------------------------------------------------------------
UNKNOWN66890372013-01-1813:45:52createtablescott.t1(idint);
UNKNOWN66891632013-01-1813:47:04truncatetablescott.t1;
2.5)关闭日志分析
3)根据logmnr结果,使RMAN恢复停留在time或scn之前。
setuntiltime'2013-01-1813:47:04';
Oracle实例已启动
数据库已装载
系统全局区域总计422670336字节
FixedSize1300352字节
VariableSize331352192字节
DatabaseBuffers83886080字节
RedoBuffers6131712字节
分配的通道:c1
通道c1:SID=154设备类型=DISK
分配的通道:c2
通道c2:SID=151设备类型=DISK
正在执行命令:SETuntilclause
启动restore于2013-01-1814:19:34
通道c1:正在开始还原数据文件备份集
通道c1:正在指定从备份集还原的数据文件
通道c1:将数据文件00001还原到/u01/oradata/timran11g/system01.dbf
通道c1:将数据文件00002还原到/u01/oradata/timran11g/sysaux01.dbf
通道c1:将数据文件00003还原到/u01/oradata/timran11g/lx01.dbf
通道c1:将数据文件00004还原到/u01/oradata/timran11g/user01.dbf
通道c1:将数据文件00005还原到/u01/oradata/timran11g/example01.dbf
通道c1:将数据文件00006还原到/u01/oradata/timran11g/test01.dbf
通道c1:将数据文件00007还原到/u01/oradata/timran11g/undotbs01.dbf
通道c1:正在读取备份片段/u01/myrman/51.bak
通道c1:段句柄=/u01/myrman/51.bak标记=TAG20130118T123557
通道c1:已还原备份片段1
通道c1:还原完成,用时:00:01:55
完成restore于2013-01-1814:21:30
启动recover于2013-01-1814:21:31
线程1序列4的归档日志已作为文件/u01/disk1/timran/arch_1_804846837_4.log存在于磁盘上
线程1序列5的归档日志已作为文件/u01/disk1/timran/arch_1_804846837_5.log存在于磁盘上
线程1序列6的归档日志已作为文件/u01/disk1/timran/arch_1_804846837_6.log存在于磁盘上
线程1序列7的归档日志已作为文件/u01/disk1/timran/arch_1_804846837_7.log存在于磁盘上
归档日志文件名=/u01/disk1/timran/arch_1_804846837_4.log线程=1序列=4
归档日志文件名=/u01/disk1/timran/arch_1_804846837_5.log线程=1序列=5
归档日志文件名=/u01/disk1/timran/arch_1_804846837_6.log线程=1序列=6
归档日志文件名=/u01/disk1/timran/arch_1_804846837_7.log线程=1序列=7
介质恢复完成,用时:00:00:08
完成recover于2013-01-1814:21:41
释放的通道:c1
释放的通道:c2
4)验证
//基于scn的方法与基于time相似,语法是setuntilscn6689163;
//基于日志的方法类似手工恢复的例子,语法是setuntilsequence3;
*考点:不完全恢复的手工与RMAN语法比较:
手工方法RMAN方法
基于timeuntiltimeXXXsetuntiltimeXXX
基于scnuntilchangeXXXsetuntilscnXXX
基于日志untilcancelsetuntilsequenceXXX
案例4
恢复SPFILE或CONTROLFILE:
//TEST表空间里有T1表
SQL>selectowner,table_name,tablespace_namefromdba_tableswheretablespace_name='TEST';
OWNERTABLE_NAMETABLESPACE_NAME
SCOTTT1TEST
//T1表里有一条记录
rman的情况:
CONFIGURECONTROLFILEAUTOBACKUPFORMATFORDEVICETYPEDISKTO'/u01/myrman/%F';
//控制文件自动备份,备份目的地是/u01/myrman
2)做一个全库备份。
RMAN>backupdatabaseformat'/u01/myrman/%s.bak';
1Full1.27GDISK00:01:422013-01-1619:36:18
BP关键字:1状态:AVAILABLE已压缩:NO标记:TAG20130116T193436
段名:/u01/myrman/2.bak
备份集1中的数据文件列表
1Full66987902013-01-1619:34:45/u01/oradata/timran11g/system01.dbf
2Full66987902013-01-1619:34:45/u01/oradata/timran11g/sysaux01.dbf
4Full66987902013-01-1619:34:45/u01/oradata/timran11g/user01.dbf
5Full66987902013-01-1619:34:45/u01/oradata/timran11g/example01.dbf
6Full66987902013-01-1619:34:45/u01/oradata/timran11g/test01.dbf
7Full66987902013-01-1619:34:45/u01/oradata/timran11g/undotbs01.dbf
2Full9.67MDISK00:00:102013-01-1619:36:31
BP关键字:2状态:AVAILABLE已压缩:NO标记:TAG20130116T193621
段名:/u01/myrman/c-3416564781-20130116-00
//由于控制文件自动备份的关系,spfilefile和controlefile打包在一个备份集2里。
3)得到数据库唯一标识号:DBID
SQL>selectdbidfromv$database;
DBID
3416564781
//dbid是你的database的一个唯一识别ID,恢复spfile和controlfile时候都要用到。这个信息在rman加载数据库时也可以得到。
4)关闭数据库,然后让参数文件不起作用
[oracle@timrandbs]$mvspfiletimran.oraspfiletimran.old
[oracle@timrandbs]$mvinittimran.orainittimran.old
//模拟spfile损坏,pfile也不能起作用。
5)RMAN恢复参数文件
[oracle@timran~]$[oracle@timran~]$rmantarget/
connectedtotargetdatabase(notstarted)
RMAN>startupnomount;//没有了参数文件,SQL*PLUS是无法启动实例的,但RMAN可以,所以startupnomount一定要在RMAN下做!!!
startupfailed:ORA-01078:failureinprocessingsystemparameters
LRM-00109:couldnotopenparameterfile'/u01/oracle/dbs/inittimran.ora'
startingOracleinstancewithoutparameterfileforretrivalofspfile
Oracleinstancestarted
TotalSystemGlobalArea159383552bytes
FixedSize1218244bytes
VariableSize58722620bytes
DatabaseBuffers92274688bytes
RMAN>setdbid=3416564781;
executingcommand:SETDBID
RMAN>restorespfilefromautobackup;
//执行该命令,如果没有找到的话,那可能是文件的路径发生错误.可以通过直接赋予它的物理路径及文件名
RMAN>restorespfilefrom'/u01/myrman/c-3416564781-20130116-00';
启动restore于2013-01-1614:43:42
通道ORA_DISK_1:SID=100设备类型=DISK
通道ORA_DISK_1:正在从AUTOBACKUP/u01/myrman/c-3416564781-20130116-0e还原spfile
通道ORA_DISK_1:从AUTOBACKUP还原SPFILE已完成
完成restore于2013-01-1614:43:46
//查看在dbs/目录下已经产生spfiletimran.ora文件。证明spfile恢复好了。
控制文件恢复过程与参数文件是类似的,一个区别是当rman恢复完控制文件后,会将该控制文件所在的备份集从存储库中删掉。
案例5恢复误删除表空间(已备份),RMAN必须通过老控制文件进行恢复
本例要做的是droptablespacetest,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。
1)$tail-f/u01/diag//rdbms/timran11g/timran11g/trace/alert_timran11g.log
2)SQL>droptablespacetestincludingcontentsanddatafiles;
//删除test表空间
3)查看告警有关信息:
droptablespacetestincludingcontentsanddatafiles
Deletedfile/u01/oradata/timran11g/test01.dbf
WedJan1619:40:122013
Completed:droptablespacetestincludingcontentsanddatafiles
4)查看rman备份集信息
6Full66987902013-01-1619:34:45
3Full9.67MDISK00:00:102013-01-1619:40:12
BP关键字:3状态:AVAILABLE已压缩:NO标记:TAG20130116T194002
段名:/u01/myrman/c-3416564781-20130116-01
//备份集1中的数据文件6已经空了,这是删除了test表空间所致。另外又增加了备份集3,这是自动备份控制文件设为on所致。
5)准备对droptablespacetest做不完全恢复
两个要点:
1.新增了3号备份集,其中的控制文件备份是由于droptablespace这个动作之后产生的,这个控制文件里已经没有test表空间的记录了,如果你按照通常的不完全恢复,rman会找当前的或最新的控制文件,也就是说它会用这个3号集,当然我们要用的是2号集,因2号集里才有test表空间的记录。所以这个不完全恢复一定要用一个老的控制文件。归根结底是rman的restore(还原)依据的是控制文件的信息,如果你要用了3号集还原控制文件,那就意味着test01.dbf无法restore了!
2.控制文件恢复时,如果能确认你用的那个控制文件,就输入它的物理路径好了,这个办法最简单明了。
3.当你restore控制文件后,下一步是进入mount状态(考点),然后才能做不完全恢复,使用老控制文件,对应手工恢复方式,RMAN没有使用usingbackupcontrolfile子句。
6)shutdown数据库删除文件
[oracle@timrantimran11g]$rm*.ctl//删掉所有控制文件,准备让rman恢复老控制文件
[oracle@timrantimran11g]$rm*.dbf//删掉所有数据文件,不完全恢复是整个数据库通过数据备份和日志前滚来完成
7)用RMAN恢复
startupnomount;
setDBID=3416564781
restorecontrolfilefrom'/u01/myrman/c-3416564781-20130116-00';
alterdatabasemount;
setuntiltime'2013-01-1619:39:56';
VariableSize352323712字节
DatabaseBuffers62914560字节
正在执行命令:SETCONTROLFILEAUTOBACKUPFORMAT
正在执行命令:SETDBID
启动restore于2013-01-1619:45:25
通道ORA_DISK_1:SID=154设备类型=DISK
通道ORA_DISK_1:正在还原控制文件
输出文件名=/u01/oradata/timran11g/control01.ctl
输出文件名=/u01/oradata/timran11g/control02.ctl
输出文件名=/u01/oradata/timran11g/control03.ctl
完成restore于2013-01-1619:45:28
释放的通道:ORA_DISK_1
启动restore于2013-01-1619:45:33
启动implicitcrosscheckbackup于2013-01-1619:45:33
已交叉检验的1对象
完成implicitcrosscheckbackup于2013-01-1619:45:34
启动implicitcrosscheckcopy于2013-01-1619:45:34
完成implicitcrosscheckcopy于2013-01-1619:45:34
搜索恢复区中的所有文件
正在编制文件目录...
没有为文件编制目录
通道ORA_DISK_1:将数据文件00001还原到/u01/oradata/timran11g/system01.dbf
通道ORA_DISK_1:将数据文件00005还原到/u01/oradata/timran11g/example01.dbf
通道ORA_DISK_1:将数据文件00006还原到/u01/oradata/timran11g/test01.dbf//test表空间已还原
通道ORA_DISK_1:将数据文件00007还原到/u01/oradata/timran11g/undotbs01.dbf
通道ORA_DISK_1:正在读取备份片段/u01/myrman/2.bak
通道ORA_DISK_1:段句柄=/u01/myrman/2.bak标记=TAG20130116T193436
通道ORA_DISK_1:还原完成,用时:00:01:46
完成restore于2013-01-1619:47:21
启动recover于2013-01-1619:47:22
线程1序列2的归档日志已作为文件/u01/oradata/timran11g/redo02.log存在于磁盘上
归档日志文件名=/u01/oradata/timran11g/redo02.log线程=1序列=2
介质恢复完成,用时:00:00:02
完成recover于2013-01-1619:47:25
8)验证:
作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动。TSPITR是一种对个别表空间执行不完全恢复的技术,一般是针对用户错误的删除(或截断)了表。TSPITR通过RMAN创建一个辅助库,将单个表空间在辅助库上恢复到指定的某个时刻,因为是在辅助库恢复,目标库(生产库)不用停机。
在一系列准备工作完成后(建立辅助实例,网络连接等),利用RMAN同时连接目标数据库和新启动的辅助实例,如:
$rmantargetsys/oracle@timran11gauxiliarysys/oracle@newdb
之后就可以创建辅助数据库了,以下两个命令是两种创建辅助库的方法:
RMAN>duplicatetargetdatabase;//利用RMAN备份创建辅助库
RMAN>duplicatetargetdatabasefromactivedatabase;//从联机数据库(不用RMAN备份)直接创建辅助库。
我下面的测试没有建立辅助库,就是在目标库上完成的,当然这是不推荐的,我们仅仅是为了了解一下这个过程。
前提:
1)有一套全库备份,因为TSPITR这个过程是要在辅助库上恢复目标库的system和undo表空间(考点)
2)本例设置了控制文件自动备份:RMAN>CONFIGURECONTROLFILEAUTOBACKUPON;
1)建表空间
2)建表
createtablescott.t2(c1date)tablespaceabcd;
insertintoscott.t2values(sysdate);
3)RMAN备份表空间
RMAN>backuptablespaceabcdformat'/u01/myrman/abcd_%s.bak';
SQL>selectsysdatefromdual;
SYSDATE
-------------------
2013-01-1622:02:14
5)删除表并purge
SQL>droptablescott.t2purge;
6)建立目录指定辅助库目标
$mkdir-p/u01/oradata/timran11g/auxdata
7)做RMANTSPITR并指定辅助库目的地(这里还是目标库)
RMAN>recovertablespaceabcduntiltime'2013-01-1622:02:14'auxiliarydestination'/u01/oradata/timran11g/auxdata';
执行过程值得一读,但太长了,略了。
SQL>altertablespaceabcdonline;
C1
2013-01-1621:58:11
1)TSPITR是保持在线业务下表空间级的不完全恢复,恢复的表空间要自包含。
2)TSPITR适用于purge表,ddl删除表列,但不适用删除表空间,以及重命名表空间(恢复旧命名)。
案例7:数据块介质恢复(BMR)
如果数据文件只是出现部分数据块损坏,RMAN可以尝试针对坏块进行恢复,就是说不需要恢复整个数据文件,只恢复损坏的数据块。
可能有两种情况下发现坏块:1)rman备份时,2)session访问到该块时
比如出现了下面的报错:
ORA-01578:ORACLEDATABLOCKCURRPTED(FILE#5,BLOCK#21)
对应的rman恢复命令应该是:
RMAN>blockrecoverdevicetypediskdatafile5block21;
考点会围绕以下知识点:
1)BMR是RMAN的一个功能,只能在RMAN上实现
2)BMR做的是一个完全恢复
3)RMAN是块级备份,备份是自动检测坏块,缺省下碰到坏块就会中断备份,除非setmaxcurrupt
4)做RMR有两点需求:一个是数据库要在mount或open下,另一个是需要坏块所在的数据文件的完整0级备份。
5)检测出来的坏块可以在视图V$database_block_currption查看
如果没有catalog,RMAN的存储库(元数据)保存在目标库的控制文件里,这样可能存在如下隐患
1)目标库上的控制文件损坏,造成该目标库上的RMAN元数据丢失。尽管可能备份的数据还在,但RMAN无法找到它们了。
2)RMAN元数据受控制文件参数control_file_record_keep_time限制,缺省是7天,超时可能被覆盖,造成元数据丢失。
对此,我们可以在另一台服务器上建立一个CatalogDatabase
优点是:
1)它多了一份目标库的RMAN元数据副本,目标库的控制文件坏了也不用担心了。
3)使用一个catalog目录库就可以管理许多目标库,所谓集中管理多个目标库,这些目标库可以是不同平台,不同版本。
4)它可以使用脚本,scritp这是catalog独有的功能,使RMAN的备份与恢复更加灵活,自动化。
catalogmode在生产环境中一定要建在一台独立的oracleserver上,不能建在同一台目标机上,目的就是防止目标机的controlfile和catalog目录库一同损毁,从而完全丢失使RMAN元数据。
配置一个CATALOG的简单操作:catalog:xp-oracle-orcltarget:linux-oracle-timran11g
1)创建Catalog所用表空间
SQL>createtablespacerman_tsdatafile'E:\rman.dbf'size50m;
SQL>createuserrmanidentifiedbyrmandefaulttablespacerman_ts;
SQL>grantresource,recovery_catalog_ownertorman;
SQL>exit
3)从RMAN客户端上同时连接target库和catalog库
C:>rmantargetsys/system@timran11gcatalogrman/rman@orcl
连接到目标数据库:TIMRAN(DBID=4035750304)
连接到恢复目录数据库
4)创建catalog目录
RMAN>createcatalogtablespacerman_ts;
恢复目录已创建
5)注册
RMAN>registerdatabase;
注册在恢复目录中的数据库
正在启动全部恢复目录的resync
完成全部resync
如果想手动重新同步
RMAN>RESYNCCATALOG;
rman脚本可以作为操作系统文件来存储,比如:将下面的两个命令保存到一个名为timran.rcv文件中
run{backupdatabaseplusarchivelogdeleteallinput;
deleteobsolet;}
那么可以在操作系统下调用该脚本
$rmantarget/catelogrman/rman@orcl@timran.rcv
但是如果有目录的话,可以使用它来存储一个脚本
有关脚本的命令有:
create[global]script
replace[global]script
print[global]script
list[global]scriptname
exectue[global]script
delete[global]script
1)到目标库的RMAN连接通常是SYS用户,因为一般需要在RMAN里发出启动或关闭数据库,但是不需要指定ASSYSDBA。
2)创建catalog目录的版本必须高于或等于任何目标库的数据库版本,因此可以创建单个版本为11.1.0.6的目录加补丁集6。
3)使用createscript建立本地脚本,它只使用于你连接点的目标数据库,使用createglobalscript命令创建全局存储脚本,它适用于所有目标数据库,但不能同时对多个目标库执行命令。本地脚本和全局脚本都保存在RMANcatalog里。
4)使用exectue去执行脚本,它必须包含在RUN{}。可以参考笔记最后的附录部分,有《Oracle一周备份计划范例》。
一个目录可以注册你单位的所有数据库的详细信息,如果target服务器比较多,可能有几个DBA来负责,一些DBA管理一部分,另一些管理其他部分。这就可能需要创建一个或几个虚拟专用目录,作为DBA可以将自己管理的target注册到自己的专用目录中,并且不能查看注册在其他任何专用目录中的任意数据库。
*考点:RMAN元数据总是存在于RMANtarget数据库中,但它只能恢复由controlfile_record_keep_time参数所指定的数据,catalog是一个额外的存储区,可以无限期的保留元数据。
TargetDatabase即目标数据库是我们指的要备份的数据库,AuxiliaryDatabase即辅助数据库是从目标库创建的新的数据库,通常建立一个
模拟生产系统的一个平台,用于测试目标库,包括升级,新应用程序上线等
一般步骤:
1)将辅助库上安装数据库软件,建立OracleHome
2)为辅助库建立口令文件
3)确保到辅助实例的网络连通性
4)为辅助实例创建参数文件
5)以nomount方式启动辅助实例
6)在mount或open模式下启动目标数据库
7)创建备份或将备份和归档日志文件复制到辅助库实例可以访问的某个位置,除非正在使用活动数据库复制
8)如果有必要分配辅助通道
9)运行rmanduplicate命令
10)使用resetlogs打开辅助数据库
1)辅助库的参数文件里db_name是必选项,复制数据库使用新的DBID。
2)DB_FILE_NAME_CONVERT指定数据文件和临时文件的文件系统映射名称。
LOGFILE_NAME_CONVERT指定联机重做日志文件的文件系统映射名称。
1)RMAN>listbackup;
2)RMAN>listbackupoftablespaceusers;
3)RMAN>listbackupofdatafile2;
4)RMAN>listbackupofcontrolfile;
5)RMAN>listbackupofarchivelogall;
6)RMAN>listbackupofarchiveloguntiltime='sysdate-1';
7)RMAN>listbackupset56;
8)RMAN>listdatafilecopyall;
9)RMAN>listcopyoftablespaceusers;
10)RMAN>listcopyofdatafile1;
11)RMAN>listdatafilecopy67;
12)RMAN>listcopyofcontrolfile;
13)RMAN>listexpiredbackup;
用于检测备份状态(AVAILABLE:可用;UNAVAILABLE:不可用;expired过期,即备份已经被os删除了。
RMAN>crosscheckbackup;
RMAN>crosscheckcopy;
例:可以试一下将某文件的备份在os下删除,再使用crosscheck进行检查,该备份的状态由AVAILABLE改为EXPIRED
RMAN>deleteexpiredbackup;//删除所有过期的备份。
对于obsolete状态,是针对RMAN备份保留策略来说的,超过了这个保留策略的备份,会被标记为obsolete,但其状态依旧为AVAILABLE,我们可以使用reportobsolete来查看已废弃的备份。
*考点:DELETEEXPIRED命令不删除任何文件,它只更新RMAN存储库(元数据)DELETEOBSOLETE命令将删除文件并相应的更新存储库。
例如这里,冗余数为1,如果有两个控制文件的备份,较早的一个备份,就会被标记为obsolete:
RMAN>REPORTschema;//查看目标库的物理结构
RMAN>REPORTschemaattime|scn|sequence;//at子句必须在catalog里使用(考点)
RMAN>REPORTneedbackup;//查看需要做备份的datafile
RMAN>REPORTobsolete;//根据备份冗余策略来判断,那些备份是陈旧的(obsolete)
RMAN>REPORTNEEDBACKUPincremental3;//三天以来尚未进行备份的文件:
RMAN>REPORTNEEDBACKUPredundancy2;//如果不具有两个或更多个备份则需要进行备份:
RMAN>REPORTNEEDBACKUPrecoverywindowof3days;//需要进行备份以恢复到三天前的数据状态:
RMAN>REPORTOBSOLETEREDUNDANCY2;//如果需要的备份副本不多于两个,列出作废的恢复文件:
一道考题:两个版本两个答案:
YouexecutedthefollowingcommandintheRecoveryManager(RMAN):
RMAN>REPORTNEEDBACKUPdays3;
Whatistheoutputofthiscommand
A.Alistoffilesthatrequireabackupwithin3days
B.Alistoffilesrequiringmorethan3daysofarchivelogstoapply
C.AlistoffilesthatRMANrecommendsbebackeduponlyonceineverythreedays,basedonlowvolatility
D.Alistoffilesforwhichabackupasalreadybeenperformedinthelastthreedaysandwhichis
requiredtobebackedupagainbasedonthehighnumberoftransactionsperformedonthem
答案:a或b都有
我们看一下oracle文档的解释:
REPORTNEEDBACKUPDAYS=n
Displaysfilesthatrequiremorethanndays'worthofarchivedredologfilesforrecovery.
这个解释和答案b比较吻合。所以我判断b是正确的。
RMAN>deletebackupofdatafile2;
RMAN>deletebackupoftablespacesystem;
RMAN>deletebackupset30,32;
RMAN>deletebackupofcontrolfile;
RMAN>deletenopromptbackupofcontrolfile;//删除noprompt不提示
RMAN>deletecopyofdatafile10;
RMAN>deletecopyoftablespaceusers;
RMAN>deleteexpiredbackup;//删除过期的备份
RMAN>deleteexpiredcopy;
RMAN>deleteobsolete;//删除陈旧的备份
RMAN>deletenopromptobsolete;//删除不加提示
传统意义上,系统的资源分配是由OS来完成的,但是对于数据库资源,OS分配资源会带来一些问题:
OracleResourcemanager就是把原本由OS管理的硬件资源交给Oracle来管理。
在数据库环境中,可能同时存在着多个用户请求数据库服务,并且他们所要完成的任务优先级不同,那么我们就应该区别对待这些会话请求。Oracle资源管理就是为了解决这个问题的。
1)资源使用组:Resourceconsumergroup
一个资源使用组由一组具有相似请求的用户组成,一个组可以包含许多用户,一个用户又可以是多个组的成员(这个很重要),但是同一时刻,每个session只能有一个组作为这个session的有效使用者组。
下面三类特别的组是系统组,它们不能被修改或删除。
SYS_GROUP
DEFAULT_CONSUMER_GROUP
OTHER_GROUP
需要强调的一点是OTHER_GROUPS这个资源用户组。任何一个资源计划必须要包括这个OTHER_GROUPS用户组,这个使用组的作用就是作为一个后选项,当一个没有匹配到任何资源使用组的SESSION连接到数据库的时候会自动的匹配到OTHER_GROUPS下面,受制于OTHER_GROUPS的资源限定。
2)资源计划:Resourceplan
就是oracle把数据库资源按一定方法来分配,可以限制每个组占用资源的比例。
查看当前激活资源计划有三个办法
一是showresoure_manager_plan参数
二是命令selectname,is_top_planfromv$rsrc_plan;
三是通过OEM查看资源管理信息
3)资源计划指令:Resourceplandirectives
1)建四个用户,并授予connect角色:
grantconnecttotimidentifiedbytim;
grantconnecttoacctidentifiedbyacct;
grantconnecttobatchidentifiedbybatch;
grantconnecttomgridentifiedbymgr;
2)建立三个使用者组:
建OLTP组,将用户tim,mgr加入该组
建DSS组,将用户acc,mgr加入该组
建BATCH组,将用户batch,mgr加入该组
建组结束前,可以单击ShowSQL研究一下输出,注意挂起区域的用法,单击Enter返回。
3)设置初始使用者组
缺省下,普通用户会定位到DEFAULT_CONSUMER_GROUP组下:
SQL>selectusername,INITIAL_RSRC_CONSUMER_GROUPfromdba_users;
USERNAMEINITIAL_RSRC_CONSUMER_GROUP
MGRDEFAULT_CONSUMER_GROUP
HRDEFAULT_CONSUMER_GROUP
TIMDEFAULT_CONSUMER_GROUP
BATCHDEFAULT_CONSUMER_GROUP
ACCTDEFAULT_CONSUMER_GROUP
SCOTTDEFAULT_CONSUMER_GROUP
SYSTEMSYS_GROUP
SYSSYS_GROUP
我们把新建的四个用户指定到三个自建的组中
execdbms_resource_manager.set_initial_consumer_group('TIM','OLTP');
execdbms_resource_manager.set_initial_consumer_group('ACCT','DSS');
execdbms_resource_manager.set_initial_consumer_group('BATCH','BATCH');
execdbms_resource_manager.set_initial_consumer_group('MGR','OLTP');
TIMOLTP
ACCTDSS
BATCHBATCH
MGROLTP
4)建立三个新的资源计划
首先是建立DAYTIME--白天资源计划
4.1)将SYS_GROUP组、OLTP组、DSS组及BATCH组加入DATTIME计划,然后会发现OTHER_GROUPS组也自动加入了。
4.2)指定指令几乎,比如:CPU使用优先级。选advance,这个应该对应的是MGMT方法(8个cpulevel).
具体设置:
Group/Subplanlevel1level2level3level4......
---------------------------------------------------------------------------------------
BATCH50
DSS50
OLTP100
OTHER_GROUPS100
SYS_GROUP100
第二,建立NIGHTTIME--夜晚资源计划
参考4.1-4.2
BATCH25
DSS25
OLTP50
第三,建立MONTHEND--月底资源计划
BATCH100
5)激活组的切换,MGR用户初始激活组是OLTP组,现在切换成DSS组。
session1sys;
SQL>selectresource_consumer_groupfromv$sessionwhereusername='MGR';
resource_consumer_group
-----------------------
OLTP
session2,mgr:
declareold_grpvarchar2(30);
begin
dbms_session.switch_current_consumer_group('DSS',old_grp,TRUE);
end;
DSS
6)sys用户来切换某用户使用者组
executedbms_resource_manager.switch_consumer_group_for_user('MGR','BATCH');
1)使用cpu百分比方法
再建一个nightime计划,同样把四个组加入其中(加上orther_group一共5个组),然后分配cpu指令,这次选Mode:Percentage,看到只有一个列可选比例,给定比例batch_group:dss:oltp:other_group:sys_group是20:40:10:0:30。
2)再回到daytime计划,看看还有几种指令
2.1)活动会话池:(PPT-414)
2.2)限制并行度:
Oracle可通过参数设置并行度,如:parallel_max_servers,(创建一个并行执行服务器池),但是无法阻止任何人使用它,于是我们可以通过ResourceManagement加以限制。
不做任何事情的session浪费服务器资源,如PGA白白占用,idletime指令从两个方面限制这样的情况,比如某组的maxidletime(秒)=1800,表示空闲了3分钟,blockanothersession(秒)=30,表示把别人锁了30秒,这两种情况都会终止该session.
2,5)限制undo数据的产生
某些用户的大型事务可能填满undo表空间,如批处理事务不定期的提交,为了安全起见,可以对这里潜在的用户设置undo表空间使用上限,比如某组其undopool设置为6G,当到达这个上限值后改session会被挂起,直至事务提交后释放池中的空间。
举例,接续15.3的例子,假设MGR要运行大作业,每个组里都有MGR这个用户,但是不同的计划下这些组的优先级不同,可以设想MGR总能可以激活自己的一个组,而这个组的在某个激活的计划下优先级又最高,那么DBA可以限制他的行为,通过设置Threshold,以DAYTIME计划为例,OLTP组的Threshold设为10,ACTION选switchtoDSS组,这样一来,当某用户占用10秒时就被降级了。OLTP是level2/100,DSS是level3/50.
1)OEM使DAYTIME计划激活
2)设置上面的Threshold
4)session2sys:查看MGR当前组是OLTP
5)session1mgr:制造一个笛卡尔积查询
SQL>selectcount(*)fromall_objects,all_objects;
6)session2sys:查看10秒后降级为DSS组
12.6考点:
1)SQL>showparameterresource
resource_limitbooleanFALSE
resource_manager_cpu_allocationinteger1
resource_manager_planstringNIGHTIME
激活的资源计划有一个参数:resource_manager_plan,但是resource_limit这个参数与资源计划毫无关系。
2)赋给一个用户管理资源管理器的能力,需要系统权限ADMINISTERRESOURCEMANAGER,而这个权限不是使用通常的grant方法授予的,只能使用oracle提供的包:DBMS_RESOURCE_MANAGER和DBMS_RESOURCE_MANAGER_PRIVS是有关资源管理器的PL/SQLAPI形式的最有用的两个包。
3)还是关于上面的两个包:
DBMS_RESOURCE_MANAGER_PRIVS包负责:授予管理ResourceManager的权限,将用户放置到组中,从组中删除用户。DBMS_SESSION和DBMS_RESOURCE_MANAGER包负责切换会话的有效组,创建使用者组,配置会话映射到组的方式。
4)在每个级别的总CPU使用率不能超过100%,如果超过的话,则挂起区域将无法验证并且其计划不能保存到数据字典,计划容许在一个级别分配的资源<100%,但这样做没有什么意义。
5)会话池不限制会话的数量,限制的是活动会话的数量。
6)每个计划都必须包含一条针对OTHER_GROUPS组的指令。
7)关于会话池,活动会话如果没有提交,该会话仍然对该组的活动会话池计数有效。
8)每个组的undopool与undo表空间配额无关,undo表空间是基于每个用户自动分配的,你甚至不可能授予undo表空间上的配额。
9)undo池针对的是整个组,不是单个用户或会话,如果一个组填满了它的池,属于该组的所有会话都会挂起,直到一个会话发出commit或rollback命令。
AdvancedSchedulerConcepts:(PPT:450)
----------------------------------------------------------------
|Resource||Resource||Window|
|consumergroup||plan||group|
|||
----------------------------------------------------------
|JobChain||Jobclass||Window|
--------------------------------------------
|Program|----------|Job|---------|Schedule|
|||-------------|
ArgumentsArgumentsTimeEvent
1)SCHEDULER下的jobs
*考点:必须将JOB_QUEUE_PROCESSES实例参数设置为>0的值,否则调度程序将无法运行,默认值为1000。如果有任何定义的、活动的作业,那么总是运行作业队列协调器(后台进程cjq0)。
SQL>showparameterjob_queue_processes
job_queue_processesinteger1000
SQL>selectprogramfromv$processwhereprogramlike'%J%';
PROGRAM
------------------------------------------------
oracle@timran.localdomain(J000)//(J000)表示有一个job进程在运行,根据参数可以有1000个
oracle@timran.localdomain(CJQ0)
2)SCHEDULER下的program
Program指的是运行的程序。包括具体的要操作的执行代码,可以有下列三种类型:
PL/SQLBLOCK:标准的pl/sql代码块;
STOREDPROCEDURE:编译好的PL/SQL存储过程,或者Java存储过程,以及外部的c子程序;
EXECUTEABLE:ORACLE数据库之外的应用,比如操作系统命令等等。
3)SCHEDULER下的scheduler
如果不考虑与资源计划的结合,Schedules(调度);Programs(程序);Jobs(任务)这三者之间到底是个什么关系?
直白地来说就是:program负责具体做什么(左膀),scheduler负责什么时候做(右臂),job就简单了(联手左膀右臂),一个字:做!
4)JOBCLASSES
相当于创建了一个job组,可以将那些具有相同特性的job,统统放到相同的JobClasses中,然后让JobClasses与资源计划器结合进行管理。
5)WINDOW
6)JOBCHAIN
CHAIN可以被视做一组Programs的复合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成功的话继续运行PROGRAM:C,否则的话运行PROGRAM:D。Programs:A、B、C、D以及执行的逻辑关系就构成了一个最简单的CHAIN。
下面我们通过实例来演示,如何创建program、schedule、job,以便能初步理解三者间的关系。
先建一个测试表
SQL>createtablescott.job_test1(my_datedate);
第一步,创建一个名叫my_pro1的program,(带PL/SQLBLOCK)操作如下:
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=>'my_pro1',
program_action=>'begin
insertintoscott.job_test1values(sysdate);
end;',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'insertsysdateintotable',
enabled=>TRUE);
END;
PL/SQLproceduresuccessfullycompleted.
通过上述语句,我们定义了一个program,类型是一个oracle匿名块,其动作是将输入sysdate插入到scott.job_test中。
dbms_scheduler.create_schedule(
repeat_interval=>'FREQ=SECONDLY;INTERVAL=30',
start_date=>sysdate,
comments=>'StartEvery30seconds',
schedule_name=>'my_sch1');
第三步:创建job,按照指定的schedule,执行program,创建job时,start_date,repeat_interval,job_action等均无须指定,因为这些参数将由program和schedule来控制。操作如下:
dbms_scheduler.create_job(
job_name=>'my_job1',
schedule_name=>'my_sch1',
这样,操作完成后,ORACLE就会自动定时(当前设置为30秒执行一次)program中定义的操作。
检查结果:
SQL>select*fromscott.job_test1;
MY_DATE
2012-11-2215:56:13
2012-11-2215:56:43
2012-11-2215:57:13
也可以通过*_scheduler_job_run_details即可查询
例如,查看刚刚创建的"MY_JOB1"任务的执行情况,执行命令如下:
SQL>selectlog_id,log_date,status,additional_info
fromuser_scheduler_job_run_details
wherejob_name='MY_JOB1';
;
禁用作业:
SQL>execdbms_scheduler.disable('my_job1');
例;使用调度程序自动激活DAYTIME计划
1)运行下列查询看激活的窗口
selectWINDOW_NAME,ACTIVEfromdba_scheduler_windows;
2)看哪个资源计划是活动的
select*fromv$rsrc_plan;
3)暂时清除当前活动计划
SQL>altersystemsetresource_manager_plan=''scope=memory;
4)建立一个叫DAY_WIN的窗口,该窗口将激活DAYTIME计划
execdbms_scheduler.create_window(-
window_name=>'day_win',resource_plan=>'daytime',-
start_date=>trunc(systimestamp)+6/24,repeat_interval=>'freq=daily',-
duration=>'012:00:00',comments=>'dailyat6AM');
这将从现在开始,每天早晨6:00打开窗口,持续12小时。
5)强制数据库立即打开窗口
execdbms_scheduler.open_window(-
window_name=>'day_win',duration=>'000:05:00',force=>true);
这将立即打开窗口,激活DAYTIME计划。重复1),2)步骤再查看。
Jobclass将一个job或多个job与一个resourceplan联系起来,而resourceplan又可以通过window激活,这种设计又特殊的意义:Oracle可以根据相对优先权在window内调度作业运行,此外,window也可以激活resourceplan.
多个job加入到class中,如果这个class被调度在同一窗口下,则根据设定的优先值从1-5顺序执行,1首先被执行,默认是3。
1)当createjob过程创建作业时,无法指派优先级,必须在后面使用API的setattribute过程
2)作业A在其类中的优先级是1,作业B的优先级是5,作业B处于resourceplan中有更高的优先权的使用者组内,则A在B后被执行。
1)ASH(ActiveSessionHistory)
ASH以v$session为基础,每秒采样一次,ASH只记录活动会话等待的事件,不活动的会话不会采样,采样工作由后台进程MMNL来完成,大部分采样数据在内存里。而有一部分采集信息存入了AWR库。
生成ASH报告:
SQL>@/u01/oracle/rdbms/admin/ashrpt.sql
2)AWR(AutomaticWorkloadRepository)
AWR工作时是由后台进程MMON负责,于每1小时生成一个内存统计的快照,积累的快照(快照集)会定时写入磁盘上的sysaux表空间,快照不能移动到其他位置,快照也会作为ADDM的原始数据,缺省情况下,Oracle将快照保留8天。
生成AWR报告,注意是你确定的起始快照至结束快照之间的报告。
SQL>@/u01/oracle/rdbms/admin/awrrpt.sql
1)AWR统计信息:就是快照的原始数据。
2)AWR指标(metrics):两个或多个统计数据综合的结果。
3)AWR基准线(baseline)。是一种快照集,由多个快照组成。只不过它的是作为用来衡量和比较性能好坏的依据。基准线分为静态基准线和移动窗口基准线。
4)与AWR有关参数
SQL>showparameterstatistics_level
statistics_levelstringTYPICAL
若参数STATISTICS_LEVEL设置为TYPICAL或ALL将默认启用AWR来采集数据库统计信息。ALL参数收集信息最全,参数的默认值是TYPICAL,
如果STATISTICS_LEVEL设为BASIC,将禁用收集快照和运行顾问。但你仍可以通过DBMS_WORKLOAD_REPOSITORY包来手动获得AWR统计信息。
*考点:收集AWR快照时自动生成ADDM报告,也可以根据需要生成ADDM报告,默认情况下ADDM报告保存30天。
ADDM报告生成:
SQL>@/u01/oracle/rdbms/admin/addmrpt.sql
1)为了演示效果,清除所有AWR快照和ADDM报告
2)手工即时AWR快照
execdbms_workload_repository.create_snapshot;
3)模拟业务高峰
createtablescott.test1asselect*fromall_objects;
foriin1..10loop
insertintoscott.test1select*fromall_objects;
deletescott.test1;
endloop;
4)再次手工即时AWR快照
进入OEM,后查看两次快照的AWR报告和ADDM报告。
顾问就是通过分析AWR捕获的数据,提出改进性能的建议。ADDM本身就是顾问,它的报告里还会建议你找其他的顾问。具体病症还要看专科。
Oracle11g主要的一些Advisor:(PPT:358)
1)SQLAdvisors其中包括:
SQLTuningAdvisor:对单个SQL语句提供调优建议
SQLAccessAdvisor:对整个负载(包含多个SQL语句)提供调优建议。
SQLRepairAdvisor:对可能的oracle内部错误,如ORA-600需要的patch(补丁)提出建议
3)SegmentAdvisor:对比较稀疏的对象提供收缩命令(shrink).
4)UndoAdvisor:为undo表空间的大小提供建议,如避免快照太旧的问题。
等等
*考点:有三个自动维护的任务:1)ADDM收集优化器统计信息,2)SegmentAdvisor,3)SQLTuningAdvisor。这些顾问在维护窗口中自动运行。默认方式下,维护窗口从工作日的22点开始运行4小时,周六周日,从早上6点开始运行20小时。
从10g开始,Oracle数据库凭借警报系统一举实现了‘自我管理’。警报系统顶替了大量的单调工作,它将监视很多可能导致问题的条件,有状态警报和无状态警报之分,警报必须使用阀值配置,11g有200多种阀值,它们存在于AWR中,此后,MMON后台进程将实施监控,并将当前状态与阀值比较,比如当表空间达到全满的85%时发出警告性警报,达到97时将发出严重警报。
有API和OEM两种方法、OEM方法;HOME主页-->ReleteLink-->MetricandPolicysettings
有状态警报:基于持久保存的可修复条件,比如表空间的使用。
无状态警报:事件发生后又消失了,比如查询因‘快照太旧’而失败。
需要除默认配置外其他通知方法,需要进行三个级别的配置
1)必须配置通知方法OEM->右上角setup链接
2)必须创建规则来捕获事件OEM->右上角Preferences链接
3)管理员必须订阅规则Preferences链接->左边Administrators
1)警告由MMON后台进程而非EM引发,EM只管读取警报,自己或第三方编写的事件处理程序也同样可以。
2)有状态警报默认机制是在OEM主页上显示,并将它们写入了dba_outstanding_alerts视图,如果问题解决了,则可能将其清除,然后保存到dba_alert_history视图中,而无状态警报直接写入dba_alert_history视图。
1)parse分析语法语义
i)从共享池的库缓冲区搜索,该语句是否执行过,凡是执行过的sql语句,oracle会使用HASH函数计算,产生一个很小的文本记录,如果是第一次执行则进入第二步。
ii)检查语法,权限(权限的信息放在oracle的数据字典当中。oracle先从共享池的数据字典缓冲区中搜素,如果没有,再从数据文件(system表空间的数据文件)当中读取,然后,存放在数据字典缓冲区,以便共享。
iii)分析过程中,对访问到的表进行锁操作,目的是保护表的结构不被修改,优化器会根据数据的存储结构(表的存储结构),统计信息,计算读取的代价,生成执行计划同时编译并存储在共享池的缓冲区中
2)BIND绑定变量
优化器会考虑绑定变量来确定执行计划,Oracle强烈建议有条件的情况下对于OLTP类应用使用绑定变量,因为可以减少SQLPARSE。使用绑定变量也可能有负作用,就是对于访问具有倾斜的列(离散度低,某些值过于集中),有可能制定了一个不好的执行计划。11g在这方面有了切实的改进,解决了以往的bandpeeking(9i)的负面问题。
3)建立计划
4)执行库池里的执行计划,返回结果(sql硬解析从1)开始,软解析从4)开始)
使用绑定变量的两个例子;
例1
SQL>altersystemflushshared_pool;
SQL>select*fromscott.empwhereempno=7788;
7788SCOTTANALYST75661987-04-1900:00:00300020
SQL>select*fromscott.empwhereempno=7902;
7902FORDANALYST75661981-12-0300:00:00300020
where后面再加一个空格:
SQL>colsql_textfora60;
SQL>selectsql_text,parse_callsfromv$sqlwheresql_textlike'select*fromscott.empwhere%';
SQL_TEXTPARSE_CALLS
-----------------------------------------------------------------------
select*fromscott.empwhereempno=79021
select*fromscott.empwhereempno=77881
使用BIND变量看看:
SQL>variableinumber;
SQL>exec:i:=7900;
SQL>select*fromscott.empwhereempno=:i;
7900JAMESCLERK76981981-12-0300:00:0095030
SQL>exec:i:=7499;
select*fromscott.empwhereempno=:i2
例2:
---------
带绑定变量的查询
createtablescott.m1(xint);
createorreplaceprocedureproc1
as
foriin1..10000
loop
executeimmediate
'insertintoscott.m1values(:x)'usingi;
---------不带绑定变量的查询
createtablescott.m2(xint);
createorreplaceprocedureproc2
'insertintoscott.m2values('||i||')';
---------两项分别执行,比较效率
SQL>settimingon;
SQL>execproc1
PL/SQL过程已成功完成。
SQL>execproc2
Oracle11g比较大的改进之一,是在Oracle实例的内存管理方面,也就是Oracle11g中的新的内存管理特性--自动化内存管理(automaticmemorymanagement,AMM)。它将SGA和PGA统一分配,其作用是实现了SGA和PGA之间自动转换内存空间。
手动PGA和SGA管理(8i之前)
自动PGA管理(9i)
自动SGA管理(10g)
自动memory管理(11g)
memory_target:
该参数设置整个oracle数据库实例可以使用的内存量,自动的调节SGA与PGA的大小。该参数是可以动态调整的初始化参数。
memory_max_target:
该参数设置Oracle实例可以使用的最大内存量。memory_target<=memory_max_target.这个参数是静态初始化参数。
如果你不想设置SGA与PGA的最小值,可以把sga_target与pag_aggregate_target初始化参数都设置为0。
1)得到SGA当前值
showparemeterSGA_TARGET,//比如是600M
SQL>selectvalue/1024/1024fromv$pgastatwherename='maximumPGAallocated';//比如是300M
如果执行了下列语句,你将得到一个错误的PGA估计值
3)11g的参数memory_target应该设置为:memory_target=600M(SGA)+300M(PGA)
4)11g的参数memory_max_target参数如果不设,数据库将自动使memory_max_target=memory_target.
5)最后使sga_target=0,pga_aggregate_target=0
当你设置了memory_target参数,内存尺寸有如下关系:
1)如果忽略memory_max_target,而设置memory_target参数,则默认前者值等于后者值。
2)如果不设置sga_target和pga_aggregate_target,数据库自动调优sga和pga。
3)如果仅设置sga_target,或仅设pga_aggergate_target,仍然可以自动调优sga和pga。
当你不设置memory_target,该参数默认为0,随后将按如下为sga和pga分配内存。
1)如果不设置sga_target和pga_aggregate_target,数据库不自动调优sga,但仍可自动调优pga。
2)如果只设置sga_target,则数据库自动调优sga
3)无论是否设置pga_aggregate_target,数据库都自动调优pga。
当自动调优sga时,其中只有log_buffer组件不能自动调整,必须手动调整,下次启动有效。
当自动调优sga时,可以手动调整其他sga组件(一共五个),则将作为最小大小值(下限值)被参考。
SQL>select*fromv$memory_target_adviceorderbymemory_size;
MEMORY_SIZEMEMORY_SIZE_FACTORESTD_DB_TIMEESTD_DB_TIME_FACTORVERSION
----------------------------------------------------------------------
303.751901.00081
404119011
5051.2519011
6061.519011
7071.7519011
808219011
memory_size_factor值为1的值是实例分配到的memory_target的当前值。
V$MEMORY_DYNAMIC_COMPONENTS
V$MEMORY_RESIZE_OPS
v$sga_dynamic_components
v$sga_dynamic_free_memory
v$sga
v$sgainfo
v$sgastat
v$pgastat
v$buffer_pool
15.3.1使用AUTOTRACE
sys用户缺省配置了autotrace。它只能在SQL*PLUS里使用。作用:自动跟踪为SQL语句生成一个执行计划,并提供与该语句的处理有关的统计。
常用命令
SQL>setautotraceon;
或
SQL>setautotracetraceonlyexplain;//仅显示执行计划策略。
SQLTrace:跟踪SQL语句的执行,输出结果放在参数background_dump_dest指定的目录下,扩展名.trc
TKPROF把SQLTrace输出的跟踪文件转化成可读的格式。
这两个都是Oracle实用程序,如果把上节的AUTOTRACE比喻成售前,SQLTrace工具捕获的是SQL查询实际的执行效果。那就相当于售后。
SQL的一些顾问可以调优SQL语句,但最多是一种被动的机制,而且需要DBA干预。而SPM(SQLPlanManagement)可以提供一种预防性的机制,为保持执行计划始终处于最优状态。Oracle引入SQL计划基线的概念,目的是使SQL执行计划得以进化。
如果一条语句经常被使用,Oracle为了防止因数据库环境的变化造成原执行计划出现性能退化,又会生成新的执行计划。
既然优化程序可以对一条语句生成若干执行计划,累积的这些计划组成了一部计划历史,在其中有标记为accepted的计划,这样的计划是比较优异的(成本较低的),计划基线就是计划历史中那些accepted的执行计划。生成一条语句的最初的计划肯定是accepted,因为它无从比较。
以后再生成的几乎就可以同计划基线去比较了。
1自动捕获;设OPTIMIZER_CAPTURE_SQL_PLAN_BASELINESE为TRUE,数据库自动捕获新计划,但新计划不管是否优异,暂不列入accepted计划行列,要以观后效,一个未认可的计划必须优于认可的计划才能进化为计划基线。
2手动装载;手动在数据库中装载它们,一般是升级或已经测试过的,新计划直接列入accepted。因为你装载的计划是你自认为最优的计划。
可以利用Oracle提供了DBMS_SPM程序包或OEM管理SQL计划基线。
软件和硬件环境会发生变化,如升级操作系统,扩容硬件,新应用程序添加等。DatabaseReplay通过捕获生产服务器上的工作负荷,然后在测试系统上重放工作负荷,以此来评估测试系统上的性能变化。
使用DatabaseReplay时有四个步骤:
1)捕获工作负荷
2)预处理工作负荷
3)重放工作负荷
4)分析和报告
考点:一个重放客户端可以重放来自许多会话的语句。
(基于Linux的RMANCATALOG备份策略(选))
前言
对于Oracle数据库的备份与恢复,尽管存在热备,冷备以及逻辑备份之外,使用最多的莫过于使用RMAN进行备份与恢复。而制定RMAN备份策略则是基于数据库丢失的容忍程度,即恢复策略来制定。在下面的备份策略中,给出的是一个通用的备份策略。在该备份策略中,使用了catalog方式来保持备份脚本以及备份信息。在实际环境中应根据具体的情况对此进行相应的调整。
步骤
确认备份可用空间以及备份路径,根据需要创建相应文件夹
1.对于账户的连接创建一个connect.rcv,该文件包含连接到target和catalog信息
2.创建通用的脚本用于删除过旧的备份和备份控制文件以及备份归档日志
global_del_obso--删除过旧的备份
global_bkctl--备份控制文件
global_arch--备份归档日志
3.创建0,1,2级增量备份
这三个脚本中均包含第2步的3个脚本,先调用global_del,然后做增量备份,最后备份归档日志global_arch和控制文件global_bkctl
4.创建inc0.rcv,inc1.rcv,inc2.rcv
文件内容包含调用@@/
5.编辑第4步的三个文件分别为inc0.sh,inc1.sh,inc2.sh
nohup$ORACLE_HOME/bin/rmancmdfile=/u03/bk/scripts/inc1.rcvlog=/u03/bk/scripts/inc0.logappend&
6.使用crontab制定备份计划
具体实现
1.连接脚本
connect.rcv文件内容
connectcatalogrman/rman@david;
connecttargetsys/oracle@austin;
catalog的通用脚本
rmancmdfile=/u03/bk/scripts/connect.rcv--(在rman中使用外部脚本)
相当于:
rmancatalogrman/rman@davidtargetsys/oracle@austin--使用该脚本连接后创建通用脚本
2.建立通用脚本
--删除不必要的备份
RMAN>createglobalscriptglobal_del_obsocomment'Ascriptforobsoletebackupanddeleteit'{
crosscheckarchivelogall;
deletenopromptexpiredarchivelogall;
allocatechannelch1devicetypedisk;
deletenopromptobsoleterecoverywindowof7days;
releasechannelch1;
--备份控制文件脚本
RMAN>createglobalscriptglobal_bkctlcomment'Ascriptforbackupcontrolfile'{
backupascompressedbackupset
currentcontrolfilereuse
format='/u03/bk/backupctl.ctl'
tag='bkctl';
--备份归档日志脚本
RMAN>createglobalscriptglobal_archcomment"backuparchivelogandthendeleteit"{
allocatechannelch2devicetypedisk;
sql"altersystemarchivelogcurrent";--归档当前的联机日志
setlimitchannelch1readrate=10240;--(读取速率10M)
setlimitchannelch1kbytes=4096000;--(备份片的大小)
format='/u03/bk/arch_%d_%U'
tag='bkarch'
archivelogalldeleteinput;
releasechannelch2;
--使用list查看所有的已建立的全局脚本
listglobalscriptnames;--(列出所有的脚本)
deleteglobalsscriptscript_name;--(删除脚本)
RMAN>listglobalscriptnames;
ListofStoredScriptsinRecoveryCatalog
GlobalScripts
ScriptName
Description
global_arch
backuparchivelogandthendeleteit
global_bkctl
Ascriptforbackupcontrolfile
global_del_obso
Ascriptforobsoletebackupanddeleteit
3.创建0,1,2级增量备份脚本(注:每个脚本备份前会执行删除过旧的备份,脚本尾部会调用另外两个脚本来备份归档日志及控制文件)
--创建0级增量备份
RMAN>createglobalscriptglobal_inc0comment"backupdatabaseasincrmentallevel0"{
executeglobalscriptglobal_del_obso;
setlimitchannelch1readrate=10240;
setlimitchannelch1kbytes=4096000;
setlimitchannelch2readrate=10240;
setlimitchannelch2kbytes=4096000;
incrementallevel0database
format='/u03/bk/inc0_%d_%U'
tag='inc0';
executeglobalscriptglobal_arch;
executeglobalscriptglobal_bkctl;
--创建1级增量备份
RMAN>createglobalscriptglobal_inc1comment"backupdatabaseasincrmentallevel1"{
incrementallevel1database
format='/u03/bk/inc1_%d_%U'
tag='inc1';
--创建2级增量备份
RMAN>createglobalscriptglobal_inc2comment"backupdatabaseasincrmentallevel2"{
incrementallevel2database
format='/u03/bk/inc2_%d_%U'
tag='inc2';
--在rman中检验在rman中写的脚本global_inc0、global_inc1、global_inc2,因为RMAN不会自动检查,下面的语句用来执行脚本(检验)
executeglobalscriptglobal_inc0;
executeglobalscriptglobal_inc1;
executeglobalscriptglobal_inc2;
--查看备份完成情况
listbackupsetsummary;
4.建立shell脚本,让linux自动执行脚本
a.viinc0.rcv,inc1.rcv,inc2.rcv--注意不同的文件执行不同的备份脚本
@@/u03/bk/scripts/connect.rcv--(rman下的脚本去调用其他脚本用@@符号)(调用脚本不需要分号)
executeglobalscriptgloal_inc0;
exit;
b.编辑shell文件
viinc0.sh
nohup$ORACLE_HOME/bin/rmancmdfile=/u03/bk/scripts/inc0.rcvlog=/u03/bk/scripts/inc0.logappend&
viinc1.sh
viinc2.sh
nohup$ORACLE_HOME/bin/rmancmdfile=/u03/bk/scripts/inc2.rcvlog=/u03/bk/scripts/inc0.logappend&
--注意:nohup与&表示将脚本放入后台执行
c.使用crontab建立一个备份计划
crontab-e
#minhourdatemonday(星期)command
301**0/u03/bk/scripts/inc0.sh
301**1/u03/bk/scripts/inc2.sh
301**2/u03/bk/scripts/inc2.sh
301**3/u03/bk/scripts/inc2.sh
301**4/u03/bk/scripts/inc1.sh
301**5/u03/bk/scripts/inc2.sh
301**6/u03/bk/scripts/inc2.sh
d.重启crontab服务(如果没有启动)
#/sbin/servicecrondstatus--用于检查crontab服务状态
#/sbin/servicecrondstop//关闭服务
#/sbin/servicecrondrestart//重启服务
#/sbin/servicecrondreload//重新载入配置
使crontab服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/servicecrondstart
e.从上面的备份策略来看,即
周日执行0级增量备份,相当于全备
周一,周二,周三执行2级增量备份
周四执行1级增量备份
周五,周六执行2级增量备份
f.编辑好的shell脚本测试
chmod755*.sh--给shell脚本加权限
测试脚本例如./inc0.sh
总结
1.backupcontrolfileineachscriptstail(在脚本的尾部备份控制文件)
2.Deleteobsoletebackupsetineachscriptsthreshold(删除旧的备份)
3.Switchlogfilebeforebackupdatabase;(在数据库备份以前切换日志,备份联机重做日志)