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

053:数据库高级管理:

目录

第一部分:数据库备份与恢复... 4

第一章:备份恢复概述... 4

1.1 备份的意义: 4

1.2 数据库故障的类型:... 4

1.3 制定你的备份和恢复的计划... 4

1.4 备份恢复分类... 5

1.5 备份恢复方式... 5

1.6 完全恢复与不完全恢复... 5

1.7 归档与非归档... 6

第二章:手工备份与恢复... 6

2.1 手工备份:... 6

2.2 手工备份和恢复的命令... 6

2.3 备份前应对数据库进行检查: 7

2.4 手工非一致性备份(热备份)的执行方式及热备份的监控(v$backup)... 7

2.5 dbv   (db verify)检查数据文件是否有坏块... 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 不完全恢复(Incomplete recover) 适用环境:... 20

4.3 不完全恢复的基本类型:... 20

4.4 不完全恢复的操作步骤(恢复模式对象的传统方法):... 21

4.5、logminer 工具的使用... 21

4.6 不完全恢复范例:... 21

第五章:闪回 flashback. 41

5.1 flashback 的功能:... 41

5.2 flashback分类:(DBA-II PPT:253)... 42

第六章:RMAN(recover management 恢复管理器)概述... 55

6.1 rman的定义和功能: 55

6.2 rman的优点:... 56

6.3 rman的架构:... 56

6.4 rman 连接目标库方法... 56

6.5、查看rman的默认配置,修改rman的配置信息... 57

6.6 rman备份的分类:... 61

6.7 rman的命令格式:... 61

第七章:rman(备份)... 62

7.1 rman备份分类:... 62

7.2 rman归档方式备份常用语法:... 62

7.3 增量备份: 63

7.4 块变更跟踪(block change tracking) 64

7.5 数据恢复顾问DRA. 65

第八章:rman 完全恢复... 66

8.1 recover 恢复:... 66

8.2 完全恢复:... 67

第九章:rman 不完全恢复... 77

9.1 rman 不完全恢复的三个标准模式:... 77

第十章:目录库和辅助库... 91

10.1 创建目录库(Catalog database)的必要性... 91

10.2 Catalog database 的配置... 92

10.3 RMAN存储脚本... 93

10.4 虚拟专用目录(ppt85-86) 94

10.5 Auxiliary Database. 94

第十一章: rman 维护... 95

11.1 rman 使用和维护... 95

11.2 list  命令一览... 95

11.3 crosscheck:... 95

11.4 report 报告命令一览... 96

11.5 delete  删除备份命令一览... 97

第二部分 优化oracle数据库... 97

第十二章 Oracle 资源管理... 97

12.1 为什么要使用Oracle资源管理器... 97

12.2 Oracle 资源管理的基本概念: PPT:406. 98

12.3 一个资源管理中创建组、计划、及指令的例子:... 99

12.4 其他的资源指令和阀值... 102

12.5 配置测试使用者组自动切换... 103

第十三章 Oracle 自动任务调度... 104

13.1 Oracle任务调度概述... 104

13.2 理解以下概念:... 105

13.3 例子... 106

13.4 通过调度程序窗口控制一个计划... 108

13.5 Window和Job Class. 109

第十四章 AWR与警报系统... 110

14.1 Oracle数据库采样ASH和AWR。... 110

14.2 相关的一些概念: 110

14.3 ADDM (Automatic Database Dianostic Monitor) 111

14.4 自动维护作业 AutoTask. 113

14.5 使用服务器生成警报系统... 113

第十五章:Oracle 性能调优... 114

15.1 SQL的硬解析和软解析... 114

15.2 11g内存管理... 118

15.3 查看Oracle的执行计划:... 120

15.4 SQL计划管理 SPM.. 121

15.5 Database Replay(数据库重放)... 122

附录 Oracle一周备份计划范例... 122

 

 

 

 

第一部分:数据库备份与恢复

 

第一章:备份恢复概述

 

1.1 备份的意义:

 

     1)保护数据,避免因为各种故障而丢失数据

 

     2)MTBF:平均故障间隔时间

 

     3)MTTR:平均恢复时间

 

1.2 数据库故障的类型:

 

     1)user process failure:  pmon 自动处理

     2)user errors :      需要dba通过备份恢复

     3)instance failure:   smon 自动处理

     4)media failure:     必须通过备份和日志恢复   (介质恢复)

    

    

1.3 制定你的备份和恢复的计划

 

     1)根据生产环境的恢复周期,制定详细的备份计划,然后严格执行

 

     2)对备份,要在一定的时间内利用测试环境,进行故障恢复的练习

 

 

1.4 备份恢复分类

    

     1)逻辑备份与恢复 面向object   

     2)物理备份与恢复 面向media failure  (直接面向磁盘上的数据文件)

 

1.5 备份恢复方式

 

     逻辑备份与恢复

 

     1)传统的导入导出:exp/imp:

     2)数据泵导入导出:expdp/impdp

 

//逻辑备份就是热备 (数据库打开时)数据库对象某一时刻状态,不能运用在media failure(介质)上,逻辑备份的恢复就是还原备份,没有recover的概念,只有restore(还原)的概念。

    

     物理备份与恢复

 

     1)手工备份与恢复, 通过OS 的命令,完成备份与还原,然后再运用日志进行恢复。

     2)自动备份与恢复, 利用oracle 的备份恢复工具rman (或其他备份恢复软件),还原与恢复过程自动完成。

       

//物理备份从方式上可以有一致性备份(冷备)和非一致性备份(热备)

//完整的备份方案应该以物理备份为主,逻辑备份辅助(用于备份一些重要的表)

 

//逻辑备份比较适合不同平台之间的迁移,而物理备份是从哪来到哪去。

 

1.6 完全恢复与不完全恢复

 

media failure 后,需要运用日志进行recover,

 

1)完全恢复:利用完整备份或部分备份,可以将datafile恢复到failure前得最后一次commit,不会出现数据丢失。

    

2)不完全恢复:需要运用完整备份和日志将database恢复到过去的某个时间点(或SCN),有数据丢失。

 

1.7 归档与非归档

 

归档模式:redo log 写入 archive log

 

非归档模式:没有archive log, redo log 循环覆盖

    

                 

手工冷备  手工热备 RMAN冷备    RMAN热备    完整还原    完全恢复    不完全恢复       ----------------------------------------------------------------------------归档模式:      yes     yes     yes     yes     yes     yes         yes

 

非归档模式:    yes     no      yes         no      yes     no              no

 

*考点:

1)非归档模式运行时必须备份那些文件:控制文件和整个数据文件集,并且必须首先干净的关闭数据库(冷备)

2)当处于非归档模式下时,在丢失数据文件后唯一的选择是执行完整的数据库还原,而不能进行恢复。

3)非归档模式下,RMAN只能做冷备。

 

                                                                   

第二章:手工备份与恢复

 

2.1 手工备份:

 

    1)数据库全备:备份database的所有数据块(datafiles、controlfile)

    2)部分备份:只备份单个表空间或datafile(archivelog 模式)

    3)一致性备份(冷备份):在数据库正常关闭情况下做备份,数据库处于一致性状态。

    4)非一致性备份(热备份):database 在open状态下备份。

 

2.2 手工备份和恢复的命令

 

    1)备份和还原使用os 命令

    2)恢复用sqlplus命令:recover

 

2.3 备份前应对数据库进行检查:

 有关的视图:v$datafile\v$datafile_header\v$controlfile\v$logfile\dba_tablespaces\dba_data_files

  

 1) 检查需要备份的数据文件

 

SQL> select name from v$datafile;

                                              

SQL> select file_id,file_name,tablespace_name from dba_data_files;  

 

 2)检查要备份控制文件

 

SQL> select name from v$controlfile;

 

 3)在线redo日志不需要做备份

 

 

2.4 手工非一致性备份(热备份)的执行方式及热备份的监控(v$backup)

 

注意:对只读的表空间不能做热备份,临时表空间不需要备份

 

 1)在备份前要进入backup mode(backup模式),

    即:执行begin backup (在数据文件上生成检查点,写入scn ,将来恢复的时候以此scn 为起点)

         

SQL> alter database begin backup;       //对整个库做热备份  

SQL> alter database end backup;

                       

SQL> alter tablespace users begin backup;   //对表空间做备份

SQL> alter tablespace users end backup;

 

 2)备份期间利用v$backup 监控

      

例;

 

SQL> alter tablespace test begin backup;

 

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            2414314

         2            2414314

         3            2414314

         4            2414314

         5            2414314

         6            2430480           //在备份期间 ,scn 不发生变化

         7            2414314

 

SQL> select * from v$backup;

 

     FILE# STATUS                CHANGE# TIME

---------- ------------------ ---------- -------------------

         1 NOT ACTIVE                  0

         2 NOT ACTIVE                  0

         3 NOT ACTIVE                  0

         4 NOT ACTIVE                  0

         5 NOT ACTIVE                  0

         6 ACTIVE                2430480 2012-07-30 11:07:19

         7 NOT ACTIVE                  0

 

STATUS 是ACTIVE,表示可以备份相应的数据文件。

 

$cp test01.dbf test01.bak

 

备份完毕,执行end backup

 

SQL> alter tablespace test end backup;                                                                              

 

SQL> select * from v$backup;

 

     FILE# STATUS                CHANGE# TIME

---------- ------------------ ---------- -------------------

         1 NOT ACTIVE                  0

         2 NOT ACTIVE                  0

         3 NOT ACTIVE                  0

         4 NOT ACTIVE                  0

         5 NOT ACTIVE                  0

         6 NOT ACTIVE            2430480 2012-07-30 11:07:19

         7 NOT ACTIVE                  0

 

*考点:不能备份临时表空间,甚至不能将它们置于备份模式。

 

 

2.5 dbv   (db verify)检查数据文件是否有坏块

 

在手工备份前,应该检查datafile 是否有坏块,备份完后对备份也做检查

        

[oracle@timran admin]$ dbv

 

DBVERIFY: Release 11.1.0.6.0 - Production on Mon Jul 30 11:11:07 2012

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

Keyword     Description                    (Default)

----------------------------------------------------

FILE        File to Verify                 (NONE)

START       Start Block                    (First Block of File)

END         End Block                      (Last Block of File)

BLOCKSIZE   Logical Block Size             (8192)

LOGFILE     Output Log                     (NONE)

FEEDBACK    Display Progress               (0)

PARFILE     Parameter File                 (NONE)

USERID      Username/Password              (NONE)

SEGMENT_ID  Segment ID (tsn.relfile.block) (NONE)

HIGH_SCN    Highest Block SCN To Verify    (NONE)

            (scn_wrap.scn_base OR scn)          

[oracle@timran admin]$

 

针对某个datafile做坏块检查

 

[oracle@timran admin]$ dbv file=/u01/oradata/timran11g/system01.dbf

 

 

第三章:手工完全恢复

 

3.1 完全恢复;

通过备份、归档日志、current redo ,将database恢复到failure 前的最后一次commit状态。

 

3.2 完全恢复的步骤

 

     1)restore:还原所有或部分datafile

     2)recover:利用归档日志和当前的redo日志做恢复

 

3.3 手工完全恢复可以基于三个级别

 

    recover database:  关键文件(系统表空间、undo数据文件、控制文件)损坏或数据库的大部分datafile丢失,只能mount状态完成

    recover tablespace:非关键表空间损坏,表空间下某些数据文件不能访问,一般是在open下完成

    recover datafile:  非关键文件损坏,单个或几个datafile丢失,可以在mount或open 状态完成

 

什么是关键数据文件:如果关键文件损坏,数据库将不能维持在open状态,或崩溃或死机!

 

考点:那些数据文件是关键文件:三个;1)system01.dbf, 2)undo tablespace,3)control file

 

3.4 恢复过程可以查看的视图:

   

    1)v$recover_file: 查看需要恢复的datafile

    2)v$recovery_log: 查看recover 需要的redo 日志

    3)v$archvied_log: 查看已经归档的日志

   

 

3.5 非归档模式下只能做全备的完整还原,还原后仍会缺失联机日志文件

(因为只备数据文件和控制文件),需要在mount下发出

    alter database clear logfile group  <组号>. (如果是在RMAN下还原,这一过程是自动完成的)。

 

3.6 归档模式下手工完全恢复的实验

 

前提: 1)有一套datafile全备, 2)使用当前控制文件, (当前控制文件是好的) 3)自备份以来的归档日志和当前联机日志是完整的,

 

范例1:recover database

 

说明:由于media failure  适用于系统表空间出了问题 即system01.dbf损坏。或丢失了大部分datafile,

 

sys:

SQL> select * from scott.test;

 

        ID

----------

         1

 

在这个状态下先在os下做一个数据文件和控制文件的冷备。

 

SQL> shutdown immediate

 

