Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423535
  • 博文数量: 148
  • 博客积分: 3191
  • 博客等级: 中校
  • 技术积分: 1232
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-11 15:25
文章分类

全部博文(148)

文章存档

2011年(148)

我的朋友

分类: Oracle

2011-08-17 15:07:47

归档模式

检查数据库归档状态

SQL> archive log list;

数据库日志模式            存档模式

自动存档             启用

存档终点            d:\oracle\arch

最早的概要日志序列     1

下一个存档日志序列   2

当前日志序列           2

SQL>

 

先关闭数据库,做一次冷备份

 

1,完全恢复
 

创建测试表

 

SQL> create table test(

  2  id number (10),

  3  name varchar2(30)

  4  )

  5  tablespace users;

 

表已创建。

 

SQL>

 

 

(1)重要的数据文件丢失(system)
 

启动数据库,模拟数据库操作。

 

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 进行的

 

 

指定日志: {=suggested | filename | AUTO | CANCEL}

auto

已应用的日志。

完成介质恢复。

 

=> 启动数据库到mount状态

 

SQL> alter database open;

 

数据库已更改。

 

=> 检查数据

 

SQL> select * from test;

 

        ID NAME

---------- ------------------------------

         1 winy

 

SQL>

 

(2)一般数据文件损坏
 

插入模拟数据

 

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 进行的

 

 

指定日志: {=suggested | filename | AUTO | CANCEL}

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>

 

(3)没有备份,只有归档日志文件
 

关闭数据库,把USER01.DBF文件删除,模拟文件丢失。

 

SQL> host del D:\oracle\oradata\winy\USERS01.DBF

 

(4)损坏控制文件

控制文件因为一般都有好几个镜像,就算坏了一个,拷贝一个好的替换掉坏的也就行了,所以出问题的机率较小。但这里还是讨论一下如果所有的控制文件坏了应该如何解决。

步骤:

=> 创建控制文件到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,就会报如上的错误了,可以忽略。

 


2,不完全恢复
 
 (1)用户的错误操作

    当用户执行了错误的操作,比如误删了某一个表或是清空了一些表的内容,这个时候就不可能做完全恢复了,因为这会导致错误的操作也被恢复。在这种情况下,只能做不完全恢复。当然,还有其它的方法,比如使用FLASHBACKTSPITR,但这要另外分别谈论了,在这里就不谈了。这里主要介绍如何执行不完全恢复。

查看目前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>

阅读(520) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~