rowid+rdba+dba+db_files+maxdatafiles系统的介绍

整理自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的组成:

  1. SQL> select rowid from emp where rownum = 1; 
  2.      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来做到这一点:

  1. select dbms_rowid.rowid_object('AAAAeNAADAAAAWZAAA') data_object_id#,
  2.        dbms_rowid.rowid_relative_fno('AAAAeNAADAAAAWZAAA') rfile#,
  3.        dbms_rowid.rowid_block_number('AAAAeNAADAAAAWZAAA') block#,
  4.        dbms_rowid.rowid_row_number('AAAAeNAADAAAAWZAAA') row# from dual;
  5.  
  6.        DATA_OBJECT_ID#     RFILE#     BLOCK#       ROW#
  7.            ---------------                  ----------       ----------        ----------
  8.                   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

其中要解释两个列: OBJECT_ID DATA_OBJECT_ID :在对象建立当初,这两个id是一样的,前者代表的是这个对象的名字的id,是不会有变化的。即使你给这个表改一下名字,也不会有变化;后者, (也就是ROWID中的前六位代表的位置)是数据对象的位置(数据段)一个编号。如果把这个表换一个表空间,这个编号就会变化,接下来,测试:
先改变这个表的名字: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


SQL> select owner,segment_name,file_id,RELATIVE_FNO,block_id from dba_extents were owner='SCOTT' and segment_name='T2';

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

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创建实例的时候可以指定该值的大小。 官网对这个参数的说明如下:

 

MAXDATAFILES

       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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值