分类: Oracle
2011-08-17 15:07:47
检查数据库归档状态
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\oracle\arch
最早的概要日志序列 1
下一个存档日志序列 2
当前日志序列 2
SQL>
先关闭数据库,做一次冷备份
创建测试表
SQL> create table test(
2 id number (10),
3 name varchar2(30)
4 )
5 tablespace users;
表已创建。
SQL>
启动数据库,模拟数据库操作。
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
数据库装载完毕。
数据库已经打开。
SQL> insert into test values(1,'winy');
已创建 1 行。
SQL> commit;
提交完成。
SQL>
模拟系统表空间损坏
SQL> host ren d:\oracle\oradata\winy\system01.dbf system01.bak
启动数据库
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-01157: 无法标识/锁定数据文件 1 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 1: 'D:\ORACLE\ORADATA\WINY\SYSTEM01.DBF'
SQL>
恢复步骤:
=> 把备份的system01.dbf文件拷贝到D:\ORACLE\ORADATA\WINY\目录下。
=> 做介质恢复
SQL> recover database;
ORA-00279: 更改 592466 (在 01/31/2005 10:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\ARCH\ARC00002.001
ORA-00280: 更改 592466 对于线程 1 是按序列 # 2 进行的
指定日志: {
auto
已应用的日志。
完成介质恢复。
=> 启动数据库到mount状态
SQL> alter database open;
数据库已更改。
=> 检查数据
SQL> select * from test;
ID NAME
---------- ------------------------------
1 winy
SQL>
插入模拟数据
SQL> insert into test values(2,'david');
已创建 1 行。
SQL> select * from test;
ID NAME
---------- ------------------------------
1 winy
2 david
SQL> commit;
提交完成。
SQL>
关闭数据库,用UltraEdit修改数据文件user01.dbf,模拟数据丢失
启动数据库
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
数据库装载完毕。
数据库已经打开。
SQL>
恢复步骤:
=> 将受损的文件所在的表空间offline
SQL> alter tablespace users offline;
表空间已更改。
SQL>
=> 把备份的文件用操作系统命令restore回来
=> recover表空间
SQL> recover tablespace users;
ORA-00279: 更改 592466 (在 01/31/2005 10:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\ARCH\ARC00002.001
ORA-00280: 更改 592466 对于线程 1 是按序列 # 2 进行的
指定日志: {
auto
已应用的日志。
完成介质恢复。
=>把USERS表空间online
SQL> select tablespace_name,status from dba_tablespaces;
TABLESPACE_NAME STATUS
------------------------------ ---------
SYSTEM ONLINE
UNDOTBS1 ONLINE
TEMP ONLINE
USERS OFFLINE
SQL> alter tablespace users online;
表空间已更改。
SQL>
关闭数据库,把USER01.DBF文件删除,模拟文件丢失。
SQL> host del D:\oracle\oradata\winy\USERS01.DBF
控制文件因为一般都有好几个镜像,就算坏了一个,拷贝一个好的替换掉坏的也就行了,所以出问题的机率较小。但这里还是讨论一下如果所有的控制文件坏了应该如何解决。
步骤:
=> 创建控制文件到trace文件
SQL> alter database backup controlfile to trace;
数据库已更改。
SQL>
=> 关闭数据库,删除所有的控制文件,启动数据库报错
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-00205: ?????????????????????
=> 在UDUMP目录下找到最新的TRACE,截取其中的一段另外生成文件cre_ctl.sql,如下所示:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "WINY" NORESETLOGS ARCHIVELOG
MAXLOGFILES 10
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 1
MAXLOGHISTORY 226
LOGFILE
GROUP 1 'D:\ORACLE\ORADATA\WINY\REDO01.LOG' SIZE 10M,
GROUP 2 'D:\ORACLE\ORADATA\WINY\REDO02.LOG' SIZE 10M,
GROUP 3 'D:\ORACLE\ORADATA\WINY\REDO03.LOG' SIZE 10M
DATAFILE
'D:\ORACLE\ORADATA\WINY\SYSTEM01.DBF',
'D:\ORACLE\ORADATA\WINY\UNDOTBS01.DBF',
'D:\ORACLE\ORADATA\WINY\USERS01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\ORADATA\WINY\TEMP01.DBF'
SIZE 41943040 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
=> 关闭数据库,执行cre_ctl.sql
SQL> @c:\cre_ctl.sql
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
控制文件已创建
ORA-00283: ??????????
ORA-00264: ?????
ALTER SYSTEM ARCHIVE LOG ALL
*
ERROR 位于第 1 行:
ORA-00271: ?????????
数据库已更改。
表空间已更改。
SQL>
如果不需要RECOVER,就会报如上的错误了,可以忽略。
当用户执行了错误的操作,比如误删了某一个表或是清空了一些表的内容,这个时候就不可能做完全恢复了,因为这会导致错误的操作也被恢复。在这种情况下,只能做不完全恢复。当然,还有其它的方法,比如使用FLASHBACK或TSPITR,但这要另外分别谈论了,在这里就不谈了。这里主要介绍如何执行不完全恢复。
查看目前TEST表的情况
SQL> select *from test;
ID NAME
---------- ------------------------------
2 winy
SQL>
确定时间
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2005-02-01 15:50:29
SQL>
删除表,并进行日志切换
SQL> drop table test;
表已丢弃。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL>
启动数据库到MOUNT状态
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 101784276 bytes
Fixed Size 453332 bytes
Variable Size 75497472 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
SQL>
把所有的数据文件都拷贝回去
RECOVER数据库
SQL> recover database until time '2005-02-01 15:50:00';
ORA-00279: 更改 592747 (在 02/01/2005 09:31:12 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\ARCH\ARC00001.001
ORA-00280: 更改 592747 对于线程 1 是按序列 # 1 进行的
。。。
ORA-00279: 更改 598927 (在 02/01/2005 15:26:22 生成) 对于线程 1 是必需的
ORA-00289: 建议: D:\ORACLE\ARCH\ARC00007.001
ORA-00280: 更改 598927 对于线程 1 是按序列 # 7 进行的
ORA-00278: 此恢复不再需要日志文件 'D:\ORACLE\ARCH\ARC00006.001'
已应用的日志。
完成介质恢复。
重置日志
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from test;
ID NAME
---------- ------------------------------
2 a
SQL>