November 2009 Archives

关于Fast Block Cleanout

| No Comments

有多少朋友真正知道Fast Block Cleanout的含义?

 

我们来看一个Fast Block Cleanout的例子:

SQL> create table t1 as select * from dba_users;

 

Table created

 

SQL> alter system checkpoint;

 

System altered

 

SQL> select dump('_NEXT_OBJECT',16) from dual;

 

DUMP('_NEXT_OBJECT',16)

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

Typ=96 Len=12: 5f,4e,45,58,54,5f,4f,42,4a,45,43,54

 

BBED> set file 1

        FILE#           1

 

BBED> set block 122

        BLOCK#          122

 

BBED> dump

 File: /dras11/oradata/astca/system01.dbf (1)

 Block: 122              Offsets:    0 to  511           Dba:0x0040007a

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

 06020000 0040007a aa05a584 00080106 b4720000 01000000 00000012 aa05a583

 00080000 00010200 00000000 0005001e 0001b684 0080004f 475c4500 20010000

 aa05a584 0001006c ffff00ea 0110035c 035c0000 006c1f7c 1f3c1efb 1ebe1e7e

 01101dec 1da41d64 1d221ce1 1ca41c5c 1c1b1bda 1b9f1b5f 1b1f1adf 1aa21a54

 1a1719db 199a1959 191218d1 1890184f 180e17cd 178d174c 170c16cf 168f1653

 161415d8 15981559 151d14d5 1499145a 141913d9 139d1361 131e12dd 129d1260

 122411e3 11a21163 112010dd 10a11065 10280fe5 0fa40f5f 0f1a0ede 0e9c0e56

 0e150dd6 0d960d55 0d150cd5 0c990c5b 0c1a0bd4 0b840b34 0af40ab1 0a750a39

 09f409af 096a0925 08e508a5 08650825 07e507a4 07610722 06e606a9 061f05df

 05a10559 051604cd 048b0449 04030000 00000000 00000000 00000000 00000000

 00000000 00000000 00000000 00000000 00000000 2c011102 c10204c3 093e3b01

 800c5f4e 4558545f 4f424a45 435402c1 02ff0180 07786a06 13042b28 07786d06

 03130a3c 07786a06 13042b28 0180ffff 0180ff01 8004c307 38242c00 1102c102

 03c26463 01800c5f 4e455854 5f4f424a 45435402 c102ff01 8007786a 0613042b

 2807786a 06130432 1207786a 0613042b 280180ff ff0180ff 018004c3 0738242c

 001102c1 0202c207 01800c5f 4e455854 5f4f424a 45435402 c102ff01 8007786a

 

 <32 bytes per line>

 

BBED> set offset 340

        OFFSET          340

 

BBED> dump

 File: /dras11/oradata/astca/system01.dbf (1)

 Block: 122              Offsets:  340 to  851           Dba:0x0040007a

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

 2c011102 c10204c3 093e3b01 800c5f4e 4558545f 4f424a45 435402c1 02ff0180

 07786a06 13042b28 07786d06 03130a3c 07786a06 13042b28 0180ffff 0180ff01

 8004c307 38242c00 1102c102 03c26463 01800c5f 4e455854 5f4f424a 45435402

 c102ff01 8007786a 0613042b 2807786a 06130432 1207786a 0613042b 280180ff

 ff0180ff 018004c3 0738242c 001102c1 0202c207 01800c5f 4e455854 5f4f424a

 45435402 c102ff01 8007786a 0613042b 2807786a 0613042b 3507786a 0613042b

 280180ff ff0180ff 018004c3 0738242c 001102c1 0203c206 6401800c 5f4e4558

 545f4f42 4a454354 02c102ff 01800778 6a061304 2b280778 6a061304 2b350778

 6a061304 2b280180 ffff0180 ff018004 c3073824 2c001102 c10202c2 0601800c

 5f4e4558 545f4f42 4a454354 02c102ff 01800778 6a061304 2b280778 6a061304

 2b340778 6a061304 2b280180 ffff0180 ff018004 c3073824 2c001102 c10203c2

 05640180 0c5f4e45 58545f4f 424a4543 5402c102 ff018007 786a0613 042b2807

 786a0613 042b3407 786a0613 042b2801 80ffff01 80ff0180 04c30738 242c0011

 02c10202 c2050180 0c5f4e45 58545f4f 424a4543 5402c102 ff018007 786a0613

 042b2807 786a0613 042b2d07 786a0613 042b2801 80ffff01 80ff0180 04c30738

 242c0011 02c10203 c2046401 800c5f4e 4558545f 4f424a45 435402c1 02ff0180

 

 <32 bytes per line>

 

