主要介绍了Oracle数据库备份与恢复的具体方法及相关案例
详细内容请大家参考下文
冷备份
备份步骤
冷备份具有很多优良特性快速方便以及高效一次完整的冷备份步骤是
首先关闭数据库(shutdown normal)
拷贝相关文件到安全区域(利用操作系统命令拷贝数据库的所有的数据文件日志文件控制文件参数文件口令文件等(包括路径))
重新启动数据库(startup)
以上的步骤可以用一个脚本来完成操作
su oracle < sqlplus /nolog
connect / as sysdba
shutdown immediate;
!cp 文件 备份位置(所有的日志数据控制及参数文件);
startup;
exit;
恢复步骤
恢复的时候相对比较简单了我停掉数据库将文件拷贝回相应位置重启数据库就可以了当然也可以用脚本来完成
热备份
备份步骤
当需要做一个精度比较高的备份而且我们的数据库不可能停掉(少许访问量)时这个情况下我们就需要归档方式下的备份就是下面讨论的热备份热备份可以非常精确的备份表空间级和用户级的数据由于它是根据归档日志的时间轴来备份恢复的理论上可以恢复到前一个操作甚至就是前一秒的操作具体步骤如下
通过视图v$database查看数据库是否在Archive模式下:
SQL> select log_mode from v$database;
如果不是Archive模式
则设定数据库运行于归档模式下SQL>shutdown immediate
SQL>startup mount
SQL> alter database archivelog;
SQL> alter database open;
如果Automaticarchival显示为Enabled则数据库归档方式为自动归档否则需要手工归档或者将归档方式修改为自动归档如
正常shutdown数据库在参数文件中initora中加入如下参数
SQL>shutdown immediate
修改initora
LOG_ARCHIVE_START=TRUE
LOG_ARCHIVE_DEST=ORACLE_HOME/admin/o/arch(归档日值存放位置可以自己定义)
SQL>startup
然后重新启动数据库此时Oracle数据库将以自动归档的方式工作在Archive模式下其中参数LOG_ARCHIVE_DEST是指定的归档日志文件的路径建议与Oracle数据库文件存在不同的硬盘一方面减少磁盘I/O竞争另外一方面也可以避免数据库文件所在硬盘毁坏之后的文件丢失归档路径也可以直接指定为磁带等其它物理存储设备但可能要考虑读写速度可写条件和性能等因素
注意当数据库处在ARCHIVE模式下时一定要保证指定的归档路径可写否则数据库就会挂起直到能够归档所有归档信息后才可以使用另外为创建一个有效的备份当数据库在创建时必须履行一个全数据库的冷备份就是说数据库需要运行在归档方式然后正常关闭数据库备份所有的数据库组成文件这一备份是整个备份的基础因为该备份提供了一个所有数据库文件的拷贝(体现了冷备份与热备份的合作关系以及强大的能力)
备份表空间文件
a首先修改表空间文件为备份模式 ALTER TABLESPACE tablespace_name BEGIN BACKUP;
b然后拷贝表空间文件到安全区域 !CP tablespace_name D_PATH;
c最后将表空间的备份模式关闭 ALTER TABLESPACE tablespace_name END BACKUP;
对归档日志文件的备份
停止归档进程-->备份归档日志文件-->启动归档进程
如果日志文档比较多我们将它们写入一个文件成为一个恢复的参考$ files `ls <归档文件路径>/arch*dbf`;export files
备份控制文件:
SQL> alter database backup controlfile to controlfile_back_name(一般用的方式) reuse;
当然我们也可以将上面的东东写为一个脚本在需要的时候执行就可以了:
脚本范例
su oracle < sqlplus /nolog
connect / as sysdba
ALTER TABLESPACE tablespace_name BEGIN BACKUP
!CP tablespace_name D_PATH
ALTER TABLESPACE tablespace_name END BACKUP
alter database backup controlfile to controlfile_back_name(一般用的方式) reuse;
!files `ls <归档文件路径>/arch*dbf`;export files 恢复步骤
热备份的恢复对于归档方式数据库的恢复要求不但有有效的日志备份还要求有一个在归档方式下作的有效的全库备份归档备份在理论上可以无数据丢失但是对于硬件以及操作人员的要求都比较高在我们使用归档方式备份的时候全库物理备份也是非常重要的归档方式下数据库的恢复要求从全备份到失败点所有的日志都要完好无缺
恢复步骤LOG_ARCHIVE_DEST_
shutdown数据库
将全备份的数据文件放到原来系统的目录中
将全备份到失败点的所有归档日志放到参数LOG_ARCHIVE_DEST_所指定的位置
利用sqlplus登陆到空实例(connect / as sysdba)
然后 startup mount
set autorecovery on
recover database;
alter database open;
这样热恢复就算完工
Windows平台的oracle备份(Veritas BE)
通过Backup Exec实施Oracle灾难恢复很简单
需要的数据
FULL CLOSED备份
shutdown数据库(不要用shutdown abort强行关闭)实施一个文件级备份备份全部的Oracle相关文件包括Windows系统文件系统状态和Oracle程序文件和数据文件等内容
这个冷备份对于快速恢复Oracle数据库系统非常关键如果没有它系统被破坏后只能重新安装再恢复这要比直接恢复冷备份慢得多也更复杂
每当数据库或表单的物理结构或逻辑结构有变化时都应该重新创建这个冷备份
FULL ONLINE备份
这个备份要通过Backup Exec Agent for Oracle Server来完成要备份全部表空间归档日志和控制文件通过这种方式备份Oracle会将所有缓存内容写入文件将online redo log做归档所以数据库备份中包含的是备份时数据库的即时点信息完整而且有效以后做恢复时可以恢复到最后一次FULL ONLINE备份的状态
恢复过程
重新安装Windows系统和Remote Agent for Windows Server为恢复Oracle服务器准备环境
恢复最后一次FULL CLOSED备份重新启动计算机
此时Windows系统Oracle数据库系统都是完整的只是Oracle数据库中可能不是最新的数据Backup Exec Agent for Oracle Server也不用重新安装了
用SQLPlus用SYS以sysdba身份连接到数据库系统关闭数据库
shutdown immediate + < enter >
通过介质服务器恢复最新的FULL ONLINE备份恢复作业属性的高级选项中确保选中了Restore over Existing files(覆盖现存文件) 选项
要想成功的恢复数据库在最后一次FULL CLOSED备份之后的所有redo log必须都已经成功归档并备份少了哪一个数据库就无法恢复到最后的FULL ONLI NE备份时的状态
通过Oracle的alert log可以看到数据库的恢复需要哪些归档日志以及你应该把它们恢复到什么位置
恢复完成后用SYS用户以sysdba身份连接到数据库将数据库加载到mount阶段
startup mount + < enter >
数据库mount完成后执行recover过程
recover database using backup controlfile + < enter >
数据库会提示你需要哪些日志
ORA: Change generated at needed for thread
ORA: Suggestion : \Oracle_Home\Oradata\\%SID%TARC
ORA: {=Suggested | filename | AUTO | FROM logsource | CANCEL}
最简单的方法是选自动恢复
auto + < enter >
系统会在initora文件中定义的位置上查找所有必需的日志并依次应用它们最后一个要应用的日志是online redo log实际上它并不包括任何的transaction只有一个SCN可以略过但是自动恢复过程会因为找不到相应的文件而报错
ORA cannot open archived log
E\ORACLE\ORADATA\KIMSTAD\ARCHIVE\KIMSTADTARC
ORA unable to open file
OSD unable to open file
O/SError (OS ) The system cannot find the file specified
为此输入以下命令(until cancel参数使我们可以在需要的时候中止恢复过程)
recover database until cancel using backup controlfile +
这样在数据库恢复的最后阶段再次提示前面的错误时我们就可以中止恢复过程
cancel + < enter >
这时除了最后一个online redo log以外所有的commit transaction都已经提交到数据库之中了完成后会显示
Media recovery canceled
实际上恢复过程已经正常完成了
最后是打开数据库并同步日志序列号
alter database open resetlogs + < enter >
至此Oracle数据库被成功恢复到最后一次Full Online备份
说明Oracle i可以用internal账号完成DBA操作i取消了internal账号SYS账号代替它了为了以DBA身份登录启动SQL Plus时应该加nolog参数进入之后再登录connect username/password as sysdba
具体示例
用Oracle数据库的热备份来重建数据库
为了检验我为公司开发的Oracle数据库在线自动备份系统我根据Oracle数据库在线自动备份系统产生的备份文件来重建和恢复Oracle数据库为了让大家共享其方法和步骤(也适合于用其它方式对Oracle做的热备份进行重建数据库)现整理如下
一系统环境
本次测试所使用的系统环境如下
硬件环境
服务器Dell PowerEdge (CPUPⅢ MHz 内存MB 硬盘GB)
软件环境
操作系统UnixWare
数据库Oracle for Unix 企业版SIDora
Oracle安装路径/home/oracle
备份文件所有数据库文件控制文件初始化文件数据库备份以来的所有归档日志文件
二恢复步骤
下面根据从用户处带回来的备份数据在一台新的服务器重建Oracle数据库其详细步骤如下
创建数据库恢复使用的环境
在新的Dell服务器上安装与原来的数据库服务器相同的操作系统UnixWare 然后安装与原数据库相同版本的Oracle for Unix 企业版
删除新服务器上的Oracle实例
启动新数据库服务器上的Oracle在sqlplus中查找到数据库文件的路径并保存在当前路径下的文件file_nametxt中
$ sqlplus system/manager
SQL> spool file_nametxt
SQL> select file_name from sysdba_data_files
SQL> spool end
SQL>exit
关闭新服务器的Oracle然后根据文件file_nametxt中的路径删除新装的Oracle实例的所有数据库文件
注从本步开始所有操作都是用Oracle用户登录操作系统(Unix)后进行文中所有的黑色粗体号字符(标题除外)的语句可以直接执行黑色倾斜粗体号字符的语句需要修改后执行
恢复数据库文件
把备份的所有数据库文件用Ftp上传新的数据库服务器中的相同路径下如果原来的路径已不存在可以拷贝到其他路径下恢复时详细处理方法见步骤中<>
恢复初始化参数文件
把备份的initSIDora文件用Ftp上传到新数据库服务器中Oracle实例的initSIDora文件位置覆盖之其位置一般在$ORACLE_HOME/dbs目录下
恢复控制文件
把备份的ControlFilebak文件用Ftp上传到新数据库服务器中Oracle实例的各个镜像路径下并按初始化参数文件initSIDora中的该项的位置和名称命名
control_files = (/home/oracle/app/oracle/oradata/ora/controlctl /home/oracle/app/oracle/oradata/ora/controlctl/home/oracle/app/oracle/oradata/ora/controlctl)
其路径如有变动在初始化参数文件initSIDora中修改如上内容的路径和名称使其实际路径与该参数的路径一致
恢复归档日志文件
把数据库备份后的归档日志用Ftp上传到新数据库服务器的相同路径下路径如有变动可以根据初始化参数文件initSIDora中如下位置进行修改使其实际路径与该参数的路径一致
log_archive_dest_ = location=/home/oracle/app/oracle/admin/ora/arch
恢复数据库
经过以上个步骤把所有的备份文件已经上传到了新数据库服务器中下面开始根据这些文件恢复并启动数据库先在操作系统的提示符下做如下操作
$svrmgrl
SVRMGR>connect internal
SVRMGR>startup mount
<> 创建口令文件
如果原来的数据库配置了口令文件并且在mount数据库时报如下错误
ORA error opening password file /home/oracle/app/oracle/product//dbs/orapw
可以到/home/oracle/app/oracle/product//dbs/路径下用以下命令创建口令文件
orapwd
其用法如下
Usage orapwd file= password= entries=
where
file name of password file (mand)(口令文件的命名方式为orapwSID)
password password for SYS and INTERNAL (mand)
entries maximum number of distinct DBA and OPERs (opt)
There are no spaces around the equalto (=) character
例如 orapwd file=orapwora password=manager
然后重新执行如下语句mount数据库
SVRMGR>startup mount
<> 修改数据库文件的路径
如果在上述的步骤中修改了恢复的数据库文件的路径可以用如下语句对数据库文件重新命名
alter database rename file old_file to new_file;
如把原来路径/home/oracle/app/oracle/oradata/ora下的文件systemdbf改到了/u/oracle/app/oracle/oradata/ora下
SVRMGR>alter database rename file
/home/oracle/app/oracle/oradata/ora/systemdbf
to /u/oracle/app/oracle/oradata/ora/systemdbf;
按照上面的方法把所有修改路径的数据库文件重新命名
<> 根据控制文件和归档日志文件恢复数据库
下面开始用控制文件和归档日志文件恢复数据库
SVRMGR>recover database using backup controlfile until cancel;
出现如下提示
ORA: change generated at // :: needed for thread
ORA: suggestion: /home/oracle/app/oracle/admin/ora/arch/arch__arc
ORA: change for thread is in sequence #
Specify log: {=suggested | filename | AUTO | CANCEL}输入
auto
如果有如下提示则表示成功
ORA: change generated at // :: needed for thread
ORA: suggestion: /home/oracle/app/oracle/admin/ora/arch/arch__arc
ORA: change for thread is in sequence #
ORA: log file /home/oracle/app/oracle/admin/ora/arch/arch__arc noy
Log applied
意外处理如果其它提示可能是需要的日志文件不存在检查ORA中该文件是否存在
直到出现如下提示
ORA: change generated at // :: needed for thread
ORA: suggestion: /home/oracle/app/oracle/admin/ora/arch/arch__arc
ORA: change for thread is in sequence #
ORA: log file /home/oracle/app/oracle/admin/ora/arch/arch__arc noy
ORA: cannot open archived log /home/oracle/app/oracle/admin/ora/arch
/arch__arc
ORA: unable to obtain file status
Intel SVR UNIX Error: : No such file or directory
Additional information:
<> 重置日志
SVRMGR>alter database open resetlogs;
意外处理如果提示创建日志的路径不存在按提示路径创建目录然后再重置日志
<> 重启数据库完成恢复
SVRMGR>shutdown immediate
SVRMGR>startup
ORACLE instance started
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
Database mounted
Database opened
数据库正常打开数据库重建恢复成功
Oraclei RMAN 备份及恢复步骤
在这里没有讨论多么深入的RMAN技术也没有告诉大家这样去编写备份脚本这并不是我的初衷我只想把我会的写出来和大家一起学习一起进步谢谢
切换服务器归档模式如果已经是归档模式可跳过此步
%sqlplus /nolog (启动sqlplus)
SQL> conn / as sysdba (以DBA身份连接数据库)
SQL> shutdown immediate; (立即关闭数据库)
SQL> startup mount (启动实例并加载数据库但不打开)
SQL> alter database archivelog; (更改数据库为归档模式)
SQL> alter database open; (打开数据库)
SQL> alter system archive log start; (启用自动归档)
SQL> exit (退出)
连接
%rman target=rman/rman@mydb (启动恢复管理器)
基本设置
RMAN> configure default device type to disk; (设置默认的备份设备为磁盘)
RMAN> configure device type disk parallelism ; (设置备份的并行级别通道数)
RMAN> configure channel device type disk fromat /backup/backup_%U; (设置备份的文件格式只适用于磁盘设备)
RMAN> configure channel device type disk fromat /backup/backup_%U; (设置备份的文件格式只适用于磁盘设备)
RMAN> configure controlfile autobackup on; (打开控制文件与服务器参数文件的自动备份)
RMAN> configure controlfile autobackup format for device type disk to /backup/ctl_%F; (设置控制文件与服务器参数文件自动备份的文件格式)
查看所有设置
RMAN> show all
查看数据库方案报表
RMAN> report schema;
备份全库
RMAN> backup database plus archivelog delete input; (备份全库及控制文件服务器参数文件与所有归档的重做日志并删除旧的归档日志)
备份表空间
RMAN> backup tablespace system plus archivelog delete input; (备份指定表空间及归档的重做日志并删除旧的归档日志)
备份归档日志
RMAN> backup archivelog all delete input;
复制数据文件
RMAN> copy datafile to /oracle/dbs/py;
查看备份和文件复本
RMAN> list backup;
验证备份
RMAN> validate backupset ;
从自动备份中恢复服务器参数文件
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> startup nomount; (启动实例)
RMAN> restore spfile to pfile /backup/mydbora from autobackup; (从自动备份中恢复服务器参数文件)
从自动备份中恢复控制文件
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> startup nomount; (启动实例)
RMAN> restore controlfile to /backup from autobackup; (从自动备份中恢复控制文件)
恢复和复原全数据库
RMAN> shutdown immediate; (立即关闭数据库)
RMAN> exit (退出)
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak (将数据文件重命名)
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak (将数据文件重命名)
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak (将数据文件重命名)
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak (将数据文件重命名)
%rman target=rman/rman@mydb (启动恢复管理器)
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydbora (指定初始化参数文件启动数据库)
RMAN> restore database; (还原数据库)
RMAN> recover database; (恢复数据库)
RMAN> alter database open; (打开数据库)
恢复和复原表空间
RMAN> sql alter tablespace users offline immediate; (将表空间脱机)
RMAN> exit (退出恢复管理器)
%mv /oracle/dbs/usersdbf /oracle/dbs/usersbak (将表空间重命名)
%rman target=rman/rman@mydb (启动恢复管理器)
RMAN> restore tablespace users; (还原表空间)
RMAN> recover tablespace users; (恢复表空间)
RMAN> sql alter tablespace users online; (将表空间联机)
增量备份与恢复
第一天的增量基本备份
RMAN> backup incremental level= database plus archivelog delete input;
第二天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
第三天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
第四天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
第五天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
第六天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
第七天的增量差异备份
RMAN> backup incremental level= database plus archivelog delete input;
增量恢复
RMAN> shutdown immediate;
RMAN> exit
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak
%mv /oracle/dbs/tbs_f /oracle/dbs/tbs_bak
%rman target=rman/rman@mydb
RMAN> startup pfile=/oracle/admin/mydb/pfile/initmydbora
RMAN> restore database;
RMAN> recover database;
RMAN> alter database open;