PL/SQL笔记5

来源:互联网 发布:南联盟大使馆被炸 知乎 编辑:程序博客网 时间:2024/06/06 02:20


函数
函数也是编译好且存储在数据库服务器上的程序代码
函数必须有返回值
(1) 函数的创建
create or replace function F2(par1 in number default 500)
return number
is
  v1 number;
begin
  select 1 into v1
  from deual;
  return(v1);
end;


(2) 函数的调用 
在SQL语句中调用函数
select F1(1) from dual;
在赋值语句中调用函数 
a:= F1(1);
在表达式中调用函数
if F1(1)  + 7 > 10000
then


没有参数的函数调用
select F3 from dual;




(3) 函数的编译
如果函数变的无效,需要对函数进行编译
alter function 函数名 compile;


(4) 函数的删除
drop function 函数名 #drop any procedure权限


(5) 函数使用技巧
使用函数返回结果集
SQL> create or replace package pack_return_result    --定义包头
  2  as
  3    type type_cursor is ref cursor;
  4    procedure pro_getresult(p in out type_cursor);
  5  end pack_return_result;
  6  
  7  /      


Package created.


create or replace function fun_getresult
return pack_return_result.type_cursor
is
  p pack_return_result.type_cursor; --定义游标变量
begin
  open p for 
    open p for select deptno,dname,loc from jiang.dept where deptno >20;
  return(p);
end;
  
SQL> set serveroutput on
SQL> variable v_bind_ref refcursor
SQL> execute :v_bind_ref := fun_getresult();
SQL> print v_bind_ref;


在函数中执行DDL
利用动态SQL(execute immediate或者DBMS_SQL包)
create or replace function F4(tablename IN varchar2)
return number;
is
  pragma autonomous_transaction;
  v1 number;
begin
  execute immediate 'create table ' || tablename || ' (name varchar2(20))';
  return(v1);
end;


运行函数
declare
  v_r number;
begin
  v_r := F4('bbcc');
end;


在函数中执行DML
create or replace function f_phone 
return varchar2
begin
  insert into phone_info values ('3310','诺基亚',111);
  commit;
  return 'ok';
end;


在块中调用
declare
  v_r varchar2(200);
begin
  v_r := f_phone;
  dbms_output.put_line(v_r);
end;




通常情况下,不允许在查询语句中使用含有DDL或者DML语句的函数。
若还是想使用它们,必须使用自治事务(Autonomous Transactions, AT)解决。
自治事务是由一个事务调用的,调用它的事务叫主事务(Main Transaction, MT)。
create or replace function f5(tablename in varchar2)
return number;
is
begin
  execute immediate 'create table ' || tablename || ' (name varchar2(20))';
  return(v1);
end;


在select中调用:
SQL> select f5('tab_f5') from dual;
ORA-14552: 在查询或DML中无法使用DDL,提交或回退


将创建f5函数改为:
create or replace function f5(tablename IN varchar2)
return number;
is
  pragma autonomous_transaction;
  v1 number := 88;
begin
  execute immediate 'create table ' || tablename || ' (name varchar2(20))';
  return(v1);
end;
  


从数据库中获取创建函数的脚本:
select text from user_source where name = 'F4' and type = 'FUNCTION';




(6) 常用函数
常用数字型函数
abs(n)
......
to_char(n)


常用字符型函数
chr(n) 返回数字n对应的字符
initcap(c)
.....
nvl(c1,c2)


常用日期型函数
add_months(n)
last_day(d)
months_between(d1,d2)
next_day(d,w)
round(date,format)
sysdate
systemstamp
to_char
to_date
trunc(date,format)


包:
包由包头和包体组成,同样存储在数据库的数据字典中。
可以被包集成的对象有:存储过程,函数,游标,变量,常量,异常,PL/SQL表和记录类型
(1) 包的优点
隐藏商业规则,提高数据安全性
提高程序的执行的效能,当第一次调用包时,包被整体读入内存,后续的调用不会耗用额外的I/O
加强程序开发的模块化
能够为用户提供全局的信息
方便利用面向对象的设计思想进行程序设计


