首页 > 代码库 > Oracle 10g数据库备份与恢复操作手册

Oracle 10g数据库备份与恢复操作手册

Oracle 10g数据库备份与恢复操作手册

 

 

 

前言

文档目的

备份与恢复是数据库管理中最重要的方面之一。如果数据库崩溃却没有办法恢复它,那么对企业造成的毁灭性结果可能会是数据丢失、收入减少、客户不满等。不管公司是使用单个数据库还是多个数据库来存储数百  GB或    TB的数据,它们都有一个共同点,即需要制订一个备份与恢复方案来备份重要数据并使自身免于灾难。要制定一个适合自己公司情况的合理的备份与恢复方案,就必须熟悉备份与恢复的方法和操作。

为了给 Oracle DBA和相关技术人员提供一个参考和学习资料特编写此文档。

文档范围

本文档共包括 7章。

第一章,对冷备份进行简单介绍并以实际例子对冷备份与恢复的操作步骤做了描述。

第二章,热备份,对热备进行了简单介绍,并详细说明了热备份的备份步骤。

第三章,热备份下的完全恢复,这是本文档的重点和基础内容,详细介绍了  Oracle

数据库在各种可能发生的数据文件损坏的情况下的完全恢复操作。

第四章,不完全恢复,对基于时间和 SCN号的不完全恢复操作进行举例说明。

第五章,RMAN备份与恢复,对  RMAN这个备份工作的一些基本常用操作做了一些

举例说明。

第六章,逻辑备份,介绍对逻辑备份(import/export)的常用操作。

第七章,其他备份和恢复,对 flashback和  logminer这两个工具的常用操作进行举例说明。

目标读者

本文的主要读者为信息技术部门领导及下属技术人员与工程技术人员,Oracle数据库DBA和具有一定  Oracle数据库基础知识的学习者。

环境介绍

本文中所有操作内容均在以下环境中完成:

操作系统:RedHat Enterprise 5.4

Oracle数据库:Oracle  10.2.0.1.0

Oracle相关环境变量:

ORACLE_SID=ora10(catalog数据库  SID为  rman)

ORACLE_BASE=/u01

ORACLE_HOME=/u01/db_1

其他说明

“#”后的文字为当前命令的注释和说明。

1         冷备份

1.1   冷备份概述

冷备份是当数据库的所有可读写的数据库物理文件具有相同的系统改变号(SCN)时进行的备份,使数据库处于一致状态的唯一方法是数据库正常关闭。故只有在数据库正常关闭的情况下的备份才是一致性备份。

冷备份既适用于 archivelog模式,也适用于  noarchivelog模式。

²优点:

?快速且简单的备份方法。

?容易恢复到某个时间点上。

?低维护,高安全

²缺点:

?单独使用时,只能提供到“某一时间点上”的恢复。

?在冷备份过程中,数据库必须处于关闭状态。

?备份步骤

1.2   备份步骤

1.查看数据库文件位置:

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

SQL>select name from v$controlfile;

SQL>select parameter spfile;

2.执行备份:

SQL>shutdown immediate;

拷贝文件数据文件到备份目录。

Tips: 对于只读文件,在下次修改前备份一次就够

1.3   恢复测试

创建测试表并插入数据:

SQL> create table test1(a int);

SQL> insert into test1 values(1);

SQL> commit;

2.冷备份步骤备份。

3.再插入几条数据:

SQL> insert into test1 values(2);

SQL> commit;

4.正常关闭数据库:

SQL>Shutdown immediate;

5.删除数据文件,模拟故障:

