执行User-Manager数据库的闪回和恢复(2)
五、还原控制文件
这节包含以下主题:
· Restore Lost Copy of a Multiplexed Control File
· Restore Control File from Backup After Loss of All Current Control Files
· Create New Control File After Losing All Current and Backup Control Files
1>还原丢失的复用控制文件的副本
如果媒介失败而损坏了一个或多个控制文件并且至少有一个控制文件没有被损坏,你可以使用下面的过程来恢复数据库
<1>复制复用控制文件到默认位置
如果硬盘和文件系统中包含了完整的已丢失的控制文件,你可以简单的复制他们到已丢失控制文件的位置。在这种情况下,你不需要改变control_files初始化参数设置。
=>用复制的复用控制文件替换已损坏的控制文件
如果实例仍然在运行,那么需关闭它
Shutdown abort;
正确的硬件问题引发媒介失败。如果你不能迅速的修复硬件问题,那么你需要到其他存储设备上通过还原已损坏的控制文件来恢复数据库
使用一个完整的当前数据库的当前控制文件的拷贝来替换已损坏的控制文件。例子:用
Good_cf.f 替换 bad_cf.f:
% cp /oracle/good_cf.f /oracle/dbs/bad_cf.f
STARTUP
<2>复制复用控制文件到非默认位置:
假设硬盘和文件系统包含的已丢失控制文件不完整,所以你不能拷贝他们到已遗失控制文件的位置。在这种情况下你必须改变control_files初始化参数来为已遗失的控制文件制定一个新的位置。
è还原一个控制文件到非默认位置:
如果实例仍然处于运行状态,那么你需关闭它
Shutdown abort.
如果你不能纠正硬件问题而引发的媒介失败,那么你需要复制完整的控制文件到另一个位置来取代它
例如,拷贝control01.dbf到一个新的磁盘 位置:
cp $ORACLE_HOME/oradata/trgt/control01.dbf /new_disk/control01.dbf
编辑数据库的参数文件以便control_files参数映射出所有控制文件的当前位置和包含所有不能被还原的控制文件。假设初始参数文件中包含:
CONTROL_FILES='/oracle/oradata/trgt/control01.dbf',
'/bad_disk/control02.dbf'
那么,你需要像下面那样修改它:
CONTROL_FILES='/oracle/oradata/trgt/control01.dbf',
'/new_disk/control02.dbf'
最后:
STARTUP
2>在当前控制文件丢失后在备份中对控制文件的还原
等媒介恢复失败而导致该数据库的所有控制文件丢失时,而你又得从一个备份中维护它们时,你可以使用已下过程;等某个控制文件无法访问时,你可以启动实例(nolog,而不是mount状态).如果控制文件无效,而你有尝试mount数据库时,会报已下错误:
ORA-00205:
error in identifying control file, check alert log for more info
你不能mount、open数据库,除非数据库可以重新被访问.如果你还原完控制文件后,必须
open resetlogs.
如下列表格所示了等online redo logs的状态是否是available时,还原控制文件的过程:
Status of Online Logs |
Status of Datafiles |
Restore Procedure |
Available |
Current |
如果online logs包含了恢复所必须得redo,就可以直接恢复控制文件和应用日志。为了open数据库,你必须指定包含改变的online logs的文件名,,在恢复后open resetlogs |
Unavailable |
Current |
如果online logs包含了恢复所必不可少的redo,那么你只需要重建控制文件即可。因为online redo不能访问,所以得opne resetlogs (等online redo是可以访问时,在控制文件重建后的recovery后的open resetlogs是可以省略的 |
Available |
Backup |
1、 还原备份中的控制文件2、执行完全恢复 3、open resetlogs |
Unavailable |
Backup |
2、 还原备份中的控制文件2、执行不完全恢复 3、open resetlogs |
=>还原控制文件到默认状态
如果可能的话,还原控制文件到它的原始状态。这样的话,你就可以避免在初始化参数文件中指定新的控制文件的位置
To restore a backup control file to its default location:
如果实例仍然running,关掉它:
SHUTDOWN ABORT
纠正引发媒介失败的硬件问题
把备份好的控制文件还原到control_files参数指向的位置
例如:假设ORACLE_HOME/oradata/trgt/control01.dbf
和
ORACLE_HOME/oradata/trgt/control02.dbf
是服务端参数文件中指定控制文件的位置,那么可以使用操作系统自带的命令来还原这些控制文件到他们的位置:
% cp /backup/control01.dbf ORACLE_HOME/oradata/trgt/control01.dbf
% cp /backup/control02.dbf ORACLE_HOME/oradata/trgt/control02.dbf
开一个新的实例 and mount 数据库 例如:
Startup mount
通过执行带USING BACKUP CONTROLFILE 从句的recover命令来还原。如果你执行的是不完全备份,需指定until cancel。例如:
Recover database using backup controlfile until cancel
应用提示归档日志。如果收到一个信息说需要的规定日志已经遗失,它的大概意思是说
某个所必不可少的redo记录为与online redo logs中
例子:假设你看到了下面的信息
ORA-00279: change 55636 generated at 11/08/2002 16:59:47 needed for thread 1
ORA-00289: suggestion : /oracle/work/arc_dest/arcr_1_111.arc
ORA-00280: change 55636 for thread 1 is in sequence #111
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
你 能 指定online redo log的名字 然后按“ENTER”(你也可以尝试多几次,知道找到正确的日志为止):
ORACLE_HOME/oradata/redo01.dbf
Log applied.
Media recovery complete.
如果某个online logs不可访问,你能取消恢复(不应用它们) 如果所有的数据文件都是current and online logs里的redo 需要恢复,那么你不能open数据库(不应用online logs) 如果online
Logs不可访问,那么你必须使用"Create New Control File After Losing All Current and Backup Control Files"重新创建控制文件
在完成恢复后需要用resetlogs打开数据库:
ALTER DATABASE OPEN RESETLOGS;
=>还原备份中的控制文件到非默认状态
如果由于媒介严重损坏而导致你无法还原控制文件到它的原始位置,那么你必须在服务端的配置文件中重新制定这个控制文件的新的位置。一个有效的控制文件必须得被初始化参数control_files所指定;否则数据库将会阻止你
To restore a control file to a nondefault location:
Edit control_file初始化参数来映射出新的位置,如果spfile中的控制文件列表如下而且这连个位置都不能访问:
CONTROL_FILES='/oracle/oradata/trgt/control01.dbf',
'/oracle/oradata/trgt/control01.dbf'
然后,你可以修改pfile内容为:
CONTROL_FILES=
'/good_disk/control01.dbf','/good_disk/control02.dbf'
3>在当前的控制文件和备份中的控制文件都丢失后创建新的控制文件
如果在媒介失败是所有的控制文件都永久丢失了,但是所有的online redo log成员全部被完整的保存了下来,这是你可以在恢复数据库后重新创建一个新的控制文件。这个策略的好处是你不需要用resetlogs选项打开数据库
依赖当前已经的和备份中的控制文件,你可以有很多选择,如下表所示。这种改变将会被记录到alert_sid.log中,因此等决定应选择哪一种选项是可以查看此日志
创建控制文件的一些选项:
If you . . . |
Then . . . |
在你改变数据库的结构后而且你已经保存了SQL命令跟踪初始,可以执行: Alter database backup controlfile to trace noResetlogs |
Use the CREATE CONTROLFILE statement from the trace output as-is. |
在你改变数据库的结构前备份你最近的控制文件: Alter database backup controlfile to trace |
Edit the output of ALTER DATABASE BACKUP CONTROLFILE TO TRACE to reflect the change. For example, if you recently added a datafile to the database, then add this datafile to the DATAFILE clause of the CREATE CONTROLFILE statement. |
备份控制文件: Alter database backup controlfile To 文件名 (不是trace)
|
使用控制文件来获取SQL的输出 。创建一个临时的数据库实例,切换到mount状态 and 备份控制文件 ,然后运行 Alter database backup conrolfile to trace noResetlogs. 如果控制文件的副本先于最新的机构改变,然后编辑trace来反映出这个改变 |
Trace 和filename都没有控制文件的备份
|
手动执行”create controlfile”语句 |
注意:
如果你的字符集不是默认的US7ASCII,那么你必须指定字符集来作为create controlfile语句的参数。在数据库启动时字符集被写入到alter日志中。字符集的信息也被记录到backup controfile to trace
输出中
启动数据库到nomount模式下,输入:
STARTUP NOMOUNT
用create controlfile语句创建控制文件,指明noresetlogs选项。在下面的例子中假设字符集是默认的US7ASCII
CREATE CONTROLFILE REUSE DATABASE SALES NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 32
MAXINSTANCES 16
MAXLOGHISTORY 1600
LOGFILE
GROUP 1 (
'/diska/prod/sales/db/log1t1.dbf',
'/diskb/prod/sales/db/log1t2.dbf'
) SIZE 100K
GROUP 2 (
'/diska/prod/sales/db/log2t1.dbf',
'/diskb/prod/sales/db/log2t2.dbf'
) SIZE 100K,
DATAFILE
'/diska/prod/sales/db/database1.dbf',
'/diskb/prod/sales/db/filea.dbf';
在创建完控制文件后,启动到mount下
恢复数据库(不要指明”using backup controlfile“从句)
RECOVER DATABASE
在恢复完成时,open数据库(不需要resetlogs选项)
ALTER DATABASE OPEN;
立即备份控制文件。下面的SQL语句把控制文件备份到了/backup/control01.dbf)
ALTER DATABASE BACKUP CONTROLFILE TO '/backup/control01.dbf' REUSE;
参考:
"Backing Up the Control File to a Trace File", and "Re-Creating Datafiles When Backups Are Unavailable: Scenario"
原文链接:
http://download.oracle.com/docs/cd/B19306_01/backup.102/b14191/osrecov.htm#g1016721