数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

数据库备份与恢复测试(7)


发布日期:2024年03月31日
 
数据库备份与恢复测试(7)

###############################################################################################

# []热备份期间的数据库崩墤(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 模式

在这种情况下均需进行介质恢复

二)临时表空间

临时表空间并不包含真正的数据恢复的方法是删除临时表空间并重建即可

三)系统表空间

如果备份不可用则只能采用重建数据库的方法

               

上一篇:关于Oracle的问题的深度

下一篇:PL/SQL基础教程(二)