数据库的备份与恢复.docx
《数据库的备份与恢复.docx》由会员分享,可在线阅读,更多相关《数据库的备份与恢复.docx(17页珍藏版)》请在冰豆网上搜索。
![数据库的备份与恢复.docx](https://file1.bdocx.com/fileroot1/2023-5/24/5ef3e76b-5acb-4491-974c-df9f35762768/5ef3e76b-5acb-4491-974c-df9f357627681.gif)
数据库的备份与恢复
数据库的备份与恢复
1ORACLE数据库的备份与恢复
在本集中备份系统中,ORACLE数据库的备份与恢复是由LegatoNetworker(以下简称Networker),LegatoNetworkerModuleforOralce(以下简称NMO),Catalog数据库,以及OracleRecoverManager(以下简称RMAN)各部分共同完成的。
其中Networker提供对磁带库、磁带机、磁带、索引等的管理;NMO提供Networker与RMAN之间的接口;Catalog保存了备份的数据库结构信息,以及备份集、备份片和数据库模式等信息;RMAN是Oracle的一个实用程序,完成对Oracle数据文件、控制文件、归档重做日志的备份、还原和恢复工作,并把操作的信息保存在数据库的控制文件和Catalog数据库中,它简化了Oracle数据库的备份与恢复。
1.1ORACLE数据库的备份
对Oracle数据库的备份,是由Networker主动发起的,在每天规定的时间启动组备份,所有包含在同一组的客户端将调用Oracle数据库中的RMAN脚本,启动RMAN备份,通过NMO将数据备份到磁带库。
当然在需要的时候也可以在Oracle数据库服务器上手动执行RMAN备份脚本。
所有Oracle数据库的备份已经在Networker上设置好,平时不需人为干预。
以下是常用的备份脚本。
1.1.1Oracle数据库的0级备份
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc2type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc3type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc4type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
backupincrementallevel0database
diskratio0
skipinaccessible
taghot_db_bk_level0
format'db_%s_%p_%t';
sql'altersystemarchivelogcurrent';
backuparchivelogalldeleteinput
skipinaccessible
format'al_%s_%p_%t';
backupcurrentcontrolfile
taghot_cf_bk
format'cf_%s_%p_%t';
releasechannelc1;
releasechannelc2;
releasechannelc3;
releasechannelc4;
}
1.1.2Oracle数据库的1级增量备份
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc2type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc3type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc4type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
backupincrementallevel1database
diskratio0
skipinaccessible
taghot_db_bk_level1_differ
format'db_%s_%p_%t';
sql'altersystemarchivelogcurrent';
backuparchivelogalldeleteinput
skipinaccessible
format'al_%s_%p_%t';
backupcurrentcontrolfile
taghot_cf_bk
format'cf_%s_%p_%t';
releasechannelc1;
releasechannelc2;
releasechannelc3;
releasechannelc4;
}
1.2ORACLE数据库的恢复
通过NMO模块备份的数据可以使用两种方式进行恢复:
1、在RMAN命令行模式下输入适当的命令,或使用RMAN恢复脚本;2、使用OEM备份管理工具,其中包含了针对RMAN的图形用户接口,可以产生相应的RMAN命令执行备份与恢复操作。
Oracle使用restore和recover命令恢复数据库,restore(还原)是指从备份介质中提取出所需的数据文件,并把它存储到磁盘上;recover(恢复)是指对数据库应用重做日志,以保证数据库的一致性。
在还原(restore)数据库文件时,数据库应该处于什么状态呢?
下表提供了一个快速解答。
基本原则是:
当一个文件正在被还原时,这个数据文件不能被实例使用,因为当一个数据库文件正在被还原时实例不能对其进行写入操作。
在任何数据库文件还原期间,目标数据库的实例必须已经启动。
当从备份集中只还原任何非系统数据文件时,为了确保还原成功,这些数据文件(或表空间)必须处于脱机状态。
如果是还原任何系统表空间数据文件,则数据库必须以加载(mount)模式启动。
当还原一个控制文件时,实例必须以非加载(nomount)模式启动,因为数据库被加载后,该控制文件就要被使用。
数据库文件
数据库状态
任何非系统数据文件
加载或打开,但这些文件或表空间必须脱机
系统数据文件
加载
数据库(所有数据文件)
加载
归档日志
非加载、加载或打开
控制
非加载
下面介绍几种恢复情况下的RMAN恢复。
1.2.1Oracle数据库的完全恢复
完全恢复包括对已执行的数据库、表空间或数据文件使用增量备份和重做数据以把数据库修正到最近的时刻。
之所以称为“完全”恢复是因为oracle对备份应用所有的重做数据。
在介质失效破坏数据文件或控制文件时,经常需要执行介质完全恢复。
可以对数据库、表空间或数据文件执行完全恢复。
如果在整个数据库上执行完全恢复,必须:
∙将数据库置于mount模式
∙确保所有需要恢复的数据文件是联机的
∙还原整个数据库或需要恢复的文件
∙应用联机或归档重做日志,或两者都应用
如果需要对一个表空间或数据文件执行完全恢复,你必须:
∙如果数据库是打开的(open),把需要恢复的表空间或数据文件置于脱机状态
∙还原表空间或数据文件
∙应用联机或归档重做日志,或两者都应用
下面是使用RMAN执行完全恢复的一个示范脚本,在执行前数据库必须置于mount模式。
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc2type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
restoredatabase;
recoverdatabase;
releasechannelc1;
releasechannelc2;
}
alterdatabaseopen;
1.2.2Oracle数据库的不完全恢复
不完全恢复使用备份数据产生一个非现时版本的数据库。
也就是说,你不必应用自最近备份以来所有的重做数据,而是截止到某一特定时间点的重做日志,将数据库回退到以前的某个时间点。
一般在下列情况下执行不完全恢复:
∙介质故障破坏了部分或所有的联机重做日志
∙用户错误导致数据丢失,例如:
用户不小心drop了一个表
∙一个归档重做日志丢失导致无法执行完全恢复
∙丢失了当前的控制文件,必须使用备份的控制文件打开数据库
执行不完全恢复,必须还原该时间点以前创建的所有备份,恢复命令指定在哪个时间点上希望恢复操作停止。
在恢复完成以后以resetlogs(重置日志)方式打开数据库。
当打开数据库时,将忽略剩余的数据库重做信息,一旦数据库打开,被忽略的重做信息就不能再用了。
重置(resetting)日志文件创建了数据库的一个新实体,已恢复的数据库的序号将以新的日志序列流开始,起始的日志序号为1,控制文件被更新以反应新的数据库。
注意:
由于归档日志文件现在使用的序号是从1开始计数的,所以应当在打开数据库之后清除当前归档日志目的路径。
这样做能够避免来自不同数据库实体的文件保存在同一目录下时产生冲突。
下面是使用RMAN执行不完全恢复的示范脚本,在执行前数据库必须置于mount模式。
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
#settimetojustbeforedatawaslost
setuntiltime“TO_DATE(‘02/02/200312:
02:
10’,’MM/DD/YYYYHH24:
MI:
SS’)”;
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc2type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
restoredatabase;
recoverdatabase;
releasechannelc1;
releasechannelc2;
}
alterdatabaseopenresetlogs;
不完全恢复(时间点恢复)有三种方法,上面介绍的时基于时间的恢复,另外还有基于取消的恢复(指定恢复到某一重做文件)和基于取消的恢复(指定恢复到某个SCN)。
1.2.3Oracle数据库表空间的恢复
如果恢复系统数据文件,数据库必须置于mount模式。
如果需要恢复非系统的数据文件或表空间,数据库可以打开,但相应的数据文件或表空间必须脱机。
下面是表空间恢复的示范脚本。
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
allocatechannelc2type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
sql’altertablespacexxxxofflineimmediate’;
restore(tablespacexxxx);
recover(tablespacexxxx);
sql’altertablespacexxxxonline’;
releasechannelc1;
releasechannelc2;
}
1.2.4恢复控制文件
如果丢失了当前控制文件的所有拷贝,但还有数据库当前日期的目录,则使用restorecontrolfile命令重新生成控制文件,该控制文件与以前的备份类似。
RMAN将自动把控制文件存放到init.ora文件指定的路径下。
还原前,数据库必须置于nomount模式。
还原与恢复之后,必须重置日志并打开数据库。
下面是还原控制文件的示范脚本
connectcatalogrman/rman@catalog_server
connecttargetsystem/passwd@oracle_server
run{
allocatechannelc1type'SBT_TAPE'
parms'ENV=(NSR_SERVER=l2000a,NSR_CLIENT=hostname,NSR_DATA_VOLUME_POOL=pool_name)';
restorecontrolfile;
releasechannelc1;
}
1.2.5把Oracle数据库恢复到另一台主机上
在某些情况下,为了安全起见,有可能需要把数据库恢复到另外一台主机上。
这时可以按照以下步骤进行恢复:
a)在NetworkerServer上包含需要恢复Oracle的备份,并且在被备份的数据库主机的clientsetup属性下remoteaccess中要包含将要进行恢复的主机。
b)在第二套Oracle系统主机上安装NMO模块。
c)在第二套Oracle系统主机上安装和配置RMAN。
d)创建相应的RMAN恢复脚本。
e)在RMAN恢复脚本中指定NSR_SERVER变量。
f)在RMAN恢复脚本中指定NSR_CLIENT变量为原来备份的Oracle主机名。
g)使用RMAN命令执行恢复脚本恢复数据库。
2SYBASE数据库的备份与恢复
在本系统中,Sybase的备份和恢复是由NetWorker、NetWorkerModuleforSybase、SybaseOpenClient/C和SybaseBackupServer共同完成的。
NetWorker和NetWorkerModuleforSybase(以下简称NMS)通过使用XBSA的API接口连接到Sybase的BackupServerAPI接口为Sybase数据库提供存储管理服务。
Libbms共享库从SybaseBackupServer接受API呼叫,把他们翻译成XBSA呼叫,并发送到NetWorker。
在NetWorker上设置Sybase备份的策略,磁带池等信息。
2.1SYBASE数据库的备份
在日常的自动备份中,savegrp使用nsrsyb脚本代替标准的save命令,nsrsyb脚本与SybaseOpenClient/C互相协调对指定的数据库进行备份。
NetWorker处理日常的存储管理任务,而libbms负责把数据从Sybase传送到NetWorker。
NetWorker提供几种配置好的策略。
可以从中选择,也可以自己创建。
NMS模块把NetWorker的备份级别翻译成Sybase的dump命令,如下表所示:
NetWorker
SybaseServer
BackupOperation
full
dumpdatabase
Fullbackupofadatabaseanditstransactionlogs
incremental
dumptransactionlog
Backupofallchangestothedatabasesincethelastdump
1–9
notvalid
Failswithanerrormessage
skip
skip
Skipstheschedulebackup
本系统中对Sybase数据库的备份都已设置好,每天自动执行,不需人为干预。
下面只介绍如何通过命令行手动发起备份。
Sybase建议在做手动备份以前先对数据库做一致性检查。
NMS提供了一个命令nsrsybcc可以执行这项操作。
可以使用nsrsybsv命令对Sybase数据库或TransactionLog,缺省情况下,nsrsybsv将把数据写入Default池。
如果想写入特定的磁带池需要指定参数-bpool_name。
下面是一个手动备份的例子:
1、指定NetWorkerServer
setenvNSR_SERVERNetWorker_server_name
2、设定SYBASE变量,指定Sybase路径
setenvSYBASE/space2/sybase
3、对Sybase12.0或以后版本,运行Sybase.sh或Sybase.csh脚本
source$SYBASE/SYBASE.sh
4、备份指定的数据库和交易日志
nsrsybsv-Uuserid-Ppassword-lfullSYBASE:
/server_name/db_name
如果想备份整个数据库,则使用
nsrsybsv-Uuserid-Ppassword-lfullSYBASE:
/server_name
5、如果要备份NetWorker的索引和bootstrap,则
savegrp-O-lfull-Pprinter_name-cclient_name
你也可以使用isql命令行的dump命令对数据库和日志进行备份,语法如下:
dumpdatabasedatabase_nameto“bms:
:
”
或
dumptransactiondatabase_nameto“bms:
:
”
2.2SYBASE数据库的恢复
NMS提供了一种数据库崩溃时从NetWorker备份介质中恢复数据的有效方法,当一个恢复请求被发起时,libbms共享库把由nsrsybrc命令或load命令请求的对象名翻译成NetWorker可以理解的格式,并传送给NetWorker的nsrd进程。
libbms共享库也将向nsrindexd进程发送请求。
nsrindexd进程确保被请求对象的索引信息存在,并通知libbms。
libbms共享库随后将向nsrmmd介质进程请求数据。
Nsrmmd从NetWorker的媒体数据库中查找包含相应数据的介质,然后把数据恢复到Sybase数据库。
可以在命令行下使用NMS提供的nsrsybrc命令对数据库实例进行恢复。
nsrsybrc可以执行指定时间点、重定向和导入等不同类型的数据库恢复。
1、指定时间点恢复
对Sybase-ASE11.5和以后的版本,可以使用-t选项指定数据库恢复到某个时间点。
这项功能使得数据库可以把交易日志还原到中间位置,而不用还原所有的交易日志。
恢复命令如下:
nsrsybrc-Uuserid-Ppassword-snetworker_server-t“MM/DD/YYHH:
MM:
SS”SYBASE:
/server_name[/db_name]
在一个指定时间点的恢复中,nsrsybrc把数据库还原到指定的时间点,它首先还原时间点之前最近一次的全备份,然后对数据库应用时间点之前所有的交易日志。
注意:
在指定时间点恢复以后,AdaptiveServer将重新开始数据库的日志序列号。
所有应该立即做一次数据库的全备份。
2、重定向恢复
重定向恢复可以把备份的数据库装载到一个新的数据库上,nsrsybrc程序使用-d选项指定重定向的位置。
在重定向恢复以前,需要确认:
Ø确保新的数据库已经创建,并且和原数据库有着相同的设备分配
Ø创建新数据库时注意使用forload选项
下面是重定向恢复的几种情况:
a)恢复到同一个服务器实例,使用不同的数据库名称
nsrsybrc-Uuserid-Ppassword-snetworker_server-dSYBASE:
/server_name/new_db_nameSYBASE:
/server_name/old_db_name
b)恢复到不同的服务器实例,使用相同的数据库名称
nsrsybrc-Uuserid-Ppassword-snetworker_server-dSYBASE:
/new_server_name/db_nameSYBASE:
/old_server_name/db_name
c)恢复到不同的服务器实例,使用不同的数据库名称
nsrsybrc-Uuserid-Ppassword-snetworker_server-dSYBASE:
/new_server_name/new_db_nameSYBASE:
/old_server_name/old_db_name
3、导入恢复
导入恢复使你可以从另一个NetWorker客户端上的Sybase服务器恢复备份的数据库。
nsrsybrc程序通过使用-c选项或指定NSR_CLENT参数来执行这项工作。
nsrsybrc-Uuserid-Ppassword-snetworker_server-cnetworker_clientSYBASE:
/s