这里我们可以看出在obj$_NEXT_OBJECT所在的block上已经发生了一次Fast Block Cleanout

 

因为上述block中:

块头的SCNaa05a584 0008,其所在的SEQ01

CSCaa05a583 0008

SCN/FSC0000 aa05a584,即FSCFree space credit)为0000

Lck Flag20

这完全符合oracleFast Block Cleanout的特征!

 

Oracle在做Fast Block Cleanout之前会检查这个blockCSCwrap是否等于当前transactioncommit SCNwrap,只有在相等的情况下才会继续做下去。我们从上面可以看到现在的CSCwrap0008commit SCNwrap也是0008,即这个条件被满足。

 

Oracle在做Fast Block Cleanout的时候会做这样一些事情:

1) 会把ITL中的LCK Flag设为20

2) 会把当前transactioncommit scn写到这个block的块头的SCN,同时把seq写为1,当然,写的时候会判断一下,如果当前transactioncommit scn已经和块头的SCN相等了,就只递增seq

3) 会把当前transactioncommit scnbase写到ITL中,紧邻FSC

4) 这个block会被oraclebuffer cache中标记为dirty

 

oracle做完Fast Block Cleanout后,对应记录行头的lock flag并不会被清掉,并且ITL中的FSC不会被修改(所以oracle只会把commit scnbase写到ITL中)----我们从结果中可以看到_NEXT_OBJECT所在记录的行头的lock flag还是01,这时候ITL中的FSC还是0000,且commit scnbase(即aa05a584)已经被写到上述ITL中。

 

朋友们,当你见到ITL中的Lck Flag20的时候,就代表着oracle已经对这个block成功做过Fast Block Cleanout了,这个ITL所对应的transaction已经commit了!

关于AIX上proc的两个问题的解答

| No Comments

110gR2server端安装是否已经默认安装了proc

答:是的,也就意味着不用再通过client端安装包再装一遍Precompilers了。

 

2、为什么找不到demo_proc.mk

答:默认安装不会有demo_proc.mk10gdemo_proc.mkCompanion CD里,11gdemo_proc.mkExample CD里。demo_proc.mk随便拷一个拿来就能用了,比如我的demo_proc.mk就是找熊哥要的。

 

我们来看一个最简单的proc的例子:

$ pwd

/u01/app/oracle/product/10.2.0/precomp/demo/proc

$ ls

demo_proc.mk    demo_proc64.mk  sample1.pc

sample1.pc的目的是把ipratest中表emp中指定记录给print出来

 

SQL> conn scott/tiger@ipratest;

Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0

Connected as scott

 

SQL> select empno,ename,sal,comm from emp where ename in ('SMITH','CUIHUA');

 

EMPNO ENAME            SAL      COMM

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

 7369 SMITH        1000.00

 7499 CUIHUA       1600.00    300.00

 

现在我们把sample1.pc编译成可执行文件并把上述两条记录给print出来:

$ export LD_LIBRARY_PATH=$ORACLE_HOME/lib

$ export OBJECT_MODE=64

$ make -f demo_proc.mk sample1 PROCFLAGS="userid=scott/tiger@ipratest"

        /bin/make -f /u01/app/oracle/product/10.2.0/precomp/demo/proc/demo_proc.mk PROCFLAGS="userid=scott/tiger@ipratest" PCCSRC=sample1 I_SYM=include= pc1

        proc userid=scott/tiger@ipratest iname=sample1 include=. include=/u01/app/oracle/product/10.2.0/precomp/public include=/u01/app/oracle/product/10.2.0/rdbms/public include=/u01/app/oracle/product/10.2.0/rdbms/demo include=/u01/app/oracle/product/10.2.0/plsql/public include=/u01/app/oracle/product/10.2.0/network/public

 