(2) 创建包(创建包需要有create procedure权限)
创建包头:
create or replace package pack_first 
as
  b varchar2(10); --定义变量
  c_id constant number := 50; --定义常量
  type emprectype is record --定义类型
  (
    emp_id int,
    salary real);
  );
  
  cursor caller_cur return emprectype; --定义游标变量
  invalid_salary exception; --定义异常变量
  function hire_employee(comm in real, deptno in real) return int; --定义函数
  procedure fire_employee(emp_id int, v3 int varchar2); --定义存储过程
end pack_first;




(3) 让其他用户使用包
包是一个对象,只能整体授权。不能把包中一个对象的使用权限单独授予某个用户
grant execute on pack_first to 用户;


(4) 包的编译
如果包变得无效,可以对包重新进行编译
alter package pack_first compile package; --对包进行编译包括包头和包体
alter package pack_first compile specification; --对包头进行编译
alter package pack_first compile body; --对包体进行编译


(5) 删除包
drop package body pack_first; --删除包体,包头仍然存在,可以用来重新构建包
drop package pack_first; --删除包


(6) 包中存储过程和函数的重载
create or replace package pkg_student 
as
  procedure f_get_infor(p_studentID in student.id%TYPE);
  procedure f_get_infor(p_name in student.name%TYPE);
end pke_student;
/


create or replace package body pkg_student   
as
  procedure f_get_infor(p_studentID in student.id%TYPE)
  is 
    v_id int;
    v_name varchar2(200);
    v_city varchar2(20);
  begin
    select id,name,city into v_id,v_name,v_city
    from student
    where id = p_studentID;
    dbms_output.put_line('ID: ' || v_id || ' NAME: ' || v_name || ' CITY: ' || v_city);
  end f_get_infor;
  
  procedure f_get_infor(p_name in student.name%TYPE)
  is 
    v_id int;
    v_name varchar2(200);
    v_city varchar2(20);
  begin
    select id,name,city into v_id,v_name,v_city
    from student
    where id = p_name;
    dbms_output.put_line('ID: ' || v_id || ' NAME: ' || v_name || ' CITY: ' || v_city);
  end f_get_infor;
end pkg_student;


重载的注意事项:
如果两个函数仅仅是名字或者参数的模式上(in, out, in out)不同,不能算为重载
返回值的类型不同不能算重载
重载函数的参数类型不能属于同一族,比如char和varchar2


(7) 查看包中的存储过程和函数
使用desc命令或者查询字典视图DBA_PROCEDURES
select object_name,procedure_name from DBA_PROCEDURES where owner = 'SCOTT' and object_name = 'PACK_LIST';

desc PACK_LIST;








********数据库的备份**********
数据库备份分为
物理备份:对数据库的物理文件的备份,包括数据文件,归档日志文件,控制文件等

逻辑备份:利用Oracle导出工具导出数据库的逻辑对象,把它们存放在二进制文件中
注:逻辑备份会导致数据的丢失,除非是只想利用它备份历史数据,否则不要使用逻辑备份。


物理备份又被分为冷备份和热备份


(1) 数据库故障种类
实例失败:
机器突然掉电,操作系统突然宕掉,Oracle后台进程失败,或者shutdown abort命令关闭数据库都会导致实例失败
实例失败时,内存中的数据没有及时写入数据文件中,导致数据文件不一致。实例失败后需要进行实例恢复。
数据库启动时,Oracle会自动执行实例恢复,实例恢复不需要用户的干预。
执行实例恢复的原理是,应用重做日志文件使数据文件处于一致性状态。


介质失败:
磁盘损坏或者操作系统故障造成
当Oracle不能读写数据文件,控制文件,重做日志时,介质失败发生。


用户错误:
人为造成的,误删数据,表等。




(2) 冷备份
又叫脱机备份或者离线备份:数据库关闭情况下,进行对数据库的备份
需要DBA备份所有的数据文件,控制文件和重做日志文件。
一致性冷备份:是指备份中的所有数据文件和控制文件有相同的系统改变号(System Change Number, SCN)。
冷备份必须是一致性备份,否则数据库恢复时,有可能打不开数据库。


