第五章 数据备份与恢复
通过本章的学习,要求学员掌握以下内容:
1、 大致了解ORACLE的备份方式。
2、 了解如何配置RMAN。
3、 了解如何部署备份策略
4、 如何实现一般的还原和恢复
5.1****备份概述
5.1.1****概述
所谓备份,就是把数据库复制到转储设备的过程。其中,转储设备是指用于放置数据库拷贝的磁带或磁盘。通常也将存放于转储设备中的数据库的拷贝称为原数据库的备份或转储。
ORACLE数据库的备份分为物理备份和逻辑备份两种。物理备份是将实际组成数据库的操作系统文件从一处拷贝到另一处的备份过程,通常是从磁盘到磁带。可以使用 Oracle 的恢复管理器(Recovery Manager,RMAN)或操作系统命令进行数据库的物理备份。逻辑备份是利用SQL语言从数据库中抽取数据并存于二进制文件的过程。Oracle提供的逻辑备份工具是 EXP。数据库逻辑备份是物理备份的补充,对于逻辑备份来说,时间点恢复是不可能的,逻辑备份通常不会用作产品数据库备份与恢复计划的部分。
5.1.2 数据库运行方式
在说明ORACLE备份方式之前,应大致了解一下ORACLE数据库的运行方式。ORACLE数据库有两种运行方式:一是归档方式(ARCHIVELOG),归档方式的目的是当数据库发生故障时最大限度恢复数据库,可以保证不丢失任何已提交的数据;二是不归档方式(NOARCHIVELOG),只能恢复数据库到最近的回收点(冷备份或是逻辑备份)。根据数据库的高可用性和用户可承受丢失的工作量的多少,对于生产数据库,强烈要求采用为归档方式;那些正在开发和调试的数据库可以采用不归档方式。
在创建数据库时,就可以设置数据库初始的存档方式。一般情况下默认为NOARCHIVELOG方式。当数据库创建好以后,根据我们的需要把需要运行在归档方式的数据库改成ARCHIVELOG方式。 方法如下:
1.改变不归档方式为为归档方式
(1)关闭数据库,备份已有的数据,改变数据库的运行方式是对数据库的重要改动,所以要对数据库做备份,对可能出现的问题作出保护。
(2)修改初试化参数,使能自动存档
修改(添加)初始化文件init[SID].ora参数:
log_archive_start=true #启动自动归档
log_archive_format=ARC%T%S.arc #归档文件格式
log_archive_dest=/arch12/arch #归档路径
在9i中,可以最多有10个归档路径,并可以归档到其它服务器,如备用数据库(standby database)服务器
(3)启动Instance到Mount状态,即加载数据库但不打开数据库:
$>sqlplus “/as sysdba”
SQL>startup mount
(4)发出修改命令
SQL >alter database archivelog;
SQL>alter database open;
2.改变归档状态为不归档状态
与以上步骤相同,但有些操作不一样,主要是在以上的(2)操作中,现在为删除或注释该参数,在d操作中,命令为
SQL >alter database noarchivelog;
5.2 操作系统备份
操作系统备份有两类,冷备份(Cold backup)与热备份(Hot backup),操作系统备份与逻辑备份有本质的区别。逻辑备份提取数据库的数据内容,而不备份物理数据块。而操作系统备份则是拷贝整个的数据文件。
1.冷备份
冷备份在文件级备份开始前数据库必须彻底关闭。关闭操作必须用带有normal、immediate、transaction选项的shutdown来执行。
数据库使用的每个文件都被备份下来,这些文件包括:
所有数据文件
所有控制文件
所有联机REDO LOG 文件
INIT.ORA文件(可选)
作冷备份一般步骤是:
(1) 正常关闭要备份的实例(instance);
(2) 备份整个数据库到一个目录
(3) 启动数据库
如果利用脚本对数据库进行冷备份,必须对关闭数据库的命令进行逻辑检查,如果发生关闭数据库的命令不能正常执行而导致数据库没有正常关闭,那么,所有的冷备份将会是无效的。
2.热备份
热备份是当数据库打开并对用户有效是的操作系统级的数据备份。热备份只能用于ARCHIVELOG方式的数据库。在数据文件备份之前,对应的表空间必须通过使用ALTER TABLESPACE …… BEGIN BACKUP以备份方式放置。然后组成表空间的数据文件可以使用类似冷备份的操作系统命令进行拷贝。在数据文件用操作系统命令拷贝后,应使用ALTER TABLESPACE …… END BACKUP命令使表空间脱离热备份方式。
热备份没有必要备份联机日志,但必须是归档状态,在实例恢复的时候,可能需要用到归档日志。当前联机日志一定要保护好或是处于镜相状态,当前联机日志的损坏,对于数据库的损坏是巨大的,只能以数据的丢失来进行数据库的恢复工作。
对于临时表空间,存放的是临时信息,在热备份是也可以考虑不用备份,如果临时文件发生故障,可以删除该数据文件与表空间,重建一个临时表空间。
热备份的优点是显而易见的 :
l 可在表空间或数据文件级备份,备份时间短。
l 备份时数据库仍可使用。
l 可达到秒级恢复(恢复到某一时间点上)。
l 可对几乎所有数据库实体作恢复。
l 恢复是快速的,在大多数情况下在数据库仍工作时恢复。
一般热备份的时候,用户还在操作数据库。为了不影响用户正常工作,最好使每个表空间处于备份状态的时间最短,这样就要求一个表空间一个表空间的备份,不要使表空间一起处于备份状态而同时拷贝数据文件。
如果在热备份的时候如果数据库中断(如断电),那么在重新启动数据库的时候,数据库将提示有数据文件需要恢复,你需要把正在断电时候的处于备份状态的数据文件通过ALTER TABLESPACE …… END BACKUP结束备份方式。具体哪个数据文件或表空间处于备份状态,可以通过vdatafile来获得。
5.3****恢复管理器备份(****RMAN****)
Recovery manager(RMAN)是ORACLE提供的DBA工具,用于管理备份和恢复操作。RMAN只能用于ORACLE8或更高的版本中。它能够备份整个数据库或数据库部件,其中包括表空间、数据文件,控制文件和归档文件。RMAN可以按要求存取和执行备份和恢复。
RMAN备份有如下优点
l 支持在线热备份
l 支持多级增量备份
l 支持并行备份、恢复
l 减少所需要备份量
l 备份、恢复使用简单
重要的是,使用恢复管理器允许您进行增量数据块级的备份(这个与导出/导入的增量截然不同)。增量RMAN备份是时间和空间有效的,因为他们只备份自上次备份以来有变化的那些数据块。另一个空间有效的RMAN特性是它只备份数据文件中使用的数据块,忽略空的、未用的数据块,这个对于预分配空间的表空间有很大的好处。从9i开始,还增加了RMAN的数据块级别的恢复,可以进一步减少数据库恢复时间。
RMAN支持以下不同类型的备份
FULL 数据库全备份,包括所有的数据块
INCREMENTAL 增量备份,只备份自上次增量备份以来修改过的数据块。需要一个0 级的增量作为增量的基础,可以支持5级增量。
OPEN 在数据库打开的时候使用
CLOSED 在数据库加载(MOUNT)但不打开的时候备份,关闭备份可以是CONSISTENT或INCONSISTENT类型的。
CONSISTENT 在数据库加载但不打开,并且在加载之前数据库被彻底关闭(而不是被破坏或异常退出)时使CONSISTENT备份可以简单的进行复原(RESTORE)而不是恢复(RECOVER)
INCONSISTENT 在数据库打开或加载(但不打开)时使用。在该数据库正常关闭或崩溃后,INCONSISTENT备份需要恢复。
从上面各种备份方式来看,由于RMAN是数据块级别的备份,而操作系统下的备份是文件级的备份。这样使得恢复管理器(RMAN)备份无论是在空间和时间上相对于操作系统备份都具有明显的优势。另外,对于操作系统的备份来说,DBA自己动手编写脚本,在无法预知的情况下,脚本的维护、管理及稳定性都很难得到完全的保证。而对于RMAN,只要理解了BACKUP,RESTORE,RECOVER这三个最基本的命令,就可以进行数据库的备份,复原以及恢复操作。
用户管理(操作系统)和服务器管理的备份与恢复之间的根本不同之处是:对用户管理的操作,DBA必须知道需要备份什么以及需要还愿和恢复什么;而对于服务器管理的操作,RMAN将通过一个简单的接口决定需要备份什么以及需要还原与恢复什么,大部分管理任务被省略或简单化了。以下的内容将介绍实现RMAN一般的备份策略及具体配置。
5.4****备份策略
RMAN在备份数据时有两种操作的模式:增量式和完全式
增量备份的级别是一个0到4之间的整数,增量备份时,数据检查点SCN存储在目标数据库控制文件中,随后的增量备份决定了需要拷贝哪些与以前的增量备份级别相关而且发生在SCN时间的数据块,备份级别0时全集备份级别。是其它级别增量拷贝的基准。
增量备份又分为差异型备份和累积型备份:差异型备份拷贝所有在最近同级或低级增量备份以来所有改动的数据块。(ORACLE默认的增量备份类型);累积型备份拷贝所有在最近低级增量备份以来改动的数据块。(包括了最近同级备份时改动的数据块)。选择差异型备份还是选择累积型备份是从备份时的大小、速度与还原时的速度的重要性来衡量。
完全备份和增量备份级别0一样,但不是增量备份,不能作为其他增量备份的基准。
典型的备份部署方案一般是在周末进行增量级别为0的备份。然后,在整个星期内,需要进行不同的级别1或2的备份。这样每周循环可以使每一周都有一个基准增量备份以及每周内的少量增量备份。具体如下:(脚本文件请参考附件)
星期天 0级别备份(运行b_whole_inco.rcv脚本)
星期一 2级别备份(运行b_whole_inc2.rcv脚本)
星期二 2级别备份(运行b_whole_inc2.rcv脚本)
星期三 2级别备份(运行b_whole_inc2.rcv脚本)
星期四 1级别备份(运行b_whole_inc1.rcv脚本)
星期五 2级别备份(运行b_whole_inco.rcv脚本)
星期六 2级别备份(运行b_whole_inco.rcv脚本)
有了这个累积增量备份部署,就可用至少三个备份集来进行还原和恢复工作。
当为归档日志文件部署备份策略时,必须绝对确保已经获得了每个备份的归档日志文件的至少一个(最好多个)拷贝。还必须清理归档日志的目的地以防止写满文件系统以及中断数据库操作,RMAN有一个比较谨慎的部署选项DELETE INPUT,可以在对备份了归档日志进行删除。下面的归档日志备份策略在删除输入之前已经为每个归档日志文件做了三份拷贝。
(1) 在新的备份策略的前一两天内对目标数据库运用ARCHIVELOG ALL选项以实现为 所有已经存在的归档日志文件做基准备份。(运行b_archive.rcv)
(2) 每天为包括有最近两天的重做的所有已经存在的归档日志文件做备份(运行 b_archive_2days.rcv)。
(3) 每天为包括有从五天以前到前两天的重做日志文件进行备份(运行b_archive_delete3.rcv)
有了上述的备份部署,就可以将数据库恢复到以前的任何一个时刻。但在实际的生产系统中,很少会有将系统恢复到以前的已经过去了很长一段时间的某一个时刻,应该根据实际的需求来决定保留多长时间的备份,如假设只要求数据库能恢复到21天内的某一个时刻,那么只需保留最近21天内的备份即可。21天前的备份可以删除,或转储到别的位置。
5.5****备份部署
当用RMAN进行备份时,RMAN要把备份的相关信息(如什么时间进行的备份、备份了哪些文件、备份到什么位置等)进行存储,根据对这些信息存储位置的不同,RMAN的运行模式分为如下两种:
l NOCATALOG模式:
这种模式下将备份信息存在备份的目标数据库的控制文件中。
l CATALOG模式:
这种模式下单独创建一个Oracle数据库,将备份信息存在此独立的.数据库中(此时独立的数据库称为目录数据库,即Catalog database)。
出于高效和管理方便的,决定采用的是CATALOG(目录)模式备份。当用RMAN部署一个恢复目录时,需要将目录保存在与注册在其中的任何一个目标数据库都不同的数据库和机器上(防止当目标数据库崩溃时,目录数据库也不可用的情况),也可以使用一个产品数据库作为其他产品数据库的目录数据库。但必须注意,目录数据库的版本和目标数据库的版本必须一致。确定目录数据库后,在tnsnames.ora中配置目录数据库到目标数据库的连接。tnsnames.ora位于$ORACLE_HOME/network/admin中,配置情况如下:
SKGL204 = #到目标数据库的连接名,可自己设置
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.204)(PORT = 1521))
目标数据库的IP,可也是机器名
)
(CONNECT_DATA =
(SERVICE_NAME = skgl)
与目标数据库的inti.ora文件中的参数service_names同
)
)
配置连接后,在目录数据库上,执行如下命令:
\1. 创建表空间,用于存储备份信息。
SQL>CREATE TABLESPACE rmantbs DATAFILE ‘/oradata/catdb1/rmantbs01.dbf’ SIZE 32M;表空间名和路径根据自己的情况重新设置。
\2. 创建用户,用于管理备份信息。
SQL>CREATE USER rmanadm IDENTIFIED BY rmanadm
DEFAULT TABLESPACE rmantbs
TEMPORARY TABLESPACE temp ;
RMAN用户名和密码;根据自己的情况重新设置
\3. 授权。
SQL>GRANT CONNECT,RESOURCE,RECOVERY_CATALOG_OWNER TO rmanadm;
\4. 创建恢复目录。
$rman CATALOG rmanadm/rmanadm
RMAN>CREATE CATALOG;
\5. 注册目标数据库。
$rman CATALOG rmanadm/rmanadm TARGET SYS/SYS@targetDB
RMAN>REGISTER DATABASE;
配置好目录数据库后,便可以部署备份策略了。
首先来看bak_scripts目录下的脚本文件:
b_whole_inc0.rcv(文件名)(用于基准备份)
1 @@connect.rcv
2 run{
3 allocate channel d1 type disk;
4 backup incremental level = 0 database
5 format '/oradata/PRACTICE/backup/ch12/db%d%s%p%t'
6 tag = 'WHOLE_INC0';
7 release channel d1;
8 }
(1..8为行号,另行加上的,便于说明)
第1行的connect.rcv是同目录下的另一脚本文件,内容如下:
connect target sys/change_on_install@skgl204
connect catalog rmanadm/rmanadm@sw1hnm1
用于连接目标数据库和目录数据库,用户名、密码和服务名根据前面定义的情况重新设置。另外需要设置的是第4行带下划线的部分,为目标数据库上用于存储备份文件的路径,可根据目标数据库的情况自行设置。设置好的路径必须在目标数据库上实际存在,否则备份不能成功。
b_whole_inc1.rcv,b_whole_inc2.rcv,b_archive.rcv,b_archive_2days.rcv,b_archive_delete2.rcv都需同样的设置。(见安装包bak_scripts下的文件)
b_whole_inc0.sh,b_whole_inc1.sh,b_whole_inc2.sh,b_archive.sh,b_archive_2days.sh,b_archive_delete3.sh(见安装包bak_scripts下的文件)是用于部署在unix系统上的命令文件
b_whole_inc0.sh内容如下:
$ORACLE/HOME/bin/rman cmdfile=/bak_scripts/b_whole_inc0.rcv
log=/temp/b_whole_inc0.log
为放置bak_scripts文件夹的路径,设置完所有文件之后,使用chmod将这些文件修改为可执行文件,将便可用crontab部署这些命令文件。步骤如下:
以oracle用户登陆,定位在bak_scripts目录下
$chmod u+x b_whole_inc0.sh #其他文件类似
$crontab –e
min hour date month day command
0 1 * * 0 /b_whole_inc0.sh #Sunday
0 1 * * 1 /b_whole_inc2.sh #Monday
0 1 * * 2 /b_whole_inc2.sh #Tuesday
0 1 * * 3 /b_whole_inc2.sh #Wednesday
0 1 * * 4 /b_whole_inc1.sh #Thursday
0 1 * * 5 /b_whole_inc2.sh #Friday
0 1 * * 6 /b_whole_inc2.sh #Saturday
0 2 * * * /b_archive_2days.sh #Every Day
30 2 * * * /b_ archive_delete3.sh #Every Day
执行时间可重新设置。
注意:必须使第一次运行的备份脚本为b_whole_inc0.sh,其他的增量备份都是以0级增量备份为基准的,如果第一次运行的为其他脚本,那么至少前几天的备份是无效的,只能等到下一次循环到b_whole_inc0.sh脚本时,备份才重新生效。
b_whole_inc0.bat,b_whole_inc1.bat,b_whole_inc2.bat,b_archive.bat,b_archive_2days.bat,b_archive_delete3.bat(见安装包bak_scripts下的文件)是用于部署在windows系统上的命令文件
b_whole_inc0.bat内容如下:
rman cmdfile=/bak_scripts/b_whole_inc0.rcv log=c:/temp/b_whole_inc0.log
设置为bak_scripts文件夹所在的路径,设置完所有文件后,便可用at命令部署这些批处理文件。在windows的cmd窗口执行下列命令:
at 1:00 /every:Sunday cmd /c /b_whole_inc0.bat
at 1:00 /every:Monday cmd /c /b_whole_ inc2.bat
at 1:00 /every:Tuesday cmd /c /b_whole_ inc2.bat
at 1:00 /every:Wednesday cmd /c /b_whole_ inc2.bat
at 1:00 /every:Thursday cmd /c /b_whole_inc1.bat
at 1:00 /every:Friday cmd /c /b_whole_inc2.bat
at 1:00 /every:Saturday cmd /c /b_whole_inc2 .bat
at 2:00 cmd /c /b_archive_2days. bat
at 2:30 cmd /c /b_ archive_delete3. bat
至此,所有的备份策略便部署完毕。
5.6****还原和恢复
数据库的恢复分完全恢复和不完全恢复。完全恢复一般在实例崩溃后,恢复到最近的现场,一般操作如下:
C:> rman target sys/change_on_install@skgl204 catalog rmanadm/rmanadm
RMAN>
RUN{
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN;
}
不完全恢复的原因很多,如用户的误操作是数据库必须回到或只能回到以前备份的点,不完全恢复的一般操作如下:(其中命令中的 “TO_DATE(‘01/14/2005 12:02:10’,’MM/DD/YYYY HH24:MI:SS’)”为期望恢复到的时间点)
C:> rman target sys/change_on_install@skgl204 catalog rmanadm/rmanadm
RMAN>
RUN{
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
SET UNTIL TIME TO_DATE “(‘01/14/2005 12:02:10’,’MM/DD/YYYY HH24:MI:SS’)” ;
RESTORE DATABASE;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
}
RMAN> RESET DATABASE;
在执行完不完全恢复后,需在目录数据库中用RMAN发布RESET DATABASE命令,以从目标数据库控制文件中获得更新RMAN目录的新纪录的信息。另外,应对恢复后的数据库即时以增量备分级0重新备份数据库。