Pro*C/C++: Release 10.2.0.4.0 - Production on Thu Nov 12 20:27:21 2009

 

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

 

System default option values taken from: /u01/app/oracle/product/10.2.0/precomp/admin/pcscfg.cfg

 

        /bin/make -f /u01/app/oracle/product/10.2.0/precomp/demo/proc/demo_proc.mk OBJS=sample1.o EXE=sample1 build

        /u01/app/oracle/product/10.2.0/bin/oraxlc   -O3  -q64 -DSS_64BIT_SERVER -qwarn64 -qinfo=uni -DAIXRIOS -I. -I/u01/app/oracle/product/10.2.0/precomp/public -I/u01/app/oracle/product/10.2.0/rdbms/public -I/u01/app/oracle/product/10.2.0/rdbms/demo -I/u01/app/oracle/product/10.2.0/plsql/public -I/u01/app/oracle/product/10.2.0/network/public     -c sample1.c

"sample1.c", line 157.2: 1506-218 (E) Unknown preprocessing directive #incluee.

"sample1.c", line 295.1: 1506-412 (I) Referenced variable "sqlstm", which was not initialized in its declaration.

"sample1.c", line 381.1: 1506-412 (I) Referenced variable "sqlstm", which was not initialized in its declaration.

"sample1.c", line 422.1: 1506-412 (I) Referenced variable "sqlstm", which was not initialized in its declaration.

"sample1.c", line 426.1: 1506-412 (I) Referenced variable "temp_char", which was not initialized in its declaration.

"sample1.c", line 456.1: 1506-412 (I) Referenced variable "sqlstm", which was not initialized in its declaration.

"sample1.c", line 460.1: 1506-412 (I) Referenced variable "msg_len", which was not initialized in its declaration.

"sample1.c", line 460.1: 1506-412 (I) Referenced variable "buf_len", which was not initialized in its declaration.

"sample1.c", line 460.1: 1506-412 (I) Referenced variable "err_msg", which was not initialized in its declaration.

        /u01/app/oracle/product/10.2.0/bin/oraxlc   -o sample1 sample1.o -L/u01/app/oracle/product/10.2.0/lib/ -lclntsh  -lld -lm `cat /u01/app/oracle/product/10.2.0/lib/sysliblist`  -lm  -lc_r -lpthreads

$ ls

demo_proc.mk    demo_proc64.mk  sample1         sample1.c       sample1.lis     sample1.o       sample1.pc

 

$ ./sample1

 

Connected to ORACLE as user: SCOTT

 

Enter employee number (0 to quit): 7369

 

 

Employee        Salary          Commission

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

SMITH           1000.00           0.00

 

Enter employee number (0 to quit): 7499

 

 

Employee        Salary          Commission

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

CUIHUA          1600.00         300.00

 

Enter employee number (0 to quit): 0

 

 

Total rows returned was 2.

 

G'day.

 

最后我们来看一下pcscfg.cfg的内容:

$ cat /u01/app/oracle/product/10.2.0/precomp/admin/pcscfg.cfg

sys_include=(/usr/include)

ltype=short

code=ansi_c

cpp_suffix=cc

parse=none

SQLCHECK=SEMANTICS

 

如何在oracle里以binary的ftp方式传送文件

| 1 Comment

上周五写了一段java存储过程,用于在oracle里实现zip压缩。

今天同事又来找我了,说调我写的zip压缩生成的zip文件在客户端无法解压缩。

 

这是因为默认的ftp方式是ascii

 

恩,那我们就来写一个以binaryftp方式传文件的存储过程。

P_SYS_PUT_BIN_FILE_BY_FTP 用于将在database server端的某个文件通过ftpbinary的方式传到指定的ftp server

其代码如下:

create or replace procedure P_SYS_PUT_BIN_FILE_BY_FTP

(i_vc_filepath in varchar2,

 i_vc_filename in varchar2,

 i_vc_ftpserver_ip_address in varchar2,

 i_vc_ftpserver_username in varchar2,

 i_vc_ftpserver_password in varchar2,

 o_vc_return_flag out varchar2) is

