首页 > 技术文章 > oracle-参数文件的备份与还原

yhq1314 2019-07-16 16:02 原文

oracle-参数文件的备份与还原

参数文件是实例启动到nomount状态的必要条件,规定了实例的行为特征,位置跟操作系统相关,一般unix类的系统在$ORACLE_HOME/dbs目录下

windows%ORACLE_HOME%\database目录下),启动会按照以下顺序寻找参数文件(SID表示实例名)

--1 spfileorcl.oraorcl是实例名,SID

--2 spfile.ora

--3 initSID.ora

其中spfileorcl.oraspfile.ora是二进制文件,称为服务器参数文件(或者spfile)。InitSID.ora是文本文件。

YHQT@ orcl >show parameter spfile
NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
spfile				     string	 /u01/app/oracle/product/11.2.0
						 /db_1/dbs/spfileorcl.ora

判断实例是通过哪一种参数文件启动的,上面查询结果显示实例启动所使用的spfile

1 参数文件损坏的后果

场景1spfileorcl.ora\spfile.ora\initorcl.ora 3个文件在实例启动前已经损坏丢失了

3个参数文件都损坏,实例无法启动到nomount状态,共享内存结构(SGA)和后台进程无法启动。启动时看到错误提示LRM-00109

显示找不到initorcl.ora文件,实际上3个文件都没有找到(orcl为实例名)

[oracle@DSI ~]$ oerr ora 1078
01078, 00000, "failure in processing system parameters"
// *Cause:  Failure during processing of INIT.ORA parameters during
//        system startup.
// *Action:  Further diagnostic information should be in the error stack.

场景2:实例通过spfileorcl.oraspfile.ora启动,但该参数文件在实例启动后丢失或损坏

遇到这种情况,凡是涉及访问参数文件(spfile)的命令就会失败,实例不会有崩溃的危险,比如’alter system’修改参数文件,

show parameter或查询v$parameter视图参数文件中的参数都会遇到ORA-01565无法识别文件的错误

-SQL> alter system set fast_start_mttr_target=600;
-SQL> show parameter db_name
-SQL> select * from v$parameter where name=db_name’;
告警日志
ORA-01565:unable to open spfile /u01/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora

2 备份

RMAN能够以备份集的形式备份spfile(不包括pfile),手动备份和自动备份。当然也可以使用操作系统级别的复制命令(cp)备份参数文件,恢复时只要复制dbs目录即可

-2.1 手动备份

RMAN> backup spfile; --只用来备份参数文件
Starting backup at 16-JUL-19
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=148 device type=DISK
channel ORA_DISK_1: starting full datafile backup set
channel ORA_DISK_1: specifying datafile(s) in backup set
including current SPFILE in backup set
channel ORA_DISK_1: starting piece 1 at 16-JUL-19
channel ORA_DISK_1: finished piece 1 at 16-JUL-19
piece handle=/u01/app/oracle/fra/ORCL/backupset/2019_07_16/o1_mf_nnsnf_TAG20190716T113012_gltk64cs_.bkp tag=TAG20190716T113012 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed time: 00:00:01
Finished backup at 16-JUL-19

这里使用了快速恢复区,在生成的备份集的文件名前半部分o1_mf_nnsnf_

-2.2 自动备份

在备份1号数据文件时或只要备份时包含了1号数据文件,RMAN就会将控制文件与参数文件备份至一个额外的备份集。

RMAN> backup datafile 1;

另外,若启用了控制文件的自动备份功能,参数文件和控制文件会在合适时机自动备份

用操作系统命令复制一下参数文件永远是一个简单可行的方案。

3 恢复

恢复参数文件实际上就是还原参数文件,参数文件的修改没有重做日志的支持,所以不存在恢复的操作

若在之前已经使用操作系统命令复制过参数文件,那么最简单的方法是在复制回原来的地方

-3.1 实例启动时发现损坏

如果有使用 os命令复制参数文件,此时将它复制回去就好

若有参数文件的备份集,还原步骤如下:

--1 使用RMAN启动实例到nomount状态
--2 执行restore spfile命令,根据备份类型的区别使用对应的语句‘from autobackup’或‘from 备份片路径’,前者对应自动备份,后者对应手动备份
--3 重启实例,恢复完成

注意:在sqlplus下没有参数文件不能启动到nomount状态,但是在RMAN下可以。

RMAN> startup nomount;

命令输出中的LRM-00109错误显示RMAN也做了寻找参数文件失败的尝试。

RMAN具有内置的参数文件能够在没有参数文件的特殊情况下将实例启动到nomount状态。

RMAN>restore spfile from '/u01/app/oracle/fra/ORCL/backupset/2019_07_16/o1_mf_nnsnf_TAG20190716T113012_gltk64cs_.bkp';
SQL> startup force;
SQL> show parameter spfile

若之前是利用控制文件自动备份生成参数文件备份的,还原命令稍有不同,无须指定备份片的路径,给出数据库名和快速恢复区的路径即可(前提是使用了快速恢复区)

YHQT@ orcl >show parameter db_recovery
NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest             string     /u01/app/oracle/fra
db_recovery_file_dest_size         big integer 4G
RMAN> restore spfile from autobackup db_name=orcl db_recovery_file_dest='/u01/app/oracle/fra';

若管理员没有启用快速恢复区,控制文件自动备份保存在默认的’$ORACLE_HOME/dba’目录下,此时还原命令首先指定数据库的DBID

RMAN> set dbid 1534031567;
RMAN> restore spfile from autobackup;

如果使用了rman catalog和快速恢复区,那么from子句和dbid都可以不用管,直接执行restore spfile就可

[oracle@DSI ~]$ rman target sys/***@orcl catalog rcowner/***@orcl
RMAN> run {
startup nomount;
restore spfile;
startup force;
}

-3.2 实例运行时损坏

如果发现问题时数据库尚未关闭(实例处于运行中),则无序关闭实例而是应该直接执行RMAN命令的restore命令。不关闭实例的好处很多,

不但高可用性,并且不用通过rman启动到nomount状态, 不用设置dbid,只要记住如果实例是利用服务器参数文件(spfile不是pfile)启动的,还需指定to子句将其还原到其他路径才行

RMAN> restore spfile from autobackup;
--RMAN-06564: must use the to clause when the instance is started with spfile
RMAN> restore spfile to '/home/oracle/spfileorcl.ora' from autobackup;
$ mv /home/oracle/spfileorcl.ora $ORACLE_HOME/dbs ##最好不要直接restore到dbs路径

推荐阅读