分类: 服务器与存储
2008-06-16 19:10:17
SQL> alter tablespace users begin backup;
表空间已更改。
SQL> host copy D:\\oradata\USERS01.DBF D:\\oradata\\USERS01.DBF
已复制 1 个文件。
SQL> conn scott/tiger
已连接。
SQL> create table empcopy as select * from emp;
表已创建。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
alter system switch logfile
*
ERROR 位于第 1 行:
ORA-01031: 权限不足
SQL> conn sys/ as sysdba;
已连接。
SQL> alter system switch logfile;
系统已更改。
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
ERROR 位于第 1 行:
ORA-01113: 文件 9 需要介质恢复
ORA-01110: 数据文件 9: 'D:\ORACLE\ORADATA\USERS01.DBF'
SQL> alter database datafile D:\ORACLE\ORADATA\USERS01.DBF end backup;
alter database datafile D:\ORACLE\ORADATA\USERS01.DBF end backup
*
ERROR 位于第 1 行:
ORA-02236: 无效的文件名
SQL> alter database datafile 'D:\ORACLE\ORADATA\USERS01.DBF' end backup;
数据库已更改。
SQL> alter database open;
数据库已更改。
#################################################################################
# [5] resetlogs 恢复测试 #
#################################################################################
参见控制文件恢复部分
#################################################################################
# [6] 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 9 BLOCK 12, 235 DATAFILE 4 BLOCK 101;
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;
已创建14行。
SQL> select owner,segment_name,tablespace_name,extent_id,file_id,block_id,blocks from dba_extents
where segment_name='EMPBLOCK' order by block_id;
做一次数据的全库备份
RMAN> backup database;
手工地用ultraedit破坏datafile 9文件
SQL> select count(*) from empblock;
select count(*) from empblock
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号9,块号11)
ORA-01110: 数据文件 9: 'D:\ORACLE\ORADATA\USERS.DBF'
恢复坏块
RMAN> BLOCKRECOVER DATAFILE 9 BLOCK 11;
启动 blockrecover 于 2005-03-04 11:06:32
使用通道 ORA_DISK_1
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00009 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=D:\ORACLE\ORA92\DATABASE\11GEF66H_1_1 tag=TAG20050304T105409 params=NULL
通道 ORA_DISK_1: 块恢复已完成
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 2005-03-04 11:06:44
SQL> select count(*) from empblock;
COUNT(*)
----------
917504
#########################################################
# [测试2]
#########################################################
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
ORA-01991: ???????'C:\\ora92\DATABASE\PWDtestdb.ORA'
SQL> alter database open;
数据库已更改。
SQL> create table arch1 (status varchar(2)) tablespace users;
表已创建。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch1 select 'ok' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> insert into arch1 select * from arch1;
已创建6166行。
SQL> /
已创建12332行。
SQL> /
已创建24664行。
SQL> /
已创建49328行。
SQL> commit;
提交完成。
SQL> alter system switch logfile;
系统已更改。
SQL> insert into arch select 'no' from dba_objects;
已创建6166行。
SQL> commit;
提交完成。
SQL> select GROUP#,SEQUENCE#,archived, STATUS from v$log;
GROUP# SEQUENCE# ARC STATUS
---------- ---------- --- ----------------
1 5 NO CURRENT
2 3 YES ACTIVE
3 4 YES ACTIVE
SQL> shutdown
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> exit
从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.1.0 - Production中断开
C:\Documents and Settings\lifeng.fang>oradim -delete -sid testdb
C:\Documents and Settings\lifeng.fang>oradim -new -sid testdb -intpwd sunsdl
RMAN> backup format 'c:\BLOCKRECOVER_%s%p.BAK' database;
启动 backup 于 04-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在启动 full 数据文件备份集
通道 ORA_DISK_1: 正在指定备份集中的数据文件
在备份集中包含当前的 SPFILE
备份集中包括当前控制文件
输入数据文件 fno=00001 name=C:\ORACLE\ORADATA\TESTDB\SYSTEM01.DBF
输入数据文件 fno=00002 name=C:\ORACLE\ORADATA\TESTDB\UNDOTBS01.DBF
输入数据文件 fno=00003 name=C:\ORACLE\ORADATA\TESTDB\INDX01.DBF
输入数据文件 fno=00005 name=C:\ORACLE\ORADATA\TESTDB\USERS01.DBF
输入数据文件 fno=00004 name=C:\ORACLE\ORADATA\TESTDB\TOOLS01.DBF
通道 ORA_DISK_1: 正在启动段 1 于 04-3月 -05
通道 ORA_DISK_1: 已完成段 1 于 04-3月 -05
段 handle=C:\BLOCKRECOVER_11.BAK comment=NONE
通道 ORA_DISK_1: 备份集已完成, 经过时间:00:00:26
完成 backup 于 04-3月 -05
SQL> insert into arch select * from arch1;
已创建104822行。
SQL> select count(*),status from arch1 group by status;
COUNT(*) ST
---------- --
12332 no
197312 ok
SQL> select SEGMENT_NAME,HEADER_BLOCK from dba_segments where SEGMENT_NAME = 'ARCH1';
SEGMENT_NAME HEADER_BLOCK
--------------------------- ------------
ARCH1 11
SQL> select to_char(11*8*1024,'xxxxxx') from dual;
TO_CHAR
-------
16000
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
我现在用ultraedit修改arch表的头块
在地址16000上进行破坏
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL> INSERT INTO ARCH1 SELECT * FROM ARCH1;
INSERT INTO ARCH1 SELECT * FROM ARCH1
*
ERROR 位于第 1 行:
ORA-01578: ORACLE 数据块损坏(文件号5,块号11)
ORA-01110: 数据文件 5: 'C:\ORACLE\ORADATA\TESTDB\USERS01.DBF'
RMAN> BLOCKRECOVER DATAFILE 5 BLOCK 11;
启动 blockrecover 于 04-3月 -05
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: sid=16 devtype=DISK
通道 ORA_DISK_1: 正在恢复块
通道 ORA_DISK_1: 正在指定要从备份集恢复的块
正在恢复数据文件 00005 的块
通道 ORA_DISK_1: 已从备份段 1 恢复块
段 handle=C:\BLOCKRECOVER_11.BAK tag=TAG20050304T164623 params=NULL
通道 ORA_DISK_1: 块恢复已完成
正在开始介质的恢复
完成介质的恢复
完成 blockrecover 于 04-3月 -05
SQL> select count(*),status from arch1 group by status;
COUNT(*) ST
---------- --
12332 no
197312 ok
#################################################################################
# [7].rman Restoring Datafile Copies to a New Host #
#################################################################################
#################################################################################
# [8].表空间的恢复(rman和常规恢复) #
#################################################################################
####################################################
# [8.1] 非正常关机的情况下,用rman恢复单个数据文件
####################################################
1、做一次全库备份
RMAN> backup database;
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
---- ---------- -------------------- ------- -------------------
1 419840 SYSTEM YES D:\ORACLE\ORADATA\ORACLE\SYSTEM01.DBF
2 204800 UNDOTBS1 YES D:\ORACLE\ORADATA\ORACLE\UNDOTBS01.DBF
3 20480 CWMLITE NO D:\ORACLE\ORADATA\ORACLE\CWMLITE01.DBF
4 20480 DRSYS NO D:\ORACLE\ORADATA\ORACLE\DRSYS01.DBF
5 152960 EXAMPLE NO D:\ORACLE\ORADATA\ORACLE\EXAMPLE01.DBF
6 25600 INDX NO D:\ORACLE\ORADATA\ORACLE\INDX01.DBF
7 20480 ODM NO D:\ORACLE\ORADATA\ORACLE\ODM01.DBF
8 10240 TOOLS NO D:\ORACLE\ORADATA\ORACLE\TOOLS01.DBF
9 25600 USERS NO D:\ORACLE\ORADATA\ORACLE\USERS01.DBF
10 39040 XDB NO D:\ORACLE\ORADATA\ORACLE\XDB01.DBF
11 204800 SINO NO D:\ORACLE\ORADATA\ORACLE\SINO.DBF
12 204800 RCVCAT NO D:\ORACLE\ORADATA\ORACLE\RCVCAT.DBF
13 409600 PERFSTAT NO D:\ORACLE\ORADATA\ORACLE\PERFSTAT.DBF
2、显示一下系统时间
SQL> select sysdate from dual;
SYSDATE
-------------------
2005-02-25 11:53:00
3、创建一个table
SQL>create table empcopy1 (id number,name varchar2(50),salary number) tablespace users;
4、切换日志
SQL>alter system switch logfile;
5、重启机器至mount状态
SQL>startup mount
6、模拟删除USERS01.DBF文件,进行完全恢复
RMAN> run {
2> restore datafile 9;
3> recover datafile 9;
4> alter database open;
5> }
----------------------------------------------------------------------------------------------------------------------------
####################################################
# [8.2] 非正常关机情况下,非RMAN方式用备份的数据文件进行恢复
####################################################
1、恢复前数据库状态
SQL> select * from swap_p1;
ID NAME HIRE_DATE SALARY
---------- -------------------------------------------------- ------------------- ----------
1002 zhang namo 2005-11-01 00:00:00 1200
SQL> insert into swap_p1 select * from test;
已创建7行。
SQL> commit;
提交完成。
SQL> conn sys/ as sysdba
已连接。
SQL> alter system switch logfile;
系统已更改。
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
2、将旧的备份数据文件拷贝到当前的数据文件位置
3、恢复数据库
SQL> recover database ;
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> conn scott/tiger
已连接。
SQL> select * from swap_p1;
ID NAME HIRE_DATE SALARY
---------- -------------------------------------------------- ------------------- ----------
1002 zhang namo 2005-11-01 00:00:00 1200
1001 zhang xiao 2004-01-01 00:00:00 1200
1007 zhang namo 2004-10-01 00:00:00 1200
1008 zhang namo 2005-09-01 00:00:00 1200
1002 zhang namo 2005-11-01 00:00:00 1200
1003 zhang namo 2006-11-01 00:00:00 1200
1005 zhang namo 2006-10-01 00:00:00 1200
1006 zhang namo 2006-10-01 00:00:00 1200
已选择8行。
----------------------------------------------------------------------------------------------------------------------------
####################################################
# [8.3] 非正常关机情况下,恢复单独表空间
####################################################
1、恢复前数据库状态
SQL> conn scott/tiger
已连接。
SQL> select * from swap_p1;
未选定行
SQL> insert into swap_p1 select * from test;
已创建7行。
SQL> commit;
提交完成。
SQL> conn sys/ as sysdba
已连接。
SQL> shutdown abort
ORACLE 例程已经关闭。
2、将旧的备份数据文件拷贝到当前的数据文件位置
3、恢复数据文件
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL> alter database datafile 17 offline;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> recover tablespace test4;
完成介质恢复。
SQL> alter tablespace test4 online;
数据库已更改。
SQL> conn scott/tiger
已连接。
SQL> select * from swap_p1;
ID NAME HIRE_DATE SALARY
---------- -------------------------------------------------- ------------------- ----------
1001 zhang xiao 2004-01-01 00:00:00 1200
1007 zhang namo 2004-10-01 00:00:00 1200
1008 zhang namo 2005-09-01 00:00:00 1200
1002 zhang namo 2005-11-01 00:00:00 1200
1003 zhang namo 2006-11-01 00:00:00 1200
1005 zhang namo 2006-10-01 00:00:00 1200
1006 zhang namo 2006-10-01 00:00:00 1200
已选择7行。
####################################################
# [8.4] 丢失数据文件,用rman从备份中还原数据文件并恢复tablespace
####################################################
RMAN> backup database;
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
---- ---------- -------------------- ------- -------------------
1 419840 SYSTEM *** D:\ORACLE\ORADATA\SYSTEM01.DBF
2 204800 UNDOTBS1 *** D:\ORACLE\ORADATA\UNDOTBS01.DBF
3 20480 CWMLITE *** D:\ORACLE\ORADATA\CWMLITE01.DBF
4 20480 DRSYS *** D:\ORACLE\ORADATA\DRSYS01.DBF
5 152960 EXAMPLE *** D:\ORACLE\ORADATA\EXAMPLE01.DBF
6 25600 INDX *** D:\ORACLE\ORADATA\INDX01.DBF
7 20480 ODM *** D:\ORACLE\ORADATA\ODM01.DBF
8 10240 TOOLS *** D:\ORACLE\ORADATA\TOOLS01.DBF
9 25600 USERS *** D:\ORACLE\ORADATA\USERS01.DBF
10 39040 XDB *** D:\ORACLE\ORADATA\XDB01.DBF
11 204800 SINO *** D:\ORACLE\ORADATA\SINO.DBF
12 204800 RCVCAT *** D:\ORACLE\ORADATA\RCVCAT.DBF
13 409600 PERFSTAT *** D:\ORACLE\ORADATA\PERFSTAT.DBF
14 51200 TEST1 *** D:\ORACLE\ORADATA\TEST1.DBF
15 51200 TEST2 *** D:\ORACLE\ORADATA\TEST2.DBF
16 51200 TEST3 *** D:\ORACLE\ORADATA\TEST3.DBF
17 51200 TEST4 *** D:\ORACLE\ORADATA\TEST4.DBF
2、关闭数据库,删除D:\ORACLE\ORADATA\TEST4.DBF文件
3、启动数据库到mount 状态
4、启动rman
D:\>rman target sys/ nocatalog
5、恢复tablespace test4
从copy的备份中恢复
RMAN> run {
2> allocate channel c1 type disk;
3> restore datafile 17 from datafilecopy;
4> recover tablespace test4;
5> alter database open;
6> release channel c1; }
####################################################
# [8.5] 重建controlfile文件时,丢失所有在线日志,语句少写了表空间的datafile
####################################################
~~~~~~~~~
~~ 场景
~~~~~~~~~
RMAN> report schema;
数据库方案报表
文件 KB 表空间 RB segs 数据文件名称
---- ---------- -------------------- ------- -------------------
1 0 SYSTEM *** D:\ORACLE\ORADATA\SYSTEM01.DBF
2 204800 UNDOTBS1 *** D:\ORACLE\ORADATA\UNDOTBS01.DBF
3 20480 CWMLITE *** D:\ORACLE\ORADATA\CWMLITE01.DBF
4 20480 DRSYS *** D:\ORACLE\ORADATA\DRSYS01.DBF
5 152960 EXAMPLE *** D:\ORACLE\ORADATA\EXAMPLE01.DBF
6 25600 INDX *** D:\ORACLE\ORADATA\INDX01.DBF
7 20480 ODM *** D:\ORACLE\ORADATA\ODM01.DBF
8 10240 TOOLS *** D:\ORACLE\ORADATA\TOOLS01.DBF
9 25600 USERS *** D:\ORACLE\ORADATA\USERS01.DBF
10 39040 XDB *** D:\ORACLE\ORADATA\XDB01.DBF
11 204800 SINO *** D:\ORACLE\ORADATA\SINO.DBF
12 204800 RCVCAT *** D:\ORACLE\ORADATA\RCVCAT.DBF
13 409600 PERFSTAT *** D:\ORACLE\ORADATA\PERFSTAT.DBF
14 0 TEST1 *** D:\ORACLE\ORA92\DATABASE\MISSING00014
15 0 TEST2 *** D:\ORACLE\ORA92\DATABASE\MISSING00015
16 0 TEST3 *** D:\ORACLE\ORA92\DATABASE\MISSING00016
17 0 TEST4 *** D:\ORACLE\ORA92\DATABASE\MISSING00017
由于redo文件损坏,致使数据库无法正常启动,DBA用重建control文件的方法,使数据库重启,但是没有把14-17datafile文件的名子写在control
文件中,这样,启动数据库后出现上面的结果,在用rman备份数据库文件时,出现错误:
RMAN> backup database;
启动 backup 于 2005-03-03 09:34:57
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of backup command at 03/03/2005 09:34:57
RMAN-06004: ORACLE error from recovery catalog database: RMAN-20003: target database incarnation not found in recovery catalog
~~~~~~~~~
~~ 恢复数据文件14-17
~~~~~~~~~
1、重命名数据文件
SQL> ALTER DATABASE OPEN RESETLOGS;
SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00014' to 'd:\\oradata\test1.dbf';
数据库已更改。
SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00015' to 'd:\\oradata\test2.dbf';
数据库已更改。
SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00016' to 'd:\\oradata\test3.dbf';
数据库已更改。
SQL> alter database rename file 'D:\ORACLE\ORA92\DATABASE\MISSING00017' to 'd:\\oradata\test4.dbf';
数据库已更改。
2、用rman备份数据库
RMAN> reset database;
在恢复目录中注册的数据库的新实体化
正在启动全部恢复目录的 resync
完成全部 resync
MAN> backup database;
----------------------------------------------------------------------------------------------------------------------------
####################################################
# [8.6] 用rman从备份中恢复system表空间
####################################################
方法一:
1、做一次全库备份
2、恢复system表空间
STARTUP MOUNT
RMAN> run {
2> restore datafile 1;
3> recover datafile 1;
4> alter database open;
5> }
方法二:
1、做一次全库备份
2、恢复system表空间
RMAN> run {
2> restore tablespace system;
3> recover tablespace system;
4> alter database open;
5> }
####################################################
# [8.7] 用户表空间损坏
####################################################
一)用户表空间
错误:
在启动数据库时出现ORA-01157,ORA-01110或操作系统级错误例如ORA-07360,
在关闭数据库(使用shutdown normal或shutdown immediate) 时将导致错误ORA
-01116,ORA-01110以及操作系统级错误ORA-07368
解决:
以下有两种解决方案:
1.用户的表空间可以被轻易地重建
即最近导出的对象是可用的或表空间中的对象可以被轻易地重建等.在
这种情况下,最简单的方法是offline并删除该数据文件,删除表空间并
重建表空间以及所有的对象.
svrmgrl> startup mount
svrmgrl> alter database datafile filename offline drop;
svrmgrl> alter database open;
svrmgrl> drop tablespace tablespace_name including contents;
重建表空间及所有对象.
2.用户的表空间不能够被轻易地重建
在大多数情况下,重建表空间是不可能及太辛苦的工作.方法是倒备份及做介
质恢复.如果您的系统运行在NOARCHIVELOG模式下,则只有丢失的数据
在online redo log中方可被恢复。
步骤如下:
1)Restore the lost datafile from a backup
2)svrmgrl> startup mount
3)svrmgrl> select v1.group#,member,sequence#,first_change#
>from v$log v1,v$logfile v2 where v1.group#=v2.group#;
4)如果数据库运行在NOARCHIVELOG模式下则:
svrmgrl> select file#,change# from v$recover_file;
如果 CHANGE# 大于最小的FIRST_CHANGE#则数据文件可以被恢复。
如果 CHANGE# 小于最小的FIRST_CHANGE#则数据文件不可恢复。 恢复最近一
次的全备份或采用方案一.
5)svrmgrl> recover datafile filename;
6)确认恢复成功
7)svrmgrl> alter database open resetlogs;
3.只读表空间无需做介质恢复,只要将备份恢复即可.唯一的例外是:
表空间在最后一次备份后被改为read-write 模式
表空间在最后一次备份后被改为read-only 模式
在这种情况下,均需进行介质恢复
二)临时表空间
临时表空间并不包含真正的数据,恢复的方法是删除临时表空间并重建即可.
三)系统表空间
如果备份不可用,则只能采用重建数据库的方法