/*

功能: 将在database server端的某个文件通过ftpbinary的方式传到指定的ftp server

作者: cuihua

创建日期:2009-11-09

 

输入参数:

i_vc_filepath:待传的文件所在的路径,注意这里的路径只能是已经建好的directory的名字

i_vc_filename: 待传的文件名

i_vc_ftpserver_ip_address: 待传送文件的ftp server端的ip地址

i_vc_ftpserver_username: 连接该ftp server端的用户名

i_vc_ftpserver_password:连接该ftp server端用户的密码

 

输出参数:

o_vc_return_flag:用于判断该存储过程是否成功执行,并在出错后存储相应的错误原因。

                 如果它的值的第一位为S,则表明该存储过程成功执行,没有错误。

                如果它的值的第一位为E,则表明该存储过程执行失败,具体错误原因为它的值的第二位到最后一位。

输入输出参数:

 

调用到的存储过程:

xutl_ftp.put

*/

 

styp_handle xutl_ftp.session_handle; --连接ftp serversessionhandle

 

src_file BFILE;

dst_file BLOB;

lgh_file BINARY_INTEGER;

 

 

begin

 

   o_vc_return_flag := 'S' || '_' || i_vc_filename || '已经成功上传到指定的ftp server端!';

  

   dbms_lob.createtemporary(dst_file,false,dbms_lob.session);

   src_file := bfilename(i_vc_filepath, i_vc_filename);

   dbms_lob.fileopen(src_file, dbms_lob.file_readonly);

   lgh_file := dbms_lob.getlength(src_file);

   dbms_lob.loadfromfile(dst_file, src_file, lgh_file);

  

   styp_handle := xutl_ftp.start_session(i_vc_ftpserver_ip_address, i_vc_ftpserver_username, i_vc_ftpserver_password);

   xutl_ftp.put(styp_handle, dst_file, i_vc_filename);

  

   xutl_ftp.end_session(styp_handle);   

   dbms_lob.fileclose(src_file);

  

   if dbms_lob.istemporary(dst_file) = 1 then

           dbms_lob.freetemporary(dst_file);

   end if;

  

   commit;

 

exception

  when others then

    o_vc_return_flag := 'E' || '_' || sqlcode || '_' || sqlerrm;

    rollback;

    return; 

end P_SYS_PUT_BIN_FILE_BY_FTP;

 

我们来看一下上述存储过程如何用:

SQL> set serveroutput on size 1000000;

SQL> var vc_return_flag varchar2(2000);

SQL> exec p_sys_put_bin_file_by_ftp('INTERFACE_FILE_DIR','SAT.CA.20090918.00000050.IN.zip','172.22.9.134','cuihua','cuihua',

:vc_return_flag);

 

PL/SQL procedure successfully completed

vc_return_flag

---------

S_SAT.CA.20090918.00000050.IN.zip已经成功上传到指定的ftp server端!

 

如何在oracle里实现zip压缩

| No Comments

有同事问我如何在oracle里实现zip压缩?他说utl_compress不支持zip格式的文件。

 

其实在oracle里用java存储过程就可以实现zip压缩了,我们来看一个例子,在这个例子里函数F_SYS_FILE_TO_ZIP用于将一个指定文件压缩为一个zip文件,函数F_SYS_FILES_TO_ZIP用于将一个文件夹内的所有文件都压缩为一个zip文件:

 