不一致备份:冷备份要求DBA干净地关闭数据库(使用shutdown immediate或normal)。如果没有干净的关闭数据库,比如使用shutdown abort命令就对
数据库进行备份,这样的备份是不一致的备份。
处理措施如下:
    如果数据库运行在归档模式,且还处在冷备份后生成的归档日志文件,可以把不一致冷备份恢复到一致性状态。
    如果数据库运行在非归档模式,这样的备份是无效的备份。


(3) 热备份
热备份又叫联机备份,是指数据库运行时对数据库进行的备份。对数据库进行热备份,要求数据库运行在归档模式。
热备份是不一致的备份,恢复数据时,需要应用归档日志文件,才可以使数据库处于一致性的状态。
热备份需要备份数据文件,控制文件,归档日志文件等。




(4) 备份和恢复的工具
两种工具或方法来执行数据的备份和恢复:
一种方法是用户管理的备份和恢复
另一种方法是使用RMAN(恢复管理器)


(5) 用户管理的备份和恢复
传统的备份和恢复方法,通过这种方法,DBA可以直接管理组成数据库的文件。
使用SQL*Plus和操作系统命令的联合方式完成。


(6) RMAN
RMAN功能强大,但是为了使用其功能,RMAN通常要求一个额外的数据库(Recovery Catalog)。
RMAN是一个客户端工具,用于执行数据库的备份和恢复。
RMAN可以用来备份和恢复数据文件,归档日志文件和控制文件,也可以用来执行数据库的完全恢复或不完全恢复。
为了保证RMAN使用时能连接恢复目录,恢复目录数据库必须打开,目标数据库至少要STARTED(unmount),
否则RMAN会返回一个错误,目标数据库必须置于归档模式下。


*****通道(Channel):表示到指定设备的一个数据流,一个通道对应一个服务器会话。
通过在目标服务器上创建一个服务器会话,建立RMAN到目标数据库之间的一个通道,其中一个服务器会话把数据库备份到磁盘存储,
另一个服务器会话把数据备份到磁带存储。
用户可以手动分配通道,如allocate channel c1 device type sbt,也可以使用configure channel命令配置自动分配的通道。


*****恢复资料数据库
RMAN的恢复资料数据库是一个数据库,用于存放恢复资料。
恢复资料,或恢复目录,就是一系列的表和视图,RMAN利用这些表存放备份信息。


准备恢复资料通常要经历3个阶段:
第一阶段:创建恢复资料拥有者
1 以数据库管理员的身份登录到恢复资料数据库:
2 创建表空间
create tablespace space_for_backup datafile '/database/oracle/oradata_backup.dbf' size 80M; --用于存放资料
3 创建恢复资料的拥有者
create user rman identified by huawei
temporary tablespace temp
default tablespace space_for_backup
quota unlimited on space_for_backup;
4 把恢复资料库的维护和查询权限授予恢复资料的拥有者rman
grant recovery_catalog_owner to rman;
grant resource,connect to rman;
第二阶段:创建恢复资料(实质就是创建一些表和视图)
1 启动RMAN
执行rman命令


2 登录到恢复目录数据库(不是目标数据库)
RMAN> connect catalog rman/huawei
connected to recovery catalog database
登录到恢复目录数据库,其主要存放备份信息,恢复目录数据库和目标数据库是两个数据库(也可以是相同的,但是不推,会存在数据库无法恢复情况)


3 创建恢复资料
RMAN> create catalog tablespace space_for_backup; --需要将RECOVERY_CATALOG_OWNER,connect,resource权限赋值给rman用户
recovery catalog created                          --可以不用指定表空间,不指定就用默认的表空间
创建恢复资料,恢复资料存放在表空间space_for_backup中。


注:
虽然使用RMAN不一定必需恢复目录,但是推荐使用。
因为恢复目录记载的信息大部分可以通过控制文件来记载,RMAN在恢复数据库时使用这些信息。
不使用恢复目录将会对备份恢复操作有限制。


4 查看表是否创建成功
select table_name from user_tables;


第三阶段:注册目标数据库(将目标数据库的信息写到恢复资料中)
注册目标数据库的目的是把要备份的数据库(目录数据库)的信息同步到恢复资料数据库中。
1 在操作系统命令中,启动RMAN


