ocp11g培训内部教材053课堂笔记(043)数据备份cphmvp

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:{=suggested|filename|AUTO|CANCEL}

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:{=suggested|filename|AUTO|CANCEL}

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:{=suggested|filename|AUTO|CANCEL}

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:{=suggested|filename|AUTO|CANCEL}

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:{=suggested|filename|AUTO|CANCEL}

//选auto不好使,再来一遍选cancel.

17:56:21SQL>recoverdatabaseuntilcancel;

17:56:23Specifylog:{=suggested|filename|AUTO|CANCEL}

cancel

Mediarecoverycancelled.

//选择cancel,在丢失的归档日志前终止recover

7)resetlogs打开数据库

111

不完全恢复中的复杂性是恢复数据文件的时候使用备份的控制文件。

1)为什么会使用备份的控制文件主要有三种情况:

第一种:控制文件全部丢失。(当然还有trace方法)

第二种:全备与当前控制文件不匹配,比如全备后又增/删了表空间。

2)使用备份的控制文件恢复数据库的语法:

recoverdatabaseusingbackupcontrolfile;//符合条件时,实现完全恢复

recoverdatabaseuntil[time|change]usingbackupcontrolfile;//不完全恢复

然后会有如下选项:

Specifylog:{=suggested|filename|AUTO|CANCEL}

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;//再次做恢复

指定日志:{=suggested|filename|AUTO|CANCEL}

/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;

语法:

flashbacktabletotimestamp|scn

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

文件内容包含调用@@/

/connect.rcv以及run{executeglobalscriptscriptname;}exit;

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;(在数据库备份以前切换日志,备份联机重做日志)

