oracle的备份和恢复

Oracle系统备份恢复方案

一、            概述

1.1      备份的概念

    所谓备份,就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。 

    能够进行什么样的恢复依赖于有什么样的备份。作为 DBA,有责任从以下三个方面维护数据库的可恢复性: 

    使数据库的失效次数减到最少,从而使数据库保持最大的可用性; 

    当数据库不可避免地失效后,要使恢复时间减到最少,从而使恢复的效率达到最高; 

·当数据库失效后,要确保尽量少的数据丢失或根本不丢失,从而使数据具有最大的可恢复性。 

    灾难恢复的最重要的工作是设计充足频率的硬盘备份过程。备份过程应该满足系统要求的可恢复性。例如,如果数据库可有较长的关机时间,则可以每周进行一次冷备份,并归档重做日志,对于24*7的系统,或许我们考虑的只能是热备份。 如果每天都能备份当然会很理想,但要考虑其现实性。企业都在想办法降低维护成本,现实的方案才可能被采用。只要仔细计划,并想办法达到数据库可用性的底线,花少量的钱进行成功的备份与恢复也是可能的。

1.2        ORACLE数据库的运行方式

    ORACLE数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复数据库,可以保证不丢失任何已提交的数据;二是不归档方式(NOARCHIVELOG),只能恢复数据库到最近的回收点(冷备份或是逻辑备份)。我们根据数据库的高可用性和用户可承受丢失的工作量的多少,对于生产数据库,强烈要求采用为归档方式;那些正在开发和调试的数据库可以采用不归档方式。 

    如何改变数据库的运行方式,在创建数据库时,作为创建数据库的一部分,就决定了数据库初始的存档方式。一般情况下为NOARCHIVELOG方式。当数据库创建好以后,根据我们的需要把需要运行在归档方式的数据库改成ARCHIVELOG方式。 

Oracle 10g 之前,你还需要修改初始化参数使数据库处于自动归档模式。
pfile/spfile中设置如下参数:log_archive_start = true;重启数据库此参数生效,此时数据库处于自动归档模式。也可以在数据库启动过程中,手工执行:archive log start 使数据库启用自动归档,但是重启后数据库仍然处于手工归档模式。从Oracle 10g 开始,log_archive_start参数已经废除

     a.启用归档模式

SQL>shutdown immediate

SQL>startup mount
SQL >alter database archivelog

      SQL>alter database open

     b.停止归档模式

SQL>shutdown immediate

SQL>startup mount

SQL>alter database noarchivelog

SQL>alter database open

c.修改相应的初始化参数

1.3      ORACLE备份的分类

简单的按照备份进行的方式,可以分为逻辑备份、冷备份(脱机备份)、热备份(联机备份),其实冷备份与热备份又可以合称为物理备份

按照备份的工具,可以分为EXP/IMP备份、OS拷贝、RMAN、第三方工具,如VERITAS

1.3.1.         EXP/IMP逻辑备份

导入/导出是ORACLE幸存的最古老的两个命令行工具了,正确的说法是Exp/Imp只能是一个好的转储工具,特别是在小型数据库的转储,表空间的迁移,表的抽取,检测逻辑和物理冲突等中有不小的功劳。当然,我们也可以把它作为小型数据库的物理备份后的一个逻辑辅助备份,也是不错的建议。

对于越来越大的数据库,特别是TB级数据库和越来越多数据仓库的出现,EXP/IMP越来越力不从心了,这个时候,数据库的备份都转向了RMAN和第三方工具。

1.3.2.         冷备份(脱机备份)

在文件级备份开始前数据库必须彻底关闭。关闭操作必须用带有normalimmediatetransaction选项的shutdown来执行。

数据库使用的每个文件都被备份下来,这些文件包括:

     所有数据文件

     所有控制文件

     所有联机REDO LOG 文件

     ☆INIT.ORA文件(可选)

     作冷备份一般步骤是:

        a.正常关闭要备份的实例(instance);

        b.备份整个数据库到一个目录

c.启动数据库

            SQL>connect internal

            SQL>shutdown immediate

            SQL>! cp <file> <backup directory>

SQL>!tar cvf /dev/rmt/0 /u01/oradata/prod

            SQL>startup

注意:如果利用脚本对数据库进行冷备份,必须对关闭数据库的命令进行逻辑检查,如果发生关闭数据库的命令不能正常执行而导致数据库没有正常关闭,那么,所有的冷备份将是无效的。