2 登录到恢复资料数据库
RMAN> connect catalog rman/huawei
connected to recovery catalog database


3 登录到目标数据库(要备份的数据库)
RMAN> connect target sys@NOAS  --NOAS为目标数据库实例


target database Password: --输入sys用户的密码
connected to target database: NOAS (DBID=2281856182)


连接到目标数据库时,要使用专有服务器连接(即SERVER=DEDICATED),否则注册时会产生错误"ORA-19550:无法在使用调度程序时使用备份/恢复功能"


4 注册目标数据库
RMAN> register database;


database registered in recovery catalog
starting full resync of recovery catalog
full resync complete


5 查看注册是否成功
RMAN> report schema;


Report of database schema for database with db_unique_name NOAS


List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
RMAN-06169: could not read file header for datafile 5 error reason 4
1    5630     SYSTEM               YES     /database/oracle/oradata/noas/system01.dbf
2    1010     SYSAUX               NO      /database/oracle/oradata/noas/sysaux01.dbf
3    4940     UNDOTBS1             YES     /database/oracle/oradata/noas/undotbs01.dbf
4    238      USERS                NO      /database/oracle/oradata/noas/users01.dbf
5    0        EXAMPLE              NO      /database/oracle/oradata/noas/example01.dbf
6    5000     TBS_ETL_DATA         NO      /home/oracle/ETL_DATA.dbf
7    2000     TBS_BICP_DATA        NO      /database/oracle/oradata/noas/BICP_DATA.dbf
8    1024     TBS_SOP_COM          NO      /database/oracle/oradata/noas/TBS_SOP_COM.dbf
9    25150    TBS_ISOP_APP_DATA    NO      /database/oracle/oradata/noas/TBS_ISOP_APP_DATA.dbf
10   1000     TBS_VSOP_TEST        NO      /database/oracle/oradata/noas/TBS_VSOP_TEST.dbf
11   2        Tbs1                 NO      /database/oracle/oradata/noas/TBS_NOAS.dbf
12   4        TBS2                 NO      /database/oracle/oradata/noas/TBS2.dbf
13   4        SPACETEST            NO      /database/oracle/oradata/noas/spacetest.dbf
14   202      TBS10                NO      /database/oracle/oradata/noas/tbs10.dbf
15   20000    TBS_BICP_DATA_TEST   NO      /database/oracle/oradata/noas/BICP_TEST_DATA.dbf
16   1000     TBS_COGNOS_DATA      NO      /database/oracle/oradata/noas/cognos_data.dbf
17   10000    NOAS_DATA            NO      /database/oracle/oradata/noas/NOAS_DATA
18   20000    NOAS_DATA_C          NO      /database/oracle/oradata/noas/NOAS_DATA_C.dbf
19   1024     TBS_SOP_DATA         NO      /database/oracle/oradata/noas/TBS_SOP_DATA.dbf
20   10       TEST1                NO      /opt/oracle/product/11gR2/db/dbs/test.dbf
21   2        TBS12                NO      /database/oracle/oradata/noas/tbs12.dbf
22   50       COGNOS               NO      /database/oracle/oradata/noas/cognosfile.dbf
23   40       TEST                 NO      /database/oracle/oradata/noas/test12.dbf
24   80       SPACE_FOR_BACKUP     NO      /database/oracle/oradata_backup.dbf