THE END
1.对“三个课堂”的认识和理解显然,在中小学推进“三个课堂”,有利于推进解决“唯分数”“唯升学”等功利化教育倾向问题,让第二课堂和第三课堂弥补第一课堂短时期内难以克服的不足,更为现实地解决了传统课堂教学存在的问题。让第二课堂和第三课堂成为发展素质教育、促进学生全面发展的有效载体,成为统筹加强“五项管理”的有效手段,成为推进新时代https://wenku.baidu.com/view/2e6ffaf52d3f5727a5e9856a561252d381eb2042.html
2.一堂好课的六大标准在教育的漫漫征程中,什么样的课才能称之为一堂好课?这是每一位教育工作者不断思索与追寻的问题。让我们跟随特级教师的智慧指引,结合新课标,一同探寻一堂好课的六大标准,揭开优质课堂的神秘面纱,为教育的精彩绽放注入新的活力。 1.清晰有效的教学目标 https://edu.jixi.gov.cn/Article/48244.html
3.第二课堂今天是星期三下午的第三节是第二课堂,下课的时候,我们看别人玩游戏,我们看了一会上课了,我们去综合楼打乒乓球,刚过去一会儿没打几下,人叫我们回去,他说是老师叫我们回去的。 我们几个只好回去了,不知道他们怎么想的,反正我是这样想的,我以为老师让我们回去写作业呢,原来是看我们班的元旦表演,好不好,第一个表https://www.jianshu.com/p/b3f82c19714d
4.新课标与新课堂,你认为的新课堂应该是怎样的?课堂不仅是学科知识的殿堂,更是人性的养育圣殿,它是学生成长的殿堂,是学生发挥创造力和想象力的天空,学生品味生活的“梦想剧场”。 2024-12-16 08:51:32 143楼 夏向勇 话题:0 精华:0 积分:115 课堂不仅是学科知识的殿堂,更是人性的养育圣殿,它是学生成长的殿堂,是学生发挥创造力和想象力的天空,学生品味生https://yun.xgjy.cn/studio/index.php?r=studio/topic/show&sid=17&id=4390&page=15
5.西南交通大学数学学院第二三课堂学生指导手册2.第二课堂包含哪些模块,哪些模块有学时要求? 根据《西南交通大学第二、三课堂建设实施办法(试行)》第一章内容,第二课堂指校内课外的文化、科技、艺术、体育等各类活动;第二课堂共设置了六个模块,分别是:思想政治与道德素养类、心理素质与身体素质类、艺术体验与审美修养类、文化沟通与交往能力类、学术科技与创新创https://maths.swjtu.edu.cn/info/1064/7507.htm
6.快速学习拼音方法在帮助孩子记忆时,可以告诉孩子:第一行跟相关声母相应,第二行和相关单韵母相应,第三行前两个和相关复韵母对应,第四行和鼻韵母响应。这样一组一组来记更容易些。 (4)标调规则: 关于汉语拼音的标调规则,可以帮孩子复习有关的儿歌:见a找a,没a找o、e,i、u并列标在后。 https://www.wenshubang.com/xuexijihua/204755.html
7.《水龙吟·登建康赏心亭》教案设计第一遍,教师范读,学生听读正音。 第二遍,听录音,把握节奏和感情。 第三遍,抽学生读,指导诵读技巧。 2、结合注释梳理全词,理解词作上下片各写了什么内容? 3、大家分组讨论,思考下列问题 ①词的上片作者在赏心亭看到哪些触动自己心弦的景象?表现了词人怎样的心情? https://www.yuwenmi.com/jiaoan/gaoer/460481.html
8.校本研修:四年级语文备课组“聚焦关键性问题设计有效教学三、小组合作,理解诗意 1.指名读,检查读的情况。教师范读,学生静听,感受诗中所描绘的景物。 “疏疏〞“未成阴”,了解春季的特点。 3.让学生小组合作,分前两句、后两句说诗意,体验诗句所描绘的景物美。 4.理解第一、二句。 〔1〕第一句写了哪几种景物?有什么特点?用自己的话说说这句诗的意思。 http://yhlxx.jnjy.net.cn/NewShow-2126.aspx
9.省前中国际分校报第16期高复年级:1、高复理科语数外人均总分345.9分名列武进区第二名,高复文科语数外人均总分344.5分名列武进区第三名。 2、理科:武进区前10名有3人,前20名有5人,前50名有9人,前100名有13人;其中高复(6)班庄昊以418.5分名列第2名,高复(6)班潘洛以403.5分名列第8名,高复(3)班王馨以403分名列第9名。 http://qhims.wjedu.net/static/xkxb/20140516/993395.jhtml
10.五年级数学小数乘法教案为什么每组中第二题的积都与第二个因数相等? 你有什么发现? 看看每组中第三题的积你有什么发现? 3、完成练习十六第11题。 根据刚才发现的规律,你能说说每次乘的积比第一个因数大还是小? 指名学生口答。 独立完成计算并检验是否正确。4、完成练习十六第12题。 https://www.fwsir.com/jiaoan/html/jiaoan_20220724083049_1906015.html
11.《让我们荡起双桨》优秀教学设计(精选10篇)2、朗读第二小节。 (1)边读边想像,并读出感情。 (2)同学们,如果你就坐在小船上划船,会有什么感觉?用自己的话说一说。 (3)同学们最喜欢哪些句子?为什么?(引出“水中鱼儿望着我们,悄悄地听我们愉快的歌唱”的诗句加以体会。) 3、朗读第三小节 https://mip.ruiwen.com/jiaoxuesheji/2021455.html
12.《朱德的扁担》练习题(精选12篇)全文共三个自然段:第一自然段简要揭示当时的背景和形势。(这个自然段我将它放在第一课时的教学中来解决。)第二自然段叙述了红军战士们争着到茅坪去挑粮。第三自然段是全文的重点段,讲了朱德加入了挑粮的队伍,战士们怕他累着,藏了他的扁担,但他又连夜做了一根,并写上了“朱德记”三个字。 https://www.diyifanwen.com/jiaoan/xiaoxueernianjiyuwenjiaoan/709980.html
13.教学设计——读课文查字典识字(音序)部分本环节两部分来进行感知,一部分以动画的形式来激发学生学习兴趣,第二部分以读通课文,读准字音,初步了解课文内容为主。让学生运用句式:“小壁虎分别向( )、( )和( )借尾巴。”进行说话训练。既有利于学生了解课文的大致内容,又训练了他们的语言表达能力。 三、 巧读课文,理解内容 (一)出示第一、二节,自读https://yaxx.qpedu.cn/jswd/zcjsdg/270827.htm
14.植物妈妈有办法一、谈话引入课文 1、由秋天植物的.种子成熟引入,设问导入课文。 2、齐读课题: ⑴知道植物妈妈孩子分别指植物和它们的种子。 ⑵用补充课题的方法了解课文大意。 二、初读课文,检查预习 1、指名分节读课文,其余学生听、辨,纠正字音。 2、学生同桌互相听读课文,要求读正确。(为是多音字) https://www.unjs.com/jiaoan/yuwen/xiaoxue2/20100723165356_315025.html
15.第二式课程与教学1400多个省级实验区隐性课程对学生的影响有几个特点:第一,影响方式的无意识性;第二,空间的广泛性; 第三,内容的全面性。 从性质上看,课程可分为显性课程和隐性课程两种类型。 1.显性课程 显性课程亦称公开课程,是指在学校情境中以直接、明显的方式呈现的课程。显性课程的主要特征之一是计划性,这是区分显性课程和隐性课程的主要标志https://blog.csdn.net/m0_63910340/article/details/129322261
16.教学说课稿精选15篇因为我采用“三勤四环节”教学法,所以课堂步骤主要由定向诱导、自学探究、讨论解疑、反馈总结这四个环节组成。 “定向诱导”环节主要有两个内容,一是导入新课,二是明确学习目标。当代特级语文教师余映潮认为,语文课开始的第一秒钟就应该是在学语文,所以,我设计了一个简单的交流话题来导入新课:请用一个词表现你的童https://www.qunzou.com/jiaoxue/shuokegao/626703.html
17.枣庄市课程纲要编写指导意见二、注意事项 1.编制学期课程纲要,就是想通了一学期课程开设的基本问题。要回答好三个问题:你要把学生带到哪里去,你怎样把学生带到那里,你如何确信你已经把学生带到了那里。把握三个前提:把握学科思想、掌握学科知识体系、明确学科课程目标。做到三个读懂:读懂课标和教材、读懂学生、读懂课堂。 http://tzsxzx.tzjtzy.cn/index.php?r=space/school/portal/content/view&id=419895
18.原州四中“高效课堂”实施方案固原市第四中学第一部分 理论篇 第一章:教育是什么 第二章:高效课堂概念及三大系统解析 第三章:高效课堂的八大支撑系统 第四章:“四新”标准解读 第五章:教师:从讲师到导师https://yun.nxeduyun.com/index.php?r=space/school/theme/content/view&id=685605
19.莆田一中2020三、课程内容/授课计划 第一课时演讲技术性指导第二课时《自我介绍,互相认识》 第三课时《超级流浪家》第四课时《小演员的明星梦》 第五课时《国要怎么爱》第六课时《真正的文明是什么》 第七课时《人生需要急转弯》第八课时《寒门贵子》 第九课时《年轻人能为世界做什么》第十课时《背对父母奔跑的日子》 http://www.fjptyz.com/zt/dfzfrmp/kcjs/20210710/453500091.shtml
20.鸟的天堂获奖教学设计(通用10篇)(第一个鸟的天堂指的是这棵大榕树,特定称谓;第二个鸟的天堂指的是真真正正鸟的天堂。鸟儿在这里栖息繁衍,过着幸福的生活。) 3.指导学生读出感慨的味道。 四、了解榕树成为鸟的天堂的原因。 1、什么原因使这棵大榕树成为了“鸟的天堂”呢? 2、学生根据查找的课外资料或其它知识加以介绍分析。 https://www.oh100.com/kaoshi/jiaoxuesheji/633793.html
21.市实验中学英语第一次大教研活动及工作坊活动校本教研在文本三个段落的阅读过程中,还可以分别设置了三个不同的task来实现阅读目标。第一段,寻找supporting detail句子;第二段,依据time shift填空;第三段,完成match的任务。同时,在第二段和第三段,还可以结合板书,让学生复述Abing和二泉映月的相关细节句子。由此可见,教师在细节阅读的过程中不仅需要熟练地运用不同的阅读http://jysyzx.hnjysz.com/html/2019/yangbenjiaoyan_0419/2831.html