1.3.3.            热备份(连机备份)

热备份是当数据库打开并对用户有效是的OS级的数据备份。热备份只能用于ARCHIVELOG方式的数据库。在数据文件备份之前,对应的表空间必须通过使用ALTER TABLESPACE …… BEGIN BACKUP以备份方式放置。然后组成表空间的数据文件可以使用类似冷备份的操作系统命令进行拷贝。在数据文件用操作系统命令拷贝后,应使用ALTER TABLESPACE …… END BACKUP命令使表空间脱离热备份方式。

热备份没有必要备份联机日志,但必须是归档状态,在实例恢复的时候,可能需要用到归档日志。当前联机日志一定要保护好或是处于镜相状态,当前联机日志的损坏,对于数据库的损坏是巨大的,只能以数据的丢失来进行数据库的恢复工作。

对于临时表空间,存放的是临时信息,在热备份是也可以考虑不用备份,如果临时文件发生故障,可以删除该数据文件与表空间,重建一个临时表空间。

热备份的优点:

a.可在表空间或数据文件级备份,备份时间短。 

b.备份时数据库仍可使用。 

c.可达到秒级恢复(恢复到某一时间点上)。 

d.可对几乎所有数据库实体作恢复。 

e.恢复是快速的,在大多数情况下在数据库仍工作时恢复。

在热备份的时候,因为用户还在操作数据库,所以,最好是每个表空间处于备份状态的时间最短,这样就要求一个表空间一个表空间的备份,不要一起使表空间处于备份状态而同时拷贝数据文件。

注意:如果在热备份的时候如果数据库中断(如断电),那么在重新启动数据库的时候,数据库将提示有数据文件需要恢复,你需要把正在断电时候的处于备份状态的数据文件通过ALTER TABLESPACE …… END BACKUP结束备份方式。具体哪个数据文件或表空间处于备份状态,可以通过v$backupv$datafile来获得。

1.3.4.         RMAN进行备份

采用数据库提供的RMAN备份工具有以下的优点:

a.       支持在线热备份

    是指备份不需要关闭数据库进行,在备份的同时可以进行正常的数据库的各种操作,

满足了7*24的系统的需要,对于本系统而言,数据库的备份将不会影响INTERNET

INTRANET用户对数据库的访问。

 

b.       支持多级增量备份

    多级增量备份是指第N级的备份只需要备份最后一次同级或N-1级备份以后发生的改变的数据。可以通过下图来说明:

 

 

上图是一个增量备份的例子,即在第一个星期天做一个增量的0级备份,然后在星期一,星期二做一个增量的2级备份,在星期三做一个增量的1级备份,然后类推。假设现在在星期五数据库需要做恢复,则可以先恢复第一个星期天的0级备份,,然后恢复星期三的1级备份,再恢复星期四和星期五的2级备份就可以完成数据库的恢复。

 

因为在本系统录入后的数据数据进入数据库后将大部分变为只读状态,所以采用对这些表空间只备份一次或比经常改变的表空间备份次数更少的方法,将能够很大地减少备份的数据量。具体的方案如下:

对于表PROD_CONTENT_CN_TBLPROD_VALUE_TBL由于做了关于序列号的分区,采取的当一个分区满了以后,在数据库里把该分区改成只读状态,然后做一个该表空间的备份,然后在做数据库的日常增量备份时忽略该表空间的数据则能够大大减少要备份的数据量。

 

c.       支持并行备份,恢复

RMAN是通过启动数据库的SERVER进程来进行备份和恢复,而且支持启动多个SERVER进程来进行备份和恢复,在同一个SERVER进程内还支持多个BACKUPSET(备份集)的同时产生。主要是通过设置多个通道及filesperset参数来达到并行的目的。

 

分配多个通道的语句(以下语句分配两个通道)

Allocate channel ‘dev_ 1’ type disk;

Allocate channel ‘dev_ 2’ type disk;

 

设置在一个通道同时打开的备份文件语句(以下语句设置在一个通道下同时打开3个文件)

backup filesperset 3。。。

 

d.       减小所需要备份量

因为RMAN是工作在数据快一级,所以能够只备份分配的数据快,这样就大大地减少了所需要的备份的数据量,特别是对于预先分配空间的数据库而言。

 

e.       备份,恢复使用简单

RMAN的使用特别简单,在进行备份和恢复时都不需要指定需要备份或需要恢复的数据文件,RMAN会自动地把备份或恢复所需要的数据文件进行备份或进行恢复。减少了人为操作可能产生的错误。

 