List of Temporary Files
=======================
File Size(MB) Tablespace           Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1    29       TEMP                 32767       /database/oracle/oradata/noas/temp01.dbf
2    2000     TBS_ETL_TEMP         2000        /home/oracle/ETL_TEMP.dbf
3    1000     TBS_BICP_TEMP        1000        /database/oracle/oradata/noas/BICP_TEMP.dbf
4    500      TBS_SOP_TEMP         32767       /database/oracle/oradata/noas/TBS_SOP_TEMP.dbf
5    2        TEMPTBS              32767       /database/oracle/oradata/noas/TEMPTBS.dbf
6    10000    TEMP_NOAS_DATA_C     32767       /database/oracle/oradata/noas/TEMP_NOAS_DATA_C.dbf
7    500      TBS_SOP_TMP          32767       /database/oracle/oradata/noas/TBS_SOP_TMP.dbf
8    2        TEMSP5               32767       /database/oracle/oradata/noas/temsp5.dbf
9    2        TEMP_SPACE_TEST      32767       /database/oracle/oradata/noas/temp_space_test.dbf
10   2        TEMPTBS11            32767       /database/oracle/oradata/noas/tmptbs11.dbf
11   10000    TBS_BICP_TEMP_TEST   10000       /database/oracle/oradata/noas/BICP_TEMP_TEST.dbf
12   10000    TEMP_NOAS_DATA       32767       /database/oracle/oradata/noas/TEMP_NOAS_DATA.dbf
13   2000     TBS_COGNOS_TAMP      2000        /database/oracle/oradata/noas/cognos_temp.dbf
14   2        TMPTBS12             32767       /database/oracle/oradata/noas/tmptbs12.dbf
16   50       TEMPCOGNOS           20480       /database/oracle/oradata/noas/tempcognosfile.dbf




*****RMAN连接
1 连接到目标数据库
RMAN> connect target sys@noas  --noas指向目标数据库的网络服务名 target表示连接到目标数据库


target database Password: 
connected to target database: NOAS (DBID=2281856182) 


2 连接到恢复资料数据库
RMAN> connect catalog rman/huawei@noas --noas指向恢复资料数据库的网络服务名 catalog表示连接到恢复资料数据库


connected to recovery catalog database


****************************************************************
(7) 冷备份的实施
数据库关闭以后进行的备份
如果数据库运行在非归档模式,一定要执行数据库的一致性备份。
1 获取数据库中所有数据文件的名字和位置
select name from v$datafile;
SQL> select name from v$datafile;


NAME
--------------------------------------------------------------------------------
/database/oracle/oradata/noas/system01.dbf
/database/oracle/oradata/noas/sysaux01.dbf
/database/oracle/oradata/noas/undotbs01.dbf
/database/oracle/oradata/noas/users01.dbf
/database/oracle/oradata/noas/example01.dbf
/home/oracle/ETL_DATA.dbf
/database/oracle/oradata/noas/BICP_DATA.dbf
/database/oracle/oradata/noas/TBS_SOP_COM.dbf
/database/oracle/oradata/noas/TBS_ISOP_APP_DATA.dbf
/database/oracle/oradata/noas/TBS_VSOP_TEST.dbf
/database/oracle/oradata/noas/TBS_NOAS.dbf


NAME
--------------------------------------------------------------------------------
/database/oracle/oradata/noas/TBS2.dbf
/database/oracle/oradata/noas/spacetest.dbf
/database/oracle/oradata/noas/tbs10.dbf
/database/oracle/oradata/noas/BICP_TEST_DATA.dbf
/database/oracle/oradata/noas/cognos_data.dbf
/database/oracle/oradata/noas/NOAS_DATA
/database/oracle/oradata/noas/NOAS_DATA_C.dbf
/database/oracle/oradata/noas/TBS_SOP_DATA.dbf
/opt/oracle/product/11gR2/db/dbs/test.dbf
/database/oracle/oradata/noas/cognosfile.dbf




2 得到控制文件的名字和位置
select name from v$controlfile;
SQL> select name from v$controlfile;


NAME
--------------------------------------------------------------------------------
/database/oracle/oradata/noas/control01.ctl
/opt/oracle/fast_recovery_area/noas/control02.ctl


3 干净地关闭数据库
shutdown normal或shutdown immediate或shutdown transactional


4 备份文件
使用操作系统命令,把数据库文件,控制文件,初始化参数文件等复制到备份的目标路径。


5 使用startup命令重新启动数据库




