整理自dave大哥的pdf手册;这些东西很乱,自己以前都认真的学习过,但是看见dave大哥整理的这么认真,我就转过来,自己再多看看。好了挨着来吧:
1.rowid
rowid是伪列(pseudocolumn),伪劣的意思是实际上这一列本身在数据字典中并不存在,在查询结果输出时它被构造出来的。
rowid并不会真正存在于表的data block中,但是他会存在于index当中,用来通过rowid来寻找表中的行数据。
1.1 利用rowid来得到相关信息
SQL> conn sys/admin as sysdba
已连接。
SQL> create table bl(id number);
表已创建。
SQL> insert into bl values(1);
已创建 1 行。
SQL> select owner,segment_name,file_id,RELATIVE_FNO,block_id from dba_extents where owner='SYS' and segment_name='BL';
OWNER SEGMENT_NA FILE_ID RELATIVE_FNO BLOCK_ID
----- ---------- ---------- ------------ ----------
SYS BL 1 1 62129
SQL> desc dbms_rowid.rowid_info PACKAGE SYS.DBMS_ROWID PROCEDURE ROWID_INFO
Argument Name Type In/Out
------------------------------ ----------------------- ------
ROWID_IN ROWID IN
ROWID_TYPE NUMBER OUT
OBJECT_NUMBER NUMBER OUT
RELATIVE_FNO NUMBER OUT
BLOCK_NUMBER NUMBER OUT
ROW_NUMBER NUMBER OUT
TS_TYPE_IN VARCHAR2 IN
SQL> set serveroutput on
SQL>DECLARE
v_rowid_type NUMBER;
v_OBJECT_NUMBER NUMBER;
v_RELATIVE_FNO NUMBER;
v_BLOCK_NUMBERE_FNO NUMBER;
v_ROW_NUMBER NUMBER;
BEGIN
DBMS_ROWID.rowid_info (
rowid_in => 'AAAJVnAANAAAACiAAA',
rowid_type => v_rowid_type,
object_number => v_OBJECT_NUMBER,
relative_fno => v_RELATIVE_FNO,
block_number => v_BLOCK_NUMBERE_FNO,
ROW_NUMBER => v_ROW_NUMBER);
DBMS_OUTPUT.put_line ('ROWID_TYPE: ' || TO_CHAR (v_rowid_type));
DBMS_OUTPUT.put_line ('OBJECT_NUMBER: ' || TO_CHAR (v_OBJECT_NUMBER));
DBMS_OUTPUT.put_line ('RELATIVE_FNO: ' || TO_CHAR (v_RELATIVE_FNO));
DBMS_OUTPUT.put_line ('BLOCK_NUMBER: ' || TO_CHAR (v_BLOCK_NUMBERE_FNO));
DBMS_OUTPUT.put_line ('ROW_NUMBER: ' || TO_CHAR (v_ROW_NUMBER));
END;
/
结果:
ROWID_TYPE: 1
OBJECT_NUMBER: 38247
RELATIVE_FNO: 13
BLOCK_NUMBER: 162
ROW_NUMBER: 0
2.2 . Rowid的结构
ROWID 格式:
扩展的ROWID 在磁盘上需要10 个字节的存储空间,并使用18 个字符来显示。
它包含下列组成元素:
1. 数据对象编号:每个数据对象(如表或索引)在创建时都分配有此编号,并且此编号在数据库中是唯一的
2. 相关文件编号:此编号对于表空间中的每个数据文件是唯一的
3. 块编号:表示包含此行的块在数据文件中的位置
4. 行编号:标识块头中行目录位置的位置
在内部,存储的10个字节(bytes),即80位(bit)又按如下规则进行划分:
(1)数据对象编号需要32 bit
(2)相关文件编号需要10 bit
(3)块编号需要22 bit
(4)行编号需要16 bit
在oracle 8以前,一个rowid占用6个字节大小的存储空间(10bit file#+22bit block#+16bit row#), rowid格式为:BBBBBBBB.RRRR.FFFF。
在oracle 8以后, rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#),文件号仍然用10位表示,只是不再需要置换,为了向后兼容,同时引入了相对文件号(rfile#),所以从Oracle7到Oracle8,Rowid仍然无需发生变化.
Rdba(Tablespace relative database block address)就是rowid中的rfile#+block#.
rowid这样改变之后,数据库中数据库文件个数的限制从整个数据库最多只能有的2^10-2=1022个数据文件(去掉全0和全1), 变为了每个表空间中可以最多有2^10-2个数据文件。
所以说,数据库能支持的数据文件最大数是受rowid的长度限制的。
需要注意的是: local index中存储的rowid是6个字节,而global index中存储的rowid是10个字节。
那么增加的32bit object# 这个前缀主要就是用来定位表空间的,同时这个object#其实对应的就是data_object_id,由于一个段对象只能属于一个表空间,同时data_object_id就是标识了一个段的物理存储id.因此object#+rfile#就可以唯一定位当前的rowid是在那个数据文件上了。
可以通过dbms_rowid这个包来转换我们的rowid成不同组成部分:
dbms_rowid.rowid_object(rowid)---> 32bit object#
dbms_rowid.rowid_relative_fno(rowid)---> 10bit rfile#
dbms_rowid.rowid_block_number(rowid)---> 22bit block#
dbms_rowid.rowid_row_number(rowid)---> 16bit row#
扩展的ROWID 使用以64 为基数的编码方案来显示,该方案将六个位置用于数据对象编号、三个位置用于相关文件编号、六个位置用于块编号、三个位置用于行编号。
用例子说明一下Rowid的组成:
- SQL> select rowid from emp where rownum = 1;
- AAAAeNAADAAAAWZAAA
分解一下,可以看到
Data Object number = AAAAeN
File = AAD
Block = AAAAWZ
ROW = AAA
另外,我们需要注意的是,ROWID是64进制的,分布关系如下
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
拿其中的Data Object number= AAAAeN为例子,
N是64进制中的13,位置为0
13 * (64 ^ 0) = 13
e是64进制中的30,位置为1
30 * (64 ^ 1) = 1920
A是64进制中的 0
所以
A * (64 ^ 2) = 0
A * (64 ^ 3) = 0
A * (64 ^ 4) = 0
A * (64 ^ 5) = 0
则有AAAAeN = 0 + 0 + 0 + 0 + 1920 + 13 = 1933,表示该行存在的对象,对应的对象号为1933。
而且,我们也可以利用oracle提供的包,dbms_rowid来做到这一点:
- select dbms_rowid.rowid_object('AAAAeNAADAAAAWZAAA') data_object_id#,
- dbms_rowid.rowid_relative_fno('AAAAeNAADAAAAWZAAA') rfile#,
- dbms_rowid.rowid_block_number('AAAAeNAADAAAAWZAAA') block#,
- dbms_rowid.rowid_row_number('AAAAeNAADAAAAWZAAA') row# from dual;
- DATA_OBJECT_ID# RFILE# BLOCK# ROW#
- --------------- ---------- ---------- ----------
- 1933 3 1433 0
关于更多dbms_rowid的用法,可以参考包的说明或者是oracle手册。
下面做一个测试:
SQL> selecT * from dba_objects where object_name='T2';
OWNER OBJECT_NAME SUCT_NAM OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS------------ -------------- -------------- ------------------- ---------------- ---------- --------------- ------------- ---------- ----------
SCOTT T2 58199 58199 TABLE 15-9月 -12 15-9月 -12 2012-09-15:10:16:54 VALID
T G S
-- -- --
N N N
先改变这个表的名字:SQL> alter table t2 rename to t21;
表已更改。
SQL> select *from dba_objects where object_name='T21';
OWNER OBJECT_NAME SUCT_NAM OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE CREATED LAST_DDL_TIME TIMESTAMP STATUS
------------ -------------- -------------- ------------------- ---------------- ---------- --------------- ------------- ---------- ----------
SCOTT T2 58199 58199 TABLE 15-9月 -12 28-9月 -12 2012-09-28:20:56:39 VALID
T G S
-- -- --
N N N
没有任何变化。对象创建了之后,虽然名字改变,但是还是那个对象,位置也在原来的地方,所以两个都不会变化。
继续测试,把这个表放到其他表空间。
SQL> alter table t21 move tablespace example;
表已更改。
SQL> select OWNER ,OBJECT_NAMe , OBJECT_ID, DATA_OBJECT_ID , created, LAST_DDL_TIME , TIMESTAMP from dba_objects where object_name='T21';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID CREATED LAST_DDL_TIME TIMESTAMP
---------- ----------------------- -------------- -------------- -------------- ------------------- ---------------
SCOTT T21 58199 59554 15-9月 -12 28-9月 -12 2012-09-28:20:56:39
现在第二个编号变化了,换了存储的表空间了。。。
下面涉及到了一个老的话题:TRUNCATE (截断),到底进行了什么操作。。。正好在这里,我们通过观察data_object_id 来看看。
SQL> truncate table t21;
表被截断。
SQL> select OWNER ,OBJECT_NAMe , OBJECT_ID, DATA_OBJECT_ID , created, LAST_DDL_TIME , TIMESTAMP from dba_objects where object_name='T21';
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID CREATED LAST_DDL_TIME TIMESTAMP
----------- -------------------- ---------------- --------------- --------------- --------------------------------- --------------
SCOTT T21 58199 59555 15-9月 -12 28-9月 -12 2012-09-28:20:56:39
哇咔咔。。。这个data_object_id 值竟然发生了变化,这就要知道truncate命令到底做了什么了。。那到底它做了什么呢?
具体看我的下一篇博客:http://blog.csdn.net/changyanmanman/article/details/7881863
OWNER SEGMENT_NAME FILE_ID RELATIVE_FNO BLOCK_ID
----------- ------------ ---------- ------------ -----------
SCOTT T2 4 4 561
2、rdba和 dba
一. DB(Data block)
From: http://www.orafaq.com/wiki/Data_block
Information about data blocks can be retrieved from the data dictionary views USER_SEGMENTS and USER_EXTENTS. These views show how many blocks are allocated for database object and how many blocks are available(free) in a segment/extent.
1.1 Dumping data blocks
Start by getting the file and block number to dump. Example:
SQL> SELECT
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,
empno, ename
FROM emp WHERE empno = 7369;
REL_FNO BLOCKNO ROWNO EMPNO ENAME
---------- ---------- ---------- ---------- ----------
4 20 0 7369 SMITH
Dump the block:
SQL> alter system dump datafile 4 block 20;
System altered.
Look for the newly created dump file in your UDUMP directory.
-- dump 多个blocks
Use the following syntax to dump multiple blocks:
ALTER SYSTEM dump datafile <file_id> block min <block_id> block max <block_id+blocks-1>;
1.2 Analyzing data block dumps
From the above block dump:
block_row_dump:
tab 0, row 0, @0x1d49
tl: 38 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4a 46
col 1: [ 5] 53 4d 49 54 48
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 50 03
col 4: [ 7] 77 b4 0c 11 01 01 01
col 5: [ 2] c2 09
col 6: *NULL*
col 7: [ 2] c1 15
Converting back to table values:
Col 0 (EMPNO)
SQL> SELECT utl_raw.cast_to_number(replace('c2 4a 46',' ')) value FROM dual;
VALUE
----------
7369
Col 2 (ENAME) - simply convert the hex values to ascii - 53 4d 49 54 48 -> SMITH. Alternatively:
SQL> SELECT utl_raw.cast_to_varchar2(replace('53 4d 49 54 48',' ')) value FROM dual;
VALUE
---------
SMITH
二. DBA(Data Block Address)
From:http://www.orafaq.com/wiki/Data_block_address
A Data Block Address (DBA) is the address of an Oracle data block for access purposes.
DBA一般指绝对数据块地址. rowid用来表示一行的物理地址,一行唯一确定一个rowid,并且在使用中一般不会改变,除非rowid之后在行的物理位置发生改变的情况下才会发生变化。在rowid 中,就有一段是来表示DBA的。
2.1 Find the DBA for a given row
Start by getting the file and block number of the row. Example:
SQL> SELECT
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
empno, ename
FROM emp WHERE empno = 7369;
REL_FNO BLOCKNO EMPNO ENAME
---------- ---------- ---------- ----------
4 20 7369 SMITH
2.2 convert the file and block numbers to a DBA address:
SQL> variable dba varchar2(30)
SQL> exec :dba := dbms_utility.make_data_block_address(4, 20);
PL/SQL procedure successfully completed.
SQL> print dba
DBA
--------------------------------
16777236
2.3 Convert a DBA back to file and block numbers
Example:
SQL> SELECT dbms_utility.data_block_address_block(16777236) "BLOCK",
2 dbms_utility.data_block_address_file(16777236) "FILE"
3 FROM dual;
BLOCK FILE
---------- ----------
20 4
三. RDBA(Tablespace relative database block address)
RDBA是相对数据块地址,是数据字典(表空间及一些对象定义)所在块的地址。
oracle 8以后,rowid的存储空间扩大到了10个字节(32bit object#+10bit rfile#+22bit block#+16bit row#)。rdba就是rowid中的rfile#+block#。
SYS@anqing1(rac1)> SELECT
rowid,
dbms_rowid.rowid_relative_fno(rowid) REL_FNO,
dbms_rowid.rowid_block_number(rowid) BLOCKNO,
dbms_rowid.rowid_row_number(rowid) ROWNO,
empno, ename
FROM scott.emp WHERE empno = 7521;
ROWID REL_FNO BLOCKNO ROWNO EMPNO ENAME
------------------ ---------- ---------- ---------- ---------- ----------
AAAMfMAAEAAAAAgAAA 4 32 0 7369 SMITH
rowid = AAAMfMAAEAAAAAgAAA
BlockNo= 4
rowno =0
把这个block dump到trace:
SYS@anqing1(rac1)> alter system dump datafile 4 block 32;
System altered.
查看当前的trace 文件位置:
SYS@anqing1(rac1)> oradebug setmypid;
Statement processed.
SYS@anqing1(rac1)> oradebug tracefile_name
/u01/app/oracle/admin/anqing/udump/anqing1_ora_19997.trc
查看trace file:
[oracle@rac1 ~]$ cat /u01/app/oracle/admin/anqing/udump/anqing1_ora_19997.trc
*** 2011-06-07 11:02:30.023
Start dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
buffer tsn: 4 rdba: 0x01000020 (4/32) -- rdba 的值
scn: 0x0000.0006bfdb seq: 0x10 flg: 0x06 tail: 0xbfdb0610
frmt: 0x02 chkval: 0x26a0 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0ED09400 to 0x0ED0B400
ED09400 0000A206 01000020 0006BFDB 06100000 [.... ...........]
ED09410 000026A0 00180001 0000C7CC 0006BFD9 [.&..............]
.....
ED094A0 00000000 00000000 00000000 00000000 [................]
Repeat 465 times
ED0B1C0 00000000 08012C00 2350C203 4C494D06 [.....,....P#.MIL]
ED0B1D0 0552454C 52454C43 4EC2034B B6770753 [LER.CLERK..NS.w.]
....
ED0B3E0 05485449 52454C43 50C2034B B4770703 [ITH.CLERK..P..w.]
ED0B3F0 0101110C 09C20201 15C102FF BFDB0610 [................]
Block header dump: 0x01000020
Object id on Block? Y
seg/obj: 0xc7cc csc: 0x00.6bfd9 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.000000f2 0x00805794.00c8.49 --U- 14 fsc 0x0000.0006bfdb
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xed09464
===============
tsiz: 0x1f98
hsiz: 0x2e
pbl: 0x0ed09464
bdba: 0x01000020
76543210
flag=--------
ntab=1
nrow=14
frre=-1
fsbo=0x2e
fseo=0x1d61
avsp=0x1d33
tosp=0x1d33
0xe:pti[0] nrow=14 offs=0 -- 该块中保存了14条记录。从row 0到row 13
0x12:pri[0] offs=0x1f72
0x14:pri[1] offs=0x1f47
0x16:pri[2] offs=0x1f1c
0x18:pri[3] offs=0x1ef3
0x1a:pri[4] offs=0x1ec6
0x1c:pri[5] offs=0x1e9d
0x1e:pri[6] offs=0x1e74
0x20:pri[7] offs=0x1e4c
0x22:pri[8] offs=0x1e26
0x24:pri[9] offs=0x1dfb
0x26:pri[10] offs=0x1dd5
0x28:pri[11] offs=0x1daf
0x2a:pri[12] offs=0x1d88
0x2c:pri[13] offs=0x1d61
block_row_dump:
tab 0, row 0, @0x1f72
tl: 38 fb: --H-FL-- lb: 0x1 cc: 8
col 0: [ 3] c2 4a 46
col 1: [ 5] 53 4d 49 54 48
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 50 03
col 4: [ 7] 77 b4 0c 11 01 01 01
col 5: [ 2] c2 09
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 1, @0x1f47
tl: 43 fb: --H-FL-- lb: 0x1 cc: 8
col 0: [ 3] c2 4b 64
col 1: [ 5] 41 4c 4c 45 4e
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 02 14 01 01 01
col 5: [ 2] c2 11
col 6: [ 2] c2 04
col 7: [ 2] c1 1f
tab 0, row 2, @0x1f1c
tl: 43 fb: --H-FL-- lb: 0x1 cc: 8
col 0: [ 3] c2 4c 16
col 1: [ 4] 57 41 52 44
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 02 16 01 01 01
col 5: [ 3] c2 0d 33
col 6: [ 2] c2 06
col 7: [ 2] c1 1f
tab 0, row 3, @0x1ef3
...
tab 0, row 13, @0x1d61
tl: 39 fb: --H-FL-- lb: 0x1 cc: 8
col 0: [ 3] c2 50 23
col 1: [ 6] 4d 49 4c 4c 45 52
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 4e 53
col 4: [ 7] 77 b6 01 17 01 01 01
col 5: [ 2] c2 0e
col 6: *NULL*
col 7: [ 2] c1 0b
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
[oracle@rac1 ~]$
/* Formatted on 2011/6/7 11:27:10 (QP5 v5.163.1008.3004) */
SELECT DBMS_UTILITY.data_block_address_file (
TO_NUMBER (LTRIM ('0x01000020', '0x'), 'xxxxxxxx'))
AS file_no,
DBMS_UTILITY.data_block_address_block (
TO_NUMBER (LTRIM ('0x01000020', '0x'), 'xxxxxxxx'))
AS block_no
FROM DUAL;
FILE_NO BLOCK_NO
---------- ----------
4 32
这个和我们之前在rowid里查看的一致。
刚才说了,在32这个块里保存了14条row记录,我们继续查询一下我们where=7521 那条:
tab 0, row 13, @0x1d61
SYS@anqing1(rac1)> select DBMS_UTILITY.data_block_address_block (TO_NUMBER (LTRIM ('0x1d61', '0x'),'xxxxxxxx')) as block_no from dual;
BLOCK_NO
----------
7521
我们查询的那条row记录在最后一条。
一. DB_FILES
一. DB_FILES
Property | Description |
Parameter type | Integer |
Default value | 200 |
Modifiable | No |
Range of values | Minimum: the largest among the absolute file numbers of the datafiles in the database Maximum: operating system-dependent |
Basic | No |
Real Application Clusters | Multiple instances must have the same value. |
DB_FILES specifies the maximum number of database files that can be opened for this database. The maximum valid value is the maximum number of files, subject to operating system constraint, that will ever be specified for the database, including files to be added by ADD DATAFILE statements.
If you increase the value of DB_FILES, then you must shut down and restart all instances accessing the database before the new value can take effect. If you have a primary and standby database, then they should have the same value for this parameter.
二. Maxdatafiles 参数
这个参数是保存在控制文件里的,在DBCA创建实例的时候可以指定该值的大小。 官网对这个参数的说明如下:
The MAXDATAFILES option of CREATE DATABASE determines the number of data files a database can have. With Oracle Real Application Clusters, databases tend to have more data files and log files than an exclusive mounted database.
一般db_files <= maxdatafiles值。 当select count(*) from dba_data_files; 的值达到db_files时,就需要修改db_files,把这个值调大。
对这个参数的默认值,从我dump 出的trace 文件看,是30. 这个值明显过小。 稍大一点的系统也不止30个datafile。 不过dbca来看,该值是100.
SQL>alter database backup controlfile to trace
CREATE CONTROLFILE REUSE DATABASE "DAVE" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 1
MAXLOGHISTORY 292
在DBCA创建Instance的时候,我们可以指定该参数。 如下图:
如果说是已经建好了,就只能重建控制文件来修改该参数值。先将控制文件dump 出来,然后修改改制,在重建控制文件。 在重建之前,记得备份控制文件和DB。 具体操作步骤参考:
Oracle 控制文件
http://blog.csdn.net/tianlesoftware/archive/2009/12/09/4974440.aspx
三. 网上的资料
google到一篇资料,是对这2个参数的说明。 链接如下:
Oracle db_files and maxdatafiles parameters
http://www.dba-oracle.com/t_db_files_maxdatafiles.htm
说明,需要翻墙,不然打不开。
The db_files parameter is a "soft limit " parameter that controls the maximum number of physical OS files that can map to an Oracle instance. Historically (before Oracle8i) you need to be careful not to set db_files too high, else you would have DBWR (database writer) issues.
The maxdatafiles parameter is a different "hard limit" parameter. When you issue a "create database" command, the value you specify for maxdatafiles is stored in your Oracle control files. The default value of 32 is usually sufficient, but after Oracle8i there is no downside to using a larger value.
In practice, many Oracle DBA with large databases will segregate important tables and indexes into isolated tablespaces and datafiles to give them more control and detailed statistrics.
Fixing a maxdatafiles limit problem
In practice, the ORA-1118 occurs when your database has hit the MAXDATAFILES limit, usually during database maintenance. Here are instructions from "Rhubarb" Stewart McGlaughlin, one of the best Oracle DBA's in North Carolina:
1. Shutdown database; Backup database 2. Start up database 3. From sqlplus as sysdba, type: alter database backup controlfile to trace; 4. Type: shutdown immediate: 5. Go to the operating system and go to the USER_DUMP_DEST directory 6. Find the newest trace file 7. Edit the trace file and change MAXDATAFILES to the new value. You will also need to delete all of the lines prior to the line that begins: STARTUP NOMOUNT. See sample text below (the example is for a database using ARCHIVELOG):
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORACLE" RESETLOGS ARCHIVELOG
MAXLOGFILES 32 MAXLOGMEMBERS 2 MAXDATAFILES 32 MAXINSTANCES 16 MAXLOGHISTORY 1600 LOGFILE GROUP 1 'D:/ORAWIN95/DATABASE/LOG2ORCL.ORA' SIZE 200K, GROUP 2 'D:/ORAWIN95/DATABASE/LOG1ORCL.ORA' SIZE 200K DATAFILE 'D:/ORAWIN95/DATABASE/SYS1ORCL.ORA', 'D:/ORAWIN95/DATABASE/USR1ORCL.ORA', 'D:/ORAWIN95/DATABASE/RBS1ORCL.ORA', 'D:/ORAWIN95/DATABASE/TMP1ORCL.ORA' ;
# Database can now be opened normally. ALTER DATABASE OPEN RESETLOGS;
8. From sqlplus as sysdba, run the edited trace file from step 7. 9. Shutdown database and backup database