###############################################################################################
# []热备份期间的数据库崩墤(rman和常规恢复) #
###############################################################################################
SQL> alter tablespace users begin backup;
表空间已更改
SQL> host copy D:\oracle\oradata\USERSDBF D:\oracle\oradata\oracle\USERSDBF
已复制 个文件
SQL> conn scott/tiger
已连接
SQL> create table empcopy as select * from emp;
表已创建
SQL> commit;
提交完成
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 行:
ORA: 权限不足
SQL> conn sys/oracle as sysdba;
已连接
SQL> alter system switch logfile;
系统已更改
SQL> shutdown abort
ORACLE 例程已经关闭
SQL> startup mount
ORACLE 例程已经启动
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
数据库装载完毕
SQL> alter database open;
alter database open
*
ERROR 位于第 行:
ORA: 文件 需要介质恢复
ORA: 数据文件 : D:\ORACLE\ORADATA\USERSDBF
SQL> alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup;
alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup
*
ERROR 位于第 行:
ORA: 无效的文件名
SQL> alter database datafile D:\ORACLE\ORADATA\USERSDBF end backup;
数据库已更改
SQL> alter database open;
数据库已更改
#################################################################################
# [] resetlogs 恢复测试 #
#################################################################################
参见控制文件恢复部分
#################################################################################
# [] rman Recovering Datablocks 恢复测试 #
#################################################################################
~~~~~~~~~~~
官方文档:
~~~~~~~~~~~
Recovering Individual Data Blocks
You can use RMAN to recover one or more corrupted data blocks Typically the corruption is reported in alert logs
trace files or results of SQL queries For example:
BLOCKRECOVER DATAFILE BLOCK DATAFILE BLOCK ;
You can also use BLOCKRECOVER to repair all corrupted blocks listed in V$BACKUP_CORRUPTION and V$COPY_CORRUPTION
These views are filled whenever RMAN performs a complete scan of a file for a backup Run this command to repair blocks
listed in the views:
BLOCKRECOVER CORRUPTION LIST;
~~~~~~~~~~~
场景
~~~~~~~~~~~
SQL> create table empblock tablespace users as select * from emp;
表已创建
SQL> insert into empblock select * from empblock;
已创建行
SQL> select ownersegment_nametablespace_nameextent_idfile_idblock_idblocks from dba_extents
where segment_name=EMPBLOCK order by block_id;
做一次数据的全库备份
RMAN> backup database;
手工地用ultraedit破坏datafile文件
SQL> select count(*) from empblock;
select count(*) from empblock
*
ERROR 位于第 行:
ORA: ORACLE 数据块损坏(文件号块号)
ORA: 数据文件 : D:\ORACLE\ORADATA\USERSDBF
恢复坏块
RMAN> BLOCKRECOVER DATAFILE BLOCK ;
启动 blockrecover 于 ::
使用通道 ORA_DISK_
通道 ORA_DISK_: 正在恢复块
通道 ORA_DISK_: 正在指定要从备份集恢复的块
正在恢复数据文件 的块
通道 ORA_DISK_: 已从备份段 恢复块
段 handle=D:\ORACLE\ORA\DATABASE\GEFH__ tag=TAGT params=NULL
通道 ORA_DISK_: 块恢复已完成
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 ::
SQL> select count(*) from empblock;
COUNT(*)
#########################################################
# [测试]
#########################################################
SQL> startup
ORACLE 例程已经启动
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
ORA: ???????C:\oracle\ora\DATABASE\PWDtestdbORA
SQL> alter database open;
数据库已更改
SQL> create table arch (status varchar()) tablespace users;
表已创建
SQL> alter system switch logfile;
系统已更改
SQL> insert into arch select ok from dba_objects;
已创建行
SQL> commit;
提交完成
SQL> insert into arch select * from arch;
已创建行
SQL> /
已创建行
SQL> /
已创建行
SQL> /
已创建行
SQL> commit;
提交完成
SQL> alter system switch logfile;
系统已更改
SQL> insert into arch select no from dba_objects;
已创建行
SQL> commit;
提交完成
SQL> select GROUP#SEQUENCE#archived STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
NO CURRENT
YES ACTIVE
YES ACTIVE
SQL> shutdown
数据库已经关闭
已经卸载数据库
ORACLE 例程已经关闭
SQL> exit
从Oraclei Enterprise Edition Release Production
With the Partitioning OLAP and Oracle Data Mining options
JServer Release Production中断开
C:\Documents and Settings\lifengfang>oradim delete sid testdb
C:\Documents and Settings\lifengfang>oradim new sid testdb intpwd sunsdl
RMAN> backup format c:\BLOCKRECOVER_%s%pBAK database;
启动 backup 于 月
分配的通道: ORA_DISK_
通道 ORA_DISK_: sid= devtype=DISK
通道 ORA_DISK_: 正在启动 full 数据文件备份集
通道 ORA_DISK_: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno= name=C:\ORACLE\ORADATA\TESTDB\SYSTEMDBF
输入数据文件 fno= name=C:\ORACLE\ORADATA\TESTDB\UNDOTBSDBF
输入数据文件 fno= name=C:\ORACLE\ORADATA\TESTDB\INDXDBF
输入数据文件 fno= name=C:\ORACLE\ORADATA\TESTDB\USERSDBF
输入数据文件 fno= name=C:\ORACLE\ORADATA\TESTDB\TOOLSDBF
通道 ORA_DISK_: 正在启动段 于 月
通道 ORA_DISK_: 已完成段 于 月
段 handle=C:\BLOCKRECOVER_BAK comment=NONE
通道 ORA_DISK_: 备份集已完成 经过时间:::
完成 backup 于 月
SQL> insert into arch select * from arch;
已创建行
SQL> select count(*)status from arch group by status;
COUNT(*) ST
no
ok
SQL> select SEGMENT_NAMEHEADER_BLOCK from dba_segments where SEGMENT_NAME = ARCH;
SEGMENT_NAME HEADER_BLOCK
ARCH
SQL> select to_char(**xxxxxx) from dual;
TO_CHAR
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我现在用ultraedit修改arch表的头块
在地址上进行破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> INSERT INTO ARCH SELECT * FROM ARCH;
INSERT INTO ARCH SELECT * FROM ARCH
*
ERROR 位于第 行:
ORA: ORACLE 数据块损坏(文件号块号)
ORA: 数据文件 : C:\ORACLE\ORADATA\TESTDB\USERSDBF
RMAN> BLOCKRECOVER DATAFILE BLOCK ;
启动 blockrecover 于 月
分配的通道: ORA_DISK_
通道 ORA_DISK_: sid= devtype=DISK
通道 ORA_DISK_: 正在恢复块
通道 ORA_DISK_: 正在指定要从备份集恢复的块
正在恢复数据文件 的块
通道 ORA_DISK_: 已从备份段 恢复块
段 handle=C:\BLOCKRECOVER_BAK tag=TAGT params=NULL
通道 ORA_DISK_: 块恢复已完成
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 月
SQL> select count(*)status from arch group by status;
COUNT(*) ST
no
ok
#################################################################################
# []rman Restoring Datafile Copies to a New Host #
#################################################################################
#################################################################################
# []表空间的恢复(rman和常规恢复) #
#################################################################################
####################################################
# [] 非正常关机的情况下用rman恢复单个数据文件
####################################################
做一次全库备份
RMAN> backup database;
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
SYSTEM YES D:\ORACLE\ORADATA\ORACLE\SYSTEMDBF
UNDOTBS YES D:\ORACLE\ORADATA\ORACLE\UNDOTBSDBF
CWMLITE NO D:\ORACLE\ORADATA\ORACLE\CWMLITEDBF
DRSYS NO D:\ORACLE\ORADATA\ORACLE\DRSYSDBF
EXAMPLE NO D:\ORACLE\ORADATA\ORACLE\EXAMPLEDBF
INDX NO D:\ORACLE\ORADATA\ORACLE\INDXDBF
ODM NO D:\ORACLE\ORADATA\ORACLE\ODMDBF
TOOLS NO D:\ORACLE\ORADATA\ORACLE\TOOLSDBF
USERS NO D:\ORACLE\ORADATA\ORACLE\USERSDBF
XDB NO D:\ORACLE\ORADATA\ORACLE\XDBDBF
SINO NO D:\ORACLE\ORADATA\ORACLE\SINODBF
RCVCAT NO D:\ORACLE\ORADATA\ORACLE\RCVCATDBF
PERFSTAT NO D:\ORACLE\ORADATA\ORACLE\PERFSTATDBF
显示一下系统时间
SQL> select sysdate from dual;
SYSDATE
::
创建一个table
SQL>create table empcopy (id numbername varchar()salary number) tablespace users;
切换日志
SQL>alter system switch logfile;
重启机器至mount状态
SQL>startup mount
模拟删除USERSDBF文件进行完全恢复
RMAN> run {
> restore datafile ;
> recover datafile ;
> alter database open;
> }
####################################################
# [] 非正常关机情况下非RMAN方式用备份的数据文件进行恢复
####################################################
恢复前数据库状态
SQL> select * from swap_p;
ID NAME HIRE_DATE SALARY
zhang namo ::
SQL> insert into swap_p select * from test;
已创建行
SQL> commit;
提交完成
SQL> conn sys/oracle as sysdba
已连接
SQL> alter system switch logfile;
系统已更改
SQL> shutdown abort
ORACLE 例程已经关闭
SQL> startup mount
ORACLE 例程已经启动
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
数据库装载完毕
将旧的备份数据文件拷贝到当前的数据文件位置
恢复数据库
SQL> recover database ;
完成介质恢复
SQL> alter database open;
数据库已更改
SQL> conn scott/tiger
已连接
SQL> select * from swap_p;
ID NAME HIRE_DATE SALARY
zhang namo ::
zhang xiao ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
已选择行
####################################################
# [] 非正常关机情况下恢复单独表空间
####################################################
恢复前数据库状态
SQL> conn scott/tiger
已连接
SQL> select * from swap_p;
未选定行
SQL> insert into swap_p select * from test;
已创建行
SQL> commit;
提交完成
SQL> conn sys/oracle as sysdba
已连接
SQL> shutdown abort
ORACLE 例程已经关闭
将旧的备份数据文件拷贝到当前的数据文件位置
恢复数据文件
SQL> startup mount
ORACLE 例程已经启动
Total System Global Area bytes
Fixed Size bytes
Variable Size bytes
Database Buffers bytes
Redo Buffers bytes
数据库装载完毕
SQL> alter database datafile offline;
数据库已更改
SQL> alter database open;
数据库已更改
SQL> recover tablespace test;
完成介质恢复
SQL> alter tablespace test online;
数据库已更改
SQL> conn scott/tiger
已连接
SQL> select * from swap_p;
ID NAME HIRE_DATE SALARY
zhang xiao ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
zhang namo ::
已选择行
####################################################
# [] 丢失数据文件用rman从备份中还原数据文件并恢复tablespace
####################################################
RMAN> backup database;
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
SYSTEM *** D:\ORACLE\ORADATA\SYSTEMDBF
UNDOTBS *** D:\ORACLE\ORADATA\UNDOTBSDBF
CWMLITE *** D:\ORACLE\ORADATA\CWMLITEDBF
DRSYS *** D:\ORACLE\ORADATA\DRSYSDBF
EXAMPLE *** D:\ORACLE\ORADATA\EXAMPLEDBF
INDX *** D:\ORACLE\ORADATA\INDXDBF
ODM *** D:\ORACLE\ORADATA\ODMDBF
TOOLS *** D:\ORACLE\ORADATA\TOOLSDBF
USERS *** D:\ORACLE\ORADATA\USERSDBF
XDB *** D:\ORACLE\ORADATA\XDBDBF
SINO *** D:\ORACLE\ORADATA\SINODBF
RCVCAT *** D:\ORACLE\ORADATA\RCVCATDBF
PERFSTAT *** D:\ORACLE\ORADATA\PERFSTATDBF
TEST *** D:\ORACLE\ORADATA\TESTDBF
TEST *** D:\ORACLE\ORADATA\TESTDBF
TEST *** D:\ORACLE\ORADATA\TESTDBF
TEST *** D:\ORACLE\ORADATA\TESTDBF
关闭数据库删除D:\ORACLE\ORADATA\TESTDBF文件
启动数据库到mount 状态
启动rman
D:\>rman target sys/oracle nocatalog
恢复tablespace test
从copy的备份中恢复
RMAN> run {
> allocate channel c type disk;
> restore datafile from datafilecopy;
> recover tablespace test;
> alter database open;
> release channel c; }
####################################################
# [] 重建controlfile文件时丢失所有在线日志语句少写了表空间的datafile
####################################################
~~~~~~~~~
~~ 场景
~~~~~~~~~
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
SYSTEM *** D:\ORACLE\ORADATA\SYSTEMDBF
UNDOTBS *** D:\ORACLE\ORADATA\UNDOTBSDBF
CWMLITE *** D:\ORACLE\ORADATA\CWMLITEDBF
DRSYS *** D:\ORACLE\ORADATA\DRSYSDBF
EXAMPLE *** D:\ORACLE\ORADATA\EXAMPLEDBF
INDX *** D:\ORACLE\ORADATA\INDXDBF
ODM *** D:\ORACLE\ORADATA\ODMDBF
TOOLS *** D:\ORACLE\ORADATA\TOOLSDBF
USERS *** D:\ORACLE\ORADATA\USERSDBF
XDB *** D:\ORACLE\ORADATA\XDBDBF
SINO *** D:\ORACLE\ORADATA\SINODBF
RCVCAT *** D:\ORACLE\ORADATA\RCVCATDBF
PERFSTAT *** D:\ORACLE\ORADATA\PERFSTATDBF
TEST *** D:\ORACLE\ORA\DATABASE\MISSING
TEST *** D:\ORACLE\ORA\DATABASE\MISSING
TEST *** D:\ORACLE\ORA\DATABASE\MISSING
TEST *** D:\ORACLE\ORA\DATABASE\MISSING
由于redo文件损坏致使数据库无法正常启动DBA用重建control文件的方法使数据库重启但是没有把datafile文件的名子写在control
文件中这样启动数据库后出现上面的结果在用rman备份数据库文件时出现错误
RMAN> backup database;
启动 backup 于 ::
RMAN: ===========================================================
RMAN: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN: ===========================================================
RMAN: failure of backup command at // ::
RMAN: ORACLE error from recovery catalog database: RMAN: target database incarnation not found in recovery catalog
~~~~~~~~~
~~ 恢复数据文件
~~~~~~~~~
重命名数据文件
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
数据库已更改
SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
数据库已更改
SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
数据库已更改
SQL> alter database rename file D:\ORACLE\ORA\DATABASE\MISSING to d:\oracle\oradata\testdbf;
数据库已更改
用rman备份数据库
RMAN> reset database;
在恢复目录中注册的数据库的新实体化
正在启动全部恢复目录的 resync
完成全部 resync
MAN> backup database;
####################################################
# [] 用rman从备份中恢复system表空间
####################################################
方法一:
做一次全库备份
恢复system表空间
STARTUP MOUNT
RMAN> run {
> restore datafile ;
> recover datafile ;
> alter database open;
> }
方法二:
做一次全库备份
恢复system表空间
RMAN> run {
> restore tablespace system;
> recover tablespace system;
> alter database open;
> }
####################################################
# [] 用户表空间损坏
####################################################
一)用户表空间
错误:
在启动数据库时出现ORAORA或操作系统级错误例如ORA
在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA
ORA以及操作系统级错误ORA
解决:
以下有两种解决方案:
用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等在
这种情况下最简单的方法是offline并删除该数据文件删除表空间并
重建表空间以及所有的对象
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象
用户的表空间不能够被轻易地重建
在大多数情况下重建表空间是不可能及太辛苦的工作方法是倒备份及做介
质恢复如果您的系统运行在NOARCHIVELOG模式下则只有丢失的数据
在online redo log中方可被恢复
步骤如下:
)Restore the lost datafile from a backup
)svrmgrl> startup mount
)svrmgrl> select vgroup#membersequence#first_change#
>from v$log vv$logfile v where vgroup#=vgroup#;
)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl> select file#change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据文件可以被恢复
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据文件不可恢复 恢复最近一
次的全备份或采用方案一
)svrmgrl> recover datafile filename;
)确认恢复成功
)svrmgrl> alter database open resetlogs;
只读表空间无需做介质恢复只要将备份恢复即可唯一的例外是:
表空间在最后一次备份后被改为readwrite 模式
表空间在最后一次备份后被改为readonly 模式
在这种情况下均需进行介质恢复
二)临时表空间
临时表空间并不包含真正的数据恢复的方法是删除临时表空间并重建即可
三)系统表空间
如果备份不可用则只能采用重建数据库的方法