****************************************************************
(7) 热备份的实施
在线备份,是在数据库运行时进行的备份,热备份生成的备份是不一致的备份,只有执行恢复才能使数据库处于一致性状态,
这就会应用到归档日志文件,只有数据库运行在归档模式(ARCHIVELOG)下才会产生归档日志文件。
********热备份的前提-----归档模式
1 基本概念
归档时热备份的前提,只有数据库运行在归档模式,才可能找回丢失的数据。
当重做日志被填满以后,Oracle将把填满的重做日志文件复制到一个或多个路径下,这个过程叫归档。
这样的文件叫归档日志文件,路径叫归档路径或归档目录。
归档的过程一般由归档进程(ARCH)自动完成,一个数据库可以有一个或多个归档进程,归档进程的数量由初始化参数LOG_ARCHIVE_MAX_PROCESSES控制。


数据库可以运行在两种模式下:非归档模式(NOARCHIVELOG)和归档模式(ARCHIVELOG)


2 使数据库运行在归档模式
通常我们执行的备份都是热备份,热备份是不一致备份,要求数据库运行在归档模式。
步骤如下:
step 1:使用sys用户登录数据库
sqlplus sys/huawei@noas as sysdba


step 2:查看数据库是否运行在归档模式
SQL> archive log list;
Database log mode       No Archive Mode
Automatic archival       Disabled
Archive destination       USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     4357
Current log sequence       4359


step 3:干净地关闭数据库
SQL> shutdown immediate;


step 4:修改初始化参数
初始化参数文件所在目录:$ORACLE_HOME/dbs --pfile和spfile一般都存放在此路径下面
**如果不存在初始化参数文件(pfile),可以根据spfile生成初始化参数文件(pfile)
create pfile='/opt/oracle/product/11gR2/db/dbs/initnoas.ora' from spfile='/opt/oracle/product/11gR2/db/dbs/spfilenoas.ora';


**编辑初始化参数文件(pfile)--设置归档日志文件名格式和归档路径
定义归档日志文件名的格式
变量%s表示日志序列号
%t表示线索号
%d表示数据库ID
%r表示重置日志ID
%a表示活动ID号
%S表示日志序列号,带有前导0
%T表示线索号,带有前导0


log_archive_format='ARC%S_%R.%T';
或log_archive_format='%t_%s_%r.dbf';


设置归档路径
设置第一个归档路径:LOG_ARCHIVE_DEST_1
LOG_ARCHIVE_DEST_1='LOCATION=/oracle/oradata/arch1'; --LOCATION关键字,指定归档路径的位置
设置第二个归档路径:LOG_ARCHIVE_DEST_2
LOG_ARCHIVE_DEST_2='LOCATION=/oracle/oradata/arch2';
......
LOG_ARCHIVE_DEST_10 最大为10


可以用 alter system set LOG_ARCHIVE_DEST_n的值进行动态修改


**重建spfile -- 根据修改过的pfile重建spfile
create spfile='/opt/oracle/product/11gR2/db/dbs/spfilenoas.ora' from pfile='/opt/oracle/product/11gR2/db/dbs/initnoas.ora';




step 5:启动数据库到mount状态
SQL> startup mount


step 6: 把数据库切换到归档模式
SQL> alter database archivelog;


Database altered.


step 7: 查看数据库是否运行在归档模式
SQL> archive log list;
Database log mode       Archive Mode
Automatic archival       Enabled
Archive destination       /opt/oracle/product/11gR2/db/dbs/arch
Oldest online log sequence     506
Next log sequence to archive   508
Current log sequence       508


(8) 备份整个数据库
step 1: 使用RMAN连接到目标数据库
RMAN> connect target sys


target database Password: 
connected to target database: NOAS (DBID=2281856182)


step 2: 连接到恢复资料数据库
RMAN> connect catalog rman/huawei


connected to recovery catalog database


step 3: 备份整个数据库
RMAN> backup database format '/oracle/backup_%s_%p_%t'; --%s指定备份集,%p指定碎片编号,%t指定时间戳。






(9) 备份单个表空间
方法一:使用SQL*Plus备份单个表空间
step1: 查看要备份的表空间由哪些数据文件组成。
select tablespace_name, file_name from sys.dba_data_files where tablespace_name = 'SYSTEM';


step2: 把表空间置于备份模式
alter tablespace system begin backup;


step3:使用操作系统命令把组成表空间的数据文件复制到备份路径中
step4: 让表空间退出备份模式,回到正常状态
alter tablespace system end backup;


