技术开发 频道

只有数据文件如何创建数据库

【IT168技术文档】
   
假如数据库崩溃,无法恢复,参数文件,控制文件,日志文件都不可用,只有数据文件(后缀为dbf)可用,能利用这些数据文件创建一个新的数据库吗?如果能,如何创建?

   在我现在正在运行的数据库中,可以查看在我现在地数据库中存在有用户test。 
 
SQL*Plus: Release 9.2.0.1.0 - Production on 星期日 3月 19 22:22:16 2006 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. SQL> conn test/test 已连接。 SQL> create table test as select '1' c from all_objects where rownum <5; 表已创建。 SQL> select * from test; C - 1 1 1 1


  可以看到用户test有三个表,其中test表中的数据如上所示。
 

SQL> select table_name from user_tables; TABLE_NAME ------------------------------ PLAN_TABLE T TEST SQL>

    这时候我们关闭数据库,备份数据库,目的是为了万一我们的试验不成功可以恢复数据库。当然,你可以逻辑备份,也可以物理备份,当然在我这里外只是将我的数据库问题转移一个目录,只是留下我的数据文件。当然我的数据文件也是备份的了。

SQL> conn /as sysdba 已连接。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL>



好了,这时候,我的数据文件在我的默认路径上。可以进行恢复了。
E:oracleoradataorcl 的目录 2006-03-19 22:33 <DIR> . 2006-03-19 22:33 <DIR> .. 2006-03-19 22:34 <DIR> backup 2006-03-19 22:31 26,222,592 INDX01.DBF 2006-03-19 22:31 262,152,192 SYSTEM01.DBF 2006-02-16 21:38 41,951,232 TEMP01.DBF 2006-03-19 22:31 10,493,952 TOOLS01.DBF 2006-03-19 22:31 209,723,392 UNDOTBS01.DBF 2006-03-19 22:31 26,222,592 USERS01.DBF 6 个文件 576,765,952 字节 3 个目录 8,712,298,496 可用字节

在这里外为了简单,我将我的口令文件,初始化参数文件都没有改变,我现在就直接使用外以前的这两个文件,当然也没有改变它的配置,尤其是一些目录的设置。

SQL> conn /as sysdba

已连接到空闲例程。

SQL> startup nomount――在这里没有指定参数文件,但是你可以指定参数文件
ORACLE 例程已经启动。 Total System Global Area 51452388 bytes Fixed Size 453092 bytes Variable Size 46137344 bytes Database Buffers 4194304 bytes Redo Buffers 667648 bytes SQL>

使用以下语句创建控制文件。

SQL> create controlfile reuse set database orcl 2 logfile group 1 ('E:oracleoradataorcllog1orcl.ora', 3 'E:oracleoradataorcllog2orcl.ora') size 4M, 4 group 2 ('E:oracleoradataorcllog3orcl.ora', 5 'E:oracleoradataorcllog4orcl.ora') size 4M resetlogs 6 datafile 7 'E:oracleoradataorclINDX01.DBF', 8 'E:oracleoradataorclSYSTEM01.DBF', 9 'E:oracleoradataorclTOOLS01.DBF', 10 'E:oracleoradataorclUNDOTBS01.DBF', 11 'E:oracleoradataorclUSERS01.DBF' 12 ;

控制文件已创建
  这里需要注意的是,在我现在试验的平台生是Oracle 9i,创建控制文件中的数据文件是不能包含临时文件的,如果使用数据文件中包含临时文件的时候,就会出现这样的错误,但是在Oracle7的时候是可以包含临时文件的,在Oracle9i的文档中使这样说的:

If it is necessary to use the CREATE CONTROLFILE statement, do not include in the DATAFILE clause any datafiles in temporary or read-only tablespaces. You can add these types of files to the database later.

就是说的使用这个语句的时候,数据文件的语句中是不能包含临时和只读表空间的文件,要想使用的话,需要在数据库启动以后添加。Oracle8不知道是如何规定的,我没有在Oracle8上作试验。 
 
SQL> create controlfile reuse set database orcl 2 logfile group 1 ('E:oracleoradataorcllog1orcl.ora', 3 'E:oracleoradataorcllog2orcl.ora') size 4M, 4 group 2 ('E:oracleoradataorcllog3orcl.ora', 5 'E:oracleoradataorcllog4orcl.ora') size 4M resetlogs 6 datafile 7 'E:oracleoradataorclINDX01.DBF', 8 'E:oracleoradataorclSYSTEM01.DBF', 9 'E:oracleoradataorclTEMP01.DBF', 10 'E:oracleoradataorclTOOLS01.DBF', 11 'E:oracleoradataorclUNDOTBS01.DBF', 12 'E:oracleoradataorclUSERS01.DBF' 13 ; create controlfile reuse set database orcl * ERROR 位于第 1 行: ORA-01503: CREATE CONTROLFILE ?? ORA-01160: ???? data file ORA-01110: ???? : 'E:oracleoradataorclTEMP01.DBF'

然后打开数据库
SQL> alter database open resetlogs;

数据库已更改。

这样你的路径上就会有你所需要的日志文件了。

E:oracleoradataorcl>dir
驱动器 E 中的卷是 Oracle
卷的序列号是 B87A-B93E
E:oracleoradataorcl 的目录
2006-03-19 23:09 <DIR> .
2006-03-19 23:09 <DIR> ..
2006-03-19 22:34 <DIR> backup
2006-03-19 22:57 3,170,304 CONTROL01.CTL
2006-03-19 22:57 3,170,304 CONTROL02.CTL
2006-03-19 22:57 3,170,304 CONTROL03.CTL
2006-03-19 23:09 26,222,592 INDX01.DBF
2006-03-19 23:09 4,194,816 LOG1ORCL.ORA
2006-03-19 23:09 4,194,816 LOG2ORCL.ORA
2006-03-19 23:09 4,194,816 LOG3ORCL.ORA
2006-03-19 23:09 4,194,816 LOG4ORCL.ORA
2006-03-19 23:09 262,152,192 SYSTEM01.DBF
2006-02-16 21:38 41,951,232 TEMP01.DBF
2006-03-19 23:09 10,493,952 TOOLS01.DBF
2006-03-19 23:09 209,723,392 UNDOTBS01.DBF
2006-03-19 23:09 26,222,592 USERS01.DBF
13 个文件 603,056,128 字节

3 个目录 8,685,973,504 可用字节
E:oracleoradataorcl>

好,这时候我们在看看你的数据是否存在。

SQL> conn test/test

已连接。

SQL> select table_name from user_tables;
TABLE_NAME
------------------------------
PLAN_TABLE
T
TEST
SQL> select * from test;
C
-
1
1
1
1

SQL>

成功,我们的数据都在,当然,你现在需要做的是,你的数据库需要建立临时表空间,在这里外就不创建了。当然,现在接下来的工作就是,你需要对整个数据库做备份,备份是最重要的,要是有备份,我们也不需要做这些东西了。

0
相关文章