SQL> create or replace and compile java source named zip as

  2  import java.io.File;

  3  import java.io.FileInputStream;

  4  import java.io.FileOutputStream;

  5  import java.io.IOException;

  6  import java.util.ArrayList;

  7  import java.util.List;

  8  import java.util.zip.ZipEntry;

  9  import java.util.zip.ZipOutputStream;

 10 

 11  public class ZipFile

 12  {

 13    //将一个指定文件压缩为一个zip文件

 14    public static String FileToZip(String FileName, String zipFileName, String isDelete)

 15    {

 16      ArrayList fileNames = new ArrayList(); // 存放文件名,并非含有路径的名字

 17      ArrayList files = new ArrayList(); // 存放文件对象

 18      try

 19      {

 20        FileOutputStream fileOut = new FileOutputStream(zipFileName);

 21        ZipOutputStream outputStream = new ZipOutputStream(fileOut);

 22 

 23        File dirFile = new File(FileName);

 24        listFile(dirFile, fileNames, files);

 25        for (int loop=0; loop<files.size(); loop++)

 26        {

 27          FileInputStream fileIn = new FileInputStream((File)files.get(loop));

 28          outputStream.putNextEntry(new ZipEntry((String)fileNames.get(loop)));

 29          byte[] buffer = new byte[1024];

 30          int len = fileIn.read(buffer);

 31          while (len != -1)

 32          {

 33            outputStream.write(buffer,0,len);

 34            len = fileIn.read(buffer);

 35          }

 36 

 37          outputStream.closeEntry();

 38          fileIn.close();

 39        }

 40        outputStream.close();

 41 

 42        //删除该源文件

 43        if ( isDelete.equalsIgnoreCase("true") == true )

 44        {

 45          dirFile.delete();

 46        }

 47 

 48        return "OK";

 49      }

 50      catch (IOException ioe)

 51      {

 52        ioe.printStackTrace();

 53        return "Error Occur: " + ioe ;

 54      }

 55    }

 56 

 57    //将一个文件夹内的所有文件都压缩为一个zip文件

 58    public static String FilesToZip(String dir, String zipFileName, String isDelete)

 59    {

 60      ArrayList fileNames = new ArrayList(); // 存放文件名,并非含有路径的名字

 61      ArrayList files = new ArrayList(); // 存放文件对象

 62      try

 63      {

 64        FileOutputStream fileOut = new FileOutputStream(zipFileName);

 65        ZipOutputStream outputStream = new ZipOutputStream(fileOut);

 66 

 67        File dirFile = new File(dir);

 68        listFile(dirFile, fileNames, files);

 69        for (int loop=0; loop<files.size(); loop++)

 70        {

 71          FileInputStream fileIn = new FileInputStream((File)files.get(loop));

 72          outputStream.putNextEntry(new ZipEntry((String)fileNames.get(loop)));

 73          byte[] buffer = new byte[1024];

 74          int len = fileIn.read(buffer);

 75          while (len != -1)

 76          {

 77            outputStream.write(buffer,0,len);

 78            len = fileIn.read(buffer);

 79          }

 80 

 81          outputStream.closeEntry();

 82          fileIn.close();

 83        }

 84        outputStream.close();

 85 

 86        //删除该目录内被压缩的源文件

 87        if ( isDelete.equalsIgnoreCase("true") == true )

 88        {

 89          for (int loop=0; loop<files.size(); loop++)

 90          {

 91            ((File)files.get(loop)).delete();

 92          }

 93        }

 94 

 95        return "OK";

 96      }

 97      catch (IOException ioe)

 98      {

 99        ioe.printStackTrace();

100        return "Error Occur: " + ioe ;

101      }

102    }

103 

104    static void  listFile(File parentFile, List nameList, List fileList)

105    {

106      if (parentFile.isDirectory())

107      {

108        File[] files = parentFile.listFiles();

109        for (int loop=0; loop<files.length; loop++)

110        {

111          listFile(files[loop], nameList, fileList);

112        }

113      }

114      else

115      {

116        fileList.add(parentFile);

117        nameList.add(parentFile.getName());

118      }

119    }

120  }

121  /

 

Java created

 

SQL> CREATE OR REPLACE Function F_SYS_FILE_TO_ZIP(FileName varchar2, zipFileName varchar2, isDelete varchar2)

  2    return varchar2

  3      as language java

  4        name 'ZipFile.FileToZip(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

  5  /

 

Function created

 

SQL> CREATE OR REPLACE Function F_SYS_FILES_TO_ZIP(dir varchar2, zipFileName varchar2, isDelete varchar2)

  2    return varchar2

  3      as language java

  4        name 'ZipFile.FilesToZip(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

  5  /

 

Function created

 

sys@IPRA>grant JAVASYSPRIV to ipra;

 

Grant succeeded.

 

$ pwd

/u01/iprainterfacefile

 

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

 

$ cp SAT.CA.20090918.00000050.IN SAT.CA.20090918.00000050.bck

 

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

