Oracle实战:备份和恢复游戏(1)
2015-10-10来源:易贤网

【51CTO.com 独家翻译】Oracle中的游戏?非也,这里引用的游戏与奥林匹克竞赛中的“运动”类似,竞赛中的参加比赛的运动员对它们从事的事情是非常认真的,他们非常热爱他们的运动或竞赛,作为一名Oracle DBA,你热爱你的工作吗?你的工作是否顺利呢?对那些认真的人而言,专业可能是一个更好的选择,我们将要玩“游戏”或竞赛,我们能从它们那里学到什么,本文为DBA提供实用、必要的技能。

丢失了一个或更多的专用文件

专用文件包括:控制文件、在线重做日志、归档重做日志和数据文件。我们假设你有多个控制文件,在初始化参数文件中标识出来了(本文我将使用pfile以便于快速编辑),你已经阅读了很多次:如果你丢失了一个控制文件,恢复或修复一个好的控制文件拷贝到错误文件的位置,或者从参数文件中移除涉及的文件,在一个控制文件丢失后(无论什么原因),对数据库有什么影响呢?

1、操作仍然可以继续,有其他的控制文件“在线”意味着你可以承受一个或更多控制文件的丢失。

2、你(DBA)不得不关闭系统,恢复文件(或从init.ora文件中移除)并重新启动。

3、Oracle关闭实例(如你不能控制,无论你想不想它都会发生)。

我问这个的原因是:控制文件之间以及在线重做日志多路复用之间有什么不同?例如:如果一个活动组的成员丢失了数据库(或实例)将发生什么?Oracle继续保持运转还是停止运转?在下面的实验中,我将control01.ctl文件放在闪存盘里,然后将闪存盘从USB端口拔出来模拟介质失效。

当前控制文件清单

*.control_files='D:\oracle\product\10.2.0/oradata/db10/\control01.ctl',

'D:\oracle\product\10.2.0/oradata/db10/\control02.ctl',

'D:\oracle\product\10.2.0/oradata/db10/\control03.ctl'

新的控制文件清单

*.control_files='D:\oracle\product\10.2.0/oradata/db10/\control01.ctl',

'D:\oracle\product\10.2.0/oradata/db10/\control02.ctl',

'F:\oracle\control03.ctl'

确认新的控制文件:

SQL> startup

ORACLE instance started.

Total System Global Area 289406976 bytes

Fixed Size 1290184 bytes

Variable Size 104857656 bytes

Database Buffers 176160768 bytes

Redo Buffers 7098368 bytes

Database mounted.

Database opened.

SQL> col name for a52

SQL> select name from v$controlfile;

NAME

----------------------------------------------------

D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\CONTROL01.CTL

D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\CONTROL02.CTL

F:\ORACLE\CONTROL03.CTL

现在已经准备好断开闪存盘的连接,没有直接的警告(用户界面没有任何提示信息,直到尝试一个操作时),实例崩溃了。

SQL> select name from v$controlfile;

select name from v$controlfile

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

下面显示了警告日志(这只是其中一部分):

Thu Mar 06 12:41:15 2008

Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_ckpt_2756.trc:

