l 实例故障
由ORACLE内部异常、操作系统故障或其它相关软件引起,导致ORACLE实例中的进程或内存区出现故障或数据库无法正常关闭,这种故障称为实例故障。实例故障没有本质上的破坏,无须对数据库进行恢复,只要重启数据库就可正常。
l 媒介故障
媒介故障主要是由于磁盘驱动器出问题、磁盘块坏、数据文件被删除或损坏等引起,文档中所介绍的备份方法基本为这种故障而设计的。
与数据库备份最紧密相关的数据库设置相信应该是有无重做日志的归档,依此可将数据库划分为两大类型:
l noarchivelog
重做日志归档的备份,这种情况数据运行性能高,但数据库恢复不够灵活。对于无归档的备份,可采用的方式比较简单,主要是以逻辑备份和脱机准备份为主。当数据文件或控制文件被损坏或丢失的情况下只能做全数据库的恢复,且只能恢复至备份的时间点。
l archivelog
有重做日志归档的备份,重做日志的归档将很大程度影响数据库的运行性能,但对数据库安全性要求极高的数据库系统必须要有重做日志的归档。这种情况的备份和恢复可采用的形式较多,有逻辑备份、脱机冷备份、联机热备份。可执行基于时间的恢复,单个数据文件的恢复。
由于ORACLE数据库创建时缺省是为NOARCHIVELOG方式,下面的内容将介绍如何将无重做日志归档的数据库系统改为有重做日志归档的数据库系统。
查看数据库是否有重做日志的归档,可以查看动态性能视图V$DATABASE中的LOG_MODE列,如果列值为ARCHIVELOG则为重做日志归档模式,如果列值为NOARCHIVELOG则为重做日志不归档模式。
查看命令如下:select log_mode from v$database;
重做日志不归档修改为重做日志归档的方法:
1、 先关闭数据库svrmgrl>shutdown immediate;
2、 对数据库做一次冷备份,即备份所有的数据文件、控件文件、重做日志文件、参数文件、口令文件;
3、 在initXXX.ora(XXX表示实例的SID)参数文件中,增加如下参数:
LOG_ARCHIVE_DEST=filename or device name(归档文件的路径)
LOG_ARCHIVE_FORMAT=filename extension(归档文件名的格式)
例如:
LOG_ARCHIVE_DEST=/archive/arch
LOG_ARCHIVE_FORMAT=%s.arc
4、 启动数据库实例svrmgrl>startup mount
5、 改变数据库为归档模式svrmgrl>alter database archivelog;
6、 打开数据库svrmgrl>alter database open;
对于可以down机的数据库系统,采用这种方法对数据库文件进行一次性备份,恢复时只能恢复到备份时间,建议在系统安装配置完成之后,提交运行前,采用这种方法进行数据库的一次备份,以后恢复时结合逻辑备份,基本可将系统恢复至可用状态。具体方法如下:
通过V$DATAFILE,V$LOGFILE,V$CONTROLFILE查看有哪些数据文件、日志文件及控制文件需要进行备份,分别在哪些目录中。将这三类文件用操作系统拷贝指令复制到一个独立的硬盘或磁带上,以备日后使用。同时还需备份口令文件、参数文件及重做日志文件。
查询指令如下:
SVRMGR> select file#,name from v$datafile;
FILE# NAME
1 C:\ORANT\DATABASE\SYS1ZXY.ORA
2 C:\ORANT\DATABASE\RBS1ZXY.ORA
3 C:\ORANT\DATABASE\USR2ZXY.ORA
4 C:\ORANT\DATABASE\TMP1ZXY.ORA
5 C:\ORANT\DATABASE\INDX1ZXY.ORA
6 C:\ORANT\DATABASE\ZXY1ZXY.ORA
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
1 C:\ORANT\DATABASE\LOGZXY1.ORA
2 STALE C:\ORANT\DATABASE\LOGZXY2.ORA
SVRMGR> select * from v$controlfile;
STATUS NAME
C:\ORANT\DATABASE\CTL1ZXY.ORA
C:\ORANT\DATABASE\CTL2ZXY.ORA
口令文件、参数文件在WINDOWS操作系统中一般存入在/orant/database目录下。
/orant/database/initXXX.ora(XXX表示数据库实例名)
/orant/database/pwdXXX.ora
重做日志文件的存放路径及文件名可通过如下指令来查看,
SVRMGR> show parameter archive
名称 类型 值
----------------------------------- ------- ----------------------------
log_archive_buffer_size 整数 127
log_archive_buffers 整数 4
log_archive_dest 字符串 C:\orant\database\archive
log_archive_duplex_dest 字符串
log_archive_format 字符串 arc%S.%T
log_archive_min_succeed_dest 整数 1
log_archive_start 布尔值 FALSE
对数据文件进行备份,使用方便,恢复快。如果数据文件丢失或损坏,可以利用备份文件将文件恢复到当前时间的数据,但不能恢复控制文件。对于数据文件的保护可采用这种方法进行备份和恢复。对于会修改的数据文件,最好每日做备份。对于静态数据文件,则只做一次性备份即可。
方法:
alter tablespace XXX begin backup;
操作系统拷贝
alter tablespace XXX end backup;
可通过V$BACKUP及V$DATAFILE_HEADER来查看正在备份的数据文件。
SVRMGR> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- ---------
1 NOT ACTIVE 0
2 NOT ACTIVE 0
3 ACTIVE 214357 2001-02-1
4 NOT ACTIVE 0
5 NOT ACTIVE 0
6 NOT ACTIVE 0
SVRMGR> Select name,status,fuzzy from v$datafile_header;
NAME STATUS FUZ
----------------------------------------------------------------
C:\ORANT\DATABASE\SYS1ZXY.ORA ONLINE
C:\ORANT\DATABASE\RBS1ZXY.ORA ONLINE
C:\ORANT\DATABASE\USR2ZXY.ORA ONLINE YES
C:\ORANT\DATABASE\TMP1ZXY.ORA ONLINE
C:\ORANT\DATABASE\INDX1ZXY.ORA ONLINE
C:\ORANT\DATABASE\ZXY1ZXY.ORA ONLINE
1、 创建一个recovery catalog数据库,数据库名为rman,SID为rman,其中数据库数据如下:
Type of space |
Space requirement |
System |
50MB |
Temp |
5MB |
Rollback |
5MB |
Recovery catalog |
10MB |
Online logs(3 groups,each with 2 members) |
Each 1MB |
2、 建表空间
svrmgrl > create tablespace rman_ts datafile ‘<directory>/<name>’
> size 20M autoextend on next 20M maxsize 50M;
3、 建用户
svrmgrl > create user rman identified by rman default tablespace rman_ts
> temporary tablespace temp quota unlimited on rman_ts;
4、 给用户授权(注意授SYSDBA权限时,先确认有口令文件的存在,然后再给口令文件增加用户数)
svrmgrl > grant recovery_catalog_owner to rman;
svrmgrl > connect sys/change_on_install as sysdba;
svrmgrl > grant dba,connect,resource,sysdba to rman;
5、 运行脚本
svrmgrl > connect rman/rman
svrmgrl > @$oracle_home/rdbms/admin/catrman.sql(UNIX) or
svrmgrl > @%oracle_home%/rdbms80/admin/catrman.sql(NT)
6、 运行rman连接目标数据库及catalog数据库
$ rman target sys/change_on_install@objectDB rcvcat rman/rman@rcvcat
7、 在catalog上注册目标数据库
rman > register database;
8、 如果上一次注册过数据库后又进行过数据库的修改,请同步目标数据库
rman > gesynch catalog;
9、 可通过查看catalog数据字典获得目标数据库注册信息:
rc_database, rc_tablespace, rc_datafile, rc_stored_script, rc_stored_script_line;
10、 设置NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK;
11、 设置NLS_DATE_FORMAT=‘YYYY-MM-DD:HH24:MI:SS’;
12、 进行如备份方案4所述的备份操作。
1. 运行rman连接目标数据库
$ rman target user/password@tnsnames nocatalog
2. 在rman方式下主要可进行如下备份:
l database(全数据库备份)
l datafile NO.(按数据文件号备份)
l datafile ‘directory/datafilename’(按数据文件名备份)
l tablespace XXX(按表空间名备份)
l current control(备份控制文件)
l archivelog all (delete input)(备份所有归档日志文件)
l archivelog from logseq=1056 until logseq=1059 (delete input)(按归档日志SEQ号备份)
l archivelog from time=’’ until time=’’(按时间备份归档日志文件)
3. Image copy 方式
类似于操作系统的COPY指令,将一个文件备份至一个文件,不进行检查和压缩。指令例举如下:
Rman>run {
>Allocate channel dev1 type disk;
>Copy
Datafile ‘……’ to ‘……’ tag=backup01,
Archivelog ‘……’ to ‘……’,
Current controlfile to ‘……’;
>Release channel dev1; }
4. Backup set方式
在单个备份文件中包含一个或多个被备份的文件,备份时执行空块的压缩。指令例举如下:
Rman>run {
>Allocate channel dev1 type disk;
>backup incremental level=0 format ‘<full path>/df_%d_%s_%p’
>tag=backup01 filesperset=4
(database include Current controlfile);
>Release channel dev1; }
首次备份,用0级
run {
allocate channel dev1 type 'sbt_tape';
backup incremental level 0
(database
format '%d_%u');
}
以后的备份用0级或1级
run {
allocate channel dev1 type 'sbt_tape';
backup incremental level 1
(database
format '&d_%u');
}
如果在第一次备份之后增加了表空间或数据文件,需重新进行0级增量备份,否则再进行备份将无法识别新增的表空间或数据文件。
run {
allocate channel dev1 type 'sbt_tape';
backup incremental level 0
(tablespace new_tbs
format '%d_%u');
}
逻辑备份最大的优越性在于备份时占用资源少,在备份与恢复时对数据库系统资影响最小。
另外对于个别表而非整个表空间或数据库的恢复也非常方便,且可以在不同的数据库上进行恢复,备份方案灵活,可根据需要选择性的备份表、表空间、用表户表信息或全局备份。在实际应用中我建议以逻辑备份为主要的备份方案,然后结合脱机冷备份或联机热备份。
EXP、IMP命令详解:
E:\>exp help=y
通过输入 EXP 命令和用户名/口令,您可以在用户 / 口令之后的命令:
或者,您也可以通过输入跟有各种参数的 EXP 命令来控制“导出”的运行方式。要指定参数,您可以使用关键字:格式: EXP KEYWORD=value 或 KEYWORD=(value1,value2,...,valueN)
实例: exp80 username/password@alias file=expfile.dmp log=mylog.log
关键字 说明(默认)
---------------------------------------------------
USERID 用户名/口令
FULL 导出整个文件 (N)
BUFFER 数据缓冲区的大小(与操作系统有关)
OWNER 所有者用户名列表
FILE 输出文件 (EXPDAT.DMP)
TABLES 表名列表
COMPRESS 导入一个范围 (Y)
RECORDLENGTH IO 记录的长度
GRANTS 导出权限 (Y)
INCTYPE 增量导出类型
INDEXES 导出索引 (Y)
RECORD 跟踪增量导出 (Y)
ROWS 导出数据行 (Y)
PARFILE 参数文件名
CONSTRAINTS 导出限制 (Y)
CONSISTENT 交叉表一致性
LOG 屏幕输出的日志文件
STATISTICS 分析对象 (ESTIMATE)
DIRECT 直接路径 (N)
TRIGGERS 导出触发器 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
FILESIZE 各转储文件的最大尺寸
QUERY 选定导出表子集的子句
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N)
TABLESPACES 将传输的表空间列表
E:\>imp help=y
可以通过输入 IMP 命令和您的用户名/口令
格式: IMP KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)
实例: imp80 username/password@alias file=impfile.dmp log=mylog.log show=y(查看Oracle数据表的建表语句)
关键字 说明(默认)
----------------------------------------------
USERID 用户名/口令
FULL 导入整个文件 (N)
BUFFER 数据缓冲区大小
FROMUSER 所有人用户名列表
FILE 输入文件 (EXPDAT.DMP)
TOUSER 用户名列表
SHOW 只列出文件内容 (N)
TABLES 表名列表
IGNORE 忽略创建错误 (N)
RECORDLENGTH IO 记录的长度
GRANTS 导入权限 (Y)
INCTYPE 增量导入类型
INDEXES 导入索引 (Y)
COMMIT 提交数组插入 (N)
ROWS 导入数据行 (Y)
PARFILE 参数文件名
LOG 屏幕输出的日志文件
CONSTRAINTS 导入限制 (Y)
DESTROY 覆盖表空间数据文件 (N)
INDEXFILE 将表/索引信息写入指定的文件
SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N)
ANALYZE 执行转储文件中的 ANALYZE 语句 (Y)
FEEDBACK 显示每 x 行 (0) 的进度
TOID_NOVALIDATE 跳过指定类型 id 的校验
FILESIZE 各转储文件的最大尺寸
RECALCULATE_STATISTICS 重新计算统计值 (N)
下列关键字仅用于可传输的表空间
TRANSPORT_TABLESPACE 导入可传输的表空间元数据 (N)
TABLESPACES 将要传输到数据库的表空间
DATAFILES 将要传输到数据库的数据文件
TTS_OWNERS 拥有可传输表空间集中数据的用户
增量卸出备份的参数是INCTYPE,这个参数的有效选项是COMPLETE、CUMULATIVE和INCREMENTAL。COMPLETE确定为全卸出,而其它两个选项则依赖全卸出用于数据库复原。CUMULATIVE卸出所有表和上次CUMULATIVE或COMPLETE卸出以来更改过的其它对象;如果更改表中一个记录,那么卸出整个表。INCREMENTAL卸出上次INCREMENTAL、CUMULATIVE或COMPLETE卸出以来更改过的所有表和对象。
增量导入的参数为INCTYPE,如果正在导入一个增量卸出,那么撤消并重建表。必须首先从上次SYSTEM卸出(规定INCTYPE=SYSTEM)中复原。然后导入每个增量卸出(规定INCTYPE=RESTORE)直到需要的变化应用于数据库。
备份指令:
exp80 username/password@alias file=expfile.dmp log=mylog.log inctype=complete
exp80 username/password@alias file=expfile.dmp log=mylog.log inctype=incremental
注意事项:
备份文件每次都要更改不同的文件名,否则会被覆盖,整套备份将没有任何意义,建议每周做一次全备份,然后一周中其它时间做增量备份。
增量备份进行恢复时,不能指定恢复某张表或某个用户的表等参数,只能在“完整数据库”模式下执行增量导出,导入亦然。
只能用有管理员身份的用户连接才能执行增量备份。
恢复指令:
imp80 username/password@alias file=expfile.dmp log=mylog.log inctype=system
imp80 username/password@alias file=expfile.dmp log=mylog.log inctype=restore
做一套系统的备份策略,我个人觉得应该从两方面考虑:
一是技术手段,包括相应的设备,可用的备份恢复脚本等;
二是根据应用要求,确定备份周期、备份方式。
以下根据个人的测试提供给广州市工商很行的备份案例,广州市工行的运行环境如下:windowsNT操作系统,oracle8.05 enterprise edition server,有重做日志的归档。
其它应用系统可根据系统及应用的不同,灵活的进行搭配和选择。
注意对备份文件、存放路径、备份日期及备份指令进行纸质记录,并对磁带进行有效的标识。
请按如下目录结构在有较大空间的硬盘上建目录。
目录 |
子目录 |
从子目录或文件 |
说明 |
Oracle_backup |
Script |
sun.bat、wed.bat …… |
运行脚本所在目录(参见操作手册) |
Copy_data |
|
RMAN用image copy方式备份的数据 |
|
Backup_data |
|
RMAN用backupset方式备份的数据 |
|
Exp_data |
|
逻辑备份数据 |
|
Cold_data |
|
冷备份数据 |
在执行备份前,先执行如下两步操作:
1、 先增加操作系统环境变量:NLS_DATE_FORMAT=‘YYYY-MM-DD:HH24:MI:SS’;
2、 在参数文件中增加对CONTROL文件的控件参数:CONTROL_FILE_RECORD_TIME=30;(保留30天的备份记录);
计划用RMAN做基于全数据库的增量备份,增量备份周期图如下所示:
Sun |
mon |
tues |
wed |
tru |
fri |
sat |
sun |
o |
2 |
2 |
1 |
2 |
2 |
2 |
0 |
l 周日执行0级备份(即全备份)
备份脚本:
run {
allocate channel dev1 type disk;
backup
incremental level 0
tag='database'
(database format 'd:\oracle_data\backup_data\d%d_u%u');
copy
datafile 1 to 'C:\oracle_data\copy_data\XX.ORA',
……
copy
current controlfile to 'c:\ oracle_data\copy_data \control.ctl';
}
l 周三执行1级备份
备份脚本:
run {
allocate channel dev1 type disk;
backup
incremental level 1
tag='database'
(database format 'd:\oracle_data\backup_data\d%d_u%u');
copy
current controlfile to 'c:\ oracle_data\copy_data \control.ctl';
}
l 其它候执行2级备份
备份脚本:
run {
allocate channel dev1 type disk;
backup
incremental level 2
tag='database'
(database format 'd:\oracle_data\backup_data\d%d_u%u');
copy
current controlfile to 'c:\ oracle_data\copy_data \control.ctl';
}
将每一段备份脚本分别保存于一个文本文件,命名为0.txt,1.txt,2.txt,并存三个BAT文件,分别为:0.bat,1.bat,2.bat,内容为:type c:\0.txt|rman80 target username/password@tnsnames nocatalog,这样只须执行BAT文件即可完成每日备份。
注意:在脚本中每日将对数据库控制文件进行一次全备份。
建议:
分为三种备份级别,每一类备份级别的数据保留两个周期即可覆盖,循环使用存储介质:
1、 每月月初对数据库做一次全备份;
操用指令:
exp80 username/password@alias full=Y file=<directory>/expfile.dmp log=<directory>/mylog.log(周日操作,建议用system用户进行操作)
2、 每周日对数据库做一次基于用户级的备份;
操用指令:
exp80 username/password@alias owner=username file=<directory>/expfile.dmp log=<directory>/mylog.log(周日操作,建议用需备份的用户进行操作)
3、 每日对重要的表进行基于表级的备份;
操作指令:
exp80 username/password@alias tables=(table1,table2,table3……) file=<directory>/expfile.dmp log=<directory>/mylog.log(每日操作,周日除外,建议用备份的所属用户进行操作)
除脚本之后,用户须每日对口令文件、参数文件、archivelog文件做操作系统级的备份。
请参见如下表格填写备份记录。
序号 |
备份时间 |
备份类型(RMAN、EXP或copy) |
备份脚本 |
生成的备份文件名及存放路径 |
错误提示 |
备份时archivelog的seq号 |
|
|
|
|
|
|
|
引起数据库失败的原因很多,有操作系统、存储介质、各类应用软件或其它原因;失败的现象也多种多样,有人为的误操作引起数据丢失,有由于掉电或操作系统失败而引起未归档而异常退出,有硬盘磁道损坏引起的文件错误等等。一般来说,备份计划越完善越周密,数据库能保证的恢复也越多,同时安全性也越高。但是过于烦琐的备份计划付出的代价将更高,影响数据库的工作效率也需要更多的服务器设备及存储介质。所以我们需要根据数据库的不同应用以及不同的环境和配置提供最合理的备份方案。
这一章节将介绍的是常见的数据库失败在进行如上一章节所述备份的情况下进行恢复的方法。
注意:只要down机做恢复时,一定要在这个时间点对数据库进行一次全冷备份,以免恢复时因为各种原因而引起的错误或失败,导致数据无法进行再恢复。
这种情况将运用对数据库数据文件进行的全备份及归档重做日志文件进行time_based(基于时间的)恢复。
具体操作方法如下:
1、 svrmgrl > alter tablespace XX offline;(此步骤可选)
2、 svrmgrl > shutdown immediate;(注意用sysdba身份用户)
3、 对数据库进行冷备份
4、 svrmgrl > startup mount;
5、 !copy c:\oracle_data\copy_data\* c:\orant\database\* (将备份的数据文件替换所有工作的数据文件)
6、 svrmgrl > recover database until time ‘2001-02-24:12:00:00’;(时间取最接近删除表前的时间)
7、 svrmgrl > alter database open resetlogs;
8、 svrmgrl > alter tablespace XX online;(此步骤可选)
这种情况将运用对数据库增量备份及归档重做日志文件进行单个数据文件的complete恢复。
具体操作方法如下:
1、 vrmgrl > alter tablespace XX offline;(此步骤可选)
2、 svrmgrl > shutdown immediate;(注意用sysdba身份用户)
3、 对数据库进行冷备份
4、 svrmgrl > startup mount;
5、 启动RMAN:rman80 target username/password@tnsname nocatalog(用sysdba身份连)
6、 根据丢失的数据文件运行如下恢复脚本:
run {
allocate channel dev1 type disk;
restore tablespace XX;(此步骤可改为restore database;)
recover tablespace XX; (此步骤可改为recover database;)
}
7、 svrmgrl > alter database open;
8、 svrmgrl > alter tablespace XX online;(此步骤可选)
这种情况可运用对数据库数据文件的增量备份、控制文件的全备份及归档重做日志文件进行恢复。
具体操作方法如下:
1、 copy c:\oracle_data\copy_data\control.ctl c:\orant\database\* (将备份的控制文件替换所有工作的控制文件)
2、 svrmgrl > startup mount;
3、 起动RMAN:rman80 target userame/password@tnsname nocatalog
4、 运行如下脚本:
run {
allocate channel dev1 type disk;
restore database;
recover database;
}
5、 recover database until cancel;(在出现的提示后按enter,注意已归档的日志sequence号,直到提示到最后一个归档重做日志sequence号加1时按cancel结束恢复)
6、 svrmgrl > alter database open resetlogs;
这种情况也可运用对数据库数据文件进行的全备份、控制文件的全备份及归档重做日志文件进行恢复。
具体操作方法如下:
1、 copy c:\oracle_data\copy_data\* c:\orant\database\* (将备份的数据文件及控制文件替换所有工作的数据文件和控制文件)
2、 svrmgrl > startup mount;
3、 recover database until cancel;(在出现的提示后按enter,注意已归档的日志sequence号,直到提示到最后一个归档重做日志sequence号加1时按cancel结束恢复)
4、 svrmgrl > alter database open resetlogs;
使用IMP工具可基于表、用户及整个数据库进行恢复。如果能从EXP备份中找回失去的数据,则优先采用IMP工具恢复。因为IMP的恢复操作简单,受环境因素的影响小,占用资源少,且不用down机进行操作。恢复脚本如下:
1、 表的恢复
imp80 username/password@alias file=impfile.dmp log=mylog.log table=(table1,table2……) show=y(请使用表的所属用户进行恢复)
2、 用户所有表的恢复
imp80 username/password@alias file=impfile.dmp log=mylog.log owner=(username) show=y(请使用表的所属用户进行恢复)
3、 数据库全套数据的恢复
imp80 username/password@alias file=impfile.dmp log=mylog.log full=y show=y(请使用管理员身份用户进行恢复)
注意:
如果计划用磁带机作为备份的存储介质,且用ORACLE备份工具将备份文件直接写入磁带设备,则要安装第三方与ORACLE兼容的磁带设备备份软件,如legato、HP、IBM等。
无论采用上列任何一种形式的备份,都不建议将备份数据通过备份工作直接存入磁带设备,因为这将极大的影响备份操作时数据库的性能,推荐将备份数据先备份至硬盘设备,然后再采用磁带设备管理工作压缩至磁带机。同样执行恢复操作时,也是推荐先将备份数据拷至硬盘设备,然后再执行恢复指令。