现在我要将文件SAT.CA.20090918.00000050.IN压缩成SAT.CA.20090918.00000050.IN.zip,同时保留源文件:

SQL> var tempstr varchar2(200);

 

SQL> begin

  2  :tempstr := F_SYS_FILE_TO_ZIP('/u01/iprainterfacefile/SAT.CA.20090918.00000050.IN','/u01/iprainterfacefile/SAT.CA.20090918.

00000050.IN.zip','false');

  3  end;

  4  /

 

PL/SQL procedure successfully completed

tempstr

---------

OK

 

压缩完后我们去看一下效果:

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

-rw-r--r--   1 oracle   dba         14580 Nov 06 18:13 SAT.CA.20090918.00000050.IN.zip

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

现在我再次将文件SAT.CA.20090918.00000050.IN压缩成SAT.CA.20090918.00000050.IN.zip同时不保留源文件:

SQL> begin

  2  :tempstr := F_SYS_FILE_TO_ZIP('/u01/iprainterfacefile/SAT.CA.20090918.00000050.IN','/u01/iprainterfacefile/SAT.CA.20090918.

00000050.IN.zip','true');

  3  end;

  4  /

 

PL/SQL procedure successfully completed

tempstr

---------

OK

 

压缩完后我们再去看一下效果:

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba         14580 Nov 06 18:18 SAT.CA.20090918.00000050.IN.zip

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

$ cp SAT.CA.20090918.00000050.bck SAT.CA.20090918.00000050.IN

详细解析datafile的status

| No Comments

之前已经写过:

"详细解析9i10gdatafile header"

"详细解析LMTdatafile的物理结构"

 

这里是详细解析系列的第三篇文章,在这篇文章里,我们详细解析了datafile在不同状态下的datafile headercontrol file中的status的含义。

 

要说清楚datafilestatus,我们首先要明白什么是oracle中的online fuzzy status----online fuzzy status通常是指datafile处于可读写的online状态。而fuzzy的具体含义是----a datafile that contains a block whose SCN is more recent than the SCN of its header is called a fuzzy datafile.

 

当一个datafile处于fuzzy状态的时候,其kcvfhsta0x04

BBED> set file 139

        FILE#           139

 

BBED> set block 1

        BLOCK#          1

 

BBED> p kcvfhsta

ub2 kcvfhsta                                @138      0x0004 (KCVFHOFZ)

 

其对应的control文件里上述datafile 139所在的status0x0e

00032760h: 00 00 00 8A 00 00 00 00 00 00 00 00 00 00 FF FF

00032770h: 00 00 00 00 00 00 00 00 00 00 20 00 00 0E 00 00

00032780h: BB 52 A0 FE 00 08 00 00 29 CF 5D 0E 00 00 00 00

0x0e=0x08+0x04+0x02,即代表Change/Write+Read+Online

 

当一个datafile处于offline状态的时候,有如下这样三种情况:

1、  当正常shutdown immediate的时候,其kcvfhsta0x00

BBED> set file 139

        FILE#           139

 

BBED> set block 1

        BLOCK#          1

 

BBED> p kcvfhsta

ub2 kcvfhsta                                @138      0x0000 (NONE)

 

在这种情况下,其对应的control文件里上述datafile 139所在的status还是为0x0e

00032760h: 00 00 00 8A 00 00 00 00 00 00 00 00 00 00 FF FF

00032770h: 00 00 00 00 00 00 00 00 00 00 20 00 00 0E 00 00

00032780h: BB 52 A0 FE 00 08 00 00 29 CF 5D 0E 00 00 00 00

 

2、  offline normal的时候,其kcvfhsta0x00

BBED> set file 139

        FILE#           139

 

BBED> set block 1

        BLOCK#          1

 

BBED> p kcvfhsta

ub2 kcvfhsta                                @138      0x0000 (NONE)

 

在这种情况下,其对应的control文件里上述datafile 139所在的status变为0x80

00032760h: 00 00 00 8A 00 00 00 00 00 00 00 00 00 00 FF FF

00032770h: 00 00 00 00 00 00 00 00 00 00 20 00 00 80 00 00

00032780h: BB 52 A0 FE 00 08 00 00 29 CF 5D 0E 00 00 00

0x80表示Save offline scn range at next checkpoint

 

3、  offline immediate的时候,其kcvfhsta0x04

BBED> set file 139

        FILE#           139

 

BBED> set block 1

        BLOCK#          1

 

BBED> p kcvfhsta

ub2 kcvfhsta                                @138      0x0004 (KCVFHOFZ)

 

在这种情况下,其对应的control文件里上述datafile 139所在的status变为0x10

00032760h: 00 00 00 8A 00 00 00 00 00 00 00 00 00 00 FF FF

00032770h: 00 00 00 00 00 00 00 00 00 00 20 00 00 10 00 00

00032780h: BB 52 A0 FE 00 08 00 00 29 CF 5D 0E 00 00 00 00

0x10表示 Media Recovery Required

 

当一个datafile处于read only状态的时候,其kcvfhsta0x00

BBED> set file 139

        FILE#           139

 

BBED> set block 1

        BLOCK#          1

 

BBED> p kcvfhsta

ub2 kcvfhsta                                @138      0x0000 (NONE)

 

在这种情况下,其对应的control文件里上述datafile 139所在的status变为0x86

00032760h: 00 00 00 8A 00 00 00 00 00 00 00 00 00 00 FF FF

00032770h: 00 00 00 00 00 00 00 00 00 00 20 00 00 86 00 00

00032780h: BB 52 A0 FE 00 08 00 00 29 CF 5D 0E 00 00 00 00

0x86=0x80+0x04+0x02,即代表Save offline scn range at next checkpoint+Read+Online

 

总结一下:

1、  当一个datafile处于online fuzzy状态的时候,其kcvfhsta0x04,其对应的control文件里上述datafile所在的status0x0e

2、  当一个datafile处于由shutdown immediate而导致的offline状态的时候,其kcvfhsta0x00,其对应的control文件里上述datafile所在的status0x0e

3、  当一个datafile处于offline normal状态的时候,其kcvfhsta0x00,其对应的control文件里上述datafile所在的status0x80

4、  当一个datafile处于offline immediate状态的时候,其kcvfhsta0x04,其对应的control文件里上述datafile所在的status0x10

5、  当一个datafile处于read only状态的时候,其kcvfhsta0x00,其对应的control文件里上述datafile所在的status0x86

 

 

Recent Comments

  • 毕业论文: 学习了。 read more
  • cui hua: 不用改数据,你改row directory里的指针就可以了——这就是我文中提到的update internal。 read more
  • yangjiawei: 领导,不好意思,再请问一下 我现在遇到一个问题,我现在已经将ind$里两个索引的状态改好了,数据库也拉起来了~! 但是在修改obj$里name里为DEPENDENCY$这一行数据的data_object_id时遇到了困难,因为他原先的长度为2个字节,现在由于我move了一下,他的长度变成了4个字节,结果如下: 原先: col 1[2] @906: 0xc1 0x5d ==>92 read more
  • cui hua: 可以从上述sql中推断出等待的顺序(如何推断我已经在文中提到了),是不是太直观,但是综合上述症状来看,只有我文中提到的这种可能。 read more
  • yangjiawei: 我最近也正好再研究这些比较Internal的东西,所以想麻烦您能对这个问题写一个比较详细的解释及解决方案,我对这些也是比较感兴趣的,可以吗? read more
  • publover: 好文,但是不明白是如何确定这个等待队列的?否则就无法看出是谁阻塞了谁,但是从SQL中看不出来等待的顺序是什么 read more
  • cui hua: 这些东西过于internal和复杂了,我不打算对外发布,误导了你反而不好。做好备份就可以了,有了完善的备份这些手段都是没有意义的。 read more
  • yangjiawei: 领导啊~能否将详细的处理过程写一份,发给我啊?我很期待能跟您学习一下~!:) read more
  • cui hua: 这个就是128 128 0 read more
  • cui hua: kamus,你是对的。但我这里指的是一种极限情况,其实我也觉得我这里的算法可能是有问题的。 read more

About this Archive

This page is an archive of entries from November 2009 listed from newest to oldest.

October 2009 is the previous archive.

December 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.