如以下是备份整个数据库的语句

backup full tag 'basicdb' format '/bak/bak/basic/basic%u_%p_%c' database ;

 

以下是备份一个表空间的语句

backup tag 'tsusers' format '/bak/bak/basic/basic%u_%p_%c' tablespace users ;

 

以下是备份归档文件的语句

backup filesperset 3   archivelog all delete input;

归档文件会在备份后自动删除。

  

1.4       RMAN的配置

配置RMAN包括配置CATALOG数据库,配置数据库与媒体管理软件的接口,制定RMAN的多级备份方案,写RMAN备份脚本

 

1.4.1   CATALOG数据库

因为RMAN自动维护备份和恢复所需要的各种信息,所以RMAN必须把这些以某种形式保存。RMAN支持两种形式保存这些信息,数据库的控制文件或创建一个单独的数据库来保存RMAN的信息。

 

当选择把RMAN的信息存储在控制文件时,控制文件的丢失时将导致备份将不能进行恢复。所以若采用RMAN做备份,推荐一定采用RMAN CATALOG数据库来单独存放备份信息。这个单独的数据库(称为CATALOG数据库)只需要很小的空间,既可以和被备份的数据库(E10K)放在同一主机上,也可以单独放在另一台主机上(如果条件允许,推荐放在一台单独的主机上来确保最大的可恢复性)。

 

备份CATALOG数据库:因为CATALOG数据库包含了所有的备份信息,所以该数据库本身也是需要通过某种方法进行备份,但因为该数据库很小(一年内可能才增加十几二十兆),所以既可以对它进行冷备份,也可以进行逻辑的输出(EXPORT)。

 

配置CATALOG数据库:

dbassist创建数据库。

在该数据库创建RMAN数据库用户:

create user rman identified by rman default tablespace ts_rman

temporary tablespace temp;

grant connect ,resource , RECOVERY_CATALOG_OWNER to rman.

连接到目标数据库和CATALOG数据库

rman target system/manager@target_tnsname rcvcat rman/rman@catalog_tnsname

创建CATALOG用户的表:

rman>create catalog

登记目标数据库:

rman>register database

 

这样就可以利用该RMAN数据库来备份目标数据库了。

 

1.4.2   磁带接口

当使用专用的磁带管理工具时,必须配置数据库与磁带的接口,一般是管理工具提供一个动态连接库与数据库进行连接。

以下是一个测试的RMAN脚本:

run {

allocate channel 'dev1' type disk

resync catalog;

backup format ‘/archive/ctl%u_%p_%c ‘ current controlfile;

release channel dev1;

}

 

二、 备份策略

2.1      物理备份

采用多级备份是为了减少了恢复所需要的时间和减少每天备份所需要的时间,而又保证系统有很好的恢复性。但是在恢复时间和备份时间要有一个权衡。比如只要开始的一个全备份和备份所有产生的归档文件就可以保证把数据库恢复到最新的状态,但是一般来说实际上并不会这么进行(因为在恢复时将需要很长很长的时间),多级备份就是为了解决这样的问题。以下是一种建议的方案。

 

每半年做一个数据库的全备份(包含只读表空间)

每个月做一次零级备份(不包含只读表空间)

每个星期做一次一级备份

每天做一个二级备份

任何表空间改成只读状态后做一个该表空间的备份。

当需要时(如四个小时归档文件系统就要接近满了)备份归档文件

 

数据库全备份脚本:

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup full  tag 'dbfull' format '/o9i/testrman/full%u_%p_%c' database ;

sql 'alter system archive log current' ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

 

零级备份脚本(只读表空间除外)

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup incremental level 0  tag 'dbL0' format '/o9i/testrman/basic%u_%p_%c' database skip readonly;

sql 'alter system archive log current' ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

一级备份脚本

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup incremental level 1  tag 'dbL1' format '/o9i/testrman/basic%u_%p_%c' ddatabase skip readonly;

sql 'alter system archive log current' ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

 

二级备份脚本

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup incremental level 2  tag 'dbL2' format '/o9i/testrman/basic%u_%p_%c' ddatabase skip readonly;

sql 'alter system archive log current' ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

表空间备份脚本(以users表空间为例)

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup  tag 'tsusers' format '/o9i/testrman/basic%u_%p_%c' tablespace users;

sql 'alter system archive log current' ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

 

归档文件备份脚本

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

backup filesperset 3   archivelog all delete input;