SQL>Host rm /u01/oradata/ora10/*

6.启动数据库,结果报错,无法启动。

7.还原备份的文件。

8.打开数据库:

SQL>Alter database open;

9.验证数据是否丢失:

SQL>Select * from test1;

1.4   结论

冷备份恢复数据库后是无法用归档文件重演到故障时间点的,因为冷备份的数据文件和控制文件的 SCN是一致的。

2         热备份

2.1   热备份特点

是当数据库的可读写的数据文件和控制文件的系统更改号(SCN)在不一致条件下的备份。对于 7*24数据库只能进行热备份。

热备份仅适用于 archive log状态。

?优点:

?可在表空间或数据库文件级别备份,备份时间短。

?备份时数据库仍可以使用。

?可达到秒级恢复。

?缺点:

?不能出错,否则备份不可用。

?备份方法复杂,难于维护。

2.2   备份操作

备份前先确认数据库处于归档模式:

SQL>archive log list;

Database log mode                 Archive Mode

Automatic archival                  Enabled

Archive destination                 /u01/db_1/dbs/arch

Oldest online log sequence           5

Next log sequence                   7

Current log sequence                7

若处于非归档模式,开启归档模式:

SQL> startup mount;

SQL> alter database archivelog;

SQL> alter database open;

2.2.1数据文件备份

1.对当前重做日志文件进行归档:

SQL> alter system archive log current;

2.查看表空间对应的数据文件:

SQL> select file_name,tablespace_name from dba_data_files;

FILE_NAME                                     TABLESPACE_NAME

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

/u01/oradata/ora10/users01.dbf                     USERS

/u01/oradata/ora10/sysaux01.dbf                    SYSAUX

/u01/oradata/ora10/undotbs01.dbf                   UNDOTBS1

/u01/oradata/ora10/system01.dbf                    SYSTEM

3.将表空间置于备份状态:

SQL> alter tablespace system begin backup;

Tablespace altered.

4.拷贝文件:

SQL>! cp /u01/oradata/ora10/system01.dbf  /bak/;

5.结束表空间备份状态:

SQL>alter tablespace system end backup;

Tablespace altered

6.按上述步骤备份其他表空间数据文件。

注意:

在表空间处于备份状态时,该表空间 SCN将被冻结。在  end  backup前,该表空间上所有的改变和操作所产生的结果将不会写入该表空间对应的数据文件,而是写入 online redo  log file。另外,也可以同时将整个数据库同时置于 begin backup状态:alter database begin backup,但不建议这样操作,因为这样会使产生大量的redo记录,导致  redo log切换频繁使归档文件数量迅速增加。

2.2.2在线备份控制文件

1.在线备份控制文件

SQL>alter tablespace backup controlfile to ‘/bak/controlfile.bak‘;

Database altered

2.在线备份生成控制文件脚本

SQL>alter database backup controlfile to trace;

Database altered

3.查看 udump下最新生成的.trc文件,里面有生成控制文件的脚本内容。为方便辨

认,建议修改文件名或另存为其他文档。

4.最后对当前日志进行归档。

SQL> alter system archive log current;

3         热备份下的完全恢复

3.1   非 system表空间数据文件受损

1.建立测试表:

SQL> create table test2(a int) tablespace users;

SQL> insert into test2 values(1);

SQL> commit;

2.进行热备份。

3.向测试表插入数据后关闭数据库:

SQL> insert into test2 values(2);

SQL> commit;

SQL> alter system switch logfile; #切换redo logfile,防止当前redo log受损

SQL> shutdown immediate;

4.删除一个或多个数据文件,模拟故障:

SQL>!  rm  /u01/oradata/ora10/users01.dbf

SQL> startup

ORACLE instance started.

....................

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

ORA-01110: data file 4: ‘/u01/oradata/ora10/users01.dbf‘

5.查看需要恢复的文件号:

SQL> select * from v$recover_file;

     FILE#   ONLINE   ONLINE    ERROR           CHANGE#    TIME   

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

         4   ONLINE   ONLINE    FILE NOT FOUND           0

 

SQL> alter database datafile 4 offline drop; #将损坏或丢失的文件脱机并删除

SQL> ! cp /bak/users01.dbf  /u01/oradata/ora10

SQL> recover datafile 4

Media recovery complete.

SQL> alter database datafile 4 online;

Database altered.

SQL> alter database open;

Database altered.

SQL> select * from test2;

Tips:

也可在将受损文件 offline之后,打开数据库,在  open状态下将其恢复。但   system表空间受损不可以用此方法恢复。

3.2   system表空间数据文件或大量数据文件受损

1.热备数据库,之后关闭数据库。

2.删除 system.dbf模拟故障。

SQL> ! rm /u01/oradata/ora10/system01.dbf

 

3.恢复

SQL> startup

ORACLE instance started.

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

ORA-01110:data file 1:/‘u01/oradata/ora10/system01.dbf‘

 

SQL> ! cp /bak/system01.dbf  /u01/oradata/ora10/

SQL> recover database

SQL> alter database open;

3.3   回滚数据文件损坏恢复

SQL> show parameter undo

SQL> ! rm /u01/oradata/ora10/undotbs01.dbf

SQL> startup

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

ORA-01110:data file 2: ‘/u01/oradata/ora10/undotbs01.dbf‘

 

SQL> alter system set undo_management=manual scope=spfile;

SQL> shutdown immediat;

SQL> startup mount

SQL> alter database datafile 2 offline drop;

SQL> alter database open;

SQL> drop tablespace undotbs1;

SQL> create undo tablespace undotbs1 datafile ‘/u01/oradata/ora10/undotbs1.dbf‘ size 50m autoextend on next 1m maxsize

1024m;

SQL> alter system set undo_management=auto scope=spfile;

SQL> shutdown immediate

SQL> startup

 

3.4   临时表空间文件损坏的恢复

Oracle10在删掉  temp01.dbf后,启动时会自动创建该文件。

若报错可通过以下方法恢复:

SQL> alter database datafile ‘/u01/oradata/ora10/temp01.dbf‘ offline drop;

SQL> alter database open;

SQL> drop tablespace temp;

SQL> create temporary tablespace temp tempfile ‘/u01/oradata/ora10/temp01.dbf‘ size 10m autoextend off;

3.5   控制文件损坏的恢复

3.5.1单个控制文件被破坏

1.删除单个控制文件,模拟故障:

$ rm /u01/oradata/ora10/control01.ctl 

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

2.恢复:

SQL> !

$ cp /u01/oradata/ora10/control02.ctl /u01/oradata/ora10/control01.ctl

$ exit

SQL> alter database mount;

SQL> alter database open;

3.5.2所有控制文件被破坏

1.删除控制文件,模拟故障:

$ rm /u01/oradata/ora10/control0*

2.启动数据库,报错:

SQL> startup

ORA-00205: error in identifying control file, check alert log for more info

3.恢复:

如果有备份控制文件的话,直接拷贝控制备份镜像到指定文件名。如果没有备份镜像可通过以下方法恢复:

备份数据文件和日志文件,以免重建控制文件失败时数据文件和日志文件也被潜在的破坏。

$ cp /u01/oradata/ora10/* /bak/

如果有备份过生成控制文件的脚本,可直接用其脚本生成新控制文件。如果没有备份脚本,则须收集数据文件和日志文件所在路径的信息。运行如下脚本恢复控制文件:

CREATE CONTROLFILE REUSE DATABASE "ORA10" NORESETLOGS  ARCHIVELOG

LOGFILE

  GROUP 1 ‘/u01/oradata/ora10/redo01.log‘  SIZE 50M,

  GROUP 2 ‘/u01/oradata/ora10/redo02.log‘  SIZE 50M,

  GROUP 3 ‘/u01/oradata/ora10/redo03.log‘  SIZE 50M

DATAFILE

  ‘/u01/oradata/ora10/system01.dbf‘,

  ‘/u01/oradata/ora10/undotbs01.dbf‘,

  ‘/u01/oradata/ora10/sysaux01.dbf‘,

  ‘/u01/oradata/ora10/users01.dbf‘

CHARACTER SET ZHS16GBK

;

SQL> alter database open;

3.6   日志文件损坏的恢复

3.6.1正常关机情况下非当前联机日志文件被破坏

1.建立测试表,并正常关闭数据库:

SQL> create table test(a int) tablespace users;

Table created.

SQL> insert into test values(12345);

1 row created.

SQL> commit;

Commit complete.

SQL> shutdown immediate;

Database closed.

Database dismounted.

ORACLE instance shut down.

2.删除日志文件,模拟故障:

$ rm /u01/oradata/ora10/redo01.log

3.启动后报错,查看损坏文件是非当前联机日志文件且已归档:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 1 of thread 1

ORA-00312:online log 1 thread 1: ‘/u01/oradata/ora10/redo01.log‘

 

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              13           YES       INACTIVE

        3              14           NO        CURRENT

        2              12           YES       INACTIVE

4.恢复:

SQL> alter database clear logfile group 1;

若损坏的日志没有归档,则运行下面命令:

SQL> alter database clear unarchived logfile group 1;

注意:

如果受损的日志没有归档,恢复后应做一次全备。因为这样恢复后归档日志会产生断点。

5.验证:

SQL> alter database open;

SQL> select * from test;

3.6.2正常关机情况下当前联机日志损坏

1.向测试表中插入新的数据:

SQL> insert into test values(54321);

SQL> commit;

 

2.删除日志文件,模拟故障,并正常关闭数据库:

$ rm /u01/oradata/ora10/redo02.log

SQL> shutdown immediate

3.启动数据库报错,当前联机日志文件受损。

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 2 of thread 1

ORA-00312:online log 2 thread 1: ‘/u01/oradata/ora10/redo02.log‘

 

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        3              4           YES       INACTIVE

        2              6           NO        CURRENT

4.恢复:

SQL> recover database until cancel;

 

SQL> alter database open resetlogs;

Database altered.

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              2           NO        CURRENT

        2              1           YES       INACTIVE

        3              0           YES       UNUSED

注意:

使用 resetlogs参数会将日志文件序号重置,这时日志(包括归档日志和联机日志文件)文件将存在断点。在 10g版本之前,这个断点在恢复数据库时时无法穿越的。所以这种情况下数据库恢复后须全备数据库。10g版本后,虽然可以穿越断点,也建议全备数据库。

5.验证:

SQL> select * from test;

3.6.3数据库运行时或非正常关机情况下已归档日志   active日志文件被破坏

1.建立测试环境:

SQL> insert  into  test values(11111);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from test;

---------------A

      12345

      54321

      11111

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        2              6           NO        CURRENT

        3              4           YES       INACTIVE

SQL> alter system switch logfile;

System altered.

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              5           YES       INACTIVE

        2              6           YES       ACTIVE

        3              7           NO        CURRENT

 

SQL> shutdown abort

ORACLE instance shut down.

2.删除日志文件,模拟故障:

$ rm /u01/oradata/ora10/redo02.log

3.启动数据库,报错:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 2 of thread 1

ORA-00312:online log 2 thread 1: ‘/u01/oradata/ora10/redo02.log‘

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

4.恢复:

查看归档文件对应的日志序号,恢复时输入对应序号的日志文件,最后打开数据(建议做一次全备份):

SQL> select name,sequence# from v$archived_log where sequence#>=5;

NAME                                                      SEQUENCE#

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

/u01/oradata/arch/1_5_736716731.dbf                                       5

/u01/oradata/arch/1_6_736716731.dbf                                       6

SQL> recover database until cancel;

ORA-00279:change 457803 generated at 12/02/2010 19:34:38 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736716731.dbf

ORA-00280:change 457803 for thread 1 is in sequence #6

 

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

/u01/oradata/arch/1_6_736716731.dbf

ORA-00279:change 457844 generated at 12/02/2010 19:36:31 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736716731.dbf

ORA-00280:change 457844 for thread 1 is in sequence #7

ORA-00280:log file ‘/u01/oradata/arch/1_6_736716731.dbf‘ no longer needed for this recovery

 

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

/u01/oradata/ora10/redo03.log

Log applied.

Media recovery complete.

SQL> alter database open;

alter database open

 *

ERROR at line 1:

ORA-01599:must use RESETLOGS or NORSETLOGS option for database open

SQL>alter database open resetlogs;

Database altered.

5.检查数据是否丢失:

SQL>select * from test;

3.6.4有备份的情况下数据库运行时或非正常关机情况下未归档active或  current日志文件被破坏

1.全备份数据库:

2.向测试表中插入新的数据,并终止数据库运行:

SQL>select * from test;

               A

           12345

           54321

           11111

           22222

3.删除日志文件,模拟故障:

$ rm /u01/oradata/ora10/redo01.log

4.启动数据库,报错,当前日志文件被损坏:

SQL> startup

ORACLE instance started.

......

ORA-00313:open failed for members of log group 1 of thread 1

ORA-00312:online log 1 thread 1: ‘/u01/oradata/ora10/redo01.log‘

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              7           NO        CURRENT

        2              6           YES       ACTIVE

        3              5           YES       INACTIVE

5.恢复:

先还原全备份,从全备份开始重做:

SQL> recover database until cancel;

ORA-00279:change 457882 generated at 12/03/2010 16:22:37 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_1_736791757.dbf

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

 

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

Auto

选择 auto。若最后提示输入最后一个日志序号文件的文件名时,输入 cancel。若自动返回 sqlplus提示符则直接打开数据库。

ORA-00279:change 482068 generated at 12/03/2010 16:26:27 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_7_736791757.dbf

ORA-00280:change 482068 for thread 1 is in sequence #7

ORA-00280:log file ‘/u01/oradata/arch/1_7_736791757.dbf ‘ no longer needed for this recovery

 

ORA-00308:cannot open archived log ‘/u01/oradata/arch/1_7_736791757.dbf‘

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

 

SQL> alter database open resetlogs;

Database altered.

SQL> select * from test;

              A

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

            12345

            54321

            11111

6.结果:

数据有丢失。

3.6.5无备份的情况下数据库运行时或非正常关机情况下未归档active或  current日志文件被破坏

1.向测试表中插入新的数据,并终止数据库运行:

SQL> shutdown abort;

2.删除日志文件,模拟故障:

$ rm /u01/oradata/ora10/redo03.log

3. 启动数据库,报错,当前日志受损:

SQL> startup

ORACLE instance started.

.........

Database mounted.

ORA-00313:open failed for members of log group 3 of thread 1

ORA-00312:online log 3 thread 1: ‘/u01/oradata/ora10/redo03.log‘

ORA-27037:unable to obtain file status

Linux Error:2 No such file or directory.

Additional information:3

SQL> select group#,sequence#,archived,status from v$log;

     GROUP#     SEQUENCE#      ARC      STATUS

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

        1              4           YES       INACTIVE

        3              6           NO        CURRENT

        2              5           YES       INACTIVE

4.无备份可还原。按以下步骤恢复:

SQL> shutdown

SQL> create pfile from spfile;

$ vi initora10.ora

#添加下面这一行

_allow_resetlogs_corruption=true     #隐含参数,允许数据库在不一致状态下打开

SQL> startup pfile=‘/u01/db_1/dbs/initora10.ora‘;

SQL> recover database until cancel;

 

SQL> recover database until cancel;

ORA-00279:change 482619 generated at 12/03/2010 17:04:13 needed for thread 1

ORA-00289:suggestion:/u01/oradata/arch/1_6_736793254.dbf

ORA-00280:change 482619 for thread 1 is in sequence #6

 

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

Auto

 

SQL> alter database open resetlogs;

5.检查数据是否有丢失:

SQL> select * from test;

有数据丢失。

注意: 在这种情况下恢复的数据库是处于不一致状态的,这种状态下运行的数据库是不稳定的。所以,恢复数据库后第一件事是导出数据,重建数据库。

4         恢复不完全恢复

4.1   时间的恢复

4.1.1概述

基于时间的恢复可以将数据库不完全恢复到过去某一时间点,常用于在误操作删除数据后,在备机上将数据库恢复到删除时间按之前,然后再把该表导出到正式环境,从而挽回丢失的数据。

4.1.2操作步骤

1.不完全恢复需要用到数据库的全备。所以在测试前先对数据库做除临时表空间外的全备份。

2.建立测试环境:

SQL> select * from test;

               A

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

               1

               2

SQL> alter system switch logfile;

System altered.

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

TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI;SS‘)

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

2010-12-05 16:18:50

SQL> drop table test purge;

Table dropped.

 

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

3.还原全备:

4.恢复至故障点:

SQL> recover database until time ‘2010-12-05 16:18;50‘;

Media recover complete.

Database altered.

SQL> select * from test;

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

               1

               2

4.2   基于SCN的恢复

4.2.1概述

基于 SCN(system change  number)的恢复可以将数据库不完全恢复到过去的某一个SCN改变点,也常用语在误操作删除数据后,在备份机上将数据库恢复到删除时间之前,然后再导出到正式环境,从而挽回丢失的数据。

4.2.1操作步骤

1.不完全恢复需要用到数据库的全备。所以在测试前先对数据库做除临时表空间外的全备份。

2.建立测试环境:

SQL> select * from test;

               A

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

               3

               1

               2

SQL> select  curent_scn from v$database;

CURRENT_SCN

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

         459219

SQL> delete test where a=3;

1 row deleted.

 

SQL> commit;

Commit complete.

SQL> select * from test;

               A

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

               1

               2

3.还原全备份。

4.恢复:

SQL> recover database until change 456219;

ORA-00279:change 455755 generated at 12/05/2010 16:12:47 needed for thread 1

ORA-00289:suggestion:

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_2_%u_.arc

ORA-00280:change 455755 for thread 1 is in sequence #2

 

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

Auto

ORA-00279:change 455908 generated at 12/05/2010 16:18:14 needed for thread 1

ORA-00289:suggestion:

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_3_%u_.arc

ORA-00280:change 455908 for thread 1 is in sequence #3

/u01/flash_recovery_area/ORA10/archivelog/2010_12_05/o1_mf_1_2+6hplp652_.arc‘

no longer needed for this recover

 

Log applied.

Media recovery complete.

SQL> alter database open resetlogs.

Database altered.

SQL> select * from test;

               A

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

               3

               1

               2

5         RMAN备份与恢复

5.1   RMAN概述

RMAN自动维护备份和恢复所需的各种信息,可保存在数据库的控制文件中,但控制文件损坏将导致 RMAN失败,故推荐在一个单独的服务器上,将  RMAN管理的所有信息全部存放到一个 catalog数据库中,一个  catalog数据库来保存远程目标数据库信息。该 catalog数据库可和被备份的目标数据库位于同一主机,也可单独放在另一台主机上(确保最大的可恢复性)。

Catalog包含了所有备份信息,故该数据库本身也需要通过某种方法进行备份,因为该数据库很小(100M内),故可对其进行冷备份或逻辑备份。

RMAN每次备份生成一个备份集,每个集中包含的备份文件称为备份片或备份段。

RMAN应运行于归档模式下。

5.2   RMAN服务器和目标服务器的配置

1.配置 RMAN CATALOG数据库(在  catalog服务器上)

SQL> create tablespace rmantbs datafile ‘/u01/oradata/rman/rmantbs.dbf‘ size 20M;

Tablespace created.

SQL> create user rman identified by rman123 default tablespace rmantbs temporary tablespace temp;

SQL> grant resource,connect,recovery_catalog_owner to rman;

Grant succeeded.

 

$ rman catalog rman/rman123    #测试登录

RMAN> create catalog tablespace rmantbs; #创建catalog对象

2.配置针对目标服务器的远程数据库链路(在 catalog服务器上)

ORA10 =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.72.20)(PORT = 1521))

    (CONNECT_DATA = http://www.mamicode.com/

      (SERVER = DEDICATED)

      (SERVICE_NAME = ora10)

    )

  )

3.配置目标数据库监听(在目标数据库上)

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = ora10)

      (ORACLE_HOME = /u01/db_1)

      (SID_NAME = ora10)

    )

  )

LISTENER =

  (DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.72.10)(PORT = 1521))

$ lsnrctl stop

$ lsnrctl start

4.启用 RMAN连接目标数据库

$ rman target sys/oracle@ora10 catalog rman/rman123

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

5.目标数据库的同步与注销

  • 由于redo log和archive log的信息不回自动更新到恢复目录,所以需要定期同步到恢复目录,使用下面命令重新同步:

RMAN> resync catalog;

  • 注销已注册的数据库:

(1)   先查询要注销的数据库的 DB_ID,查询方法有两种:

第一种是用 rman连接目标数据库时会显示,如:

RMAN> connect target sys/oracle@ora10       

connected to target database: ORA10 (DBID=719569885)

 

第二种是在目标数据库中执行以下指令可以查询到:

SQL> select dbid from v$database;

DBID

----------

 719569885

(2)   在 catalog数据库上以  rman用户登录,注销目标数据库:

SQL> select db_key,dbid from db where db_id=719569885;

DY_KEY        DBID

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

1            719569885

SQL> execute dbms_rcvcat.unregisterdatabase(1,719569885);

 

注意:

一旦注销了该目标数据库,就不可以使用恢复目录中含有的备份集来恢复数

据库了。

5.3   RMAN配置

RMAN> show all;

CONFIGURE RETENTION POLICY TO REDUNDANCY 1; 

#基于备份数量的备份保存策略,除最新3份外的其他备份都置为obsolete状态。

CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;

#基于时间的备份保存策略,7天前的备份都被置为obsolete状态。

CONFIGURE DEFAULT DEVICE TYPE TO DISK; 

#设置默认的备份设备为磁盘。磁带设备则应指定为to sbt。

CONFIGURE CONTROLFILE AUTOBACKUP ON;

#指定进行任何备份操作时,都对控制文件和参数文件同时进行备份(默认为off)。

CONFIGURE  CONTROLFILE  AUTOBACKUP   FORMAT  FOR  DEVICE   TYPE  DISK  TO

‘/u01/bak/cs_%F‘;

#指定备份的控制文件和参数文件格式。

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   ‘/u01/bak/%U_%d‘;

#设置备份文件的路径及文件名格式,只适用于磁盘设备。

5.4   备份集操作

RMAN> list backup;

#列出所有备份机信息

RMAN> delete backupset 70;  #删除指定备份集

RMAN> report obsolete;

#检查是否有过期备份集(过期状态由保存策略决定)

RMAN> delete obsolete;  #删除过期备份集

RMAN> crosscheck backup; #校验catalog的记录的备份信息是否在介质上真是存在,不一致

则置为expired过期状态

RMAN> delete expired backup;   #删除expired备份集

RMAN> validate backupset 147;  #根据backupset号验证备份有效性

5.5   RMAN备份与恢复

5.5.1全库备份与恢复

  • 全库备份

RMAN> sql ‘alter system archive log current‘;

RMAN> backup format=‘/u01/bak/f_%U‘ tag=‘full‘ database;

RMAN> list backupset of database;

RMAN> list backupset of controlfile;

RMAN> list backupset of spfile;    #列出指定内容的备份集

  • 全库恢复(也可用于异机恢复)

 

$rm  /u01/oradata/*

$rm /u01/db_1/dbs/spfileora10.ora

#模拟故障

$ rman

RMAN> connect target sys/oracle@ora10

RMAN> connect catalog rman/rman123;

RMAN> set dbid 719569885    #这一步可选,非必须。

RMAN> startup nomount;

RMAN> restore spfile from autobackup;

RMAN> startup nomount force;   #以恢复的spfile文件将数据库加载到

nomount状态。

RMAN> restore controlfile from autobackup;

RMAN> restore database;

RMAN> alter database mount;

RMAN> recover database;

#忽略报错。

RMAN> alter database open resetlogs;

5.5.2表空间备份与恢复

  • 表空间备份

RMAN> backup tablespace users;

RMAN> list backup of tablespace users;

  • 表空间恢复

RMAN> shutdown immediate

RMAN> startup mount;

RMAN> restore tablespace users;

RMAN> recover tablespace users;

RMAN> alter database open;

5.5.3表空间备份与恢复

  • 数据文件备份

RMAN> backup datafile 3;

RMAN> list backup of datafile 3;

  • 数据文件恢复

RMAN> shutdown immediate

RMAN> startup mount;

RMAN> restore datafile 3;

RMAN> recover datafile 3;

RMAN> alter database open;

5.5.4控制文件备份与恢复

  • 控制文件备份

因为控制文件常需和数据文件一起同时进行恢复,故不常单独对控制文件进行备份,而一般在对数据文件进行备份时利用 autobackup参数对控制文件进行同步备份,以保证数据文件和控制文件的一致性。

RMAN>CONFIGURE CONTROLFILE AUTOBACKUP ON; 

RMAN> backup current controlfile;

RMAN> list backup of controlfile;

#单独备份控制文件。

#查看控制文件备份信息。

RMAN> backup database include current controlfile;    #备库同时备份控制文件。

  • 控制文件恢复

RMAN> startup nomount;

RMAN> restore controlfile from autobackup;

RMAN> alter database mount;

RMAN> recover database;

RMAN> alter database open resetlogs;

最后重建临时表空间(对于 10gR2以后版本不需重建):

SQL> create temporary tablespace temp tempfile

  2  ‘/u01/oradata/ora10/temp01.dbf‘ reuse

3   autoextend off;

5.5.5归档文件备份与恢复

  • 归档文件的备份

不常单独对归档文件进行备份,而一般仅在对全库进行备份时对归档文件进行手工备份,以保证归档文件的一致性。

RMAN> backup archivelog all;

#备份归档文件。

RMAN> list backup of archivelog all;

#查看归档文件备份信息。

RMAN> backup database plus archivelog;    #备份数据库同时备份归档文件。这条命令

在备份归档日志文件前会自动执行一次

alter system archive log current。

RMAN> backup archivelog all delete all input; #备份归档文件完成后,删除目标数据

库上的归档文件。

  • 归档文件的还原

RMAN> restore archivelog all;

#还原所有归档日志文件。

RMAN> restore archivelog from scn/sequence/time; #按条件还原归档日志文件。

5.5.6RMAN脚本

举例:

run{

allocate channel d1 device type disk;

backup as compressed backupset

incremental level=0

format=‘/u01/bak/inc0_%d_%U‘

tag=‘inc0‘

channel=d1

database;

sql "alter system switch logfile";

backup as compressed backupset

format=‘/u01/bak/arch_%d_%U‘

tag=‘arch‘

channel=d1

archivelog all delete input;

backup as compressed backupset

format=‘/u01/bak/sctl.ctl‘

tag=‘ctl‘

channel=d1

current controlfile;

release channel d1;}

操作系统调用 RMAN脚本:

rman target sys/oracle@primary catalog rman/rman123\

 msglog /home/oracle/rman.log\

#指定日志记录文件位置

#指定脚本文件位置

 cmdfile=/home/oracle/rman.sh

5.5.7 RMAN增量备份与恢复

  • 差异备份:

差异备份对更低级及同级备份之后所有变化的数据备份。

差异备份所需备份时间短,恢复时间长。

RMAN> backup incremental level 0 database;

  • 累积增量备份:

累积备份只对更低级备份之后所有变化的数据备份。

累积备份所需时间长,恢复时间短。

RMAN> backup incremental level 1 cumulative database;

  • 还原:

RMAN> restore database;

6         逻辑备份(export/import

6.1   概述

逻辑备份是将数据库中所有或指定对象导出数据库成为备份文件,或将备份文件数据导入数据库。

Oracle支持三种类型的输出:

表方式(T方式),将指定表的数据导出。

用户方式(U方式),将指定用户的所有对象及数据导出。

全库方式(Full方式),将数据库中的所有对象导出。

6.2   简单导出、导入数据

6.2.1简单导出

$ exp lty/lty123

Enter array fetch buffer size: 4096 >     #选择缓冲区大小

Export file: expdat.dmp > lty.test.dmp    #导出文件名

(2)U(sers), or (3)T(ables): (2)U > t

Export table data (yes/no): yes >  

#选择导出类型

#是否导出表数据,若为no则只导出表结

Compress extents (yes/no): yes > 

#是否压缩

Table(T) or Partition(T:P) to be exported: (RETURN to quit) > test

#要导出的表名或表分区

. . exporting table                           TEST         10 rows exported

Table(T) or Partition(T:P) to be exported: (RETURN to quit) >        

#是否继续导出,退出则按回车

如果要导出全库或 system表空间则须以  sys用户登录,登录方式如下:

 

$ exp \‘sys/oracle as sysdba\‘

6.2.2简单导入

$ imp scott/tiger

Import file: expdat.dmp > lty.test.dmp    #选择要导入的文件名

Enter insert buffer size (minimum is 8192) 30720> 

#选择缓冲区大小

List contents of import file only (yes/no): no > 

#是否只列出导入数据文件的内容

Ignore create error due to object existence (yes/no): no >        

#是否忽略在对象创建时由于对象存在而发生的错误,若yes则导入数据到对象(无论对象是否存在,

若存在则继续在对象中添加数据,比如:如果表存在并且已有数据,则继续向表中插入导入的数据(约

束仍然起作用);若不存在,则先创建对象后再往里导入数据);若 no则对象存在就会跳过该对象的

导入。

Import grants (yes/no): yes > 

#是否导入权限。

Import table data (yes/no): yes >  

#是否导入表数据。

Import entire export file (yes/no): no > yes #是否导入整个文件的数据。

6.3   增量导出导入

增量导入导出是一种常用的数据备份方法,他只能对整个数据库来实施,并且必须以system用户来导出。在进行此种导出时,系统不要求回答任何问题。导出文件名缺省为 export.dmp,如果不用缺省文件名则须在命令行中指出。

6.3.1增量导出

包括三种类型:

²  “完全”增量导出(complete):导出整个数据库:

$ exp system/oracle inctype=complete file=full_101205.dmp

²  “增量型”增量导出:导出上一次备份后改变的数据:

$ exp system/manager inctype=incremental file=inc_101205.dmp

²  “累计型”增量导出:累积型到粗是导出自上次“完全”导出之后数据库中变化的数据:

$ exp system/manager inctype=cumulative file=cum_101205.dmp

6.3.2导入

$ imp system/oracle inctype=restore full=y file=full_101205.dmp

$ imp system/oracle inctype=restore full=y file=cum_101205.dmp

$ imp system/oracle inctype=restore full=y file=inc_101205.dmp

7         Flashback

7.1   概述

Flashback是指将数据库恢复到过去某个时间点或  SCN点的状态,包括行级闪回,表级闪回和库级闪回。

表级闪回是利用回收站机(recyclebin)制。当一张表被 drop掉时,默认情况下并没有真正被清除,而是被放入 recyclebin里;行级闪回和库级闪回原理实际上是对数据库执行的操作做一个反操作,如:向表里插入一条数据,闪回时则删除这一条数据。如果是行级或表级闪回,这些反操作依据的是 undo表空间里未被覆盖的原始数据,如果是库级闪回,则依据的是flashback日志。

7.2   Flashback配置步骤

1.系统配置

SQL> alter system set undo_management=‘auto‘ scope=spfile;

#重启生效。

SQL> alter system set undo_retention=9000;    #配置闪回可回溯时间,默认900秒。

SQL> show parameter undo

NAME

     TYPE   VALUE

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

undo_management    string  AUTO

undo_retention       integer  9000

undo_tablespace    string  UNDOTBS1

以下是库级闪回必须的配置(若不需要用到库级闪回则为可选配置):

SQL> show parameter db_recover

NAME                         TYPE                   VALUE

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

db_recovery_file_dest          string          /u01/flash_recovery_area

db_recovery_file_dest_size     big integer      2G

db_recovery_file_dest:该参数定义flashback日志文件存放目录。

db_recovery_file_dest_size:该参数定义了flashback日志文件目录最大大小,默认  2G。

SQL> show parameter flash

SQL> show parameter db_flash

NAME                      TYPE      VALUE

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

db_flashback_retention_target  integer    1440  #定义闪回数据保存时间,

单位分钟,默认1天。

启用归档模式和库级闪回功能:

SQL> startup mount

SQL> alter database archivelog;

SQL> alter database flashback on;

SQL> select name,log_mode,flashback_on from v$database;

NAME       LOG_MODE     FLASHBACK_ON

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

ORA10       ARCHIVELOG    YES

 

$ps  -ef | grep rvwr 

#rvwr进程定期将已变化的数据块写入flashback日志文件

$ls –l /u01/flash_recovery_area/ORA10/flashback #查看生成的flashback日志文件

2.授权给用户允许其进行闪回查询

SQL> grant connect,resource to lty; 

SQL> grant execute on dbms_flashback to lty;

SQL> grant select any transaction to lty;

7.3    行级闪回操作步骤

1.创建测试表

SQL> connect lty/lty123

#sys用户不支持行级闪回。

SQL> create table test(id int);

SQL> insert into test values (111);

SQL> commit;

SQL> insert into test values (222);

SQL> commit;

SQL> insert into test values (333);

SQL> commit;

SQL> update test set id=444 where id=333;

SQL> commit;

SQL> delete from test where id=222;

SQL> commit;

2.闪回查询对 test表所做的所有更改所对应的  SCN点

SQL> select  versions_startscn, versions_endscn, versions_xid, versions_operation  from  test versions between  timestamp  minvalue  and maxvalue;

或者:

SQL>select versions_startscn,versions_endscn,versions_xid,versions_operation from test versions between scn 602840 and 602880;

也可查询指定闪回交易号所对应的闪回 SQL语句:

SQL>select undo_sql from flashback_transaction_query where xid=‘0400090003010000‘

3.test表进行  row movement

SQL> alter table test enable row movement;

所有表中插入一行即被分配一永久 rowid,闪回时需对已删除行进行重插入处理,即需为被删行分配新的 rowid,故需允许进行 row movement。

4.闪回到指定 SCN号或时间点的状态

  • 闪回到指定SCN号:

SQL>flashback table test to scn 602857;

Flashback complete.

SQL>select * from test;

             ID

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

            111

            222

            333

SQL>rollback;

Rollbak complete.

SQL>select * from test;

             ID

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

            111

            222

            333

  • 闪回到指定时间点:

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

SQL> flashback  table test to timestamp to_date(‘2010-12-20

16:55:30‘,‘yyyy-mm-dd hh24-mi:ss‘);

7.4    表级闪回操作步骤

1.建立测试表

SQL> create table test1(a int) tablespace users;

SQL> insert into test1 values(1);

SQL> insert into test1 values(2);

SQL> insert into test1 values(3);

SQL> commit;

SQL> select * from test1;

2.删除测试表并闪回

SQL> drop table test1;

SQL> show recyclebin;

SQL> flashback table test1 to before drop;

SQL> select * from test1;

3.其他操作

  • 其他常用操作:

SQL> drop table test1 purge; #永久删除一个表(不放入回收站)

SQL> purge table test1; #清除回收站中指定表,如果回收站中有同名表,则清除先被drop掉的表。

SQL> purge recyclebin; #清空回收站

  • 闪回回收站里同名的表:

默认情况下回收站的同名表是先闪回后 drop掉的表:

SQL> show recyclebin;

SQL> flashback table test to before drop;

SQL> show recyclebin;

若要闪回指定的表,可如下操作:

SQL> show recyclebin;

SQL> flashback table "BIN$l9GDQZr46nngQKjACkgNhw==$0" to before drop;

SQL> show recyclebin;

要清除回收站中指定的表,操作类似:

SQL> purge table "BIN$l9GDQZr46nngQKjACkgNhw==$0";

  • 闪回回收站中与系统中同名的表:

SQL> show recyclebin;

...............

SQL> flashback table test to before drop;

Flashback table test to before drop

*

ERROR at line 1:

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

SQL> flashback table test to before drop rname to test2;

注意:

System表空间中的表不支持行级闪回,因为  system表空间有自己独立的 undo segment

且是 manul管理方式。Sys用户也无法使用行级闪回功能。

如果表空间空间不足时,对应表空间的回收站中的对象则按 FIFO规则自动被清除。

7.5    库级闪回操作步骤

  1. 按前面提到的库级闪回配置,配置系统
  2. 查询可闪回的最早时间和SCN号

SQL> alter session set nls_date_format=‘yyyy-mm-dd hh24:mi:ss‘;

SQL> select oldest_flashback_scn,oldest_flashback_time from v$flashback_database_log;

  1. 库级闪回到指定时间点或 SCN号状态
  • 库级闪回到指定时间点:

SQL> select * from test;

          B

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

          1

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

TO_CHAR(SYSDATE,‘YYYY-MM-DD HH24:MI;SS‘)

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

2010-12-21 09:54:41

SQL> drop table test purge;

 

SQL> shutdown immediate

SQL> startup mount;

Database mounted.

SQL>flashback database to timetamp to_date(‘2010-12-21 09:54:41

‘,‘‘yyyy-mm-dd hh24:mi:ss‘‘);

 

Flashback complete.

SQL> alter database open open resetlogs;

Database altered.

SQL> select * from test;

          B

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

          1

  • 库级闪回到指定SCN号状态:

SQL> select * from test;

          B

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

          1

SQL> select current_scn from v$database;

CURRENT_SCN

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

           642820

SQL> truncate table test;

Table truncated.

SQL> select * from test;

no rows selected

SQL> shutdown immediate

SQL> startup mount;

SQL> flashback database to scn 642820;

Flashback complete.

SQL> alter database open resetlogs;

Database altered.

SQL> slect * from test;

          B

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

          1

8         LogMiner

8.1   概述

Logminer是用于分析二进制重做日志文件和归档日志文件的工具。可从中分析出误操作执行的具体时间或 SCN号,以便恢复或进行操作审计、分析。

8.2   系统配置

SQL> alter database add supplemental log data;

Database altered.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME

--------

YES

SQL>execute

dbms_logmnr_d.build(options=>dbms_logmnr_d.store_in_redo_logs);

若无法执行以上语句,可先运行以下两个脚本:

SQL> @?/rdbms/admin/dbmslmd.sql 

SQL> @?/rdbms/admin/dbmslm.sql

建议使用非 system表空间来存放  logminer信息:

SQL> execute dbms_logmnr_d.set_tablespace(‘users‘);

8.3   操作步骤

  1. 将待分析的日志文件加入日志分析列表

添加当前日志文件:

SQL>execute dbms_logmnr.add_logfile(logfilename=>‘/u01/oradata/ora10/redo02.log‘,options=>dbms_logmnr.new);

 

SQL>select group#,sequence#,status from v$log;

GROUP#         SEQUENCE#           STATUS

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

             1                     2                  ACTIVE

             2                     4                  CURRENT

             3                     3                  ACTIVE

SQL>execute dbms_logmnr.add_logfile(logfilename=>‘/u01/oradata/ora10/redo01.dbf‘);

继续向日志分析列表中添加一个归档日志文件:

SQL>execute

dbms_logmnr.add_logfile(logfilename=>‘/u01/oradata/ora10/arch/ora10_1_2.a

rc‘,options=>dbms_logmnr.addfile);

从日志分析列表中删除一个日志文件:

SQL>execute

dbms_logmnr.add_logfile(logfilename=>‘/u01/oradata/ora10/arch/ora10_1_2.a

rc‘,options=>dbms_logmnr.removefile);

  1. 启动logminer 开始分析

SQL>execute

dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);

也可以指定开始和结束时间:

SQL>execute

dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog,starttime=>to_timestamp(‘2010-12-21 11:00:00‘,‘yyyy-mm-dd hh24:mi:ss‘),endtime=>to_timestamp(‘2010-12-21 11:00:30‘,‘yyyy-mm-ddhh24:mi:ss‘));

  1. 查看分析结果

SQL> select username,to_char(timestamp,‘yyyy-mm-dd hh24:mi:ss‘),sql_redo from v$logmnr_contents where table_name=‘TEST‘;

  1. 结束 logminer分析

SQL> execute dbms_logmnr.end_logmnr;

  

Oracle 10g数据库备份与恢复操作手册