[oracle@timran ~] $cp /u01/oradata/timran11g/*.dbf  /u01/back1

[oracle@timran ~] $cp /u01/oradata/timran11g/*.ctl  /u01/back1

 

[oracle@timran ~] $startup

 

SQL> insert into scott.test values(2);

SQL> commit;

SQL> select * from scott.test;

 

        ID

----------

         2

         1

 

SQL>select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1        167   52428800          1 NO       CURRENT          2414313 2012-7-30 9

         2          1        165   52428800          1 YES      INACTIVE         2360976 2012-7-29 1

         3          1        166   52428800          1 YES      INACTIVE         2382245 2012-7-29 2

 

SQL> alter system switch logfile;

SQL> alter system archive log current;

SQL> /

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ----------

         1          1        170   52428800          1 NO       CURRENT          2436025 2012-7-30 1

         2          1        168   52428800          1 YES      INACTIVE         2436011 2012-7-30 1

         3          1        169   52428800          1 YES      INACTIVE         2436017 2012-7-30 1

 

SQL> insert into scott.test values(3);

SQL> commit;

SQL> select * from scott.test;

 

        ID

----------

         2

         3

         1

 

 

1)模拟介质失败

  

[oracle@timran ~]$ rm /u01/oradata/timran11g/*.dbf      //数据库在打开的情况下就删掉了所有dbf文件

SQL> shutdown abort                //数据库直接abort了

ORACLE instance shut down.

 

2)启动database

 

SQL> startup                      

ORACLE instance started.

 

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: '/u01/oradata/timran11g/system01.dbf'

 

SQL>select file#,error from v$recover_file;

 

     FILE# ERROR

---------- -----------------------------------------------------------------

         1 FILE NOT FOUND

         2 FILE NOT FOUND

         3 FILE NOT FOUND

         4 FILE NOT FOUND

         5 FILE NOT FOUND

         6 FILE NOT FOUND

         7 FILE NOT FOUND

 

SQL> select file#,checkpoint_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            2436025

         2            2436025

         3            2436025

         4            2436025

         5            2436025

         6            2436025

         7            2436025

 

SQL> select file#,checkpoint_change# from v$datafile_header; 

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            2414314

         2            2414314

         3            2414314

         4            2414314

         5            2414314

         6            2430480

         7            2414314

 

3)启动失败,控制文件和数据文件头的scn不一致,需要做介质恢复。

注意:

//此例是数据库open状态在os下直接删除了所有数据文件,所以这里最好不要做日志切换,否则情况复杂。

//控制文件记录的scn 应大于需恢复的数据文件头部的scn,这样才能满足完全恢复的条件。

 

首先还原所有数据文件

[oracle@timran ~]$ cp /u01/back1/*.dbf /u01/oradata/timran11g

 

4)恢复database

 

可以先查看一下恢复时需要的归档日志

 

SQL> col archive_name for a50;

SQL> select * from v$recovery_log;

 

   THREAD#  SEQUENCE# TIME                 ARCHIVE_NAME

---------- ---------- -------------------- ------------------------------------------------

         1 ########## 2012-07-30 09:39:31  /u01/disk1/timran/arch_1_782662700_167.log

         1 ########## 2012-07-30 13:11:22  /u01/disk1/timran/arch_1_782662700_168.log

 

SQL> recover database

ORA-00279: change 2414314 generated at 07/30/2012 09:39:32 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_782662700_167.log

ORA-00280: change 2414314 for thread 1 is in sequence #167

 

13:21:13 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

 

5)打开数据库

SQL> alter database open;

 

6)验证

 

SQL> select * from scott.test;

 

        ID

----------

         2

         3

         1

 

范例2:recover tablespace(状态:database open)

 

说明:针对的是非关键表空间的损坏,基于表空间的完全恢复实际上还是对其下的datafile的恢复

 

这种情形非常实用,通常是某个非关键表空间不可访问了,并没有造成oracle宕掉, 只需要针对个别有问题的tablespace或datafile去做单独的恢复操作,

 

也就是说恢复时数据库整体是online的,而局部表空间是offline的,数据库不需要shutdown。

 

恢复表空间(删除了tablespace的所有的datafile)

 

1)了解一下当前状态,有个test表空间,

 

SQL> select file_id,file_name,tablespace_name from dba_data_files;

 

   FILE_ID FILE_NAME                                          TABLESPACE_NAME

---------- -------------------------------------------------- ------------------------------

         4 /u01/oradata/timran11g/users01.dbf                    USERS

         3 /u01/oradata/timran11g/sysaux01.dbf                   SYSAUX

         2 /u01/oradata/timran11g/undotbs01.dbf                  UNDOTBS1

         1 /u01/oradata/timran11g/system01.dbf                   SYSTEM

         5 /u01/oradata/timran11g/example01.dbf                  EXAMPLE

         7 /u01/oradata/timran11g/abcd01.dbf                     ABCD

         6 /u01/oradata/timran11g/test01.dbf                     TEST

 

SQL> conn scott/scott

Connected.

SQL> create table t1 (name char(10)) tablespace test;

SQL> insert into t1 values('a');

SQL> commit;

SQL> select * from t1;

 

NAME

--------------------------------------------------

a

 

2)模拟表空间损坏,数据库open下,直接删除表空间下的数据文件                                                                                         

[oracle@timran ~]$ rm /u01/oradata/timran11g/test01.dbf

[oracle@timran ~]$

 

3)查证该表空间上的表不可访问了

 

SQL> alter system flush buffer_cache;   //清除data buffer

 

SQL> conn / as sysdba           //换个session登陆,访问t1表,内存里已经没有了,只好做哦物理读,所以报错!

Connected.

 

SQL> select * from scott.t1;

select * from scott.t1

*

ERROR at line 1:

ORA-01116: error in opening database file 6

ORA-01110: data file 6: '/u01/oradata/timran11g/test01.dbf'

ORA-27041: unable to open file

Linux Error: 2: No such file or directory

Additional information: 3

 

4)看看scn的情况

 

SQL> select file#,checkpoint_change# from v$datafile;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            3550907

         2            3550907

         3            3550907

         4            3550907

         5            3550907

         6            3550339

 

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            3550907

         2            3550907

         3            3550907

         4            3550907

         5            3550907

         6                  0

 

 

5)数据库open下,使用备份还原这个表空间下的数据文件

 

[oracle@timran ~]$ cp /u01/back1/test01.dbf /u01/oradata/timran11g

[oracle@timran ~]$

 

6)表空间offline

 

SQL> alter tablespace test offline;     //注意:当前的数据库状态是open,数据字典里还有这个表空间。                                                                             

7)恢复tablespace

 

SQL> recover tablespace test;

 

ORA-00279: change 2430480 generated at 07/30/2012 11:07:19 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_782662700_167.log

ORA-00280: change 2430480 for thread 1 is in sequence #167

 

13:33:28 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

 

8)表空间online

SQL> alter tablespace test online;      //注意:此时数据库状态一直是open的。

 

9) 验证

SQL> select * from scott.t1;

 

NAME

--------------------------------------------------

a

 

 

范例3:(recover datafile,database mount或open状态)

 

恢复datafile, 同范例2不同的是: datafile是在数据库mount状态下恢复的(当然也可以open下进行)

 

1) 模拟环境:

 

SQL> insert into scott.t1 values('b');

SQL> commit;

SQL> select * from scott.t1;

 

NAME

--------------------------------------------------

a

b

 

2)在open 状态下删除datafile

[oracle@timran ~]$ rm /u01/oradata/timran11g/test01.dbf

[oracle@timran ~]$

                                                                                    

3)关闭数据库

SQL> shutdown abort

 

4)用备份还原该datafile

[oracle@timran ~]$ cp /u01/backup/test01.dbf /u01/oradata/timran11g

 

5)mount下恢复datafile

SQL>startup mount

13:48:33 SQL> recover datafile 6;

ORA-00279: change 2430480 generated at 07/30/2012 11:07:19 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_782662700_167.log

ORA-00280: change 2430480 for thread 1 is in sequence #167

 

13:48:47 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

 

7)打开数据库

SQL>alter database open;

 

8) 验证

SQL> select * from scott.t1;

 

NAME

--------------------------------------------------

a

b

 

3.7 手工完全恢复特点小结:

 

3.7.1 recover database 

  (关键文件损坏,数据库abort,恢复一定是在mount下)

 

os: 使用cp 还原所有dbf

1)recover database;

2)alter database open;

 

3.7.2 recover tablespace 

(非关键文件,一般是open下恢复)

 

os:使用cp 还原该表空间XXX下的所有数据文件

1)alter tablespace XXX offline;

2)recover tablespace XXX;

3)alter tablespace XXX online;

 

3.6.3 recover datafile  

 (非关键文件,database mount or open)

 

os:cp 还原相关的数据文件(mount)

1)recover datafile 6,8;

2)alter database open;

 

os:cp 还原相关的数据文件(open)

1)alter database datafile 6,8 offline;

2)recover datafile 6,8;

3)alter database datafile 6,8 online;

 

 

 

完全恢复的条件:

1.有一个备份

2.有一个备份

3.控制文件是新的,是当前的控制文件

 

 

 

第四章:手工不完全恢复(归档模式)

 

4.1 不完全恢复的特点:    

      1)让整个database 回到过去某个时间点,不能避免数据丢失。

 

      2)想跳过坏日志而继续恢复所有其他工作是不可能的,前滚没有这个功能(考点)。

 

      3)必须以sysdba身份连接进行不完全恢复,普通用户或sysoper都不行(考点)。

 

      4)语句只有recover database until 这种形式,表示整个数据库回到某个时间点或SCN,而until是指恢复在时间点前停止(考点)。

 

4.2 不完全恢复(Incomplete recover) 适用环境:

       1)在过去的某个时间点重要的数据被破坏。

 

       2)在做完全恢复时,丢失了归档日志或当前online redo log(考点)

 

       3)当误删除了表空间时(有备份)

 

       4)丢失了所有的控制文件,使用备份的控制文件恢复时      

       

4.3 不完全恢复的基本类型:

      1)基于时间点 (until time):          使整个数据库恢复到过去的一个时间点前       

    

    2)基于scn (until change):            使整个数据库恢复到过去的某个SCN前

     

   2)基于cancel (until cancel):           使整个数据库恢复到归档日志或当前日志的断点前

    

  3)基于误删除表空间(使用备份的controlfile): 使整个数据库恢复到误删除表空间前

     

4.4 不完全恢复的操作步骤(恢复模式对象的传统方法):

   

   1)先通过logmnr 找到误操作的时间点

 

      2)对现在的database做新全备

 

      3)还原该时间点前所有的datafile

 

      4)在mount状态下,对database做recover,恢复到过去的时间点

 

      5)将恢复出来的table做逻辑备份(exp)

 

      6)再将全备还原

 

      7)将导出的表导入database(imp)

     

4.5、logminer 工具的使用

    

     对redo log 进行挖掘,找出在某个时间点所作的DDL 或DML 误操作(包括:时间点、scn 、sql语句)

                                                                                           

4.6 不完全恢复范例:

 

范例1:

 

恢复过去某个时间点误操作的table

 

4.6.1 基于时间点的不完全恢复

 

1)环境:scott用户在test表空间下有个t1表

 

SQL> conn scott/scott

SQL> create table t1(id int) tablespace test;

SQL> insert into t1 values(1);

SQL> insert into t1 values(2);

SQL> insert into t1 values(3);

SQL> commit;

SQL> select * from t1;

 

        ID

----------

         1

         2

         3

 

2)误删除了t1表,并purge了。

 

SQL> drop table t1 purge;

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1        131   52428800          1 YES      INACTIVE               1875893 2012-6-13 1

         2          1        132   52428800          1 YES      INACTIVE               1896385 2012-6-13 1

         3          1        133   52428800          1 NO       CURRENT                1916973 2012-7-18 1

 

SQL> alter system switch logfile;

SQL> /

SQL> /

 

SQL> select name from v$archived_log;

 

NAME

--------------------------------------------------------------------------------

...

/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  //drop table t1 purge这个动作的日志条目记录在此归档日志里了。

/u01/disk1/timran/arch_1_782662700_134.log

/u01/disk1/timran/arch_1_782662700_135.log

 

116 rows selected

 

3)通过logmr 找出误操作的ddl命令的timestamp 或 san

 

SQL> show parameter utl          

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

create_stored_outlines               string

utl_file_dir                         string      /home/oracle/logmnr     (先建上这个目录)

 

SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);

 

SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_782662700_133.log',options=>dbms_logmnr.new);

 

SQL> execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_782662700_134.log',options=>dbms_logmnr.addfile);

 

SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);

 

SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE lower(sql_redo) like 'drop table%';

 

USERNAME                              SCN TO_CHAR(TIMESTAMP,'YYYY-MM-DDH SQL_REDO

------------------------------ ---------- ------------------------------ -----------------------------------------------

SCOTT                             1917250 2012-07-18 16:44:55            drop table test purge;

SCOTT                             1917267 2012-07-18 16:45:01            drop table student purge;

SCOTT                             1918000 2012-08-01 17:28:29            drop table t1 purge;

 

SQL> execute dbms_logmnr.end_logmnr;

 

4) 关闭数据库,删除所有dbf,准备做不完全恢复

 

SQL> shutdown abort

 

[oracle@timran ~]$ cd /u01/oradata/timran11g

[oracle@timran ~]$ rm *.dbf

 

5)还原所有备份的数据文件

 

[oracle@timran ~]$ cp /u01/back1/*.dbf ./

 

6)根据log miner提供的信息,做基于时间点的不完全恢复

 

17:31:43 SQL> startup

ORACLE instance started.

 

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              75499112 bytes

Database Buffers          201326592 bytes

Redo Buffers                7168000 bytes

Database mounted.

ORA-01113: file 1 needs media recovery

ORA-01110: data file 1: '/u01/oradata/timran11g/system01.dbf'

 

17:33:07 SQL> recover database until time '2012-08-01 17:28:29';

 

ORA-00279: change 1917581 generated at 07/18/2012 16:46:34 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_782662700_133.log

ORA-00280: change 1917581 for thread 1 is in sequence #133

 

17:33:17 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

auto

 

Log applied.

Media recovery complete.

 

7)resetlogs方式打开数据库

SQL> alter database open resetlogs;

 

8)验证

 

SQL> select * from scott.t1;

 

        ID

----------

         1

         2

         3

9)看看resetlogs后,日志sequence重置了(重置是指sequence又从一开始了)()。

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1          0   52428800          1 YES      UNUSED                       0

         2          1          0   52428800          1 YES      UNUSED                       0

         3          1          1   52428800          1 NO       CURRENT                1918000 2012-8-1 17

 

4.6.2 基于SCN的不完全恢复

 

在手工基于scn的不完全恢复的命令子句是change关键字,与基于时间的不完全恢复类似,其命令格式只要将recover命令换成下面即可:

 

SQL> recover database until change 1918000; 

 

这里不多赘述了。                                                                                  

 

 

4.6.3 基于cancel的不完全恢复

 

范例2:在做完全恢复时,丢失了部分归档日志

 

1)模拟环境

 

SQL> select * from t1;

 

        ID

----------

         1

         2

         3

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1          0   52428800          1 YES      UNUSED                       0

         2          1          0   52428800          1 YES      UNUSED                       0

         3          1          1   52428800          1 NO       CURRENT                1918000 2012-8-1 17

 

SQL> insert into t1 values (111);

SQL> commit;

 

SQL> alter system switch logfile;

SQL> /

SQL> /

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1          2   52428800          1 YES      INACTIVE               1918829 2012-8-1 17

         2          1          3   52428800          1 YES      ACTIVE                 1918831 2012-8-1 17

         3          1          4   52428800          1 NO       CURRENT                1918838 2012-8-1 17

 

SQL> insert into t1 values (444);

SQL> commit;

 

SQL> alter system switch logfile;

SQL> /

SQL> /

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------

         1          1          5   52428800          1 YES      INACTIVE               1918829 2012-8-1 17

         2          1          6   52428800          1 YES      ACTIVE                 1918831 2012-8-1 17

         3          1          7   52428800          1 NO       CURRENT                1918838 2012-8-1 17

 

 

SQL> insert into t1 values (777);

SQL> commit;

SQL> select * from t1;

 

        ID

----------

         1

         2

         3         

       111          //这个动作的日志条目记录在sequence 1里

       444          //这个动作的日志条目记录在sequence 4里

       777          //这个动作的日志条目记录在sequence 7里

 

2)模拟数据文件介质损坏,并需要恢复的归档日志有断点

 

SQL> shutdown abort

 

[oracle@timran ~]$ cd /u01/oradata/timran11g

[oracle@timran ~]$ rm user01.dbf        假设users 表空间的datafile损坏

 

3)再模拟某归档日志损坏

 

[oracle@timran ~]$ cd /u01/disk1/timran

[oracle@timran ~]$ ll

总计 359672

 

-rw-r----- 1 oracle oinstall     1024 08-01 16:52 arch_1_782662700_139.log

-rw-r----- 1 oracle oinstall 46894080 08-01 17:07 arch_1_782662700_140.log

-rw-r----- 1 oracle oinstall   608768 08-01 17:48 arch_1_790191207_1.log

-rw-r----- 1 oracle oinstall     1024 08-01 17:48 arch_1_790191207_2.log

-rw-r----- 1 oracle oinstall     6144 08-01 17:48 arch_1_790191207_3.log

-rw-r----- 1 oracle oinstall    49664 08-01 17:49 arch_1_790191207_4.log

-rw-r----- 1 oracle oinstall     1024 08-01 17:49 arch_1_790191207_5.log

-rw-r----- 1 oracle oinstall    11264 08-01 17:49 arch_1_790191207_6.log

-rw-r----- 1 oracle oinstall     1536 08-01 17:49 arch_1_790191207_7.log

 

[oracle@timran ~]$ mv arch_1_790191207_4.log arch_1_790191207_4.delete 

 

[oracle@timran ~]$ ll

-rw-r----- 1 oracle oinstall     1024 08-01 16:52 arch_1_782662700_139.log

-rw-r----- 1 oracle oinstall 46894080 08-01 17:07 arch_1_782662700_140.log

-rw-r----- 1 oracle oinstall   608768 08-01 17:48 arch_1_790191207_1.log

-rw-r----- 1 oracle oinstall     1024 08-01 17:48 arch_1_790191207_2.log

-rw-r----- 1 oracle oinstall     6144 08-01 17:48 arch_1_790191207_3.log

-rw-r----- 1 oracle oinstall    49664 08-01 17:49 arch_1_790191207_4.delete //日志不连续了,假设在sequence 4断掉了

-rw-r----- 1 oracle oinstall     1024 08-01 17:49 arch_1_790191207_5.log

-rw-r----- 1 oracle oinstall    11264 08-01 17:49 arch_1_790191207_6.log

-rw-r----- 1 oracle oinstall     1536 08-01 17:49 arch_1_790191207_7.log

 

4)尝试对某数据文件的完全恢复

 

SQL> startup

 

ORACLE instance started.

 

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              75499112 bytes

Database Buffers          201326592 bytes

Redo Buffers                7168000 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 4 - see DBWR trace file

ORA-01110: data file 4: '/u01/oradata/timran11g/users01.dbf'

 

SQL> select file#,error from v$recover_file;                                                                                    

     FILE# ERROR

---------- -----------------------------------------------------------------

         4 FILE NOT FOUND

 

[oracle@timran ~]$cp /u01/back1/users01.dbf /u01/oradata/timran11g/users01.dbf //还原单个数据文件,企图基于datafile的完全恢复

 

06:09:07 SQL> recover datafile 4;

 

有如下报错:

......

......

ORA-00308: cannot open archived log '/u01/disk1/timran/arch_1_790191207_4.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

 

//完全恢复失败,因为缺少归档日志:(/u01/disk1/timran/arch_1_790191207_4.log),只能做基于cancel的不完全恢复。

 

5)使用备份还原所有的datafile

 

[oracle@timran ~]$ cd /u01/oradata/timran11g

[oracle@timran ~]$ rm *.dbf

[oracle@timran ~]$ cp /u01/back1/*.dbf ./

 

6)进行基于cancel的不完全恢复

 

SQL> recover database until cancel;

 

ORA-00279: change 1918785 generated at 08/01/2012 17:48:41 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_790191207_4.log

ORA-00280: change 1918785 for thread 1 is in sequence #4

 

17:56:15 Specify log: {<RET>=suggested | filename | AUTO | CANCEL} 

auto

ORA-00308: cannot open archived log '/u01/disk1/timran/arch_1_790191207_4.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

 

ORA-00308: cannot open archived log '/u01/disk1/timran/arch_1_790191207_4.log'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

 

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

 

17:56:21 SQL> recover database until cancel;

ORA-00279: change 1918785 generated at 08/01/2012 17:48:41 needed for thread 1

ORA-00289: suggestion : /u01/disk1/timran/arch_1_790191207_4.log

ORA-00280: change 1918785 for thread 1 is in sequence #4

 

17:56:23 Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

cancel

Media recovery cancelled.

 

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

 

7) resetlogs打开数据库

 

SQL> alter database open resetlogs;

 

8)验证

SQL> select * from scott.t1;

 

        ID

----------

         1

         2

         3

       111

 

 

4.6.4 基于backup controlfile (备份控制文件)的恢复(有一定复杂性)

 

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

 

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

 

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

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

第三种:resetlogs打开后,数据库开始一个新的化身,若还想恢复打开时间点之后的旧化身的数据,需要与之匹配的备份控制文件。

 

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

 

recover database using backup controlfile;  //符合条件时,实现完全恢复

 

recover database until [time|change] using backup controlfile;  //不完全恢复

 

然后会有如下选项:

 

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

 

AUTO:      是指自动的使用archivelog前滚恢复,但一般不包括current log的恢复;

filename: 输入当前文件的路径和文件名,是指current log的恢复

CANCEL:    退出。

 

考点:

1)在控制文件丢失后进行恢复将会将会出现停机时间,因此不能联机执行控制文件的恢复。

2)使用backup controlfile子句的恢复数据库之后,一律要使用alter database open resetlogs打开数据库。

 

范例1:

 

环境:当前控制文件损坏,数据文件损坏,有全备但之后增加了表空间,并备份了配套的控制文件。

 

模式:所有数据文件备份(老)------(新建表空间abcd)-----备份控制文件(次新)------日志文件(新)

 

分析:新建表空间数据文件损坏, 全备里没有该数据文件的备份及控制文件描述,当前控制文件又丢失,只能用备份的控制文件恢复。

 

1)环境:

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         4 USERS                          YES NO  YES

         6 EXAMPLE                        YES NO  YES

         8 TEST                           YES NO  YES

         2 UNDOTBS1                       YES NO  YES

         3 TEMP                           NO  NO  YES

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------

         1          1          7   52428800          1 NO  CURRENT                6676574 2013-01-17 13:55:19

         2          1          5   52428800          1 YES INACTIVE               6676549 2013-01-17 13:54:14

         3          1          6   52428800          1 YES INACTIVE               6676562 2013-01-17 13:54:48

 

SQL> create tablespace abcd datafile '/u01/oradata/timran11g/abcd01.dbf' size 5m;

SQL> create table scott.a1 (name char(10)) tablespace abcd;

SQL> insert into scott.a1 values('a');

SQL> commit;

SQL> select * from scott.a1;

 

NAME

----------

a

 

SQL> alter system switch logfile;

 

2)备份控制文件

 

19:17:55 SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak1';

 

3) 模拟abcd01.dbf损坏

 

[oracle@timran ~]$rm /u01/oradata/timran11g/abcd01.dbf          //数据库open状态,删除abcd01.dbf数据文件

 

SQL> alter system flush buffer_cache;                   //db buffer 清空

 

SQL> conn / as sysdba                           //换个session查看 a1表物理读失败

已连接。

SQL> select * from scott.a1;

select * from scott.a1

                    *

第 1 行出现错误:

ORA-00376: 此时无法读取文件 3

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/abcd01.dbf'

 

4)关闭数据库

 

SQL> shutdown abort;

 

5)恢复所有数据文件备份,准备做不完全恢复

[oracle@timran timran11g]$ cd /u01/oradata/timran11g

[oracle@timran timran11g]$ rm *.ctl

[oracle@timran timran11g]$ rm *.dbf

[oracle@timran timran11g]$ cp /u01/back1/*.dbf ./

[oracle@timran timran11g]$ cp con.bak1 control01.ctl

[oracle@timran timran11g]$ cp con.bak1 control02.ctl

[oracle@timran timran11g]$ cp con.bak1 control03.ctl

 

SQL> startup

ORACLE 例程已经启动。

 

Total System Global Area  422670336 bytes

Fixed Size                  1300352 bytes

Variable Size             331352192 bytes

Database Buffers           83886080 bytes

Redo Buffers                6131712 bytes

数据库装载完毕。

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

 

SQL> col name for a50;

SQL> select file#,checkpoint_change#,name from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# NAME

---------- ------------------ --------------------------------------------------

         1            6676574 /u01/oradata/timran11g/system01.dbf

         2            6676574 /u01/oradata/timran11g/sysaux01.dbf

         3            6676601 /u01/oradata/timran11g/abcd01.dbf

         4            6676574 /u01/oradata/timran11g/user01.dbf

         5            6676574 /u01/oradata/timran11g/example01.dbf

         6            6676574 /u01/oradata/timran11g/test01.dbf

         7            6676574 /u01/oradata/timran11g/undotbs01.dbf

 

SQL> select file#,checkpoint_change#  from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            6676343

         2            6676343

         3                  0

         4            6676343

         5            6676343

         6            6676343

         7            6676343

 

SQL>

 

可以看出:1)file3 在控制文件里记录是abcd01.dbf,而与之对应的数据文件3是不存在的,2)备份的数据备份的scn比控制文件scn的还老。

 

6)使用备份控制文件恢复

 

SQL> recover database using backup controlfile;

 

ORA-00283: 恢复会话因错误而取消

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/abcd01.dbf'

ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/abcd01.dbf'

 

//此错是因为老备份里没有abcd表空间,但只要控制文件里记录了abcd就好办,方法是建一个datafile的空文件,而其中内容可由日志文件recover(前滚)时填补出来。

 

SQL> alter database create datafile '/u01/oradata/timran11g/abcd01.dbf';  

 

---再次使用备份控制文件恢复

 

SQL> recover database using backup controlfile;

......

 

ORA-00308: 无法打开归档日志 '/u01/disk1/timran/arch_1_804846837_9.log'

ORA-27037: 无法获得文件状态

Linux Error: 2: No such file or directory

Additional information: 3

 

//archive日志前滚结束了,但当前日志里还有信息需要恢复

//注意: 对于这个例子来说,一定要看清提示:如果当前日志没有归档,则直接要输入filename 不能输入auto,否则open时会失败。

 

SQL> recover database using backup controlfile;             //再次做恢复

 

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

/u01/oradata/timran11g/redo03.log                   //把蛇头(当前日志)给它。

已应用的日志。

完成介质恢复。

 

7)resetlogs打开数据库

 

SQL> alter database open resetlogs;

 

8)验证

SQL> select * from scott.a1;

 

NAME

----------------------------------------

a

b

 

 

范例2:(属于第一种情况)

 

环境:当前控制文件损坏,新建表空间在备份控制文件之后。

 

模式:全备(老)-----备份控制文件(次新)-----新建表空间timran------日志文件(新)

 

分析:整个恢复过程中datafile结构有了变化,变化发生在备份控制文件之后,新增了表空间timran,控制文件备份里没有此表空间记录,但日志里有。

 

1)环境

SQL> drop tablespace abcd including contents and datafiles;

SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak2';

SQL> create tablespace timran datafile '/u01/oradata/timran11g/timran01.dbf' size 5m;

SQL> create table scott.r1 (id int) tablespace timran ;

SQL> insert into scott.r1 values(1);

SQL> commit;

 

SQL> select * from v$tablespace;

 

       TS# NAME                                               INC BIG FLA ENC

---------- -------------------------------------------------- --- --- --- ---

         0 SYSTEM                                             YES NO  YES

         1 SYSAUX                                             YES NO  YES

        14 TIMRAN                                             YES NO  YES

         4 USERS                                              YES NO  YES

         6 EXAMPLE                                            YES NO  YES

         8 TEST                                               YES NO  YES

         3 TEMP                                               NO  NO  YES

         2 UNDOTBS1                                           YES NO  YES

 

SQL> select * from scott.r1;

 

        ID

----------

         1

SQL>  select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------

         1          1          1   52428800          1 NO  CURRENT                6677119 2013-01-17 14:08:18

         2          1          0   52428800          1 YES UNUSED                       0

         3          1          0   52428800          1 YES UNUSED                       0

 

2)模拟新建数据文件损坏

 

[oracle@timran timran11g]rm timran01.dbf

 

SQL>alter system flush buffer_cache;

SQL>conn / as sysdba

SQL>select * from scott.r1;

第 1 行出现错误:

ORA-01116: 打开数据库文件 3 时出错

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/timran01.dbf'

ORA-27041: 无法打开文件

Linux Error: 2: No such file or directory

Additional information: 3

 

3) 关闭数据库

 

SQL>shutdown abort

 

4)还原所有数据文件,以老控制文件替换当前控制文件

 

[oracle@timran timran11g]$ cd /u01/oradata/timran11g

[oracle@timran timran11g]$ rm *.ctl

[oracle@timran timran11g]$ rm *.dbf

[oracle@timran timran11g]$ cp /u01/back1/*.dbf ./

[oracle@timran timran11g]$ cp con.bak2 control01.ctl

[oracle@timran timran11g]$ cp con.bak2 control02.ctl

[oracle@timran timran11g]$ cp con.bak2 control03.ctl

 

5)启动数据库

 

SQL> startup

ORACLE 例程已经启动。

......

数据库装载完毕。

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

 

SQL> select file#,checkpoint_change#,name from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# NAME

---------- ------------------ --------------------------------------------------

         1            6677122 /u01/oradata/timran11g/system01.dbf

         2            6677122 /u01/oradata/timran11g/sysaux01.dbf

         4            6677122 /u01/oradata/timran11g/user01.dbf

         5            6677122 /u01/oradata/timran11g/example01.dbf

         6            6677122 /u01/oradata/timran11g/test01.dbf

         7            6677122 /u01/oradata/timran11g/undotbs01.dbf

 

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            6676343

         2            6676343

         4            6676343

         5            6676343

         6            6676343

         7            6676343

 

6)使用备份控制文件恢复数据库

 

SQL> recover database using backup controlfile;

 

ORA-00279: 更改 6676343 (在 01/16/2013 14:11:39 生成) 对于线程 1 是必需的

ORA-00289: 建议: /u01/disk1/timran/arch_1_804846837_4.log

ORA-00280: 更改 6676343 (用于线程 1) 在序列 #4 中

 

 

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

auto

......

 

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

/u01/oradata/timran11g/redo01.log

......

ORA-00283: 恢复会话因错误而取消

ORA-01244: 未命名的数据文件由介质恢复添加至控制文件

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/timran01.dbf'

 

ORA-01112: 未启动介质恢复

 

SQL> select file#,checkpoint_change#,name from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# NAME

---------- ------------------ --------------------------------------------------

         1            6678002 /u01/oradata/timran11g/system01.dbf

         2            6678002 /u01/oradata/timran11g/sysaux01.dbf

         3            6677999 /u01/oracle/dbs/UNNAMED00003      //注意这个问题,老控制文件不知道之后的timran01.dbf

         4            6678002 /u01/oradata/timran11g/user01.dbf

         5            6678002 /u01/oradata/timran11g/example01.dbf

         6            6678002 /u01/oradata/timran11g/test01.dbf

         7            6678002 /u01/oradata/timran11g/undotbs01.dbf

 

SQL> select file#,checkpoint_change# from v$datafile_header;

 

     FILE# CHECKPOINT_CHANGE#

---------- ------------------

         1            6678002

         2            6678002

         3                  0

         4            6678002

         5            6678002

         6            6678002

         7            6678002

 

7)重命名数据文件

 

SQL> alter database create datafile '/u01/oracle/dbs/UNNAMED00003' as '/u01/oradata/timran11g/timran01.dbf';

 

//上面的命令一石二鸟,自动完成了两个动作1)加了一个数据文件timran01.dbf,2)重命名控制文件UNNAMED00003为timran01.dbf

 

SQL> select file#,checkpoint_change#,name from v$datafile;

 

     FILE# CHECKPOINT_CHANGE# NAME

---------- ------------------ --------------------------------------------------

         1            6678002 /u01/oradata/timran11g/system01.dbf

         2            6678002 /u01/oradata/timran11g/sysaux01.dbf

         3            6677999 /u01/oradata/timran11g/timran01.dbf

         4            6678002 /u01/oradata/timran11g/user01.dbf

         5            6678002 /u01/oradata/timran11g/example01.dbf

         6            6678002 /u01/oradata/timran11g/test01.dbf

         7            6678002 /u01/oradata/timran11g/undotbs01.dbf

 

SQL> recover database using backup controlfile;

ORA-00279: 更改 6677999 (在 01/17/2013 14:20:50 生成) 对于线程 1 是必需的

ORA-00289: 建议: /u01/disk1/timran/arch_1_804953298_1.log

ORA-00280: 更改 6677999 (用于线程 1) 在序列 #1 中

 

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

/u01/oradata/timran11g/redo01.log

已应用的日志。

完成介质恢复。

 

8)resetlogs打开数据库

 

SQL> alter database open resetlogs;

 

9)验证

 

SQL> select * from scott.r1;

 

        ID

----------

         1

         2

         3

 

范例3 恢复删除的表空间(属于第二种情况)

 

环境:用户使用正常操作命令删除了表空间及其数据文件,但之后又希望恢复删除的表空间。全备里有这个表空间的数据文件。

 

模式:全备(老)------控制文件备份(次新)-----删除表空间------所需日志(新)

 

分析:当用户使用drop tablesapce xxx including contents and datafiles 这条DDL语句后,数据库的结构发生了变更,涉及了三个地方。

 

a)控制文件

b)该表空间下的数据文件

c)系统表空间(数据字典)(数据字典和DDL操作有关)

 

特别提醒的是:当前的控制文件里已经没有该表空间的信息了,所以不能使用当前的控制文件做恢复。恢复这个表空间要满足三个条件:

 

a)要有该表空间的数据文件备份

b)使用不完全恢复(基于时间点或scn)

c)使用备份的控制文件,而这个控制文件里含有该表空间的信息。

 

1)背景:

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         5 UNDOTBS2                       YES NO  YES

         4 USERS                          YES NO  YES

         6 EXAMPLE                        YES NO  YES

         8 TEST                           YES NO  YES

         3 TEMP                           NO  NO  YES

 

SQL> create table scott.t1(id int) tablespace test;

 

SQL> insert into scott.t1 values(1);

 

SQL> commit;

 

SQL> alter system switch logfile;

 

SQL> /

 

SQL> /

 

2)记录下当前scn

SQL> select current_scn from v$database;

 

CURRENT_SCN

-----------

    7222848

 

3)备份控制文件

SQL> alter database backup controlfile to '/u01/oradata/timran11g/con.bak'

 

4)删除表空间及数据文件

SQL> drop tablespace test including contents and datafiles;

 

SQL> shutdown abort

 

5)删除所有数据文件和当前控制文件,还原所有数据文件及备份的控制文件

[oracle@timran timran11g]$ rm *.dbf

[oracle@timran timran11g]$ rm *.ctl

[oracle@timran timran11g]$ cp /u01/back1/*.dbf ./

[oracle@timran timran11g]$ cp con.bak control01.ctl

[oracle@timran timran11g]$ cp con.bak control02.ctl

[oracle@timran timran11g]$ cp con.bak control03.ctl

 

6)启动数据库后,要做基于时间点(或SCN)的不完全恢复

 

SQL> startup

...

数据库装载完毕。

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选

 

SQL> recover database until change 7222848 using backup controlfile;

 

7)以不完全恢复方式打开数据库

SQL> alter database open resetlogs;

 

8)验证

SQL> select * from scott.t1;

 

        ID

----------

         1

 

 

范例4 (针对第三种情况)略

  

 

第五章:闪回 flashback

 

5.1 flashback 的功能:

利用flashback log 或 undo data 对database 可以恢复到过去某个点,可以作为不完恢复的补充

 

5.2 flashback分类:(DBA-II PPT:253)

 

   1)flashback drop

   2)flashback query (新添flashback database archive)

   3) flashback table

   4)flashback version query

   5)flashback transaction

   6)flashback database

 

 

5.2.1闪回drop 又名闪回删除

 

1)每个用户都有一个回收站,drop table时(非purge),实际上把table改名后放入了recyclebin(回收站)。

 

SQL> show parameter recyclebin

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      ON

 

//如果参数设为off 就取消了用户的回收站,那么当你drop table就相当于purge了。

 

SQL> conn scott/scott;

SQL> select * from tab;                                                                                             

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

TEST                           TABLE

T01                            TABLE

T02                            TABLE

 

SQL> drop table t01;                                                                                               

SQL> show recycle;                                                                                                             

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

T01              BIN$qrJLbL74ZgvgQKjA8Agb/A==$0 TABLE        2011-08-17:06:52:38

 

2)

 

假设如果回收站里有两个t01表,注意闪回和清除缺省含义            create table a (name char(10));   insert into a values('timran');   drop table a; 

看以下两条语句:

 

SQL> flashback table t01 to before drop;    //闪回的是最新的那个t01的表(考点)。

SQL> purge table t01;               //清除的是最老的那个t01表(考点)。

 

避免混淆 可以直接点出回收站里的表名

 

SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop

SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0"

 

SQL> purge recyclebin;              //清空回收站                                                                                 

SQL> show recycle;                                                                                                  

 

3)如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名.

SQL> drop table test;                                                                                                         SQL> create table test as select * from emp;                                                                              

SQL> select * from tab;                                                                                                         

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

DEPT                           TABLE

EMP                            TABLE

BONUS                          TABLE

SALGRADE                       TABLE

BIN$qrJLbL76ZgvgQKjA8Agb/A==$0 TABLE

TEST                           TABLE

 

06:56:50 SQL> show recycle;                                                                                                             

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME

---------------- ------------------------------ ------------ -------------------

TEST             BIN$qrJLbL76ZgvgQKjA8Agb/A==$0 TABLE        2011-08-17:06:56:36

SQL> flashback table test to before drop;                                                                                       

flashback table test to before drop

*

ERROR at line 1:

ORA-38312: original name is used by an existing object

 

SQL> flashback table test to before drop rename to test_old;    

 

//闪回drop语句中使用了重命名

 

 

rename b to a;   //把b表重命名为a

 

                                                             

 

4)system 表空间的表没有闪回drop,drop table系统表空间的表会直接被删除(考点)

 

SQL> conn /as sysdba                                                                                                         

SQL> create table test as select * from user_tables;                                                                         

SQL> drop table test;                                                                                                         SQL> show recycle;                                                                                                           

 

5)如果一个表上面有索引和约束,drop后再闪回表,索引和约束还在吗?

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

 

SQL> create table t (id int,name char(10));

SQL> alter table t add constraint pk_t primary key(id);

SQL> insert into t values (1,'sohu');

SQL> insert into t values (2,'sina');

SQL> commit;

SQL> select * from t;

 

        ID NAME

---------- ----------

         1 sohu

         2 sina

 

-----看一眼约束和索引

 

SQL> select * from user_indexes;

SQL> select * from user_constraints;

 

SQL> drop table t;

 

SQL> select * from tab;

 

TNAME                          TABTYPE  CLUSTERID

------------------------------ ------- ----------

BIN$yF3hbvIcioTgQAB/AQAJlg==$0 TABLE

BONUS                          TABLE

DEPT                           TABLE

EMP                            TABLE

SALGRADE                       TABLE

 

-----表被drop到回收站,再看一眼约束和索引

 

SQL> select * from user_indexes;        //索引不见了

SQL> select * from user_constraints;        //约束有,但乱码

 

SQL> flashback table t to before drop;

 

闪回完成。

 

SQL> select * from t;

 

        ID NAME

---------- ----------

         1 sohu

         2 sina

 

SQL>

-----再看约束和索引

 

SQL> select * from user_indexes;        //索引回来了,但乱码

SQL> select * from user_constraints;        //约束也在,但乱码

 

-----分别重命名索引和约束

 

SQL> alter index "BIN$yF3hbvIbioTgQAB/AQAJlg==$0" rename to pk_t;

 

SQL> alter table t rename constraint "BIN$yF3hbvIaioTgQAB/AQAJlg==$0" to pk_t;

 

-----再看约束和索引

ok!

 

 

5.2.2 闪回查询 flashback query:(用于DML 误操作)

 

1) 要点:

 

利用在undo tablespace 里已经被提交的undo block(未被覆盖),可以通过查询的方式将表里面的记录回到过去某个时间点。

通过设置undo_retention参数设置前镜像的保留时间。

查询的语法:

 

select   …    as of scn | timestamp

 

2)例:

sys:

create table scott.student (sno int,sname char(10),sage int);

insert into scott.student values(1,'Tom',21);

insert into scott.student values(2,'Kite',22);

insert into scott.student values(3,'Bob',23);

insert into scott.student values(4,'Mike',24);

commit;

/

 

SQL> select * from scott.student;

 

       SNO SNAME            SAGE

---------- ---------- ----------

         1 Tom                21

         2 Kite               22

         3 Bob                23

         4 Mike               24

 

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;    //取时间1

select current_scn from v$database;  //取scn 1

 

delete scott.student where sno=1;

commit;

select * from scott.student;

 

       SNO SNAME            SAGE

---------- ---------- ----------

         2 Kite               22

         3 Bob                23

         4 Mike               24

 

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;    //取时间2

select current_scn from v$database;   //取scn 2

 

update scott.student set sage=50;

commit;

select * from scott.student;

 

       SNO SNAME            SAGE

---------- ---------- ----------

         2 Kite               50

         3 Bob                50

         4 Mike               50

 

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;    //取时间3

select current_scn from v$database;取scn 3

 

scott:

select * from student as of timestamp to_date('取时间2','yyyy-mm-dd hh24:mi:ss');

select * from student as of scn 取scn1;

 

create table student2 as select * from scott.student as of scn 取scn1;

drop table student;

rename student2 to student;

select * from student;

 

*考点:可以查询以前某个时间点的数据库,但是永远不能对过去时间点得数据库做DML操作。

 

5.2.3 闪回表  flashback table

 

1)要点:

闪回表是把表里的数据 回退 到以前的某个时刻或者SCN上。自动恢复相关的属性,包括索引、触发器等。前提是对表启用行移动。

 

语法:    

flashback table <table_name> to timestamp | scn

    

2)例:  

delete student;

commit;

alter table student enable row movement;

flashback table student to scn XXXXX

 

把表的时间一下子闪回到所指的scn。

 

 

 

注意:sys的表不能闪回。

 

3)闪回归档查询补充11g新特性FLASHBACK ARCHIEVE

 

3.1)概念:

无限期的存储表行的前镜像,通过后台进程FBDA,捕捉必要的数据并将其保存在归档上,然后可以使用常规闪回查询命令查询需要的数据,但闪回可以回朔到多年以前。

 

闪回归档要求创建一个或多个表空间,然后为每个归档指定保留期并指定归档保护的表和一个可选的配额,指定原有的表空间技术上是可行的,但是oracle建议它们与常规的数据分开更好。

 

3.2)一道考题的问题:有两个版本的答案,我们来实验一下:

 

题目:

Note the output of the following query;

SQL> SELECT flashback_archieve_name, status FROM dba_flashback_archieve;

 

FLASHBACK_ARCHIEVE_NAME STATUS

FLA1

 

You executed the following command to enable Flashback Data Archive on the

EXCHANGB_PATE table:

ALTER TABLE exchange_rate FLASHBACK ARCHIEVE;

 

What is the outcome of this command?

A.The table uses the default Flashback Data Archive.

B.The Flashback Data Archive Is created In the SYSAUX tablespace.

C.The Flashback Data Archive is created in the same tablespace where the tables are stored.

D.The command generates an error because no flashback Data Archive name is specified and there is no default Flashback Data Achieve.

答案:a或d都有

 

分析:

 

首先需要建一个表空间,然后当建立flashback archive 在这个表空间上时 你可以带上关键字default, 这样status状态就会显示出default, 

 

(这个题却没有显示出default,说明前面flashback archive的时候没有加default关键字)然后,你指定表使用这个表空间时不用做任何说明就可以了,所以这个答案应该是d

 

下面是我做的测试, 看看default有与没有的差异:

 

SQL> create tablespace fda_tbs1 datafile '/u01/oradata/timran11g/fda_tbs01.dbf' size 5m;

 

SQL> CREATE FLASHBACK ARCHIVE default fda1 TABLESPACE fda_tbs1 QUOTA 10M RETENTION 1 YEAR;

闪回档案已创建。

SQL> SELECT flashback_archive_name, status FROM dba_flashback_archive;

 

FLASHBACK_ARCHIVE_NAME-----------------------------------STATUS-------

FDA1                                                     DEFAULT

 

SQL> alter table scott.emp flashback archive;

表已更改。

 

SQL> drop flashback archive fda1;

闪回档案已删除。

 

SQL> CREATE FLASHBACK ARCHIVE fda1 TABLESPACE fda_tbs1 QUOTA 10M RETENTION 1 YEAR;

闪回档案已创建。

 

SQL> SELECT flashback_archive_name, status FROM dba_flashback_archive;

 

FLASHBACK_ARCHIVE_NAME-----------------------------------STATUS-------

FDA1

 

SQL> alter table scott.emp flashback archive;

alter table emp flashback archive

*

第 1 行出现错误:

ORA-55608: 默认的闪回归档不存在

 

考点:设置闪回数据归档有两个先决条件:1)使能automatic undo managent(设置undo自动管理)   2)tablespace要ASSM()的。

 

5.2.4 闪回版本查询

 

1)要点:

闪回查询仅仅能够得到过去某个时间点上的数据,但是无法反映出一段时间内数据表中数据变化的细节,

10g的闪回版本查询可以对时间段内数据表的不同版本进行查询。

   

语法:

     

select   …  from  …   versions  between

    

其中,select后面可以选择伪列,来获得事务的开始、结束时间、SCN号、ID号等。

2)例:

create table t3 (id int, name char(10));

insert into t3 values(1,'tim');

insert into t3 values(2,'mike');

insert into t3 values(3,'brain');

insert into t3 values(4,'cade');

commit;

 

select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual; 

 

update t3 set name='nelson' where id=4;

commit;

delete t3 where id=2;

commit;

update t3 set id=id+100;

commit;

 

看看t3表经历的时间变化

 

SQL>select versions_starttime, versions_endtime, versions_xid, versions_operation,id,name from t3 versions

between timestamp minvalue and maxvalue;

 

SQL>select versions_xid, versions_operation,id, name from t3 versions between timestamp minvalue and maxvalue;

 

VERSIONS_XID     VERSIONS_OPERATION                                      ID NAME

---------------- ------------------ --------------------------------------- ----------

03000800F3010000 U                                                      104 nelson

03000800F3010000 U                                                      103 brain

03000800F3010000 U                                                      101 tim

04000A0076010000 D                                                        2 mike

08002000F9010000 U                                                        4 nelson

                                                                          1 tim

                                                                          2 mike

                                                                          3 brain

                                                                          4 cade

 

*考点:闪回版本查询不能用于外部表、临时表或V$视图。原因是这些对象都不生成撤销数据。(临时表的撤销是基于session的)。

 

5.2.5闪回事务查询

 

1)要点:

闪回事务查询可以提供 撤销查询 语句。从flashback_transaction_query 这个视图里查询引起数据变化的事务,和撤销事务的SQL语句

也就是查询operation 和 undo_sql列。

可以和闪回版本查询结合起来使用。

 

SQL>desc flashback_transaction_query;

 

SQL>select undo_sql from flashback_transaction_query where xid=hextoraw('事务号');

 

接上例:

 

SQL> select undo_sql from flashback_transaction_query where xid=hextoraw('03000800F3010000');   //产生逆操作

 

UNDO_SQL

--------------------------------------------------------------------------------

update "SYS"."T3" set "ID" = '4' where ROWID = 'AAANByAABAAAO/yAAD';

update "SYS"."T3" set "ID" = '3' where ROWID = 'AAANByAABAAAO/yAAC';

update "SYS"."T3" set "ID" = '1' where ROWID = 'AAANByAABAAAO/yAAA';

 

//执行上面语句,原操作(update t3 set id=id+100;)就撤销了     //做了个逆操作,还原以前的状态。

 

SQL> update "SYS"."T3" set "ID" = '4' where ROWID = 'AAANByAABAAAO/yAAD';

SQL> update "SYS"."T3" set "ID" = '3' where ROWID = 'AAANByAABAAAO/yAAC';

SQL> update "SYS"."T3" set "ID" = '1' where ROWID = 'AAANByAABAAAO/yAAA';

SQL> commit;

 

 

5.2.6 闪回数据库

 

1)概念:

闪回数据库相当于不完全恢复,它通过闪回日志(或归档日志)将数据库整体回退到某个时间点。

 

闪回数据库针对的是逻辑错误 (比如删除一个用户,删除一个表),如果数据库发生了物理损坏或介质丢失,闪回数据库将无能为力,闪回数据库不能代替传统完全恢复(考点)

也不能代替传统的不完全恢复。

 

使用闪回数据库,需要开启闪回日志,闪回日志存放在闪回恢复区里。

 

 

一旦启用了闪回数据库,某些块的影像会从db buffer 复制到 SGA的一个新的存储区域中,即闪回缓冲区,然后再由后台进程(Recover Write RVWR)(闪回快照)

将此闪回恢复区的内容刷新到磁盘和闪回日志。这一切并没有改变LGWR的常规作用。与重做日志不同的是 RVWR不是记录数据库变化的日志,而是记录完整块影像的记录。(PPT-311)

 

*考点:不同于重做日志,不能多路复用和归档闪回日志。它们是自动创建和管理的。

 

2)闪回日志放在闪回恢复区里

 

闪回恢复区(flashback recovery area)是一个非常重要的概念, 它不仅存放闪回日志,更是跟所有恢复有关的文件(归档日志),比如RMAN的默认位置。

rman对这个区域有部分自动管理的功能。

 

SQL> show parameter recovery_file

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_recovery_file_dest                string      /u01/flash_recovery_area

db_recovery_file_dest_size           big integer 2G

 

*考点:设置db_recovery_file_dest之前必须先设置db_recovery_file_dest_size

 

3)配置闪回数据库的基本步骤:

 

3.1) 配置成归档方式

 

闪回数据库必须配备成归档方式,是因为闪回日志里只记录了快照,这些快照可以使数据库回退到某个SCN点,而回退快照的SCN仅比你指定的SCN提前一点,

然后会运用归档日志或当前日志前滚一小段, 当到达指定的san之前时停住 。然后在此SCN前resetlogs打开数据库。    

 

3.2) 配置闪回恢复区

show parameter db_recovery_file_dest

 

3.3) 配置闪回保留时间

show parameter db_flashback_retention_target    (retention 保留期)

注意单位是分钟,缺省1440 相当于24小时

 

3.4)启用数据库闪回要在mount状态

alter database flashback on;

alter database open;

 

4) 例: 恢复被删除的模式。首先配置相关参数,mount下开启闪回数据库日志,然后打开数据库

 

archive log list 查看日志模式

show parameter recover 查看恢复文件(闪回恢复区)

在mount状态下

alter database flashback on;(打开闪回数据库日志)

打开数据库

 

 

 

4.1)取当前SCN

SQL> select current_scn from v$database;

 

CURRENT_SCN

-----------

    7248690

 

4.2)删除scott用户

SQL> drop user scott cascade;

 

4.3)准备到mount下去闪回数据库

SQL> shutdown immediate;

SQL> startup mount

 

SQL> flashback database to scn  7248690;

 

4.4)只读方式打开,确认scott已经被闪回

SQL> alter database open read only;   (不能贸然打开数据库,要在只读状态下打开,这时scn是不变的,数据库是只读的)

 

SQL> select * from scott.emp;

 

4.5)重新以resetlogs 方式打开数据库(属于不完全恢复)

SQL> shutdown immediate;

SQL> startup

ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

 

SQL> alter database open resetlogs;

 

提醒:要在mount下闪回数据库

 

flashback database to timestamp to_char('2012-03-02 19:11:11','yyyy-mm-dd hh24:mi:ss');

flashback database to scn 1264788;

 

闪回后,打开数据库,第一次最好用只读方式, 看看是否恢复到你希望的那个时间点上去了,如果不是你希望的,还可以从新闪回(前闪后闪都可以,因为只读方式scn是不会增长的)。

 

alter database open read only;

startup force;

alter database open resetlogs;           //一旦resetlogs打开,若想再一次做闪回,只能闪回比当前更早的scn(见ppt-315page)。

 

 

5)那些操作适合或不适合闪回数据库

 

适合:

 

找回drop user

在某个用户操作影响到整个数据库时

错误的truncate表

 

不适合:

 

使用了备份的控制文件或trace文件

drop表空间的操作

段重组后的表

 

6)关于闪回日志的信息有两个视图:

 

v$flashback_database_log;和v$flashback_database_stat;

 

相比来看,v$flashback_database_log信息对于flash database更有帮助。

 

desc v$flashback_database_log;

 

OLDEST_FLASHBACK_SCN                        保留的最低系统改变号

LDEST_FLASHBACK_TIME                            最低系统改变号的时间

RETENTION_TARGET                               闪回日志保留时间(单位:时间)

FLASHBACK_SIZE                                 当前闪回日志的大小(单位:字节)

ESTIMATED_FLASHBACK_SIZE                       预估满足保留时间所需要的空间大小(单位:字节)

 

 

*考点:闪回数据库要求 归档日志模式,并使用alter database open resetlogs来创建数据库的一个化身 (incarnation)。

第六章:RMAN(recover management 恢复管理器)概述

 

6.1 rman的定义和功能:

        1) Recovery Manager

        2) 通过oracle 提供的包,建立备份和恢复的server process,在oracle server 上做备份和恢复 (rman是一个工具,真正干活的是server process)

        3)rman 备份 database、tablespace、datafile、controlfile、spfile、archivelog

        4)支持归档和非归档

        5)在归档模式下支持一致性备份(冷备)和非一致性备份(热备)

        6)非归档只支持一致性备份(冷备)

 

    *考点:

    1)非归档方式的RMAN只能冷备,并在mount下做,但手工备份在mount下cp出来的备份是不能用的(手工冷备份必须在数据库关闭时进行,不能在mount下备份)。

    2)非归档方式的RMAN恢复只能还原最后一次备份。

    

6.2 rman的优点:

    1)不备份数据文件中unallocate block(未分配的块)(备份segment高水位线以下的block),节省空间(考点)

       2)备份时自动检查数据文件是否有坏块,并可以标记坏块,跳过坏块,因为RMAN是ORACLE BLOCK级备份技术

       3) 可以实现增量备份 (上次备份的就不备了,从上次之后的开始备份)

       4)备份和恢复都是用rman的命令来完成

 

6.3 rman的架构:

    1)可连接三类数据库:target database:需要备份的目标库 ,axuiliary database 复制数据库(辅助库), catalog database目录数据库。

        2)存储设备:disk 、tape (sbt 磁带机)存放备份文件的设备   

        3)channel :目标库和存储设备之间备份通道(服务进程)默认最少启动一个channel,可同时启动多个channel ,并发操作。

        4)server process:用于备份和恢复

        5)rman的元数据:记录备份的信息(一般放在目标库的controlfile 里)  //元数据 metadata 管理数据的数据

        6)catalog database :集中管理、存放备份的元数据,还可以存储备份脚本

        7)MML:media manage layer 介质管理层:用于管理磁带机的库文件或驱动  (磁带库的驱动)

 

6.4 rman 连接目标库方法

 

1)本地连接

 

RMAN工具和target database在同一台服务器

 

[oracle@timran ~]$ rman target /    //斜杠是省略了用户名和密码

 

2)远程连接

 

RMAN客户端通过ORACLE_NET连接target database 在target database 启动监听,在client配置tnsnames.ora。

 

C:\Documents and Settings\timran>rman target sys/system@timran11g

 

6.5、查看rman的默认配置,修改rman的配置信息

 

1)查看rman的默认配置

   

RMAN> show all;

 

db_unique_name 为 TIMRAN11G 的数据库的 RMAN 配置参数为:

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default    //冗余策略 (redundancy 冗余  configure安装  retention保留)

CONFIGURE BACKUP OPTIMIZATION OFF; # default            //优化  (optimization 最优化) 对没有变化的就不进行备份;

CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default

CONFIGURE CONTROLFILE AUTOBACKUP ON; # default

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/U01/MYRMAN/%F'; # default

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default

CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default

CONFIGURE MAXSETSIZE TO UNLIMITED; # default

CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default

CONFIGURE COMPRESSION ALGORITHM 'BZIP2'; # default 

CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/oracle/dbs/snapcf_timran11g.f'; # default

 

2)解释以上各行参数

 

第一行:CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default

 

备份策略保持 分为两个保持策略:两者只能选一,互斥。(见ppt47)

一个是时间策略,指定一个 时间窗口 ,必须能恢复此时间段内任一个时刻的数据。

一个冗余策略,规定至少有几个冗余的备份。

 

恢复窗口备份保存策略:

例如,假如我们指定恢复窗口是 7 天,假设今天是星期一,此前存在 3 个全备及归档日志。第一个全备是5天前生成的,第二个全备是十天前生成的,而最早一个全备是15天前备份的,

那么十天前生成的备份及之后的归档日志必须保留,而15天前的那个备份会成为废弃备份(obsolete)(见PPT-48)。

 

下面的命令将恢复窗口配置为7 天:

RMAN> configure retention policy to recovery window of 7 days;

 

冗余备份保存策略:

使用这种保存策略,RMAN 会从最新备份开始保留 N 个数据备份,其余的废弃(obsolete)。

例如,如果有三个备份,而冗余数是 2,那么最早的那个备份将被废弃。下面的命令将备份策略设置为 2:

RMAN> configure retention policy to redundancy 2;

 

设置NONE 可以把使备份保持策略失效,Clear 将恢复默认的保持策略

RMAN> configure retention policy to none; //RMAN此后不会将任何备份集或备份镜向标记为obsolete状态。

RMAN> configure retention policy clear;

例:保证至少有一个备份能恢复到 Sysdate-5 的时间点上,之前的备份将标记为Obsolete

RMAN> configure retention policy to recovery window of 5 days;

至少需要有三个冗余的备份存在,如果多余三个备份以上的备份将标记为冗余

RMAN> configure retention policy to redundancy 3;

 

 

第二行:CONFIGURE BACKUP OPTIMIZATION OFF; # default

 

设置备份优化选项 ( optimization ) 可以在配置中设置备份的优化,如:

RMAN> configure backup optimization on;

如果优化设置打开, 它只使用于归档日志,只读或脱机表空间的数据文件,因为这些文件是不会变化的,备份集运行一个优化算法。

 

跳过重复的备份文件,比如你要备份归档日志,此参数设为on可以避免重复备份,可大大节省空间和时间。 (ppt103)

 

 

考点:备份优化选项依赖于RETENTION POLICY策略,如果启用优化,在已有足够相同文件副本的情况下,RMAN将不创建额外的文件副本。

 

 

第三行:CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default       

 

设备类型有两种,可以是磁盘(DISK),或者磁带(STB),默认为磁盘。

 

第四行:CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default   //如果备份了系统表空间(system01.dbf)了,不论这个参数是on还是off,控制文件都会备份

 

设置控制文件自动备份 (autobackup on)    //在on状态下,备份任何文件时都会备份控制文件;在增加表空间和删除表空间时也会备份控制文件。

                                                                                   

RMAN> CONFIGURE CONTROLFILE AUTOBACKUP on;          

new RMAN configuration parameters:

CONFIGURE CONTROLFILE AUTOBACKUP ON;

new RMAN configuration parameters are successfully stored

     

      off: 默认情况下,在备份system 表空间时,会备份控制文件和spfile

      on:  在做任何文件的备份时,会自动备份控制文件和spfile,并且数据库的物理结构发生变化时,也自动备份controlfile。

     

第五行:CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default       //device(设备地址)

 

可以用如下的配置指定控制文件的备份路径与格式,format 指明备份文件的路径和文件名

RMAN备份文件格式 备份文件可以自定义各种各样的格式,如下:

 

%c 备份片的拷贝数

%D 位于该月中的第几天 (DD)

%M 位于该年中的第几月 (MM)

%F 一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,

%d 数据库名称其中IIIIIIIIII 为该数据库的DBID,YYYYMMDD 为日期,QQ 是一个1-256 的序列

%n 数据库名称,向右填补到最大八个字符

%u 一个八个字符的名称代表备份集与创建时间

%p 该备份集中的备份片号,从1 开始到创建的文件数

%U 一个唯一的文件名,代表%u_%p_%c

%s 备份集的号

%t 备份集时间戳

%T 年月日格式(YYYYMMDD)

 

第六行:CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default    //并行度,缺省为1,及一个通道

 

指定在以后的备份与恢复操作中并行度为2,即同时开启2个通道进行备份与恢复(ppt100)

 

并行的数目决定了开启通道的个数,当然也可以在RUN中指定通道来决定备份与恢复的并行程度。如果在RUN中指定了通道配置,将采用RUN指定的通道数(考点),

如果没有指定通道,就采用默认并行度。

 

run {

allocate channel c1 device type disk;

allocate channel c2 device type disk;

backup database plus archivedlog delete input;

 

 

 

}

 

需要注意的一点是,在BACKUP命令中有一个 FILES PER SET(每个备份集中有几个文件) 参数, 该参数是指RMAN建立的每个备份片中所能包含的文件的最大数,该参数默认值为64,

如果在执行BACKUP命令时没有指定该参数值,那么RMAN会仅 使用第一个通道来执行备份,其他通道将处于空闲状态。关于通道数与FILESPERSET值之间也有一个大小关系,

逻辑稍显复杂,总之一条,FILESPERSET值不要小于你设定的通道数。

 

第七行:CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default        //

第八行:CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default          //

 

备份也可以有镜像,这两个参数都是设置备份冗余度(一个是数据文件的,一个是归档日志的),如为2就备份相同的2份(ppt101),注意:TO STB和TO DISK相互不受影响(ppt-102)

 

第九行:CONFIGURE MAXSETSIZE TO UNLIMITED; # default

 

该配置限制通道上备份集的最大尺寸,单位支持 Bytes 、KB、MB、GB,默认值是unlimited,

 

第十行:  CONFIGURE ENCRYPTION FOR DATABASE OFF; # default

第十一行:CONFIGURE ENCRYPTION ALGORITHM ','; # default

 

加密,Transparent(透明的) encryption 透明的加密带钱夹,Password encryption:不带钱夹,ppt-107

 

第十二行:CONFIGURE COMPRESSION ALGORITHM 'BZIP2'; # default

 

压缩,这是11g新增的参数 ppt(104-106), 注意rman本来就不备份Unallocated block(HWM以上),COMPRESSION指的是压缩Unused block(压缩高水位线以下的块)

 

第十三行:CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default

 

对于归档文件,一般来说,如果你仅是单实例的话(不是Data Guard环境),archive file备份完之后就没有什么用处了,可以删除,

 

但很多人不习惯在这里设置参数,更愿意使用 脚本 删除归档文件。(见最后一章Oracle 一周备份计划)

 

第十四行:CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/oracle/dbs/snapcf_timran11g.f'; # default

 

rman 备份控制文件和同步catalog的时候,需要建立一个controlfile的快照,这个参数指定快照存放位置。

 

第十五行:这行就没有列出,实际上也挺重要,所谓自动分配通道

 

RMAN> CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/myrman/%U';

为什么没有出现,这是因为很多人更愿意在运行块里手工的指定来指定

run{

allocate channel c1 type disk format='/u01/myrman/%U'

...}

 

如果两处都指定,run{}方式优先于configure channel配置方式。(考点)

 

6.6 rman备份的分类:

 

1)backupset:不备份datafile里unallocate的块(HWM以上)、可以实现增量备份(可以备份到disk和tape)。

 

如果只启用一个channel,默认会把所有备份的datafile放入到一个backupset里,并且生成一个备份片(backup piece,在OS下看到)  

    

2)copy(镜像):实际上和手工cp 是类似的,备份datafile 所有的数据块,不能实现增量备份(但可以作为增量备份的0级备份),只能备份到disk(磁盘) ,

 

不能备份到tape(磁带),恢复时速度快。   直接作用于recover,不用进过restore;  

 

6.7 rman的命令格式:

 

1)交互式 (也叫stand alone方式)

RMAN> shutdown immediate;                                                                                                     

RMAN> startup force mount; 

RMAN> alter database open;    

RMAN> sql 'alter system switch logfile'; 

 

 

RMAN> sql 'select * from scott.emp';     //对select 不显示结果

 

2)批处理方式(也叫job方式)

 

RMAN>run {

shutdown immediate;

startup mount;

allocate channel c1 type disk;

allocate channel c2 type disk;

backup database format '/u01/myrman/%d_%s.bak';

alter database open;

}

 

3)基于EM方式(WEB方式)

 

 

第七章:rman(备份)

7.1 rman备份分类:

 

    1)归档:可以做一致性和非一致性备份

    2)非归档:一致性备份

 

7.2 rman归档方式备份常用语法:

 

7.2.1 backupset 备份集

 

1)备份全库:

  RMAN> backup database format='/u01/myrman/timran_%s.bak' filesperset 3;    //

  RMAN> backup database plus archivelog delete input;  //备份全库及控制文件、参数文件与所有归档日志,并删除旧的归档日志

 

2)备份表空间:   

  RMAN> backup tablespace users format '/u01/myrman/users_%s.bak' tag=userbak;

  RMAN> backup tablespace system plus archivelog delete input;  //备份指定表空间及归档日志,并删除旧的归档日志

 

3)备份数据文件

  RMAN> backup datafile 3,5 format '/u01/myrman/%d_%s.bak';  //备份数据文件,可以多个,以“,”分开。

  RMAN> backup archivelog all delete input;

 

4)手动备份控制文件:

  RMAN> backup current controlfile;

 

5)手动备份参数文件

  RMAN> backup spfile;

 

RMAN> list backup;      //列出backup set

 

*考点:RMAN从不备份 联机重做日志文件、临时文件 等。它只备份数据文件,归档日志文件,控制文件和spfile参数文件。

 

7.2.2 image映像文件

   

1)RMAN> copy datafile 4 to '/u01/myrman/users_%s.bak';   

2)RMAN> backup as copy tablespace 'TEST' format='/u01/myrman/%d_test_%s.bak';      //都用backup语法。统一格式

 

RMAN> list datafilecopy all;    //列出映像集

 

*考点:RMAN可在不执行restore情况下直接使用镜像副本,而backupset在recover前必须先restore。

 

7.3 增量备份:

(见ppt-117)(10g PPT-108)

 

只备份发生变化的block(rman在备份时会记录datablock的scn,下次备份时通过比较前次备份数据块上的scn来确定该数据块是否发生变化)

 

     1)差异增量备份(Differential incremental backup):以上次以来 同级别或低级别 的备份作为基础备份   //

 

     2)累积增量备份(Cumulative incremental backup): 以上次以来 比自己级别低  的备份作为基础备份

 

提示:10g以后,增量备份只有0级和1级,原来的2级以上的级别保留兼容,单不推荐使用。   0级备份就是all相当于全备。

 

7.3.1 差异和累计综合运用的一周备份计划。

 

     Level 0                                     Level 0

    |                           |

    |-------------------------------------------------------|

    |   |   |   |   |   |<------|   |

    |<--------------------------------------|   |   |

    |   |   |   |<------|   |   |   |

    |<----------------------|   |   |   |   |

    |   |<------|   |   |   |   |   |

    |<------|   |   |   |   |   |   |

    |   |   |   |   |   |   |   |

 

    LVL 0       1       1       c1      1       c1      1       0

    DAY Sun    Mon     Tue      Wed     Thu     Fri    Sat     Sun 

 

*考点:

1)如果没有备份过0级备份,那么第一次1级备份(差异或累计)就当做0级备份。

2)非归档情况下的恢复就只有还原备份这一步,在RMAN下的方法是:

startup force mount;

restore database;

alter database open resetlogs;

 

如果有增量备份,在restore第二句后,加上recover database noredo;  这个命令有两个作用,1)定位所有级别为1的累计或差异增量备份并使用它们,2)不要应用日志。

 

7.4 块变更跟踪(block change tracking)

 

增量备份总是小于完整备份,但是备份时节省的时间并不像想象的那样少,原因是增量备份默认的是要扫描整个要备份的数据文件,以便确定哪些块需要提取,

 

这当然有一个好处就是可以顺便检查坏块,如果想要增量备份能快些,oracle还提供了一个机制,叫做块变更跟踪。

 

块变更跟踪在后台启动一个进程叫  CTWR  ,这个进程向变更跟踪文件中记录每个已更改的块的地址。如果启用了块跟踪,增量备份时就去检查块跟踪文件,

 

这样比遍历整个数据文件要快的多。

 

SQL> alter database enable block change tracking using file '/u01/oradata/timran11g/change_tracking.dbf';

 

SQL> alter database disable block change tracking;

 

考点:使能块变更跟踪,才可以对之后的0级增量备份有效。

 

7.5 数据恢复顾问DRA

DRA是一个诊断和恢复数据库的工具,通过两个途径操作,一个是RMAN界面,另一个是OEM,它依赖于自动诊断知识库(ADR)和Health Monitor

例:

 

1)先以RMAN备份一个表空间

 

RMAN>backup tablespace sysaux format '/u01/myrman/%d_%s.bak';

 

2)关闭数据库,将sysaux01.dbf 暂时换个名字。

SQL> shutdown abort

 

[oracle@timran timran11g]$ mv sysaux01.dbf sysaux01.bak

 

SQL> startup

 

ORA-01157: 无法标识/锁定数据文件 2 - 请参阅 DBWR 跟踪文件

ORA-01110: 数据文件 2: '/u01/oradata/timran11g/sysaux01.dbf'

 

3) 数据库在mount模式下连接rman, 看DRA给出的建议报告

[oracle@timran timran11g]$ rman target /

 

RMAN> list failure;

......

 

4)RMAN> advise failure;

......

策略: 修复操作包括无数据丢失的完全介质恢复

  修复脚本: /u01/diag/rdbms/timran11g/timran11g/hm/reco_3505864154.hm

 

5)RMAN> repair failure;

 

策略: 修复操作包括无数据丢失的完全介质恢复

修复脚本: /u01/diag/rdbms/timran11g/timran11g/hm/reco_1197260073.hm

 

修复脚本的内容:

   # restore and recover datafile

   restore datafile 2;

   recover datafile 2;

 

是否确实要执行以上修复 (输入 YES 或 NO)? y

执行修复脚本

 

启动 restore 于 2013-03-12 14: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-12 14:20:22

 

启动 recover 于 2013-03-12 14:20:22

使用通道 ORA_DISK_1

 

正在开始介质的恢复

介质恢复完成, 用时: 00:00:07

 

完成 recover 于 2013-03-12 14:20:29

修复故障已完成

 

是否要打开数据库 (输入 YES 或 NO)? y

数据库已打开

 

*考点:

1)先list failure,然后再advise failure.次序不能错,修复问题的顺序是list,advise,repair

2)所有模式下都可以使用DRA, nomount下修复控制文件,mount或open下修复数据文件。

3)DRA目前只能在单实例下运行,RAC不可以使用它。

 

 

第八章:rman 完全恢复

 

8.1 recover 恢复:

  

   1)归档 : 完全恢复和不完全恢复

   2)非归档:只能恢复到最后一次备份状态

 

8.2 完全恢复:

 

----先对数据库做一个冷备(如果是archived模式,热备也可以)               

 

RMAN> run {

allocate channel c1 type disk;

allocate channel c2 type disk;

backup database format '/u01/myrman/%d_%s.bak';

}

 

RMAN> list backup;

 

备份集列表

===================

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

22      Full    635.16M    DISK        00:01:29     2013-01-15 15:49:14

        BP 关键字: 22   状态: AVAILABLE  已压缩: NO  标记: TAG20130115T154745

段名:/u01/myrman/TIMRAN11_24.bak

  备份集 22 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  1       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/system01.dbf

  4       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/user01.dbf

  6       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/test01.dbf

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

23      Full    621.61M    DISK        00:01:39     2013-01-15 15:49:27

        BP 关键字: 23   状态: AVAILABLE  已压缩: NO  标记: TAG20130115T154745

段名:/u01/myrman/TIMRAN11_25.bak

  备份集 23 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  2       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/sysaux01.dbf

  5       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/example01.dbf

  7       Full 6634197    2013-01-15 15:47:29 /u01/oradata/timran11g/undotbs01.dbf

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

24      Full    9.67M      DISK        00:00:11     2013-01-15 15:49:44

        BP 关键字: 24   状态: AVAILABLE  已压缩: NO  标记: TAG20130115T154933

段名:/u01/myrman/c-3416564781-20130115-08

  包含的 SPFILE: 修改时间: 2013-01-15 15:47:44

  SPFILE db_unique_name: TIMRAN11G

  包括的控制文件: Ckp SCN: 6634197      Ckp 时间: 2013-01-15 15:47:29

 

RMAN>

 

说明:

1)两个通道C1,C2对应了两个备份集22,23

2)由于设定了CONFIGURE CONTROLFILE AUTOBACKUP ON,所以备份控制文件和参数文件和到一个备份集24里了。

 

 

案例1:system表空间损坏或数据库大部分datafile丢失(recover database,必须在mount下)

 

1)环境

 

[oracle@timran ~]$ sqlplus scott/scott

 

SQL> create table t1 (id int);

SQL> insert into t1 values(1);

SQL> commit;

SQL> select * from t1;

 

        ID

----------

         1

       

SQL> alter system switch logfile;

SQL> /

SQL> /

 

SQL> insert into t1 values(2);

SQL> commit;

SQL> select * from scott.t1;

 

        ID

----------

         1

         2

 

2) 关闭数据库

SQL> shutdown abort

 

3)删除所有数据文件,模拟关键表空间损坏,然后启动数据库

 

[oracle@timran ~]$ rm /u01/oradata/timran11g/*.dbf

 

SQL> startup

ORACLE instance started.

 

Total System Global Area  285212672 bytes

Fixed Size                  1218968 bytes

Variable Size              83887720 bytes

Database Buffers          192937984 bytes

Redo Buffers                7168000 bytes

Database mounted.

ORA-01157: cannot identify/lock data file 1 - see DBWR trace file

ORA-01110: data file 1: '/u01/oradata/timran11g/system01.dbf'

 

 

12:07:10 SQL>  select file#,error from v$recover_file;

 

     FILE# ERROR

---------- -----------------------------------------------------------------

         1 FILE NOT FOUND

         2 FILE NOT FOUND

         3 FILE NOT FOUND

         4 FILE NOT FOUND

         5 FILE NOT FOUND

         6 FILE NOT FOUND

 

4)利用rman 做完全恢复

 

[oracle@timran ~]$ rman target /

 

RMAN>run {

startup force mount;

allocate channel c1 type disk;

allocate channel c2 type disk;

restore database;

recover database;

alter database open;

}

 

5)验证:

12:14:31 SQL> conn / as sysdba

12:14:34 SQL> select * from scott.t1;

 

        ID

----------

         1

         2

 

 

案例2:恢复表空间(open状态)。因数据文件的所在的介质损坏,需要将其表空间恢复到一个新的物理位置。

 

1)环境

SQL> create table scott.emp1 as select * from scott.emp where rownum < 3;

SQL> select * from scott.emp1;                                                                                                       

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

 

2)模拟损坏,删除数据文件。

                                                                                                           

[oracle@timran ~]$ rm /u01/oradata/timran11g/user01.dbf

 

3) 清除db buffer ,证实物理读失败

SQL> alter system flush buffer_cache;  

SQL> conn /as sysdba

SQL> select * from scott.emp1;

select * from scott.emp1

                    *

ERROR at line 1:

 

SQL> alter system checkpoint;         //实验中为防备rman登录不正常,可以尝试先做个检查点切换

 

4)建个目录,假设介质损坏了,更换需要时间,先把数据文件恢复到一个新的目录下(不同的物理位置),

 

[oracle@timran timran11g]$ mkdir /u01/oradata/timran11g/dir1

 

5)使用RMAN恢复表空间

 

RMAN>run{

sql 'alter database datafile 4 offline';

set newname for datafile 4 to '/u01/oradata/timran11g/dir1/user01.dbf';

restore tablespace users;

switch datafile 4;

recover tablespace users;

sql 'alter database datafile 4 online';

}

 

//set newname for和switch datafile是一对。

//restore和recover也是一对,当然将tablespace users 换成datafile 4也是可以的。

 

5)验证

 

SQL> select * from scott.emp1;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 1980-12-17 00:00:00        800                    20

      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

 

6)待介质更换完成后,可以将表空间迁移回原来位置。

 

SQL> alter tablespace users offline;

 

[oracle@timran ~]$ mv /u01/oradata/timran11g/dir1/user01.dbf /u01/oradata/timran11g

 

 

SQL> alter tablespace users rename datafile '/u01/oradata/timran11g/dir1/user01.dbf' to '/u01/oradata/timran11g/user01.dbf';

SQL> alter tablespace users online;

 

7)再验证

 

SQL> select * from scott.emp1;

 

案例3:新建表空间(rman备份没有这个表空间),datafile被破坏

 

1)环境

SQL> create tablespace lx datafile '/u01/oradata/timran11g/lx01.dbf' size 5m;                                                 

SQL> create table scott.t2(id int) tablespace lx;         

SQL> insert into scott.t2 values (1);                                                                                        

SQL> commit;                                                                                                        

SQL> select * from scott.t2;

 

        ID

----------

         1

 

    

2) 删除t2表所在的数据文件

[oracle@timran ~]$rm /u01/oradata/timran11g/lx01.dbf

 

3)清除db buffer,t2表物理读失败。

 

SQL> alter system flush buffer_cache;

SQL> conn / as sysdba

SQL> select * from scott.t2;

select * from scott.t2

                    *

第 1 行出现错误:

ORA-01116: 打开数据库文件 3 时出错

ORA-01110: 数据文件 3: '/u01/oradata/timran11g/lx01.dbf'

ORA-27041: 无法打开文件

 

4)利用rman 恢复数据文件(注意:rman备份里没有lx01.dbf)

 

RMAN>run {

sql 'alter database datafile 3 offline';

restore datafile 3;

recover datafile 3;

sql 'alter database datafile 3 online';

}    

 

使用目标数据库控制文件替代恢复目录

sql 语句: alter database datafile 3 offline

 

启动 restore 于 2013-01-18 11:23:32

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=130 设备类型=DISK

 

创建数据文件, 文件号 = 3 名称 = /u01/oradata/timran11g/lx01.dbf     //对比手工恢复,RMAN自动建立了新的lx01.dbf文件

没有完成还原; 所有文件均为只读或脱机文件或者已经还原

完成 restore 于 2013-01-18 11:23:35

 

启动 recover 于 2013-01-18 11:23:35

使用通道 ORA_DISK_1

 

正在开始介质的恢复

介质恢复完成, 用时: 00:00:01

 

完成 recover 于 2013-01-18 11:23:36

 

sql 语句: alter database datafile 3 online

 

5)验证

SQL> select * from scott.t2;

 

        ID

----------

         1

 

 

案例4:应用增量备份技术进行恢复

 

1)环境

 

清除所有rman备份

RMAN> delete backup;

RMAN> delete datafilecopy all;

 

在users表空间上建表

SQL> create table scott.t3 (id int);

SQL> insert into scott.t3 values(100);

SQL> commit;

SQL> select * from scott.t3;

 

        ID

----------

       100

 

2)建立0增量备份,利用image备份作为0级增量备份

 

RMAN> copy datafile 4 to '/u01/myrman/users_%s.bak';

 

SQL> insert into scott.t3 values(200);

SQL> commit;

SQL> select * from scott.t3;

 

        ID

----------

       100

       200

 

3)建立1 级差异增量备份

 

RMAN> backup incremental level 1 format '/u01/myrman/users_inc_1_%s.bak' datafile 4;                                                                                           

SQL> insert into scott.t3 values(300);

SQL> commit;

SQL> select * from scott.t3;

 

        ID

----------

       100

       200

       300

 

4)建立1级累计增量备份

 

RMAN> backup incremental level 1 cumulative format '/u01/myrman/users_cul_1_%s.bak' datafile 4;

 

5) 列出刚才备份的datafile 4 (第一次,immage备份,第二次,差异增量1级, 第三次,累计增量1级。)

 

RMAN> list datafilecopy all;

 

数据文件副本列表

=======================

 

关键字     文件 S 完成时间            Ckp SCN    Ckp 时间          

------- ---- - ------------------- ---------- -------------------

3       4    A 2013-01-18 12:08:41 6683129    2013-01-18 12:08:40

        名称: /u01/myrman/users_44.bak

        标记: TAG20130118T120830

 

 

RMAN> list backup of datafile 4;

 

备份集列表

===================

 

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

41      Incr 1  39.81M     DISK        00:00:10     2013-01-18 12:09:54

        BP 关键字: 41   状态: AVAILABLE  已压缩: NO  标记: TAG20130118T120944

段名:/u01/myrman/users_inc_1_46.bak

  备份集 41 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  4    1  Incr 6683188    2013-01-18 12:09:53 /u01/oradata/timran11g/user01.dbf

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

43      Incr 1  39.81M     DISK        00:00:11     2013-01-18 12:11:48

        BP 关键字: 43   状态: AVAILABLE  已压缩: NO  标记: TAG20130118T121137

段名:/u01/myrman/users_cul_1_48.bak

  备份集 43 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  4    1  Incr 6683267    2013-01-18 12:11:46 /u01/oradata/timran11g/user01.dbf

 

RMAN>

 

6)删除数据文件4

 

[oracle@timran ~]$ rm /u01/oradata/timran11g/user01.dbf

 

SQL> alter system flush buffer_cache;

SQL> conn / as sysdba

SQL> select * from scott.t3;

select * from scott.t3

*

第 1 行出现错误:

ORA-01116: 打开数据库文件 4 时出错

ORA-01110: 数据文件 4: '/u01/oradata/timran11g/user01.dbf'

 

7)恢复数据文件

 

RMAN>run {

sql 'alter database datafile 4 offline';

restore datafile 4;

recover datafile 4;

sql 'alter database datafile 4 online';

}

 

使用目标数据库控制文件替代恢复目录

sql 语句: alter database datafile 4 offline

 

启动 restore 于 2013-01-18 12:24:17

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=134 设备类型=DISK

 

通道 ORA_DISK_1: 正在开始还原数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集还原的数据文件

通道 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: 已还原备份片段 1

通道 ORA_DISK_1: 还原完成, 用时: 00:00:03

完成 restore 于 2013-01-18 12:24:21

 

启动 recover 于 2013-01-18 12:24:21

使用通道 ORA_DISK_1

 

正在开始介质的恢复

介质恢复完成, 用时: 00:00:00

 

完成 recover 于 2013-01-18 12:24:21

 

sql 语句: alter database datafile 4 online

 

RMAN>

 

//注意两点:1)使用image做0级增量备份,image没有还原步骤。2)使用了1级累计增量,但没有使用1级差异增量。

 

8)验证

SQL> select * from scott.t3;

 

        ID

----------

       100

       200

       300

 

第九章:rman 不完全恢复

 

9.1 rman 不完全恢复的三个标准模式:

基于time、基于scn和基于sequence:

 

案例1:恢复过去某个时间点误操作,一般使用基于time或scn。

 

1)环境

做一套全库备份

RMAN>delete backup;

RMAN>backup database format '/u01/myrman/%s.bak'

 

SQL> create table scott.t1 (id int);

SQL> insert into scott.t1 values(1);

SQL> commit;

select * from scott.t1;

SQL> select * from scott.t1;

 

        ID

----------

         1

 

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------

         1          1          7   52428800          1 NO  CURRENT                6689019 2013-01-18 13:45:25

         2          1          5   52428800          1 YES INACTIVE               6689014 2013-01-18 13:45:22

         3          1          6   52428800          1 YES INACTIVE               6689016 2013-01-18 13:45:23

 

SQL> truncate table scott.t1;               //此动作记录在当前日志,即sequence 7里了。

 

SQL> alter system switch logfile;

SQL> /

SQL> select * from v$log;

 

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME

---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- -------------------

         1          1          7   52428800          1 YES ACTIVE                 6689019 2013-01-18 13:45:25

         2          1          8   52428800          1 YES ACTIVE                 6689269 2013-01-18 13:49:17

         3          1          9   52428800          1 NO  CURRENT                6689271 2013-01-18 13:49:19

 

SQL> insert into scott.t1 values(2);            //此动作记录在当前日志,即sequence 9里了。    

SQL> commit;

SQL> select * from scott.t1;

 

        ID

----------

         2

 

2)根据日志挖掘找出DDL语句的truncate 的时间点

 

准备工作:

 

如果是第一次做,先要建好logmnr目录,存放数据字典文件dict.ora

$ mkdir /home/oracle/logmnr

 

设置logmnr 参数指向logmnr目录

SQL> alter system set utl_file_dir='/home/oracle/logmnr' scope=spfile;                                                       

 

开始使用PL/SQL API 方式日志挖掘

 

2.1) 建立数据字典文件dict.ora

SQL> execute dbms_logmnr_d.build('dict.ora','/home/oracle/logmnr',dbms_logmnr_d.store_in_flat_file);                         

2.2) 添加日志分析

SQL>  execute dbms_logmnr.add_logfile(logfilename=>'/u01/disk1/timran/arch_1_804846837_7.log',options=>dbms_logmnr.new);

2.3) 执行分析

SQL> execute dbms_logmnr.start_logmnr(dictfilename=>'/home/oracle/logmnr/dict.ora',options=>dbms_logmnr.ddl_dict_tracking);

2.4) 查看分析结果

SQL> select username,scn,to_char(timestamp,'yyyy-mm-dd hh24:mi:ss'),sql_redo from v$logmnr_contents WHERE sql_redo like '%t1%';

 

USERNAME                              SCN TO_CHAR(TIMESTAMP,'YYYY-MM-DDH SQL_REDO

------------------------------ ---------- ------------------------------ -------------------------------------------------

UNKNOWN                           6689037 2013-01-18 13:45:52            create table scott.t1 (id int);

UNKNOWN                           6689163 2013-01-18 13:47:04            truncate table scott.t1;

                                                           

2.5) 关闭日志分析

SQL> execute dbms_logmnr.end_logmnr;

               

3)根据logmnr结果, 使RMAN恢复停留在time或scn之前。

 

run {

startup force mount;

allocate channel c1 type disk;

allocate channel c2 type disk;

set until time '2013-01-18 13:47:04 ';

restore database;

recover database;

alter database open resetlogs;

}

 

Oracle 实例已启动

数据库已装载

 

系统全局区域总计     422670336 字节

 

Fixed Size                     1300352 字节

Variable Size                331352192 字节

Database Buffers              83886080 字节

Redo Buffers                   6131712 字节

 

使用目标数据库控制文件替代恢复目录

分配的通道: c1

通道 c1: SID=154 设备类型=DISK

 

分配的通道: c2

通道 c2: SID=151 设备类型=DISK

 

正在执行命令: SET until clause

 

启动 restore 于 2013-01-18 14: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-18 14:21:30

 

启动 recover 于 2013-01-18 14: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-18 14:21:41

 

数据库已打开

释放的通道: c1

释放的通道: c2

 

4)验证

 

SQL> select * from scott.t1;

 

        ID

----------

         1

 

//基于scn的方法与基于time相似,语法是set until scn 6689163;

 

//基于日志的方法类似手工恢复的例子,语法是set until sequence 3;

 

*考点:不完全恢复的手工与RMAN语法比较:

 

 

        手工方法        RMAN方法

-----------------------------------------------------------------

基于time    until time XXX          set until time XXX

基于scn     until change XXX    set until scn XXX

基于日志        until cancel        set until sequence XXX

 

 

案例4

 

恢复SPFILE或CONTROLFILE:

 

1)环境

SQL> select * from v$tablespace;

 

       TS# NAME                           INC BIG FLA ENC

---------- ------------------------------ --- --- --- ---

         0 SYSTEM                         YES NO  YES

         1 SYSAUX                         YES NO  YES

         4 USERS                          YES NO  YES

         6 EXAMPLE                        YES NO  YES

         8 TEST                           YES NO  YES

         3 TEMP                           NO  NO  YES

         2 UNDOTBS1                       YES NO  YES

 

//TEST表空间里有T1表

 

SQL> select owner,table_name,tablespace_name from dba_tables where tablespace_name='TEST';

 

OWNER                          TABLE_NAME                     TABLESPACE_NAME

------------------------------ ------------------------------ ------------------------------

SCOTT                          T1                             TEST

 

//T1表里有一条记录

 

SQL> select * from scott.t1;

 

        ID

----------

         1

rman 的情况:

 

RMAN> show all;

 

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/myrman/%F';

 

//控制文件自动备份,备份目的地是/u01/myrman

 

2)做一个全库备份。

RMAN> backup database format '/u01/myrman/%s.bak';

RMAN> list backup; 

 

备份集列表

===================

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

1       Full    1.27G      DISK        00:01:42     2013-01-16 19:36:18

        BP 关键字: 1   状态: AVAILABLE  已压缩: NO  标记: TAG20130116T193436

段名:/u01/myrman/2.bak

  备份集 1 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  1       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/system01.dbf

  2       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/sysaux01.dbf

  4       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/user01.dbf

  5       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/example01.dbf

  6       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/test01.dbf

  7       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/undotbs01.dbf

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

2       Full    9.67M      DISK        00:00:10     2013-01-16 19:36:31

        BP 关键字: 2   状态: AVAILABLE  已压缩: NO  标记: TAG20130116T193621

段名:/u01/myrman/c-3416564781-20130116-00

  包含的 SPFILE: 修改时间: 2013-01-16 19:29:09

  SPFILE db_unique_name: TIMRAN11G

  包括的控制文件: Ckp SCN: 6698846      Ckp 时间: 2013-01-16 19:36:21

 

//由于控制文件自动备份的关系,spfile file和controle file打包在一个备份集2里。

   

3)得到数据库唯一标识号:DBID

 

SQL> select dbid from v$database;

   

      DBID

----------

3416564781

 

//dbid是你的database的一个唯一识别ID,恢复spfile和controlfile时候都要用到。这个信息在rman加载数据库时也可以得到。

 

4)关闭数据库,然后让参数文件不起作用

 

SQL> shutdown abort

 

[oracle@timran dbs]$ mv spfiletimran.ora spfiletimran.old

[oracle@timran dbs]$ mv inittimran.ora  inittimran.old

 

//模拟spfile损坏,pfile也不能起作用。

 

5) RMAN恢复参数文件

 

[oracle@timran ~]$ [oracle@timran ~]$ rman target /

 

connected to target database (not started)

 

RMAN> startup nomount;    //没有了参数文件,SQL*PLUS是无法启动实例的,但RMAN可以,所以startup nomount一定要在RMAN下做!!!

 

startup failed: ORA-01078: failure in processing system parameters

LRM-00109: could not open parameter file '/u01/oracle/dbs/inittimran.ora'

 

starting Oracle instance without parameter file for retrival of spfile

Oracle instance started

 

Total System Global Area     159383552 bytes

 

Fixed Size                     1218244 bytes

Variable Size                 58722620 bytes

Database Buffers              92274688 bytes

Redo Buffers                   7168000 bytes

 

RMAN> set dbid=3416564781;

 

executing command: SET DBID

 

RMAN> restore spfile from autobackup;

 

//执行该命令,如果没有找到的话,那可能是文件的路径发生错误.可以通过直接赋予它的物理路径及文件名

 

RMAN> restore spfile from '/u01/myrman/c-3416564781-20130116-00';

 

启动 restore 于 2013-01-16 14:43:42

使用目标数据库控制文件替代恢复目录

分配的通道: ORA_DISK_1

通道 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-16 14:43:46

 

//查看在dbs/目录下已经产生spfiletimran.ora文件。证明spfile 恢复好了。

 

控制文件恢复过程与参数文件是类似的,一个区别是当rman恢复完控制文件后,会将该控制文件所在的备份集从存储库中删掉。

 

 

案例5 恢复误删除表空间(已备份),RMAN必须通过老控制文件进行恢复

 

本例要做的是drop tablespace test,然后再通过不完全恢复,使数据库在drop表空间前的那一刻打开,从而恢复test表空间及t1表的内容。

 

1)$ tail -f /u01/diag//rdbms/timran11g/timran11g/trace/alert_timran11g.log

 

//打开告警日志,查看drop tablespace的告警信息,记下时间点

 

2)SQL> drop tablespace test including contents and datafiles;

 

//删除test表空间

 

3)查看告警有关信息:

 

Wed Jan 16 19:39:56 2013                    //这个时间是你要until time的时刻

drop tablespace test including contents and datafiles

Deleted file /u01/oradata/timran11g/test01.dbf

Wed Jan 16 19:40:12 2013

Completed: drop tablespace test including contents and datafiles

   

4)查看rman备份集信息

 

RMAN> list backup; 

 

备份集列表

===================

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

1       Full    1.27G      DISK        00:01:42     2013-01-16 19:36:18

        BP 关键字: 1   状态: AVAILABLE  已压缩: NO  标记: TAG20130116T193436

段名:/u01/myrman/2.bak

  备份集 1 中的数据文件列表

  文件 LV 类型 Ckp SCN    Ckp 时间            名称

  ---- -- ---- ---------- ------------------- ----

  1       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/system01.dbf

  2       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/sysaux01.dbf

  4       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/user01.dbf

  5       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/example01.dbf

  6       Full 6698790    2013-01-16 19:34:45

  7       Full 6698790    2013-01-16 19:34:45 /u01/oradata/timran11g/undotbs01.dbf

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间           

------- ---- -- ---------- ----------- ------------ -------------------

2       Full    9.67M      DISK        00:00:10     2013-01-16 19:36:31

        BP 关键字: 2   状态: AVAILABLE  已压缩: NO  标记: TAG20130116T193621

段名:/u01/myrman/c-3416564781-20130116-00

  包含的 SPFILE: 修改时间: 2013-01-16 19:29:09

  SPFILE db_unique_name: TIMRAN11G

  包括的控制文件: Ckp SCN: 6698846      Ckp 时间: 2013-01-16 19:36:21

 

BS 关键字  类型 LV 大小       设备类型 经过时间 完成时间          

------- ---- -- ---------- ----------- ------------ -------------------

3       Full    9.67M      DISK        00:00:10     2013-01-16 19:40:12

        BP 关键字: 3   状态: AVAILABLE  已压缩: NO  标记: TAG20130116T194002

段名:/u01/myrman/c-3416564781-20130116-01

  包含的 SPFILE: 修改时间: 2013-01-16 19:29:09

  SPFILE db_unique_name: TIMRAN11G

  包括的控制文件: Ckp SCN: 6698986      Ckp 时间: 2013-01-16 19:40:02

 

 

//备份集1中的数据文件6已经空了,这是删除了test表空间所致。另外又增加了备份集3,这是自动备份控制文件设为on所致。

 

5)准备对drop tablespace test做不完全恢复

 

两个要点:

 

1.新增了3号备份集,其中的控制文件备份是由于drop tablespace 这个动作之后产生的,这个控制文件里已经没有test表空间的记录了,如果你按照通常的不完全恢复,rman会找当前的或最新的控制文件,也就是说它会用这个3号集,当然我们要用的是2号集,因2号集里才有test表空间的记录。所以这个不完全恢复一定要用一个老的控制文件。归根结底是 rman的restore(还原)依据的是控制文件的信息,如果你要用了3号集还原控制文件,那就意味着test01.dbf无法restore了!

 

2.控制文件恢复时,如果能确认你用的那个控制文件,就输入它的物理路径好了,这个办法最简单明了。

 

3.当你restore控制文件后,下一步是进入mount状态(考点),然后才能做不完全恢复,使用老控制文件,对应手工恢复方式,RMAN没有使用using backup controlfile子句。

 

6)shutdown数据库删除文件

 

SQL> shutdown abort

 

[oracle@timran timran11g]$ rm *.ctl          //删掉所有控制文件,准备让rman恢复老控制文件

[oracle@timran timran11g]$ rm *.dbf          //删掉所有数据文件,不完全恢复是整个数据库通过数据备份和日志前滚来完成

 

7)用RMAN恢复

RMAN>run{

startup nomount;

set DBID=3416564781

restore controlfile from '/u01/myrman/c-3416564781-20130116-00';

alter database mount;

set until time '2013-01-16 19:39:56';

restore database;

recover database;

alter database open resetlogs;

}

 

Oracle 实例已启动

 

系统全局区域总计     422670336 字节

 

Fixed Size                     1300352 字节

Variable Size                352323712 字节

Database Buffers              62914560 字节

Redo Buffers                   6131712 字节

 

正在执行命令: SET CONTROLFILE AUTOBACKUP FORMAT

使用目标数据库控制文件替代恢复目录

 

正在执行命令: SET DBID

 

启动 restore 于 2013-01-16 19:45:25

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=154 设备类型=DISK

 

通道 ORA_DISK_1: 正在还原控制文件

通道 ORA_DISK_1: 还原完成, 用时: 00:00:03

输出文件名=/u01/oradata/timran11g/control01.ctl

输出文件名=/u01/oradata/timran11g/control02.ctl

输出文件名=/u01/oradata/timran11g/control03.ctl

完成 restore 于 2013-01-16 19:45:28

 

数据库已装载

释放的通道: ORA_DISK_1

 

正在执行命令: SET until clause

 

启动 restore 于 2013-01-16 19:45:33

启动 implicit crosscheck backup 于 2013-01-16 19:45:33

分配的通道: ORA_DISK_1

通道 ORA_DISK_1: SID=154 设备类型=DISK

已交叉检验的 1 对象

完成 implicit crosscheck backup 于 2013-01-16 19:45:34

 

启动 implicit crosscheck copy 于 2013-01-16 19:45:34

使用通道 ORA_DISK_1

完成 implicit crosscheck copy 于 2013-01-16 19:45:34

 

搜索恢复区中的所有文件

正在编制文件目录...

没有为文件编制目录

 

使用通道 ORA_DISK_1

 

通道 ORA_DISK_1: 正在开始还原数据文件备份集

通道 ORA_DISK_1: 正在指定从备份集还原的数据文件

通道 ORA_DISK_1: 将数据文件 00001 还原到 /u01/oradata/timran11g/system01.dbf

通道 ORA_DISK_1: 将数据文件 00002 还原到 /u01/oradata/timran11g/sysaux01.dbf

通道 ORA_DISK_1: 将数据文件 00004 还原到 /u01/oradata/timran11g/user01.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: 已还原备份片段 1

通道 ORA_DISK_1: 还原完成, 用时: 00:01:46

完成 restore 于 2013-01-16 19:47:21

 

启动 recover 于 2013-01-16 19:47:22

使用通道 ORA_DISK_1

 

正在开始介质的恢复

 

线程 1 序列 2 的归档日志已作为文件 /u01/oradata/timran11g/redo02.log 存在于磁盘上

归档日志文件名=/u01/oradata/timran11g/redo02.log 线程=1 序列=2

介质恢复完成, 用时: 00:00:02

完成 recover 于 2013-01-16 19:47:25

 

数据库已打开

 

8)验证:

SQL> select * from scott.t1;

 

        ID

----------

         1

 

 

案例6 表空间时间点恢复(Tablespace Point In Time Recovery)

 

作为一条基本原则,不完全恢复必须应用到整个数据库,即必须还原整个数据库并运用日志一起向前滚动。TSPITR是一种对个别表空间执行不完全恢复的技术,一般是针对用户错误的删除(或截断)了表。TSPITR通过RMAN创建一个辅助库,将单个表空间在辅助库上恢复到指定的某个时刻,因为是在辅助库恢复,目标库(生产库)不用停机。

 

在一系列准备工作完成后(建立辅助实例,网络连接等),利用RMAN同时连接目标数据库和新启动的辅助实例,如:

 

$rman target sys/oracle@timran11g auxiliary sys/oracle@newdb

 

之后就可以创建辅助数据库了,以下两个命令是两种创建辅助库的方法:

 

RMAN>duplicate target database;                     //利用RMAN备份创建辅助库

RMAN>duplicate target database from active database;    //从联机数据库(不用RMAN备份)直接创建辅助库。

 

我下面的测试没有建立辅助库,就是在目标库上完成的,当然这是不推荐的,我们仅仅是为了了解一下这个过程。

 

前提:

 

1)有一套全库备份,因为TSPITR这个过程是要在辅助库上恢复目标库的system和undo表空间(考点)

2)本例设置了控制文件自动备份:RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;

 

1)建表空间

SQL> create tablespace abcd datafile '/u01/oradata/timran11g/abcd01.dbf' size 5m;

 

2)建表

create table scott.t2(c1 date) tablespace abcd;

insert into scott.t2 values(sysdate);

commit;

 

3)RMAN备份表空间

 

RMAN>backup tablespace abcd format '/u01/myrman/abcd_%s.bak';

 

4)取当前时间

 

SQL>select sysdate from dual;

 

SYSDATE

-------------------

2013-01-16 22:02:14

 

 

5)删除表并purge

 

SQL>drop table scott.t2 purge;

 

6)建立目录指定辅助库目标

 

$mkdir -p /u01/oradata/timran11g/auxdata

       

7)做RMAN TSPITR 并指定辅助库目的地(这里还是目标库)

 

[oracle@timran ~]$ rman target /

 

RMAN> recover tablespace abcd until time '2013-01-16 22:02:14' auxiliary destination '/u01/oradata/timran11g/auxdata';

 

执行过程值得一读,但太长了,略了。

 

8)验证

 

SQL> alter tablespace abcd online;

SQL> select * from scott.t2;

 

C1

-------------------

2013-01-16 21:58:11

 

考点:

1)TSPITR是保持在线业务下表空间级的不完全恢复,恢复的表空间要自包含。

2)TSPITR适用于purge表,ddl删除表列,但不适用删除表空间,以及重命名表空间(恢复旧命名)。

 

 

 

案例7:数据块介质恢复(BMR)

 

如果数据文件只是出现部分数据块损坏,RMAN可以尝试针对坏块进行恢复,就是说不需要恢复整个数据文件,只恢复损坏的数据块。

 

可能有两种情况下发现坏块:1)rman备份时,2)session 访问到该块时

 

比如出现了下面的报错:

ORA-01578: ORACLE DATA BLOCK CURRPTED(FILE #5,BLOCK #21)

 

对应的rman恢复命令应该是:

 

RMAN>blockrecover device type disk datafile 5 block 21;

 

考点会围绕以下知识点:

 

1)BMR是RMAN的一个功能,只能在RMAN上实现

2)BMR做的是一个完全恢复

3)RMAN是块级备份,备份是自动检测坏块,缺省下碰到坏块就会中断备份,除非set maxcurrupt

4)做RMR有两点需求:一个是数据库要在mount或open下, 另一个是需要坏块所在的数据文件的完整0级备份。

5)检测出来的坏块可以在视图V$database_block_currption查看

 

 

第十章:目录库和辅助库

 

10.1 创建目录库(Catalog database)的必要性

 

如果没有catalog,RMAN的存储库(元数据)保存在目标库的控制文件里,这样可能存在如下隐患

 

1)目标库上的控制文件损坏,造成该目标库上的RMAN元数据丢失。尽管可能备份的数据还在,但RMAN无法找到它们了。

2)RMAN元数据受控制文件参数control_file_record_keep_time限制,缺省是7天,超时可能被覆盖,造成元数据丢失。

 

对此,我们可以在另一台服务器上建立一个Catalog Database

 

优点是:

1)它多了一份目标库的RMAN元数据副本,目标库的控制文件坏了也不用担心了。

2)它不受时间限制,不会被覆盖,理论上是无限期的存储rman元数据历史信息。

3)使用一个catalog目录库就可以管理许多目标库,所谓集中管理多个目标库,这些目标库可以是不同平台,不同版本。

4)它可以使用脚本,scritp 这是catalog独有的功能,使RMAN的备份与恢复更加灵活,自动化。

 

10.2 Catalog database 的配置

 

catalog mode 在生产环境中一定要建在一台独立的oracle server上,  不能建在同一台目标机上,目的就是防止目标机的control file和catalog目录库一同损毁,从而完全丢失使RMAN元数据。

 

配置一个CATALOG的简单操作:catalog :xp-oracle-orcl target:linux-oracle-timran11g

 

1)创建Catalog所用表空间

 

SQL> create tablespace rman_ts datafile 'E:\rman.dbf' size 50m;

 

2)创建RMAN用户并授权

 

SQL> create user rman identified by rman default tablespace rman_ts;

SQL> grant resource, recovery_catalog_owner to rman;

SQL> exit

 

3)从RMAN客户端上同时连接target库和 catalog库

C:>rman target sys/system@timran11g catalog rman/rman@orcl

 

连接到目标数据库:TIMRAN(DBID=4035750304)

连接到恢复目录数据库

 

4)创建catalog目录

RMAN>create catalog tablespace rman_ts;

恢复目录已创建

 

5)注册

RMAN>register database;

 

注册在恢复目录中的数据库

正在启动全部恢复目录的resync

完成全部resync

 

如果想手动重新同步

 

RMAN> RESYNC CATALOG;

 

10.3 RMAN存储脚本

 

rman脚本可以作为操作系统文件来存储,比如:将下面的两个命令保存到一个名为timran.rcv文件中

 

run{backup database plus archivelog delete all input;

delete obsolet;}

 

那么可以在操作系统下调用该脚本

 

$rman target / catelog rman/rman@orcl @timran.rcv

 

但是如果有目录的话,可以使用它来存储一个脚本

 

有关脚本的命令有:

 

create [global] script

replace [global] script

print [global] script

list [global] script name

exectue [global] script

delete [global] script

 

考点:

1)到目标库的RMAN连接通常是SYS用户,因为一般需要在RMAN里发出启动或关闭数据库,但是不需要指定AS SYSDBA。

2)创建catalog目录的版本必须高于或等于任何目标库的数据库版本,因此可以创建单个版本为11.1.0.6的目录加补丁集6。

3)使用create script建立本地脚本,它只使用于你连接点的目标数据库,使用create global script命令创建全局存储脚本,它适用于所有   目标数据库,但不能同时对多个目标库执行命令。本地脚本和全局脚本都保存在RMAN catalog里。

4)使用exectue去执行脚本,它必须包含在RUN{}。可以参考笔记最后的附录部分,有《 Oracle一周备份计划范例》。

 

10.4 虚拟专用目录(ppt85-86)

 

一个目录可以注册你单位的所有数据库的详细信息,如果target服务器比较多,可能有几个DBA来负责,一些DBA管理一部分,另一些管理其他部分。这就可能需要创建一个或几个虚拟专用目录,作为DBA可以将自己管理的target注册到自己的专用目录中,并且不能查看注册在其他任何专用目录中的任意数据库。

 

*考点:RMAN元数据总是存在于RMANtarget数据库中,但它只能恢复由controlfile_record_keep_time参数所指定的数据,catalog是一个额外的存储区,可以无限期的保留元数据。

 

10.5 Auxiliary Database

 

Target Database 即目标数据库是我们指的要备份的数据库,Auxiliary Database即辅助数据库是从目标库创建的新的数据库,通常建立一个

模拟生产系统的一个平台,用于测试目标库,包括升级,新应用程序上线等

 

一般步骤:

 

1)将辅助库上安装数据库软件,建立Oracle Home

2)为辅助库建立口令文件

3)确保到辅助实例的网络连通性

4)为辅助实例创建参数文件

5)以nomount方式启动辅助实例

6)在mount或open模式下启动目标数据库

7)创建备份或将备份和归档日志文件复制到辅助库实例可以访问的某个位置,除非正在使用活动数据库复制

8)如果有必要分配辅助通道

9)运行rman duplicate命令

10)使用resetlogs打开辅助数据库

 

考点:

1)辅助库的参数文件里db_name是必选项,复制数据库使用新的DBID。

2)DB_FILE_NAME_CONVERT指定数据文件和临时文件的文件系统映射名称。

   LOGFILE_NAME_CONVERT指定联机重做日志文件的文件系统映射名称。

 

 

第十一章: rman 维护

 

11.1 rman 使用和维护

 

11.2 list  命令一览

 

  1)RMAN> list backup;

  2)RMAN> list backup of tablespace users;

  3)RMAN> list backup of datafile 2;

  4)RMAN> list backup of controlfile;

  5) RMAN> list backup of archivelog all;

  6)RMAN> list backup of archivelog until time ='sysdate -1';

  7)RMAN> list backupset 56;

  8)RMAN> list datafilecopy all;

  9)RMAN> list copy of tablespace users;

  10)RMAN> list copy of datafile 1;

  11)RMAN> list datafilecopy 67;

  12)RMAN> list copy of controlfile;

  13) RMAN> list expired backup;

 

11.3 crosscheck:

用于检测备份状态(AVAILABLE:可用;UNAVAILABLE :不可用;expired 过期,即备份已经被os 删除了。

RMAN> crosscheck backup;

RMAN> crosscheck copy;

 

对于EXPIRED状态的产生,与crosscheck命令是密切相关的,RMAN通过crosscheck命令检查备份是否存在于备份介质上,如果不存在,则状态由AVAILABLE改为EXPIRED。

 

例:可以试一下将某文件的备份在os下删除,再使用crosscheck进行检查,该备份的状态由AVAILABLE改为EXPIRED

 

RMAN>delete expired backup;     //删除所有过期的备份。

 

 

对于obsolete状态,是针对RMAN备份保留策略来说的,超过了这个保留策略的备份,会被标记为obsolete,但其状态依旧为AVAILABLE,我们可以使用report obsolete来查看已废弃的备份。

 

*考点:DELETE EXPIRED命令不删除任何文件,它只更新RMAN存储库(元数据)DELETE OBSOLETE命令将删除文件并相应的更新存储库。

 

例如这里,冗余数为1,如果有两个控制文件的备份,较早的一个备份,就会被标记为obsolete:

 

11.4 report 报告命令一览

 

 

RMAN> REPORT schema;        //查看目标库的物理结构

RMAN> REPORT schema at time|scn|sequence; //at子句必须在catalog里使用(考点)

RMAN> REPORT need backup;  //查看需要做备份的datafile

RMAN> REPORT obsolete;      //根据备份冗余策略来判断,那些备份是陈旧的(obsolete)

RMAN> REPORT NEED BACKUP incremental 3;  //三天以来尚未进行备份的文件:

RMAN> REPORT NEED BACKUP redundancy 2;   //如果不具有两个或更多个备份则需要进行备份:

RMAN> REPORT NEED BACKUP recovery window of 3 days;   //需要进行备份以恢复到三天前的数据状态:

RMAN> REPORT OBSOLETE REDUNDANCY 2;  //如果需要的备份副本不多于两个,列出作废的恢复文件:

 

一道考题:两个版本两个答案:

 

You executed the following command in the Recovery Manager (RMAN):

RMAN> REPORT NEED BACKUP days 3;

What is the output of this command?

A. A list of files that require a backup within 3 days

B. A list of files requiring more than 3 days of archivelogs to apply

C. A list of files that RMAN recommends be backed up only once in every three days, based on low volatility

D. A list of files for which a backup as already been performed in the last three days and which is

required to be backed up again based on the high number of transactions performed on them

答案:a或b都有

 

我们看一下oracle文档的解释:

 

REPORT NEED BACKUP DAYS = n

Displays files that require more than n days' worth of archived redo log files for recovery.

这个解释和答案b比较吻合。所以我判断b是正确的。

 

11.5 delete  删除备份命令一览

 

RMAN> delete backup of datafile 2;

RMAN> delete backup of tablespace system;

RMAN> delete backup ;

RMAN> delete backupset 30,32;

RMAN> delete backup of controlfile;

RMAN> delete noprompt backup of controlfile;     //删除noprompt 不提示

RMAN> delete datafilecopy all;

RMAN> delete copy of  datafile 10;

RMAN> delete copy of  tablespace users;

RMAN> delete expired backup;    //删除过期的备份

RMAN> delete expired copy;

RMAN> delete obsolete;      //删除陈旧的备份

RMAN> delete noprompt obsolete; //删除不加提示

 

 

第二部分 优化oracle数据库

 

第十二章 Oracle 资源管理

 

12.1 为什么要使用Oracle资源管理器

 

传统意义上,系统的资源分配是由OS来完成的,但是对于数据库资源,OS分配资源会带来一些问题:

 

以Linux为例,最为突出的一个问题是:Linux的资源调度是基于进程的,比如对于CPU的资源一般都是采用轮循的方法针对进程分时间片.也就是说对于Linux,它无法区分Oracle的后台进程和服务器进程之间谁轻谁重,也没有办法对Oracle用户以session角度考虑资源的配比。

 

Oracle Resource manager就是把原本由OS管理的硬件资源交给Oracle来管理。

 

在数据库环境中,可能同时存在着多个用户请求数据库服务,并且他们所要完成的任务优先级不同,那么我们就应该区别对待这些会话请求。Oracle 资源管理就是为了解决这个问题的。

 

12.2 Oracle 资源管理的基本概念: PPT:406

 

1)资源使用组:Resource consumer group

 

一个资源使用组由一组具有相似请求的用户组成,一个组可以包含许多用户,一个用户又可以是多个组的成员(这个很重要),但是同一时刻,每个session只能有一个组作为这个session的有效使用者组。

 

当新创建一个session时,oracle会根据你的设定自动把它分配到某个组(初始化组)。如果以某个用户登录的session,它的用户是属于多个组的,数据库管理员还可以手动的切换这个session所属的组。

 

下面三类特别的组是系统组,它们不能被修改或删除。

 

  SYS_GROUP

  DEFAULT_CONSUMER_GROUP

  OTHER_GROUP

 

需要强调的一点是OTHER_GROUPS这个资源用户组。任何一个资源计划必须要包括这个OTHER_GROUPS用户组,这个使用组的作用就是作为一个后选项,当一个没有匹配到任何资源使用组的SESSION连接到数据库的时候会自动的匹配到OTHER_GROUPS下面,受制于OTHER_GROUPS的资源限定。

 

2)资源计划:Resource plan

 

就是oracle把数据库资源按一定方法来分配,可以限制每个组占用资源的比例。

 

在一个数据库中同一时间只能有一个资源计划active。(也可以无任何资源计划active)。一个资源计划还可以包含子资源计划。

 

查看当前激活资源计划有三个办法

 

一是 show resoure_manager_plan参数

二是命令select name,is_top_plan from v$rsrc_plan;

三是通过OEM查看资源管理信息

 

3)资源计划指令:Resource plan directives

 

资源管理的目的是实现组(或session)对于资源分配的优先级,一部分用户在某时间内可以更多的享受资源,而另一部分则相反。

 

资源计划指令就是给出各种限定的条件,例如给某个组分配一定百分比的CPU时间,或者限制一个组内最大活动的会话数,等等。

 

 

12.3 一个资源管理中创建组、计划、及指令的例子:

 

1)建四个用户,并授予connect角色:

grant connect to tim identified by tim;

grant connect to acct identified by acct;

grant connect to batch identified by batch;

grant connect to mgr identified by mgr;

 

 

2)建立三个使用者组:

sys登录OEM-->Server-->Resource Manager-->Consumer Groups    //查看默认组

 

建OLTP组,将用户tim,mgr加入该组

建DSS组,将用户acc,mgr加入该组

建BATCH组,将用户batch,mgr加入该组

 

建组结束前,可以单击Show SQL研究一下输出,注意挂起区域的用法,单击Enter返回。

 

3)设置初始使用者组

 

缺省下,普通用户会定位到DEFAULT_CONSUMER_GROUP组下:

 

SQL> select username,INITIAL_RSRC_CONSUMER_GROUP  from dba_users;

 

USERNAME                       INITIAL_RSRC_CONSUMER_GROUP

------------------------------ ------------------------------

MGR                            DEFAULT_CONSUMER_GROUP

HR                             DEFAULT_CONSUMER_GROUP

TIM                            DEFAULT_CONSUMER_GROUP

BATCH                          DEFAULT_CONSUMER_GROUP

ACCT                           DEFAULT_CONSUMER_GROUP

SCOTT                          DEFAULT_CONSUMER_GROUP

......

SYSTEM                         SYS_GROUP

SYS                            SYS_GROUP

......

 

我们把新建的四个用户指定到三个自建的组中

 

exec dbms_resource_manager.set_initial_consumer_group('TIM','OLTP');

exec dbms_resource_manager.set_initial_consumer_group('ACCT','DSS');

exec dbms_resource_manager.set_initial_consumer_group('BATCH','BATCH');

exec dbms_resource_manager.set_initial_consumer_group('MGR','OLTP');

 

SQL> select username,INITIAL_RSRC_CONSUMER_GROUP  from dba_users;

 

USERNAME                       INITIAL_RSRC_CONSUMER_GROUP

------------------------------ ------------------------------

TIM                            OLTP

ACCT                           DSS

BATCH                          BATCH

MGR                            OLTP

HR                             DEFAULT_CONSUMER_GROUP

SCOTT                          DEFAULT_CONSUMER_GROUP

......

 

4) 建立三个新的资源计划

 

首先是建立DAYTIME--白天资源计划

 

4.1) 将SYS_GROUP组、OLTP组、DSS组及BATCH组加入DATTIME计划,然后会发现OTHER_GROUPS组也自动加入了。

4.2) 指定指令几乎,比如:CPU使用优先级。选advance,这个应该对应的是MGMT方法(8个cpu level).

具体设置:

 

Group/Subplan       level 1     level 2     level 3     level4  ......

---------------------------------------------------------------------------------------

BATCH                           50     

DSS                         50

OLTP                    100    

OTHER_GROUPS                                100

SYS_GROUP       100

 

第二,建立NIGHTTIME--夜晚资源计划

参考4.1-4.2

 

Group/Subplan       level 1     level 2     level 3     level4  ......

---------------------------------------------------------------------------------------

BATCH                   25             

DSS                 25     

OLTP                    50     

OTHER_GROUPS                        100

SYS_GROUP       100

 

 

第三,建立MONTHEND--月底资源计划

参考4.1-4.2

 

Group/Subplan       level 1     level 2     level 3     level4  ......

---------------------------------------------------------------------------------------

BATCH                   100            

DSS                         50     

OLTP                            50     

OTHER_GROUPS                                100

SYS_GROUP       100

 

5)激活组的切换,MGR用户初始激活组是OLTP组,现在切换成DSS组。

 

session1 sys;

 

SQL>select resource_consumer_group from v$session where username='MGR';

 

resource_consumer_group

-----------------------

OLTP

 

session2,mgr:

 

declare old_grp varchar2(30);

begin

dbms_session.switch_current_consumer_group('DSS',old_grp,TRUE);

end;

/

 

session1 sys;

 

SQL>select resource_consumer_group from v$session where username='MGR';

 

resource_consumer_group

-----------------------

DSS

 

 

6)sys用户来切换某用户使用者组

 

execute dbms_resource_manager.switch_consumer_group_for_user('MGR','BATCH');

 

 

12.4 其他的资源指令和阀值

 

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)

目的是限制一组同时运行的SESSION数量,假设DSS组有8个用户,如果就让3个可以运行(active session)。可将某组最大激活数设为3,可以让3个运行(active session),那么另外的5个可以连接上来,但要排队等着激活。而排队也可设延迟时间,超时后就会报错。

 

2.2)限制并行度:

Oracle可通过参数设置并行度,如:parallel_max_servers,(创建一个并行执行服务器池),但是无法阻止任何人使用它,于是我们可以通过Resource Management加以限制。

 

2.3)通过执行时间控制作业

数据库中一个大型作业会挤掉其他用户性能,Threshold指令可以解决这个问题。到了时间阀值,按action的规定去做。

 

2.4)依据空闲时间终止session

不做任何事情的session浪费服务器资源,如PGA白白占用,idle time指令从两个方面限制这样的情况,比如某组的max idle time(秒)=1800,表示空闲了3分钟,block another session(秒)=30,表示把别人锁了30秒,这两种情况都会终止该session.

 

2,5)限制undo数据的产生

 

某些用户的大型事务可能填满undo表空间,如批处理事务不定期的提交,为了安全起见,可以对这里潜在的用户设置undo表空间使用上限,比如某组其undo pool设置为6G,当到达这个上限值后改session会被挂起,直至事务提交后释放池中的空间。

 

12.5 配置测试使用者组自动切换

 

举例,接续15.3的例子,假设MGR要运行大作业,每个组里都有MGR这个用户,但是不同的计划下这些组的优先级不同,可以设想MGR总能可以激活自己的一个组,而这个组的在某个激活的计划下优先级又最高,那么DBA可以限制他的行为,通过设置Threshold,以DAYTIME计划为例,OLTP组的Threshold设为10, ACTION 选switch to DSS组,这样一来,当某用户占用10秒时就被降级了。OLTP是level2/100,DSS是level3/50.

 

1)OEM使DAYTIME计划激活

 

2)设置上面的Threshold

 

3)session1 mgr:登录

 

4)session2 sys: 查看MGR当前组是OLTP

SQL>select resource_consumer_group from v$session where username='MGR';

 

5) session1 mgr:制造一个笛卡尔积查询

SQL>select count(*) from all_objects,all_objects;

 

6) session2 sys: 查看10秒后降级为DSS组

SQL>select count(*) from all_objects,all_objects;

 

12.6 考点:

 

1)SQL> show parameter resource

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

resource_limit                       boolean     FALSE

resource_manager_cpu_allocation      integer     1

resource_manager_plan                string      NIGHTIME

 

激活的资源计划有一个参数:resource_manager_plan,但是resource_limit这个参数与资源计划毫无关系。

 

2)赋给一个用户管理资源管理器的能力,需要系统权限 ADMINISTER RESOURCE MANAGER,而这个权限不是使用通常的grant方法授予的,只能使用oracle提供的包:DBMS_RESOURCE_MANAGER和DBMS_RESOURCE_MANAGER_PRIVS是有关资源管理器的PL/SQL API形式的最有用的两个包。

 

3)还是关于上面的两个包:

 

DBMS_RESOURCE_MANAGER_PRIVS 包负责:授予管理Resource Manager的权限,将用户放置到组中,从组中删除用户。DBMS_SESSION和DBMS_RESOURCE_MANAGER包 负责切换会话的有效组,创建使用者组,配置会话映射到组的方式。

 

4)在每个级别的总CPU使用率不能超过100%,如果超过的话,则挂起区域将无法验证并且其计划不能保存到数据字典,计划容许在一个级别分配的资源<100%,但这样做没有什么意义。

 

5) 会话池不限制会话的数量,限制的是活动会话的数量。

 

6)每个计划都必须包含一条针对OTHER_GROUPS组的指令。

 

7)关于会话池,活动会话如果没有提交,该会话仍然对该组的活动会话池计数有效。

 

8)每个组的undo pool与undo表空间配额无关,undo表空间是基于每个用户自动分配的,你甚至不可能授予undo表空间上的配额。

 

9)undo池针对的是整个组,不是单个用户或会话,如果一个组填满了它的池,属于该组的所有会话都会挂起,直到一个会话发出commit或rollback命令。

 

 

第十三章 Oracle 自动任务调度

 

13.1 Oracle任务调度概述

 

在Oracle中任务调度指某一(组)执行程序在特定的时间被周期性的执行。Oracle把任务调度称为job(作业)。

 

Advanced Scheduler Concepts:(PPT:450)

 

        ----------------------  ---------------------  ---------------------

        |     Resource       |  |       Resource    |  |      Window      |

        |   consumer group   |  |         plan      |  |       group      |

                ----------------------  ---------------------  ---------------------                           

                            |                          |                 |                        

                            |                          |                 |

 ---------------    ------------------             -------------------------

 | Job Chain   |    |   Job class    |             |       Window          |

 ---------------    ------------------             -------------------------

        |                   |                          |

        |                   |                          |

        --------------------------------    ------------

                                       |    |

                                       |    |

     -----------------          ------------------         -----------------

     |   Program     |----------|      Job       |---------|   Schedule    |

     -----------------          ------------------         -----------------

            |                           |                          |

            |                           |                   |-------------|

         Arguments                  Arguments              Time         Event          

  

13.2 理解以下概念:

 

1) SCHEDULER下的jobs

 

   JOB翻译为作业,一个基本的JOB由两方面组成:program和schedule。JOB总体上可分为两大类,基于时间的JOB和基于事件的JOB。在Oracle 10g之前,采用dbms_job程序包来完成任务调度的相关工作。在Oracle 10g之后,Oracle推出了功能更加强大的dbms_schedule来完成作业调度工作。

 

*考点:必须将JOB_QUEUE_PROCESSES 实例参数设置为>0的值,否则调度程序将无法运行,默认值为1000。如果有任何定义的、活动的作业,那么总是运行作业队列协调器(后台进程cjq0)。

 

SQL> show parameter job_queue_processes

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

job_queue_processes                  integer     1000

 

SQL> select program from v$process where program like '%J%';

 

PROGRAM

------------------------------------------------

oracle@timran.localdomain (J000)                //(J000)表示有一个job进程在运行,根据参数可以有1000个

oracle@timran.localdomain (CJQ0)

 

2) SCHEDULER下的program

 

Program指的是运行的程序。包括具体的要操作的执行代码,可以有下列三种类型:

 

PL/SQL BLOCK :标准的pl/sql代码块;

STORED PROCEDURE :编译好的PL/SQL存储过程,或者Java存储过程,以及外部的c子程序;

EXECUTEABLE :ORACLE数据库之外的应用,比如操作系统命令等等。

 

3) SCHEDULER下的scheduler

 

Scheduler有的资料翻译为调度,有的翻译成时间表,简单来说指的就是作业运行的时间和频率。

 

如果不考虑与资源计划的结合,Schedules(调度);Programs(程序);Jobs(任务)这三者之间到底是个什么关系?

 

直白地来说就是:program负责具体做什么(左膀),scheduler负责什么时候做(右臂),job就简单了(联手左膀右臂),一个字:做!

 

4)JOB CLASSES

 

相当于创建了一个job组,可以将那些具有相同特性的job,统统放到相同的Job Classes中,然后让Job Classes与资源计划器结合进行管理。

 

5)WINDOW

 

窗口指定了作业运行的起始时间和终止时间,它实际上扩展了SCHEDULER(时间表)的概念,窗口也可以激活资源管理计划,这个意义在于ORACLE可以根据优先权在窗口内调度作业来运行。

 

6)JOB CHAIN

 

CHAIN可以被视做一组Programs的复合,举个简单的例子:运行PROGRAM:A以及PROGRAM:B,如果成功的话继续运行PROGRAM:C,否则的话运行PROGRAM:D。Programs:A、B、C、D以及执行的逻辑关系就构成了一个最简单的CHAIN。

 

13.3 例子

 

下面我们通过实例来演示,如何创建program、schedule、job,以便能初步理解三者间的关系。

 

先建一个测试表

 

SQL> create table scott.job_test1(my_date date);

 

第一步,创建一个名叫my_pro1的program,(带PL/SQL BLOCK)操作如下:

 

BEGIN

DBMS_SCHEDULER.CREATE_PROGRAM(

program_name    =>'my_pro1',

program_action  =>'begin

             insert into scott.job_test1 values(sysdate);

             commit;

          end;',

program_type    =>'PLSQL_BLOCK',

number_of_arguments =>0,

comments    =>'insert sysdate into table',

enabled     =>TRUE);

END;

/

 

PL/SQL procedure successfully completed.

  

通过上述语句,我们定义了一个program,类型是一个oracle匿名块,其动作是将输入sysdate插入到scott.job_test中。

 

第二步:我们建立一个schedule,规定开始program的操作时间,及操作频率。这里定义了30秒执行一次。此处repeat_interval可根据实现情况进行修改。

 

BEGIN

dbms_scheduler.create_schedule(

repeat_interval  => 'FREQ=SECONDLY;INTERVAL=30',

start_date  => sysdate,

comments     => 'Start Every 30 seconds',

schedule_name    => 'my_sch1');

END;

/

 

第三步:创建job,按照指定的schedule,执行program,创建job时,start_date,repeat_interval,job_action等均无须指定,因为这些参数将由program和schedule来控制。操作如下:

 

BEGIN

dbms_scheduler.create_job(

job_name     => 'my_job1',

program_name     => 'my_pro1',

schedule_name    => 'my_sch1',

comments     => 'insert sysdate into table',

enabled      => TRUE);

END;

/

 

 

这样,操作完成后,ORACLE就会自动定时(当前设置为30秒执行一次)program中定义的操作。

 

检查结果:

 

SQL> select * from scott.job_test1;

 

MY_DATE

-------------------

2012-11-22 15:56:13

2012-11-22 15:56:43

2012-11-22 15:57:13

......

 

 

也可以通过*_scheduler_job_run_details即可查询

 

例如,查看刚刚创建的"MY_JOB1"任务的执行情况,执行命令如下:

 

SQL>select log_id, log_date, status, additional_info

from user_scheduler_job_run_details

where job_name = 'MY_JOB1';

;

 

禁用作业:

 

SQL> exec dbms_scheduler.disable('my_job1');

 

13.4 通过调度程序窗口控制一个计划

 

例;使用调度程序自动激活DAYTIME计划

 

1)运行下列查询看激活的窗口

 

select WINDOW_NAME,ACTIVE from dba_scheduler_windows;

 

2)看哪个资源计划是活动的

 

select * from v$rsrc_plan;

 

3)暂时清除当前活动计划

 

SQL> alter system set resource_manager_plan='' scope=memory;

 

4)建立一个叫DAY_WIN的窗口,该窗口将激活DAYTIME计划

 

exec dbms_scheduler.create_window(-

window_name=>'day_win',resource_plan=>'daytime',-

start_date=>trunc(systimestamp) + 6/24,repeat_interval=>'freq=daily',-

duration=>'0 12:00:00',comments=>'daily at 6AM');

这将从现在开始,每天早晨6:00打开窗口,持续12小时。

 

5)强制数据库立即打开窗口

 

exec dbms_scheduler.open_window(-

window_name=>'day_win',duration=>'0 00:05:00',force=>true);

 

这将立即打开窗口,激活DAYTIME计划。重复1),2)步骤再查看。

13.5 Window和Job Class

 

Job class 将一个job或多个job与一个resource plan联系起来,而resource plan又可以通过window激活,这种设计又特殊的意义:Oracle可以根据相对优先权在window内调度作业运行,此外,window也可以激活resource plan.

 

多个job加入到class中,如果这个class被调度在同一窗口下,则根据设定的优先值从1-5顺序执行,1首先被执行,默认是3。

 

*考点:

1)当create job过程创建作业时,无法指派优先级,必须在后面使用API的set attribute过程

2)作业A在其类中的优先级是1,作业B的优先级是5,作业B处于resource plan中有更高的优先权的使用者组内,则A在B后被执行。

 

第十四章 AWR与警报系统

 

14.1 Oracle数据库采样ASH和AWR。

 

1) ASH(Active Session History)

 

ASH以v$session为基础,每秒采样一次,ASH只记录活动会话等待的事件,不活动的会话不会采样,采样工作由后台进程MMNL来完成,大部分采样数据在内存里。而有一部分采集信息存入了AWR库。

 

生成ASH报告:

 

SQL> @/u01/oracle/rdbms/admin/ashrpt.sql

 

2) AWR(Automatic Workload Repository)

 

AWR报告是从oracle 10g开始提供的一种性能收集和分析工具,它的前身Statspack,Statspack在10g和11g中也有提供。AWR的作用是提供一个时间段内整个系统资源使用情况的报告,通过这个报告,我们就可以了解一个系统的整个运行情况,这就像给一个人做全面体检一样。

 

*考点:

AWR工作时是由后台进程MMON负责,于每1小时生成一个内存统计的快照,积累的快照(快照集)会定时写入磁盘上的sysaux表空间,快照不能移动到其他位置,快照也会作为ADDM的原始数据,缺省情况下,Oracle将快照保留8天。

 

生成AWR报告,注意是你确定的起始快照至结束快照之间的报告。

 

SQL> @/u01/oracle/rdbms/admin/awrrpt.sql

 

14.2 相关的一些概念:

 

1) AWR统计信息:就是快照的原始数据。

 

2) AWR指标(metrics): 两个或多个统计数据综合的结果。

 

3) AWR基准线(baseline)。是一种快照集,由多个快照组成。只不过它的是作为用来衡量和比较性能好坏的依据。基准线分为静态基准线和移动窗口基准线。

 

4) 与AWR有关参数

SQL> show parameter statistics_level

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

statistics_level                     string      TYPICAL

SQL>

 

若参数STATISTICS_LEVEL设置为TYPICAL或ALL将默认启用AWR来采集数据库统计信息。ALL参数收集信息最全,参数的默认值是TYPICAL,

 

*考点:

如果STATISTICS_LEVEL设为BASIC,将禁用收集快照和运行顾问。但你仍可以通过DBMS_WORKLOAD_REPOSITORY包来手动获得AWR统计信息。

 

 

14.3 ADDM (Automatic Database Dianostic Monitor)

 

14.3.1 概念

 

ADDM相当于Oracle内部的一个顾问系统,它能够自动的完成对数据库的一些优化建议,它是根据AWR每小时采集的数据,看看有没有性能问题,如果有就给出建议调用各个相关的指导(Advisor),比如建议做SQL Tuning Advisor, 或SQL Access Advisor,或者建议创建相关索引,总之, 给出建议是ADDM作为一个顾问的特色,就像医生给病人看病。

 

ADDM的另一个特点是自动生成的ADDM报告,默认它会包括当前快照和前一个快照的时间段,如果想要ADDM跨越更长的时间段,也可以手动调用ADDM生成包括任意两个快照间的时间段。

 

*考点:收集AWR快照时自动生成ADDM报告,也可以根据需要生成ADDM报告,默认情况下ADDM报告保存30天。

 

ADDM 报告生成:

 

SQL> @/u01/oracle/rdbms/admin/addmrpt.sql

 

例:

 

1)为了演示效果,清除所有AWR快照和ADDM报告

 

2)手工即时AWR快照

exec dbms_workload_repository.create_snapshot;

 

3)模拟业务高峰

create table scott.test1 as select * from all_objects;

 

begin

for i in 1..10 loop

insert into scott.test1 select * from all_objects;

delete scott.test1;

end loop;

commit;

end;

/

 

4)再次手工即时AWR快照

exec dbms_workload_repository.create_snapshot;

 

进入OEM,后查看两次快照的AWR报告和ADDM报告。

 

 

14.3.2 其他顾问 (Advisor)

 

顾问就是通过分析AWR捕获的数据,提出改进性能的建议。ADDM本身就是顾问,它的报告里还会建议你找其他的顾问。具体病症还要看专科。

 

Oracle 11g 主要的一些Advisor:(PPT:358)

 

1)SQL Advisors 其中包括:

 

SQL Tuning Advisor: 对单个SQL语句提供调优建议

SQL Access Advisor: 对整个负载(包含多个SQL语句)提供调优建议。

SQL Repair Advisor: 对可能的oracle内部错误,如ORA-600需要的patch(补丁)提出建议

 

2)Memory Advisors:可以对Oraclen内存结构(SGA+PGA)做自动调整,以适应数据库在不同时间段的工作量变化。

 

3)Segment Advisor: 对比较稀疏的对象提供收缩命令(shrink).

 

4)Undo Advisor: 为undo表空间的大小提供建议,如避免快照太旧的问题。

 

5)MTTR Advisor:为实例恢复的时间提供建议。

 

等等

 

14.4 自动维护作业 AutoTask

 

*考点:有三个自动维护的任务:1)ADDM收集优化器统计信息,2)Segment Advisor,3)SQL Tuning Advisor。这些顾问在维护窗口中自动运行。默认方式下,维护窗口从工作日的22点开始运行4小时,周六周日,从早上6点开始运行20小时。

 

14.5 使用服务器生成警报系统

 

从10g开始,Oracle数据库凭借警报系统一举实现了‘自我管理’。警报系统顶替了大量的单调工作,它将监视很多可能导致问题的条件,有状态警报和无状态警报之分,警报必须使用阀值配置,11g有200多种阀值,它们存在于AWR中,此后,MMON后台进程将实施监控,并将当前状态与阀值比较,比如当表空间达到全满的85%时发出警告性警报,达到97时将发出严重警报。

 

14.5.1 阀值的设置方法

 

有API和OEM两种方法、OEM方法;HOME主页-->Relete Link-->Metric and Policy settings

 

14.5.2 有状态警报和无状态警报

 

有状态警报:基于持久保存的可修复条件,比如表空间的使用。

无状态警报:事件发生后又消失了,比如查询因‘快照太旧’而失败。

 

14.5.3 通知系统

 

需要除默认配置外其他通知方法,需要进行三个级别的配置

 

1)必须配置通知方法    OEM->右上角setup链接

2)必须创建规则来捕获事件  OEM->右上角Preferences链接

3)管理员必须订阅规则      Preferences链接->左边Administrators

 

*考点:

1)警告由MMON后台进程而非EM引发,EM只管读取警报,自己或第三方编写的事件处理程序也同样可以。

2)有状态警报默认机制是在OEM主页上显示,并将它们写入了dba_outstanding_alerts视图,如果问题解决了,则可能将其清除,然后保存到dba_alert_history视图中,而无状态警报直接写入dba_alert_history视图。

 

 

第十五章:Oracle 性能调优

 

15.1 SQL的硬解析和软解析

 

  1)parse分析语法语义

 

    i)  从共享池的库缓冲区搜索,该语句是否执行过,凡是执行过的sql语句,oracle会使用HASH函数计算,产生一个很小的文本记录,          如果是第一次执行则进入第二步。

 

    ii) 检查语法,权限(权限的信息放在oracle的数据字典当中。oracle先从共享池的数据字典缓冲区中搜素,如果没有,再从数据文件         (system表空间的数据文件)当中读取, 然后,存放在数据字典缓冲区,以便共享。

 

    iii)分析过程中,对访问到的表进行锁操作,目的是保护表的结构不被修改,优化器会根据数据的存储结构(表的存储结构),统计          信息,计算读取的代价,生成执行计划同时编译并存储在共享池的缓冲区中

 

  2)BIND 绑定变量

         优化器会考虑绑定变量来确定执行计划,Oracle强烈建议有条件的情况下对于OLTP类应用使用绑定变量,因为可以减少SQL PARSE。     使用绑定变量也可能有负作用,就是对于访问具有倾斜的列(离散度低,某些值过于集中),有可能制定了一个不好的执行计划。11g在     这方面有了切实的改进,解决了以往的band peeking(9i)的负面问题。

 

  3)建立计划

 

  4)执行库池里的执行计划, 返回结果(sql硬解析从1)开始,软解析从4)开始)

 

使用绑定变量的两个例子;

 

例1

 

SQL> alter system flush shared_pool;

 

SQL> select * from scott.emp where empno=7788;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7788 SCOTT      ANALYST         7566 1987-04-19 00:00:00       3000                    20

 

SQL> select * from scott.emp where empno=7902;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

 

where后面再加一个空格:

SQL> select * from scott.emp where  empno=7902;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7902 FORD       ANALYST         7566 1981-12-03 00:00:00       3000                    20

 

 

SQL> col sql_text for a60;

 

SQL> select sql_text,parse_calls from v$sql where sql_text like 'select * from scott.emp where%';

 

SQL_TEXT                                                     PARSE_CALLS

------------------------------------------------------------ -----------

select * from scott.emp where  empno=7902                              1

select * from scott.emp where empno=7902                               1

select * from scott.emp where empno=7788                               1

 

SQL>

使用BIND变量看看:

 

SQL> variable i number;

SQL> exec :i :=7900;

 

SQL> select * from scott.emp where empno=:i;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7900 JAMES      CLERK           7698 1981-12-03 00:00:00        950                    30

 

SQL> exec :i :=7499;

 

SQL> select * from scott.emp where empno=:i;

 

     EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO

---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------

      7499 ALLEN      SALESMAN        7698 1981-02-20 00:00:00       1600        300         30

 

SQL> select sql_text,parse_calls from v$sql where sql_text like 'select * from scott.emp where%';

 

SQL_TEXT                                                     PARSE_CALLS

------------------------------------------------------------ -----------

select * from scott.emp where  empno=7902                              1

select * from scott.emp where empno=7902                               1

select * from scott.emp where empno=:i                                 2

select * from scott.emp where empno=7788                               1

 

例2:

 

---------

带绑定变量的查询

create table scott.m1(x int);

create or replace procedure proc1

as

  begin

    for i in 1..10000

    loop

        execute immediate

        'insert into scott.m1 values(:x)' using i;

    end loop;

  end;

/

 

---------不带绑定变量的查询

create table scott.m2(x int);

create or replace procedure proc2

as

  begin

    for i in 1..10000

    loop

        execute immediate

        'insert into scott.m2 values('||i||')';

    end loop;

  end;

/

---------两项分别执行,比较效率

 

SQL> set timing on;

SQL> exec proc1

 

PL/SQL 过程已成功完成。

已用时间:  00: 00: 01.21

 

SQL> exec proc2

 

PL/SQL 过程已成功完成。

已用时间:  00: 00: 09.98

 

 

15.2 11g内存管理

 

Oracle11g比较大的改进之一,是在Oracle实例的内存管理方面,也就是Oracle11g中的新的内存管理特性--自动化内存管理(automatic memory management,AMM)。它将SGA和PGA统一分配,其作用是实现了SGA和PGA之间自动转换内存空间。

 

15.2.1内存组件管理历史

 

手动PGA和SGA管理 (8i之前)

自动PGA 管理 (9i)

自动SGA管理  (10g)

自动memory管理 (11g)

 

 

15.2.2 AMM的新增内存参数

 

memory_target:

该参数设置整个oracle数据库实例可以使用的内存量,自动的调节SGA与PGA的大小。该参数是可以动态调整的初始化参数。

 

memory_max_target:

该参数设置Oracle实例可以使用的最大内存量。memory_target<=memory_max_target.这个参数是静态初始化参数。

 

如果你不想设置SGA与PGA的最小值,可以把sga_target与pag_aggregate_target初始化参数都设置为0。

 

15.2.3 从10g的自动sga和自动pga过渡到11g全自动内存管理。

 

1)得到SGA当前值

 

show paremeter SGA_TARGET,//比如是600M

 

2)执行以下查询,确定PGA给定时间内的最大值

 

SQL> select value/1024/1024 from v$pgastat where name='maximum PGA allocated'; //比如是300M

 

如果执行了下列语句,你将得到一个错误的PGA估计值

 

SQL> show parameter pga_aggregate_target; //比如是2G, 比300M大多了,其实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

 

 

15.2.4 自动内存管理的相关性

 

当你设置了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组件(一共五个),则将作为最小大小值(下限值)被参考。

 

15.2.5 检查内存组件的当前值

 

SQL> select * from v$memory_target_advice order by memory_size;

 

MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR    VERSION

----------- ------------------ ------------ ------------------- ----------

        303                .75          190              1.0008          1

        404                  1          190                   1          1

        505               1.25          190                   1          1

        606                1.5          190                   1          1

        707               1.75          190                   1          1

        808                  2          190                   1          1

 

 

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

 

总之:11g 在简化 DBA 基本工作上还是下了很大功夫。可是这样也掩盖了一些技术细节,Oracle 正在逐步把内存的管理变成一个黑盒子,当然这也是相关算法更加稳定作为基础的。总体来说,利大于弊。

 

15.3 查看Oracle的执行计划:

 

15.3.1 使用AUTOTRACE

 

sys用户缺省配置了autotrace。它只能在SQL*PLUS里使用。作用:自动跟踪为SQL语句生成一个执行计划,并提供与该语句的处理有关的统计。

 

常用命令

 

SQL>set autotrace on;

SQL>set autotrace traceonly explain;    //仅显示执行计划策略。

 

15.3.2 使用SQL Trace和TKPROF

 

SQL Trace:跟踪SQL语句的执行,输出结果放在参数background_dump_dest指定的目录下,扩展名.trc

 

TKPROF把SQL Trace输出的跟踪文件转化成可读的格式。

 

这两个都是Oracle实用程序,如果把上节的AUTOTRACE比喻成售前,SQL Trace工具捕获的是SQL查询实际的执行效果。那就相当于售后。

 

15.4 SQL计划管理 SPM

 

SQL的一些顾问可以调优SQL语句,但最多是一种被动的机制,而且需要DBA干预。而SPM(SQL Plan Management)可以提供一种预防性的机制,为保持执行计划始终处于最优状态。Oracle引入SQL计划基线的概念,目的是使SQL执行计划得以进化。

 

15.4.1 概念:

 

如果一条语句经常被使用,Oracle为了防止因数据库环境的变化造成原执行计划出现性能退化,又会生成新的执行计划。

 

既然优化程序可以对一条语句生成若干执行计划,累积的这些计划组成了一部计划历史,在其中有标记为accepted的计划,这样的计划是比较优异的(成本较低的),计划基线就是计划历史中那些accepted的执行计划。生成一条语句的最初的计划肯定是accepted, 因为它无从比较。

以后再生成的几乎就可以同计划基线去比较了。

 

15.4.2 一个计划成为计划基线的两种办法;

 

1自动捕获; 设OPTIMIZER_CAPTURE_SQL_PLAN_BASELINESE为TRUE,数据库自动捕获新计划,但新计划不管是否优异,暂不列入accepted计划行列,要以观后效,一个未认可的计划必须优于认可的计划才能进化为计划基线。

 

2手动装载; 手动在数据库中装载它们,一般是升级或已经测试过的,新计划直接列入accepted。因为你装载的计划是你自认为最优的计划。

 

15.4.3 管理SPM

 

可以利用Oracle提供了DBMS_SPM程序包或OEM管理SQL计划基线。

 

15.5 Database Replay(数据库重放)

 

软件和硬件环境会发生变化,如升级操作系统,扩容硬件,新应用程序添加等。Database Replay 通过捕获生产服务器上的工作负荷,然后在测试系统上重放工作负荷,以此来评估测试系统上的性能变化。

 

使用Database Replay时有四个步骤:

 

1)捕获工作负荷

2)预处理工作负荷

3)重放工作负荷

4)分析和报告

 

考点:一个重放客户端可以重放来自许多会话的语句。

 

 

附录 Oracle一周备份计划范例

(基于Linux的 RMAN CATALOG备份策略(选))

 

前言

    对于 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

 

        文件内容包含调用 @@/<dir>/connect.rcv以及run{execute global script scriptname;}exit;       

 

    5.编辑第4步的三个文件分别为inc0.sh,inc1.sh,inc2.sh

 

        nohup  $ORACLE_HOME/bin/rman  cmdfile=/u03/bk/scripts/inc1.rcv log=/u03/bk/scripts/inc0.log append &   

 

    6.使用crontab制定备份计划    

 

具体实现

 

    1.连接脚本

 

        connect.rcv文件内容

            connect catalog rman/rman@david;

            connect target sys/oracle@austin;

 

        catalog的通用脚本

            rman cmdfile=/u03/bk/scripts/connect.rcv --(在rman中使用外部脚本)

            相当于:

        rman catalog rman/rman@david target sys/oracle@austin   --使用该脚本连接后创建通用脚本

 

    2.建立通用脚本

 

        --删除不必要的备份

 

RMAN> create global script global_del_obso  comment 'A script for obsolete backup and delete it' {

crosscheck archivelog all;

delete noprompt expired archivelog all;

allocate channel ch1 device type disk;

delete noprompt obsolete recovery window of 7 days; 

release channel ch1;

}

 

        --备份控制文件脚本

 

RMAN> create global script global_bkctl comment 'A script for backup control file'{

allocate channel ch1 device type disk;

backup as compressed backupset

current controlfile reuse

format='/u03/bk/backupctl.ctl'

tag='bkctl';

release channel ch1;

}

 

        --备份归档日志脚本

 

 

RMAN> create global script global_arch comment "backup archivelog and then delete it" {

allocate channel ch1 device type disk;

allocate channel ch2 device type disk;

sql "alter system archive log current";    --归档当前的联机日志

set limit channel ch1 readrate=10240;        --(读取速率10M)            

set limit channel ch1 kbytes=4096000;        --(备份片的大小)   

backup as compressed backupset

format='/u03/bk/arch_%d_%U'

tag='bkarch'

archivelog all delete input;

release channel ch1;

release channel ch2;

}   

 

 

        --使用list查看所有的已建立的全局脚本

 

        list global script names;               --(列出所有的脚本)

 

        delete globals script script_name;      --(删除脚本)        

 

        RMAN> list global script names;

 

    List of Stored Scripts in Recovery Catalog             

 

    Global Scripts

                      

   Script Name

 

   Description

 

        -----------------------------------------------------------------------

 

        global_arch

 

       backup archivelog and then delete it

           

        global_bkctl

 

       A script for backup control file

           

    global_del_obso

   

    A script for obsolete backup and delete it

 

 

    3.创建0,1,2级增量备份脚本(注:每个脚本备份前会执行删除过旧的备份,脚本尾部会调用另外两个脚本来备份归档日志及控制文件)

 

--创建0级增量备份

 

RMAN> create global script global_inc0 comment "backup database as incrmental level 0"{

execute global script global_del_obso;

allocate channel ch1 device type disk;

 

allocate channel ch2 device type disk;

set limit channel ch1 readrate=10240;

set limit channel ch1 kbytes=4096000;

set limit channel ch2 readrate=10240;

set limit channel ch2 kbytes=4096000;

backup as compressed backupset

incremental level 0 database

 

format='/u03/bk/inc0_%d_%U'

tag='inc0';

release channel ch1;

release channel ch2;

execute global script global_arch;

execute global script global_bkctl;

 }

           

 

--创建1级增量备份       

 

RMAN> create global script global_inc1 comment "backup database as incrmental level 1"{

execute global script global_del_obso;

allocate channel ch1 device type disk;

allocate channel ch2 device type disk;

set limit channel ch1 readrate=10240;

set limit channel ch1 kbytes=4096000;

set limit channel ch2 readrate=10240;

set limit channel ch2 kbytes=4096000;

backup as compressed backupset

incremental level 1 database

format='/u03/bk/inc1_%d_%U'

tag='inc1';

release channel ch1;

release channel ch2;

execute global script global_arch;

execute global script global_bkctl;

}

 

 

--创建2级增量备份       

 

RMAN> create global script global_inc2 comment "backup database as incrmental level 2"{

execute global script global_del_obso;

allocate channel ch1 device type disk;

allocate channel ch2 device type disk;

set limit channel ch1 readrate=10240;

set limit channel ch1 kbytes=4096000;

set limit channel ch2 readrate=10240;

set limit channel ch2 kbytes=4096000;

backup as compressed backupset

incremental level 2 database

format='/u03/bk/inc2_%d_%U'

tag='inc2';

release channel ch1;

release channel ch2;

execute global script global_arch;

execute global script global_bkctl;

}

 

       

--在rman中检验在rman中写的脚本global_inc0、global_inc1、global_inc2,因为RMAN不会自动检查,下面的语句用来执行脚本(检验)

 

RMAN> run{

execute global script global_inc0;

execute global script global_inc1;

execute global script global_inc2;

 }

       

        --查看备份完成情况

 

            list backupset summary;

 

 

 

    4.建立shell脚本,让linux自动执行脚本

 

        a. vi inc0.rcv,inc1.rcv ,inc2.rcv   --注意不同的文件执行不同的备份脚本

 

            @@/u03/bk/scripts/connect.rcv       --(rman下的脚本去调用其他脚本用@@符号)(调用脚本不需要分号)

 

            run{

            execute global script gloal_inc0;

            }

            exit;

 

    

 

        b. 编辑shell文件   

 

            vi inc0.sh

 

                nohup  $ORACLE_HOME/bin/rman  cmdfile=/u03/bk/scripts/inc0.rcv log=/u03/bk/scripts/inc0.log append &

 

            vi inc1.sh

 

                nohup  $ORACLE_HOME/bin/rman  cmdfile=/u03/bk/scripts/inc1.rcv log=/u03/bk/scripts/inc0.log append &

 

            vi inc2.sh

 

                nohup  $ORACLE_HOME/bin/rman  cmdfile=/u03/bk/scripts/inc2.rcv log=/u03/bk/scripts/inc0.log append &   

 

            --注意:nohup与&表示将脚本放入后台执行    

 

 

        c.使用crontab建立一个备份计划

 

        crontab -e  

 

            #min    hour    date  mon  day(星期)    command

 

            30        1      *     *    0           /u03/bk/scripts/inc0.sh

 

            30        1      *     *    1           /u03/bk/scripts/inc2.sh

 

            30        1      *     *    2           /u03/bk/scripts/inc2.sh

 

            30        1      *     *    3           /u03/bk/scripts/inc2.sh

 

            30        1      *     *    4           /u03/bk/scripts/inc1.sh

 

            30        1      *     *    5           /u03/bk/scripts/inc2.sh

 

            30        1      *     *    6           /u03/bk/scripts/inc2.sh

    

 

        d.重启crontab服务(如果没有启动)

 

            # /sbin/service crond status  --用于检查crontab 服务状态

 

            # /sbin/service crond stop //关闭服务

 

            # /sbin/service crond restart //重启服务

 

            # /sbin/service crond reload //重新载入配置

 

           

            使crontab服务在系统启动的时候自动启动:

 

                在/etc/rc.d/rc.local这个脚本的末尾加上:

 

                /sbin/service crond start

 

 

        e.从上面的备份策略来看,即

 

            周日执行0级增量备份,相当于全备

 

            周一,周二,周三执行2级增量备份

 

            周四执行1级增量备份

 

            周五,周六执行2级增量备份

   

 

        f.编辑好的shell 脚本测试

 

            chmod 755 *.sh         --给shell脚本加权限

 

            测试脚本  例如./inc0.sh

 

       

总结

 

    1.backup controlfile in each scripts tail (在脚本的尾部备份控制文件)

 

    2.Delete obsolete backupset in each scripts threshold (删除旧的备份)

 

    3.Switch logfile before backup database; (在数据库备份以前切换日志,备份联机重做日志)

 

    4.Chmod u+x*.sh

 

 

 

 

 

 

 

posted @ 2013-09-04 22:18  cphmvp  阅读(1266)  评论(0编辑  收藏  举报
爬虫在线测试小工具: http://tool.haoshuju.cn/