step5: 执行手工归档
alter system archive log current;


方法二:使用RMAN备份单个表空间
backup tablespace system format '/oracle/oradata/backup_%s_%p_%t';


(10) 备份单个数据文件
使用RMAN备份数据文件:
backup datafile '/opt/oracle/oradata/system.dbf' format '/oracle/oradata/backup_%s_%p_%t';




(11) 备份归档日志文件
方法一:使用操作系统命令直接备份
select THREAD#, sequence#, name from v$archived_log;


使用操作系统命令把归档日志文件从归档路径复制到备份目录。


方法二:使用RMAN进行备份
backup archivelog all format '/oracle/oradata/backuparch_%U'; --%U将产生唯一的文件名 ALL所有的归档日志文件


(12) 备份控制文件
方法1:SQL*Plus备份控制文件
SQL> alter database backup controlfile to '/oracle/oradata/control_files.bak';


方法2:把控制文件备份到跟踪文件中,在跟踪文件中将生成创建控制文件的脚本
SQL> alter database backup controlfile to trace;


方法3:RMAN备份控制文件
RMAN> backup current controlfile;


方法4:启用控制文件的自动备份,当使用RMAN进行备份的时候,RMAN会自动备份控制文件(也自动备份spfile)
RMAN> configure controlfile autobackup on;




(13) 备份spfile
RMAN> backup spfile;


也可以直接利用操作系统的命令备份spfile文件。








**************数据库的恢复***************
(1) 数据冲突的修复
数据恢复向导(Data Recovery Advisor, DRA)是帮助诊断和修复数据故障的工具。
自动诊断和修复故障。


step1: 连接到目标数据库
RMAN> connect target sys


target database Password: 
connected to target database: NOAS (DBID=1233790370)


step2: 对数据库进行验证
RMAN> validate database;


Starting validate at 19-NOV-13
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=6 device type=DISK
RMAN-06169: could not read file header for datafile 5 error reason 4
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of validate command at 11/19/2013 14:05:23
RMAN-06056: could not access datafile 5
如果发现错误,就将错误记录到自动诊断库ADR中


step3: 使用list failure列出故障
RMAN> list failure; --都是/database/oracle/oradata/noas/example01.dbf表空间数据文件丢失的问题


List of Database Failures
=========================


Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
413722     HIGH     OPEN      19-NOV-13     One or more non-system datafiles are missing
2          HIGH     OPEN      22-AUG-13     One or more non-system datafiles are corrupt




step4: 根据故障编号,获取故障的详细信息
RMAN> list failure 2 detail; --编号为2的错误详细信息


List of Database Failures
=========================


Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
2          HIGH     OPEN      22-AUG-13     One or more non-system datafiles are corrupt
  Impact: See impact for individual child failures
  List of child failures for parent failure ID 2
  Failure ID Priority Status    Time Detected Summary
  ---------- -------- --------- ------------- -------
  5          HIGH     OPEN      22-AUG-13     Datafile 5: '/database/oracle/oradata/noas/example01.dbf' is corrupt
    Impact: Some objects in tablespace EXAMPLE might be unavailable
    
    
step5: 得到故障的修复建议
RMAN> advise failure;       --或执行advise failure 2(指定故障编号)


List of Database Failures
=========================


Failure ID Priority Status    Time Detected Summary
---------- -------- --------- ------------- -------
2          HIGH     OPEN      22-AUG-13     One or more non-system datafiles are corrupt
  Impact: See impact for individual child failures
  List of child failures for parent failure ID 2
  Failure ID Priority Status    Time Detected Summary
  ---------- -------- --------- ------------- -------
  5          HIGH     OPEN      22-AUG-13     Datafile 5: '/database/oracle/oradata/noas/example01.dbf' is corrupt
    Impact: Some objects in tablespace EXAMPLE might be unavailable


analyzing automatic repair options; this may take some time
using channel ORA_DISK_1
analyzing automatic repair options complete


Mandatory Manual Actions
========================
1. If you have an export of tablespace EXAMPLE, then drop and re-create the tablespace and import the data.
2. Contact Oracle Support Services if the preceding recommendations cannot be used, or if they do not fix the failures selected for repair