ORA-00206: error in writing (block 3, # blocks 1) of control file

ORA-00202: control file: 'F:\ORACLE\CONTROL03.CTL'

ORA-27072: File I/O error

OSD-04008: WriteFile() failure, unable to write to file

O/S-Error: (OS 1006) The volume for a file has been externally altered so that the opened file is no longer valid.

…some more messages…

Thu Mar 06 12:41:29 2008

Instance terminated by CKPT, pid = 2756

修复这个问题其实很简单,但是你真的了解了当一个控制文件丢失后发生了什么吗?

修复问题,重新连接并启动

SQL> prompt Remove the reference to control03

SQL> startup

ORA-24324: service handle not initialized

ORA-01041: internal error. hostdef extension doesn't exist

SQL> conn sys/oracle as sysdba

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 289406976 bytes

Fixed Size 1290184 bytes

Variable Size 104857656 bytes

Database Buffers 176160768 bytes

Redo Buffers 7098368 bytes

Database mounted.

Database opened.

SQL>

回到在线重做日志文件,丢失了一个成员,实例会象丢失控制文件那样崩溃吗?答案是:依情况而定。一个组可能有一个或多个成员,我们先看一看#members=1的情况,与前面的例子类似,我将在一个闪存盘上创建一个成员的组,并使这个组成为活动组(意味着STATUS的值是ACTIVE, CURRENT, INACTIVE和UNUSED吗?),一旦组是活动的,我将拔出闪存盘,当前的重做日志组是哪一个?从警告日志可以看到:

提取自警告日志

Thu Mar 06 13:22:11 2008

Thread 1 advanced to log sequence 211

Current log# 10 seq# 211 mem# 0: F:\ORACLE\REDO10.LOG

如丢失控制文件一样,实例停止运转了。

SQL> select * from v$logfile;

GROUP# STATUS TYPE MEMBER

---------- ------- ------- ------------------------------------------------

7 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO07.LOG

8 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO08.LOG

10 ONLINE F:\ORACLE\REDO10.LOG

9 ONLINE D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10\REDO09.LOG

SQL> select * from v$logfile;

select * from v$logfile

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

在这个例子中,是LGWR导致了实例终止,注意在其他例子中是CKPT,在控制文件中记录了什么呢?SCN,哪个进程使用SCN给控制文件做的印记?checkpoint进程。

如果想在家中尝试,将数据库运行在非归档模式,并在当前日志组中只使用一个成员,它能再次打开数据库吗?

那个组被多路复用,相同的文件从系统中拔出,会发生什么?生命还是要继续,在警告日志中记录了一条关于丢失成员的消息,让我们向组10添加第二个成员,将它放在一个不同的驱动器中,然后再次拔出闪存盘(开始打开数据库时应该有一个提示信息)。

下面是警告日志中显示的:

Thu Mar 06 14:51:45 2008

Thread 1 advanced to log sequence 216

Current log# 10 seq# 216 mem# 0: F:\ORACLE\REDO10.LOG

Current log# 10 seq# 216 mem# 1: D:\ORACLE\PRODUCT\10.2.0\ORADATA\

DB10\REDO11.LOG

Thu Mar 06 14:53:36 2008

Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2224.trc:

ORA-00345: redo log write error block 23 count 2

ORA-00312: online log 10 thread 1: 'F:\ORACLE\REDO10.LOG'

ORA-27072: File I/O error

OSD-04008: WriteFile() failure, unable to write to file

O/S-Error: (OS 1006) The volume for a file has been externally altered

so that the opened file is no longer valid.

Thu Mar 06 14:53:36 2008

Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2224.trc:

ORA-00343: too many errors, log member closed

ORA-00346: log member marked as STALE

ORA-00312: online log 10 thread 1: 'F:\ORACLE\REDO10.LOG'

这个消息缺少两个单词:实例终止(Instance terminated),在关闭和启动之后,警告日志将仍然提示文件丢失,丢失数据库是可以被打开的。

Thu Mar 06 14:56:51 2008

ALTER DATABASE OPEN

Thu Mar 06 14:56:52 2008

Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2288.trc:

ORA-00313: open failed for members of log group 10 of thread 1

Thu Mar 06 14:56:52 2008

Errors in file d:\oracle\product\10.2.0\admin\db10\bdump\db10_lgwr_2288.trc:

ORA-00313: open failed for members of log group 10 of thread 1

Thu Mar 06 14:56:52 2008

Thread 1 opened at log sequence 216

Current log# 10 seq# 216 mem# 1: D:\ORACLE\PRODUCT\10.2.0\ORADATA\DB10

\REDO11.LOG

Successful open of redo thread 1

…some other messages…

Thu Mar 06 14:56:59 2008

Completed: ALTER DATABASE OPEN

丢失数据文件

迄今为止,从丢失控制文件或重做日志文件中恢复几乎不会丢失数据,单成员重做日志组例子可能发生数据丢失,提到数据文件,有两种分类:一个对于你(你的数据)很重要,一个对于Oracle(它的数据)很重要,为了理解这个分类,有两个问题:

1、如果你的表空间丢失了一个数据文件会发生什么?

2、如果SYSTEM表空间(作为Oracle所属的表空间)丢失了一个数据文件将会发生什么?

如果你回答这些问题时不考虑归档,那么你会保持50%左右出错的机会。

如果在非归档模式下操作,丢失了一个数据文件 -- 任一数据文件 -- 那就完了,实例终止。如果在归档模式下操作,那回答上面的两个问题的答案是不一样的:数据文件丢失意味着实例仍然在工作,丢失一个Oracle专用的数据文件意味着实例终止了。在“备份和恢复高级用户指南”中“数据文件丢失后的恢复:情景”小节非常详细地写出了。

小结

几乎所有关于丢失特定文件的备份和恢复情景都可以复制到一台使用非常便宜的闪存盘的PC上,无论是在一台有大量CPU和充足内存的AIX 5300L上还是在你的能勉强运行Oracle的个人桌面机/笔记本电脑上,原理实际上都是一样的,自己尝试一下吧!这些没有压力的最佳实践训练对生产环境中的恢复非常有帮助,当你的实例崩溃时,时间就是金钱。

更多信息请查看IT技术专栏

推荐信息