一、 恢复解决方案
错误分类 | 恢复解决方案 |
介质失败 | 如果是少量的块损坏,使用块介质恢复;如果是大量的块、数据文件、表空间的损坏,可能需要对损坏的数据文件或者表空间执行完全恢复;如果是归档Redo日志文件或者联机Redo日志文件的丢失,那么只需要不完全恢复方式。 |
逻辑损坏 | 如果是程序员错误导致出现的问题,可通过补丁应用修复问题。对于无法修复的问题,也可采用介质恢复手段来恢复数据。 |
用户错误 | 根据不同用户错误,选择不同的Flashback技术恢复,使用Flashback技术恢复用户错误是首选方案。如果Flashback不能很好的恢复数据再考虑使用介质恢复或者表空间时间点恢复。 |
注意:恢复依赖于备份,当生产环境中部署完成就应该确保有一次数据库的全库备份,且确保归档Redo日志被打开。
二、SCN时间机制
dncyp.cn
rtwzh.cn
qjcwm.cn
glkhl.cn
nmzjx.info
tqqgs.cn
omdcga.cn
lmgms.cn
SCN(System Change Number,系统改变号)是Oracle内容非常重要的时间机制,一致性、数据恢复都与SCN有着非常密切的关系。Oracle启动时,也是通过SCN的验证来确认数据库是否需要执行实例恢复的。虽然RAC有多个实例,但是只有一个数据库,SCN是对应数据库级别的改变号,所以在不同的实例产生的SCN都必须是唯一的、有序的,这是由SCN生成器完成的工作。系统时间和SCN之间可以非常容易的相互转换,下面是系统时间和SCN相互转换的例子:
SQL> select timestamp_to_scn(sysdate) from dual;
TIMESTAMP_TO_SCN(SYSDATE)
-------------------------
6980593
SQL> select scn_to_timestamp(6980593) from dual;
SCN_TO_ TIMESTAMP (6980593)
-------------------------
02-DES-13 11.12.21.000000000 PM
qczff.cn
xbszl.cn
kkpnk.cn
hcqlk.cn
SQL>
以下为几种常见的SCN:
? 检查点SCN
查询当前最近的检查点SCN:
SQL> select checkpoint_change# from v$database;
sazvkv.cn
fnndx.cn
rjzlr.cn
cybcq.cn
fpphq.cn
gqlpc.cn
rfjnf.cn
dotzwj.cn
hhrln.cn
qyhbx.cn
mpxyvq.info
CHECKPOINT_CHANGE#
------------------
3.6555E+12
yxlpb.cn
rfmbk.cn
rdwzg.cn
ebobci.info
SQL>
每执行一次检查点就由CKPT进程来更新,这个SCN保存在控制文件中。检查点的执行能够确保检查点执行时刻数据的完整性和一致性。实例恢复也是从上一次检查点开始进行恢复,检查点执行的频率决定了Crash恢复或者实例恢复需要花费的时间。当发生日志切换或者请求的SGA空间不足等情况时就会触发检查点。发生检查点,DBWn进程会将所有的脏数据写回磁盘,从而能够确保已提交的一致性数据被写回磁盘。单个联机Redo日志文件越大,发生检查点的间隔时间可能越长,实例恢复的时间也相应地增长,日志文件的丢失也会导致更多的数据丢失。
? 最新SCN
执行以下SQL语句查看数据库最新的SCN:
SQL> select current_scn from v$database;
swjpb.cn
gjynd.cn
ziaeqs.info
CURRENT_SCN
------------
3.6555E+12
SQL>
该SCN是最新生成的全局SCN,它在不断更新,并且只会增大不会减小。
? 数据文件SCN
执行以下SQL查看所有数据文件的SCN:
SQL> select checkpoint_change# from v$datafile;
CHECKPOINT_CHANGE#
------------------
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
6 rows selected.
SQL>
每个数据文件都有一个数据文件SCN,每执行一次检查点便由CKPT进程来更新一次,该SCN保存在控制文件中。
? 启动SCN
执行以下SQL语句查询所有数据文件的启动SCN:
SQL> select checkpoint_change# from v$datafile_header;
kdpcn.info
xkrmm.cn
nltmm.cn
lkybr.cn
CHECKPOINT_CHANGE#
------------------
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
3.6555E+12
6 rows selected.
SQL>
每个数据文件都有一个启动SCN,没执行一次检查点都由CKPT进程来更新一次,该SCN存储在数据文件头中。
? 终止SCN
执行下面SQL语句查询所有数据文件的终止SCN:
SQL> select last_change# from v$datafile;
rzbsq.cn
xqmsd.cn
wkntx.cn
widpiy.cn
jywtq.cn
LAST_CHANGE#
------------
nmzkd.cn
hmqjh.cn
mtlkg.cn
wnsrt.cn
6 rows selected.
SQL>
每个数据文件都有一个终止SCN,没执行一次检查点都由CKPT进程更新一次。该SCN保存在控制文件中,当数据库打开时,由于没有终止SCN存在,所以看到的是空,表示无穷大。
数据库启动过程中,首先会检查控制文件和数据文件的检查点执行次数是否一致,如果不一致需要对数据文件进行介质恢复。如果一致,进一步检查数据文件的启动SCN和终止SCN是否相同。如果数据库是非正常关闭,那么终止SCN肯定是空,这个时候需要执行Crash恢复或实例恢复的过程。Crash恢复或实例恢复过程需要用到联机Redo日志和UNDO表空间执行前滚和回滚操作,如果联机Redo日志或者UNDO表空间被损坏,那么数据库可能无法正常打开。如果启动SCN和终止SCN相同,那么数据库就可以正常打开。
? 日志SCN
执行以下SQL语句查询与日志相关的SCN:
SQL> select status,first_time,first_change#,next_time,next_change# from v$log;
STATUS FIRST_TIME FIRST_CHANGE# NEXT_TIME NEXT_CHANGE#
-------------------- -------------- ------------- -------------- ------------
INACTIVE 02-12鏈13 3.6555E+12 02-12鏈13 3.6555E+12
CURRENT 02-12鏈13 3.6555E+12 2.8147E+14
CURRENT 02-12鏈13 3.6555E+12 2.8147E+14
INACTIVE 02-12鏈13 3.6555E+12 02-12鏈13 3.6555E+12
yqmfh.cn
ndpdl.info
pxcrl.cn
znztx.cn
lcnxc.cn
cmydrf.cn
lqdmy.cn
SQL>
在上面查询中,first_time表示该日志组开始的时间,first_change#表示该日志组开始的SCN。可以看到,状态为current的日志组的first_change#值与前面讨论到的检查点的SCN值相同,说明发生日志切换的时候会触发检查点生成一致的检查点SCN。Next_time表述结束日志组的时间,next_change#表示结束日志组的SCN,该SCN值等于下一个日志组的first_change#值。当前日志组的next_time为空,next_change#是一个很大的值。
三、日志线程与联机Redo日志
Redo日志记录了数据的所有操作,以及操作的顺序。Redo日志主要包括联机Redo日志、归档Redo日志和Standby Redo日志三种类型,这三种类型的日志在结构上是完全相同的,只有用途不同而已。
Redo数据只有在数据库恢复时才能体现出它的价值。在RAC环境中,每个实例的归档Redo日志可以存放在本地文件系统,但是恢复的时候需要将所有节点的归档Redo日志放在一起,确保恢复的实例能够访问到所有实例的归档Redo日志。
每个实例都对应一个维护日志的日志线程(Redo thread),单实例只有一个线程号为1的日志线程。对于RAC来说,日志线程与实例的关系可以通过以下SQL语句查询得到。
1) 查询来自控制文件的线程信息:
SQL> select thread#,checkpoint_change#,last_redo_change# from gv$thread;
THREAD# CHECKPOINT_CHANGE# LAST_REDO_CHANGE#
---------- ------------------ -----------------
1 3.6555E+12 3.6555E+12
2 3.6555E+12 3.6555E+12
1 3.6555E+12 3.6555E+12
2 3.6555E+12 3.6555E+12
yfndb.cn
xlzqj.cn
tbyzxi.cn
SQL>
2) 查询线程与实例之间的关系:
SQL> select thread#,instance_name from gv$instance;
THREAD# INSTANCE_NAME
---------- ------------------------------------------------
1 PROD1
2 PROD2
SQL>
3) 查询线程与日志组之间的关系:
SQL> select group#,thread# from v$log;
fqrwq.cn
apkpsj.cn
pzngq.cn
koxnvn.info
njrbk.cn
GROUP# THREAD#
---------- ----------
1 1
2 1
3 2
4 2
SQL>
四、UNDO表空间
UNDO表空间存放的是数据块的前镜像,是块的多版本数据,用于数据库恢复、一致性读和事务回滚,对数据库并发下读一致性起着重要的作用。
在RAC环境中,与连接Redo日志一样,每个实例都有自己的UNDO表空间,UNDO表空间必须放在共享存储上,每个实例都能访问到所有实例的UNDO表空间,以便任一活动实例都能执行所有实例的恢复操作。每个实例都有自己独立的UNDO表空间还能减少实例间对UNDO表空间的争用。
实例对应的Redo日志组由Redo线程来指定,实例对应的UNDO表空间是直接通过初始化参数文件中的参数指定。下面是参数文件中指定UNDO表空间对应实例的参数:
Prod01.undo_tablespace = ‘UNDOTBS1’
Prod02.undo_tablespace = ‘UNDOTBS2’
1. UNDO参数
zcptq.cn
bqmcc.cn
kkwyn.cn
xsqgr.cn
kddpn.cn
kyyhf.cn
zccxf.cn
l UNDO_MANAGEMENT初始化参数
UNDO_MANAGEMENT指定系统使用的UNDO空间管理模式。设置为AUTO,实例打开自动化UNDO管理模式;设置为MANUAL表示使用回滚段的手动管理模式自动UNDO管理(AUM)是从Oracle9i开始引入,以代替回滚段,也可以称为系统管理UNDO(SMU)。自动UNDO管理自动分配和管理DML操作所需空间的UNDO表空间,代替分配很多不同大小的回滚段。
l UNDO_RETENTION初始化参数
UNDO_RETENTION指定的是事务提交之后UNDO数据保留的时间。事务提交之后,UNDO数据不再需要用于回滚或者事务恢复,但一致性读可能还需要用到这些UNDO数据。
l UNDO_TABLESPACE初始化参数
每个数据库可以有多个UNDO表空间,但是对于每个实例只有一个活动的UNDO表空间。在RAC环境中,每个实例都对应一个UNDO表空间,UNDO_TABLESPACE用于指定实例对应的UNDO表空间。UNDO表空间无法进行收缩,如果UNDO表空间过大,只有通过替换的方式缩小UNDO表空间的大小。
l GUARANTEED UNDO RETENTION特性
默认guaranteed undo retention特性是禁用的,如果启动这个特性意味着数据库不能覆盖已提交但保留时间为超过undo_retention指定时间的UNDO数据。启用这个特性需要更大的UNDO表空间来支撑,如果UNDO表空间没有足够的空间会导致DML操作分配UNDO段失败。启用这个特性能够缓解出现ORA-01555错误几率,确保在一定的时间内能够使用部分Flashback特性闪回数据。执行以下SQL语句启用UNDO表空间的RETENTION特性:
SQL> alter tablespace undotbs1 retention guarantee;
2. UNDO视图
l V$undostat视图
V$undostat是v$rollstat的代替和提升,包含很多对UNDO空间的监控和统计信息。这个视图对于了解实例对UNDO空间的使用情况非常有用,能够通过监控估算出当前负载需要的UNDO表空间大小,能够根据统计信息提供建议调整UNDO_RETENTION,还能够找出长时间运行的SQL语句。在系统中,数据也使用这个视图提供的信息调整UNDO表空间的使用。只有自动化UNDO管理模式才能使用该视图。
l dba_undo_extents视图
dba_undo_extents描述了在数据中所有undo表空间包含的区间。这个视图显示UNDO中每个区间大小。执行以下SQL语句显示UNDO表空间中不同区间状态的统计信息。
l v$transaction
l dba_rollabck_segs视图
ktkjq.cn
ylfzk.cn
nkxpn.cn
Oracle实例恢复
实例恢复
Oracle实例在非正常关闭或执行SHUTDOWN ABORT强制关闭后,实例在下次打开数据库之前会执行实例恢复过程,这个过程是由Oracle自动完成的。执行实例恢复的目的是确保数据的一致性,只有当联机Redo日志文件和UNDO表空间的介质没有被破坏才能确保实例恢复能够成功。
1. RAC的实例恢复
当软件、硬件或者人为问题导致实例失败之后,Oracle数据库自动使用联机Redo日志和UNDO数据执行实例恢复操作。
Crash恢复与实例恢复的区别:
l 一个单实例数据库或者RAC数据库所有实例失败之后,第一个打开数据库的实例会自动执行实例恢复。这种形式的实例恢复称为Crash恢复。
hpyrc.cn
rxmrz.cn
gqbzz.cn
nhtcy.cn
l 一个RAC数据库的一部分但不是所有实例失败后,在RAC中幸存的实例自动执行失败实例的恢复称为实例恢复。
根据Crash恢复和实例恢复的不同,由幸存实例或者第一个重启的实例读取失败实例生成的联机Redo日志和UNDO表空间数据,使用这些信息确保只有已提交的事务被写到数据库中,回滚在失败时候活动的事务,并释放事务使用的资源。
2. 实例恢复的阶段
在实例发生异常终止的情况下,数据库处于以下的状态:
l 事务提交的数据块只写入联机Redo日志中,没有更新到数据文件(那么未写入数据文件的更新必须重新写入数据文件)。
l 由于DBWR进程是异步向磁盘写入数据的,数据文件中可能包含没有被提交但已经写入数据文件的改变,这些改变必须回滚到之前的状态,以确保数据的一致性。
实例恢复利用联机Redo日志文件解决第一个问题,利用UNDO数据同步数据文件解决第二个问题,从而确保数据库数据的一致性。
因此,实例恢复过程会经历两个阶段:
prnmh.cn
hjnfw.info
ydmrn.cn
pblxg.cn
sqxtm.cn
u 实例恢复的第一个阶段称为Cache恢复或者前滚,确保联机Redo日志中所有已提交的事务操作的数据写回到数据文件中。如果正在执行的检查点还未完全执行完毕时发生实例失败,前滚过程可能需要通过多个联机Redo日志文件才能使数据恢复到之前时间的状态。前滚之后,数据中就包含了连接Redo日志文件中所有已提交的数据。在失败之前,数据文件中可能也包含未提交的改变,或者是记录在联机Redo日志中但未提交的数据,在前滚的时候被写到硬盘中。
u 实例恢复的第二个阶段称为回滚或者事务恢复,Oracle数据库应用UNDO块回滚在数据块中未提交的改变,这些数据块是在失败之前或者Cache恢复期间被写入的。回滚完成之后,整个实例恢复才算完成,而Redo和UNDO的丢失或者损坏都可能导致实例恢复失败。Oracle数据库能同时回滚多个事务。所有在失败的时候是活动的事务都被打上了终止的标记,等待SMON进程回滚终止的事务。
数据库由SMON后台进程自动应用联机Redo日志文件中的条目和读取UNDO表空间中的数据完成实例恢复。
kojyie.cn
myslb.cn
wlysk.cn
bkksn.cn
dztrd.cn
Oracle介质恢复
介质恢复是基于物理备份恢复数据,介质恢复技术是Oracle数据库出现介质故障时恢复的重要保障。
介质恢复过程包括还原(RESTORE)和恢复(RECOVER)两个步骤:
| 注意:还原只是建立在数据库备份的基础版本上,例如,如果数据库备份包括0级备份和很多1级备份,还原只是应用0级备份,恢复过程会根据情况自动应用1级备份或Redo日志将数据库恢复到一致性的状态。 |
完全恢复是一种没有数据库丢失的恢复方式,能够恢复到最新的联机Redo日志中已提交的数据。在传统恢复方式中,因介质失败破坏了数据文件之后,可以在数据库、表空间和数据文件上执行完全介质恢复。
各种各样的块损坏通常是通过Oracle的ORA-1578错误报告出来的,详细的损坏描述会在告警日志中打印出来。
块的物理损坏有很多种情况,例如块头(Cache Header)被一个不正确的值替换、块被破坏或变得不完整、块的头和尾不匹配、块的校验和(CHECKSUM)不正确、块错位、块被归零。
nlgsm.cn
kznpk.cn
njlkx.cn
gtcdn.cn
qtxjg.cn
ntgxt.cn
一个破裂块的意思即块是不完整的,块头的信息不能匹配块尾的信息。在告警日志中可能出现如下的日志信息:
Corrupt block relative dba:0x0380e573(file 14,block 58739)
Fractured block found during buffer read
rdccj.cn
kqrxc.cn
xhvdic.cn
zceqkd.info
CHECKSUM的算法只是根据块的字节值计算一个校验和,算法比较简单。该参数默认在所有表空间上都起作用。
属性 | 描述 |
语法 | DB_BLOCK_CHECKSUM={OFF|FALSE|TYPICAL|TURE|FULL} |
默认值 | TYPICAL |
修改范围 | ALTER SESSION,ALTER SYSTEM |
这个参数设置为OFF时,DBWn只为SYSTEM表空间计算校验和,不为用户表空间计算校验和。另外,此时数据库也不会执行日志的校验工作。
如果DB_BLOCK_CHECKSUM不等于FALSE值,每次读取块,Oracle计算校验和,都与存储在块头中的校验和进行对比。如下例子:
Corrupt block relative dba: 0x0380a58f (file 14,block 42383)
Bad check value found during buffer read
……scplsz.info
iajxtc.cn
tptqk.cn
fxtyz.cn
wlchc.cn
DB_BLOCK_CHECKING参数主要是用于数据块的逻辑一致检查,但只是在块内,不包括块间的逻辑检查。主要用于防止在内存中损坏或数据损坏。
无论该参数如何设置,对SYSTEM表空间来说,逻辑一致检查始终处于“打开”状态,在其他表空间该参数默认是关闭的。
参数值 | 含义 |
OFF或者FALSE | 对于用户表空间没有任何逻辑一致性检查工作 |
LOW | 块的内容在内存中改变之后,执行基本的块头检查,如UPDATE语句、INSERT语句、磁盘读或者在RAC中内部实例之间的块传递之后发生检查工作 |
MEDIUM | 除了索引以外的所有对象执行LOW检查和完全语义检查,由于索引能在遭遇损坏的情况下的重建,所以可以不考虑对它检查 |
FULL或者TRUE | 所有对象执行MEDIUM检查和完全语义检查 |
如果启用DB_BLOCK_CHECKING参数,在磁盘的块发生逻辑损坏,下一次块更新将作为软损坏标记这个块,之后读取这个块产生ORA-1578的错误。
当Oracle察觉读取块的内容属于不同块但是校验和又是正确的时,会产生错误。
若块包含一个正确的校验和,块头以下的结构是损坏的(块内容损坏),这可能引起不同的ORA-600错误。逻辑块损坏的详细损坏描述通常不会打印到告警日志。DBV将报告块具体的逻辑错误。
DBVERIRY不能验证联机Redo日志、归档Redo日志、控制文件和RMAN备份集,只能用于数据文件的块验证。
$ dbv file=/testdb/test01.dbf blocksize=8192
注意:DBV工具除了用于检测数据文件是否有坏块外,也用于获得坏块的详细信息。
$ dbv file=+DATAFILE/testdb/datafile/test.234.648839 userid=sys/oracle
l ANALYZE命令dsmnm.info
jsiklf.cn
qmzqz.cn
qzxwl.cn
Analyze table/index / validate structure ;
SQL> analyze table fengpin.test validate structure;
RMAN是一块备份工具,就像一个过滤器,RMAN需要通过缓存过滤每一个块,其中一个特点就是检查块是否被损坏。如果备份的数据库中包含有坏块,将会收到错误
对于包含坏块的表执行导出操作,会收到相关的错误信息。对于这种情况,在非归档模式无法通过块恢复修复块的情况下,有如下两种处理方法:
SQL> alter system set events=’10231 trace name context forever,level 10’;
SQL> alter system set events=’10231 trace name context forever,level 0’;
可以使用DBMS_REPAIR包标记损坏的数据库对象,这样在对损坏的对象执行全表扫描的时候会跳过损坏的块。语法如下:
SQL> exec dbms_repair.skip_corrupt_blocks(‘’,’tablename’);
l Expdp工具cghnf.info
yrdnq.cn
twxyh.cn
ylfdr.cn
crprq.cn
使用expdp工具不会给出坏块的提示,只会将对象正确的数据导出。
4. 块的损坏与恢复
块已经不是Oracle的格式,或者其内部是不一致的,那么这个块就被认为已损坏。块介质恢复是当数据文件是联机时,还原和恢复数据块的技术。如果只有一些块被破坏,那么块介质恢复是较好的恢复选择。
BBED(Block Brower and EDitor)是Oracle的一款内部工具,可以用来直接查看和修改Oracle数据文件块的内容。BBED是一个针对Oracle的二进制编译工具。该工具不受Oracle支持,默认是不生成可执行文件的,在使用钱需要重新编译。
1) 编译BBED
直接在Oracle 11gR2 的环境中编译BBED,将收到以下错误信息:
$ cd $ORACLE_HOME/rdbms/lib
$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
……
gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/ssbbded.o: No such file or directory
gcc: /u01/app/oracle/11.2.0/db_1/rdbms/lib/sbbdpt.o: No such file or directory
Oracle 11gR2 环境中编译BBED可执行文件所需要的ssbbded.o和sbbdpt.o对象文件被移除,不过可以从Oracle 10g环境中将这两个文件拷贝到Oracle 11g环境中进行编译。
除了将上面的ssbbded.o和sbbdpt.o文件拷贝到Oracle 11g环境外,BBED还需要用到$ORACLE_HOME/rdbms/mesg目录下的bbedus.msg和bbedus.msb两个信息文件,这几个文件都需要从Oracle 10g中拷贝到Oracle 11g中对应的目录中。下面是将以上4个文件从Oracle 10g中拷贝到Oracle 11g对应目录之后的编译过程:
$ cd $ORACLE_HOME/rdbms/lib
$ make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
$ file bbed
$ size bbed
$ ldd bbed
$ cp bbed $ORACLE_HOME/bin/
$ cd /
$ which bbed
/u01/app/oracle/product/11.2.0/db_1/bin/bbed
编译成功后登录BBED,登录时需要密码(默认密码是:blockedit)
$ bbed
2) BBED模拟表数据块的损坏
a. 创建测试表
SQL> create table test.testbbed as select * from dba_tables;
b. 创建BBED参数文件
由于BBED无法对ASM进行操作,所以这里将表创建到ACFS文件系统的存储设备上。这里创建两个BBED参数文件,filelist.txt保存要操作的数据文件的ID和路径,bbed.par保存数据文件的块大小、filelist.txt的位置和操作模式:
$ more filelist.txt
6 /testbbed/tbtbs01.dbf
$ more bbed.par
blocksize=8192
listfile=filelist.txt
mode=edit
bqfgdl.cn
dkdnx.cn
dzkqp.cn
rogpey.cn
cjqpb.cn
filelist.txt的内容可通过select file_id,file_name from dba_data_filesSQL查询得到。
c. BBED基本操作
ü 使用指定的参数文件登录BBED:
$ bbed parfile=bbed.par
ü 显示BBED配置文件中指定的数据文件信息:
BBED> info
ü 设置要操作的数据文件:
BBED> set file 6
ü 显示要操作的数据文件的详细信息:
BBED> show
d. 模拟坏块
修改文件号为6的第136号块:
BBED> modify 1000 file 6 block 136
如果修改错误,可以执行revert命令回滚。
e. 验证坏块
在BBED执行以下命令验证数据块,发现block 136已经损坏
BBED> verify
f. 使用DBV工具验证
使用DBV工具验证发现file 6 block 136已经损坏
$ dbv file=/testbbed/tbtbs01.dbf blocksize=8192
g. 执行块读取操作
执行一个test.testbbed的全表扫描,收到ORA-01578错误
SQL> alter system flush buffer_cache;
SQL> select /*+FULL(T)*/ COUNT(1) FROM TEST.TESTBBED T;
3) RMAN的块恢复
块介质恢复用来恢复一个单独的块或者数据文件中数据块的集合,如果是小数据量的数据丢失或损坏,而不是整个数据文件,这种类型的恢复是很有用的。通常,块损坏会在跟踪文件中报告错误信息。
块级别的数据丢失通常是由以下两个原因造成的:
n I/O错误引起的镜像数据丢失。
n 内存损坏,刷新到磁盘。
dnjps.cn
lszfn.cn
fngyp.cn
dfqql.cn
kyivas.info
mqwjm.cn
lkmyy.cn
a. 使用RMAN BLOCKRECOVER命令的注意事项
n 目标数据库必须在MOUNT或者OPEN状态,如果执行某个数据文件的块介质恢复,那么该数据文件不能是脱机状态。
n 块介质恢复不支持基于时间点的块恢复。
n 只能在损坏的块上执行块介质恢复。
n 块被标记为介质损坏之后是不能访问的,直达恢复完成。
n 当使用备份的控制文件加载数据库时,不能执行块的介质恢复。
n 必须有一个包含损坏块文件的全备份,块介质恢复不能使用增量备份。
n 如果RMAN访问块介质恢复需要特定归档Redo日志文件失败,那么将执行还原FAILOVER,尝试使用RMAN资料库中列出的适合这个操作的所有其它备份,如果没有合适的备份存在执行才会失败。
n 数据文件头不能被恢复
n 不能在非归档模式下执行块介质恢复。
b. RMAN BLOCKRECOVER命令的使用方式
RMAN BLOCKRECOVER命令有以下三种使用方式:
方式1 使用BLOCKRECOVER CORRUPTION LIST命令恢复在V$DATABASE_BLOCK_CORRUPTION视图中报告的所有块:
RMAN> blockrecover corruption list;
方式2 使用BLOCKRECOVER 命令的时候指定文件号和块号:
RMAN> blockrecover datafile block ;
方式3 执行blockrecover命令的时候指定表空间和数据块地址(DBA):
RMAN> blockrecover tablespace DBA ;
c. RMAN BLOCKRECOVER使用的例子
yrgnt.cn
pbyqb.cn
ixkolg.info
rsnlg.cn
zrianz.cn
kbrrj.cn
例子1 恢复3个数据文件的损坏块:
RMAN> BLOCKRECOVER DATAFILE 2 BLOCK 12,13 DATAFILE 3 BLOCK 5,98,99 DATAFILE 4 BLOCK 19;
例子2:从数据文件拷贝中还原、恢复一系列块:
RMAN> RUN
{
BLOCKRECOVER DATAFILE 3 BLOCK 2,3,4,5 TABLESPACE sales DBA 4194405,4194409,4194412 from DATAFILECOPY;
}
例子3:从指定的tag备份总还原、恢复块
RMAN> BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404,4194405 FROM TAG “weekly_backup”;
例子4:从用于恢复数据到两天以前的备份中还原、恢复SYSTEM表空间中的两个块:
RMAN> BLOCKRECOVER TALBESPACE SYSTEM DBA 4194404,4194405 RESOTRE UNTILL TIME ‘sysdate-2’;
例子5:运行备份验证数据库,修复在V$DATABASE_BLOCK_CORRUPTION中记录的所有损坏块:
RMAN> BACKUP VALIDATE DATABASE;
RMAN> BLOCKRECOVER CORRUPTION LIST;
4) 确定损坏块对应的对象
zncdp.cn
qmszx.cn
clyxy.cn
tzsqq.cn
swrnp.cn
zqdcm.cn
tslyn.cn
要确定一个损坏的对象需要知道AFN(Absolute File Numbe,绝对文件号)和BL(Block Number,块号)。AFN和RFN(Relative File Number,相对文件号)通常是相同的,但是也可能不同(特别是如果数据库从Oracle7迁移或者如果使用的是可传输、可插拔的表空间),获得正确的AFN和RFN就显得非常重要,如果指定了错误的AFN将导致找不到对象或错误识别对象。
a. 确定AFN和BL
方法1:从ORA-1578得到AFN
ORA-1578之后产生的ORA-1110错误提供AFN号码。
方法2:从DBVERIFY输出获得AFN。
通过使用DBV工具会报告损坏的块,DBV工具通过提供与相关的RDBA、RFN和BL信息。
方法3:从RMAN获得AFN
RMAN在V$DATABASE_BLOCK_CORRUPTION视图报告损坏的块。该视图的字段FILE#表示AFN,字段BLOCK#表示BL。
b. 定位损坏的对象
一旦AFN被识别,执行以下SQL语句定位损坏的对象:
SQL> select *
From DBA_EXTENTS
Where file_id=&AFN
And &BL BETWEEN BLOCK_ID AND BLOCK_ID + BLOCKS-1;
数据库特殊情况的恢复
bfyqp.cn
kjrrf.cn
suztkw.cn
lqysk.cn
1. 联机Redo日志损坏与恢复
对于正常关闭的数据库来说,关闭前会执行一个检查点以保证数据库的一致性,重启之后,联机日志是是否存在都不会导致数据的丢失。然而,如果是非正常关闭的数据库,重启之后会执行实例恢复的过程,如果实例恢复过程需要的UNDO活Redo日志丢失,那么就可能造成数据的不一致和数据的丢失。
a. 连接Redo日志损坏的4种情况
联机Redo日志文件的损坏有以下4中情况:
情况1 非当前日志损坏,正常关闭数据库。
情况2 非当前日志损坏,非正常关闭数据库。
情况3 当前日志损坏,正常关闭数据库。
情况4 当前日志损坏,非正常关闭数据库。
b. 处理方法
1) 情况1和情况2的处理方法
情况1和情况2的处理方法一样,直接把日志文件清除即可:
SQL> alter database clear logfile group 3;
2) 情况3的处理方法
在SQLPLUS中执行以下的SQL语句以RESETLOGS模式重新打开数据库:
SQL> startup mount;
SQL> recover database until cancel;
SQL> alter database open resetlogs;
3) 情况4的处理方法
这种情况会导致联机Redo日志中的一部分已提交的数据丢失,实例恢复中的前滚操作不能成功执行,回滚操作也无法执行,这也会导致部分数据的丢失。处理方法是强制打开数据库或通过备份执行介质不完全恢复。
2. 数据文件脱机与恢复
数据库的脱机包括数据文件的脱机和表空间的脱机,数据文件的脱机和表空间非正常脱机在下一次执行联机命令之前都无需先执行介质恢复操作,介质恢复成功才能联机成功。
数据文件添加到表空间之后不能再被删除,也没有语法支持这么做,如果不想使用该数据文件,唯一的方法是将数据文件设置为OFFLINE状态。执行以下步骤将数据文件设置为OFFLINE状态:
1) 如果是归档模式可以执行如下SQL语句设置数据文件的状态为OFFLINE:
SQL> alter database datafile ‘xxx.dbf’ offline;
2) 如果是非归档模式执行以下SQL语句将数据文件状态设置为OFFLINE:
SQL> alter database datafile ‘xxx.dbf’ offile drop;
即使数据文件脱机,数据文件相关的数据字典信息、元数据信息依然存在,当表空间被删除后,相关数据文件的信息才会被清除。Drop tablespace只是清空Oracle数据字典信息,即使数据文件不存在也可以正常的drop表空间。对于数据文件的脱机,在设置该数据文件OFFLINE的时候都需要对该数据文件执行介质恢复。
如果在非归档模式下使用OFFLINE drop使数据文件脱机,这就意味着该数据文件可能无法再恢复到online状态,原因在于非归档模式下可能没有足够的日志文件在执行online的时候完成介质恢复。如果数据文件脱机之后日志没有发生切换,所有需要的日志还依然存在的话,那么非归档模式下数据文件的脱机也可以再次变成online状态。
3. 表空间脱机与恢复
表空间脱机实际就是表空间对应的所有数据文件脱机。
表空间脱机分为正常脱机、临时脱机和立即脱机,如下:
1) 正常脱机
这是默认的选项,如果表空间正常脱机,当重新执行online的时候,Oracle会用相应的SCN来更新表空间数据文件头SCN即可正常地online表空间,而不需要执行介质恢复。执行以下SQL语句是表空间正常脱机:
SQL> alter tablespace xxx offline;
2) 临时脱机
当执行临时脱机(OFFLINE temporary)语句之前已经有表空间对应的数据文件脱机,那么在是表空间重新online之前需要执行特定数据文件的介质恢复。执行以下的SQL语句是表空间临时脱机:
SQL> alter tablespace xxx offline temporary;
qpkzc.cn
rxdmw.cn
wgylq.cn
grmdq.cn
qwpdh.cn
mzxlk.cn
3) 立即脱机
执行这个操作(OFFLINE immediate)表示立即使表空间脱机,在下次使表空间online的时候必须执行介质恢复,介质恢复成功之后表空间才能变成online状态。执行以下的SQL语句是表空间立即脱机:
SQL> alter tablespace xxx offline immediate;