Optional Manual Actions
=======================
no manual actions available


Automated Repair Options          -------没有自动修复内容,无法自动修复,只可手动修复
========================
no automatic repair options available




step6: 执行故障修复
RMAN> repair failure;  


RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of repair command at 11/19/2013 14:12:22
RMAN-06953: no automatic repairs were listed by ADVISE FAILURE  --没有自动修复




step7: 再次检查故障是否语句被修改 
  


(2) 冷备份的恢复
在非归档模式下产生的冷备份必须是一致性备份,否则数据库恢复将面临失败。
step1: 关闭数据库
shutdown immediate


step2: 还原数据库的备份
使用操作系统命令把数据库的备份复制到原来的位置


step3: 把数据库启动到装载状态
startup mount;


step4: 重命名数据文件
如果备份的数据文件被复制到与原来不同的位置,需要修改控制文件,使控制文件知道这种位置的变化,否则不需要做任何的改变。
alter database rename file '/oracle/oradata/test1.dbf' to '/oracle/oradata/test.dbf';


step5: 重命名重做日志文件
如果重做日志文件原来所在的磁盘还没有修好,或者想把它们放在其他位置,可以通过重命名重做日志文件来实现:
alter database rename file '/oracle/oradata/redo01.log' to '/oracle/oradata/redo_01.log';


step6: 执行数据库的不完全恢复
recover database until cancel;
这样做是为了使Oracle能够重新设置重做日志文件。


 step7: 用选项resetlogs打开数据库
 alter database open resetlogs; --resetlogs将使Oracle重新设置重做日志文件
 


 
(3) 热备份的恢复
在数据库打开的情况下,产生的备份叫做热备份。热备份是数据库备份的主要方式。
用热备份恢复数据库通常都会经历两大过程:
还原数据库: 指把数据库的备份复制到原来的位置
恢复数据库:指在还原数据库后,应用归档日志文件(备份以后产生的)或者重做日志文件的内容


******恢复整个数据库*********
整个数据瘫痪,需要恢复整个数据库。
step1: 强制把数据库启动到装载状态
RMAN> startup force mount;


step2: 还原数据库
RMAN> restore database;


step3: 恢复数据库
RMAN> recover database;


step4: 打开数据库
RMAN> alter database open;




********恢复单个表空间*************
只是数据库表空间坏掉,无需关闭数据库。
step1: 使要被恢复的表空间离线
RMAN> SQL 'Alter tablespace users offline';


step2: 运行RMAN的RUN命令,执行表空间的还原与恢复
RUN --顺序执行
{
    set newname for datafile '/oracle/oradata/users.dbf'
    to '/oracle/oradata/users01.dbf'; --重命名数据文件
    
    restore tablespace user; --还原表空间
    switch datafile all; --更新控制文件
    recover tablespace user; --执行表空间的恢复  
}
 
step3: 使表空间重新在线
RMAN> SQL 'Alter tablespace users online';


**********恢复单个数据文件***************
如果单个数据文件损坏,不必恢复整个表空间,更不必恢复整个数据库。
step1:从备份中还原数据文件/oracle/oradata/users01.dbf
RMAN> restore datafile '/oracle/oradata/users01.dbf';


step2: 执行数据文件/oracle/oradata/users01.dbf的恢复
RMAN> recover datafile '/oracle/oradata/users01.dbf';


step3:使数据文件/oracle/oradata/users01.dbf在线
SQL> alter database datafile '/oracle/oradata/users01.dbf' online;




*********修复数据块***********
在线修复冲突块
查询数据块中的冲突块:
方法一:
step1: 查询视图v$database_block_corruption
SQL> select * from v$database_block_corruption;
方法二:
step1:从跟踪文件或者警报文件中进行查找
冲突块的信息会记录在跟踪文件或者警报文件中。
SQL> select name,value from v$diag_info;


step2: 修改冲突块 
RMAN> blockrecover datafile 7 block 3 daafile 2 block 235;
修复数据文件7中的坏块3以及数据文件2中的坏块235
或执行:
RMAN> recover corruption list; --修复视图v$database_block_corruption中列出的所有冲突块。