release channel dev1;

release channel dev2;

release channel dev3;

}

 

则每天所需要备份的数据量只有一天的改变量。而做恢复时最多只要恢复当月的一个零级备份+三个一级备份+6个二级备份+当天的归档文件。如果不能接受这样的恢复时间,就只能够减少零级备份之间的时间间隔(如可以每个星期做一个零级备份,这样恢复时最多只需要恢复一个星期的数据量)。

 

备份CATALOG数据库(数据库逻辑输出)

exp pafile=exp.dat

其中exp.dat如下

userid=rman/rman

file=rmanexp.dmp

 

2.2      逻辑备份

   采用ORACLE 提供的IMPORTEXPORT工具进行数据的备份和恢复。

   该备份我们也是采用3种方式进行备份:

   全库备份

   增量备份

   一些重要数据库对象的备份。

  逻辑备份的目的主要是为了防止人为的操作而导致系统故障,需要恢复对数据进行的备份。如果是部分对象需要恢复时,它能够快速完成,使系统恢复正常。

 

逻辑备份实现

    脚本说明:

l          管理员可以使用expfull.sh脚本备份数据库。如$expfull.sh

l          脚本所在路径:/oracle/backup/expfull.cmd

l          backup.sh内容:

全库备份

su - oracle <<EOF

NLS_LANG=AMERICAN_AMERICA.UTF8;export NLS_LANG

dd=`date +%Y%m%d`

exp system/manager file=/oracle/backup/full_$dd.dmp log= /oracle/backup/full_$dd.log full=y compress=n direct=y

该备份由于每次备份的时间比较长所以建议备份每个月做一次。

增量备份

 su - oracle <<EOF

NLS_LANG=AMERICAN_AMERICA.UTF8;export NLS_LANG

dd=`date +%Y%m%d`

 

exp system/manager inctype=incremental file= file=/oracle/backup/incr_$dd.dmp
每天做一次。

部分对象备份

该部分备份可以考虑一些系统中比较重要的对象,另外系统中改变速度比较快的表也可以考虑,进行备份。

su - oracle <<EOF

NLS_LANG=AMERICAN_AMERICA.UTF8;export NLS_LANG

dd=`date +%Y%m%d`

exp system/manager full=no tables=(需要备份的表)  file=/oracle/backup/table_$dd.dmp

 

    备份实现:

 利用操作系统自动运行脚本的机制,实现数据库的自动逻辑备份。设定在固定的时间(每周1凌晨2点)执行固定的备份脚本,备份过程记录在/oracle/backup/full_$dd.log文件中。

l                        根据下述脚本,执行定期工作调度

$crontab -e

00 2 * * 1 /oracle/backup/expfull.cmd

l                        如果要检查现有系统中的定期工作调度,执行下面的命令:

$crontab -l

l                        如果要删除系统中的定期工作调度,执行下面的命令:

$crontab –r

 

三、 恢复策略

恢复策略主要是在系统出现故障的时候,如何通过使用已有的备份进行快速的恢复。

3.1      物理恢复

    数据库的的恢复比较复杂,有许多不同的情况必须在了解ORACLE数据库结构的条件下用不同的方法处理,RMAN的好处在于大部分情况不需要理解数据库的结构而使用一些最简单语句来进行恢复,这里只讨论了最常用最普通的恢复情况

 

恢复整个数据库

 

在恢复整个数据库之前必须让数据库处于安装的状态(mount状态)

SQL>startup mount

 

rman>

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

restore  database ;

recover database ;

release channel dev1 ;

release channel dev2 ;

release channel dev3 ;

}

 

  

在恢复该表空间之前让该表空间处于脱机的状态(offline状态)

svrmgrl>alter tablespace users offline;

 

rman>

run {

allocate channel 'dev1' type disk   ;

allocate channel 'dev2' type disk ;

allocate channel 'dev3' type disk ;

restore  tablespace users ;

recover tablespace users ;

release channel dev1 ;

release channel dev2 ;

release channel dev3 ;

}

 

3.2      逻辑恢复

逻辑恢复情况一般有两种情况,一种是是进行全库的恢复,这个需要通过使用下面方法进行恢复:

  imp system/manager   inctype=RESTORE FULL=y FILE=filename

另外一种情况是只恢复部分对象,这个可以从数据库全备份中来抽取出来进行恢复,该恢复操作恢复时间比较快。例如客户资料信息表由于异常数据丢失,我们可以通过备份来快速恢复。

 
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值