数据字典(dd)一致性鉴别
dd损坏通常包括:
1. Data Dictionary Inconsistency, missing rows in tables:
- Tab$/Ind$ with no entries in OBJ$
- Undo$/Tab$/Ind$ with no entries in SEG$
- Seg$ with no entries in TAB$/IND$/OBJ$
tab$和ind$的条目在OBJ$中不存在;Undo$/Tab$/Ind$的条目在SEG$中不存在;Seg$的条目在TAB$/IND$/OBJ$中不存在
2. Missing data dictionary objects
DD对象丢失
3. Corrupted data dictionary objects (table, index, or table-index inconsistency)
DD对象损坏
4. Invalid entries in data dictionary tables.
DD表中存在无效对象
1. Identifying Objects with Data Dictionary Inconsistency
首先需要安装hcheck包,参见Note136697.1
In order to detect data dictionary inconsistency we need to run hcheck.full procedure, see Note 136697.1.
a. Connect as SYS schema in sqlplus
b. Create package hOut as described in Note 101468.1 先创建hOut包,该包主要用于控制hcheck系列程序的输出,见附件hout.sql
c. Create package hcheck in SYS schema as described in Note 136697.1 attachment.
d. set serveroutput on
c. execute hcheck.full
The script will report various dictionary related issues that may or may not be a problem.
Any problems reported should be reviewed by an experienced support analyst as some
reported "problems" may be normal and expected.
Example of HCHECK.FULL output:
Problem: Orphaned IND$ (no SEG$) - See Note 65987.1 (Bug:624613/3655873)
ORPHAN IND$: OBJ=200449 DOBJ=200449 TS=0 RFILE/BLOCK=0 0 BO#=200446 SegType=
^- May be OK. Needs manual check
ORPHAN IND$: OBJ=39442 DOBJ=39442 TS=14 RFILE/BLOCK=2 49 BO#=39438 SegType=
Problem: Orphaned TAB$ (no SEG$)
ORPHAN TAB$: OBJ=1817074 DOBJ=0 TS=0 RFILE/BLOCK=0 0 BOBJ#= SegType=
^- May be OK. Needs manual check
ORPHAN TAB$: OBJ=2149126 DOBJ=2149126 TS=19 RFILE/BLOCK=31 44291 BOBJ#= SegType=
Problem: Orphaned SEG$ Entry
ORPHAN SEG$: SegType=INDEX TS=20 RFILE/BLOCK=33 28435
Based on the hcheck.full output you will have to identify the objects that show a dd inconsistency, and verify the reported inconsistency.
Select name,type# from obj$ where obj#=<OBJ>; /* 1=INDEX, 2=TABLE, 3=CLUSTER, 21=LOB, 25=IOT
Select object_name,owner,object_type from dba_objects where object_id=<OBJ>;
Some of the problems, mainly the one marked as 'May be OK. Needs manual check ' could be a false alarm.
注意有些alarm未必是真的存在问题。
Check the type of the object.
Lob Index on temporary table or IOT do not have a segment, than the problem message is a false alarm.
例如:临时表的LOB索引或者IOT表的索引不存在段,但是hcheck会抛出一个alarm。
附:
1.hout.sql
***Checked for relevance on 27-MAR-2013***
REM ======================================================================
REM hout.sql Version 1.1 29 Dec 2000
REM
REM Purpose:
REM To provide an output package for the h*.sql series of scripts.
REM All h*.sql scripts use this package to output their results
REM This allows one package to control where output is sent
REM to.
REM Eg: This package can be coded to output to DBMS_OUTPUT
REM or to use the UTL_FILE calls if required.
REM
REM This version of the script can write to both DBMS_OUTPUT and
REM to the users trace file.
REM
REM Usage:
REM See Note:101466.1 for details of using this and other h* packages
REM
REM Depends on:
REM dbms_output , dbms_system
REM
REM Notes:
REM Must be installed in SYS schema
REM For Oracle 7.3, 8.0, 8.1, 9.0, 9.2, 10.1, 10.2, 11.1 and 11.2
REM server versions
REM
REM CAUTION
REM The sample program in this article is provided for educational
REM purposes only and is NOT supported by Oracle Support Services.
REM It has been tested internally, however, and works as documented.
REM We do not guarantee that it will work for you, so be sure to test
REM it in your environment before relying on it.
REM
REM ======================================================================
REM
create or replace package hOut as
--
-- Output options - change these to default as required
-- You can override them at run time if required.
--
TO_DBMS_OUTPUT boolean := TRUE; -- Send output to DBMS_OUTPUT
TO_USER_TRACE boolean := TRUE; -- Send output to user trace file
IGNORE_ERRORS boolean := TRUE; -- Ignore DBMS_OUTPUT errors if
-- also writing to the trace file
--
-- Output methods
--
procedure put_line(txt varchar2);
procedure put(txt varchar2);
procedure new_line;
procedure wrap(txt varchar2, linelen number default 78);
procedure rule_off;
--
end hOut;
/
show errors
create or replace package body hOut as
-- 7.3 has problems with ksdwrt as it uses the wrong length info
-- putting nonsense on the end of lines.
-- As a workaround we copy the text to a TMP varchar, append a chr(0)
-- then reset the length back so we have an hidden chr(0) at the end
-- of the string.
tmp varchar2(2001);
--
APP_EXCEPTION EXCEPTION;
pragma exception_init(APP_EXCEPTION, -20000);
--
procedure put_line(txt varchar2) is
begin
tmp:=txt||chr(0);
tmp:=txt;
if TO_DBMS_OUTPUT then
begin
dbms_output.put_line(txt);
exception
when APP_EXCEPTION then
-- If DBMS_OUTPUT is full then carry on if we are writing to
-- the trace file and ignoring errors, otherwise error now
if TO_USER_TRACE and IGNORE_ERRORS then
begin
dbms_output.put_line('[TRUNCATED]');
exception
when APP_EXCEPTION then
null;
end;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,tmp);
end if;
end;
--
procedure put(txt varchar2) is
begin
tmp:=txt||chr(0);
tmp:=txt;
if TO_DBMS_OUTPUT then
begin
dbms_output.put(txt);
exception
when APP_EXCEPTION then
-- If DBMS_OUTPUT is full then carry on if we are writing to
-- the trace file and ignoring errors, otherwise error now
if TO_USER_TRACE and IGNORE_ERRORS then
begin
dbms_output.put('[TRUNCATED]');
exception
when APP_EXCEPTION then
null;
end;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,tmp);
end if;
end;
--
procedure new_line is
begin
if TO_DBMS_OUTPUT then
begin
dbms_output.new_line;
exception
when APP_EXCEPTION then
if TO_USER_TRACE and IGNORE_ERRORS then
null;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,' ');
end if;
end;
--
procedure wrap(txt varchar2, linelen number default 78) is
p integer:=1;
len integer;
pos integer;
chunk varchar2(2000);
xchunk varchar2(2000);
llen number:=linelen;
BEGIN
if (llen>2000) then
llen:=2000;
end if;
if (llen<=1) then
llen:=78;
end if;
len:=length(txt);
while (p<=len) loop
chunk:=substr(txt,p,llen);
pos:=instr(chunk,chr(10),-1);
if pos>0 then
-- We have a CR in the text - use it
put_line(substr(chunk,1,pos-1));
p:=p+pos;
else
-- No CR in the text so we will look for a split character
xchunk:=translate(chunk,' ,()=',',,,,,');
pos:=instr(xchunk,',',-1);
if pos>0 and len>llen then
put_line(substr(chunk,1,pos));
p:=p+pos;
else
put(chunk);
p:=p+llen;
end if;
end if;
end loop;
new_line;
END;
--
procedure rule_off is
begin
put_line('=========================================================');
end;
--
begin
dbms_output.enable(100000);
end hout;
/
REM ====================
2.hcheck使用方法
SQL> set serveroutput on size unlimited
SQL> spool outputfile
SQL> execute hcheck.full
SQL> spool off
3.安装hcheck
先安装hOut,再安装hcheck2.sql(for 8i,不能运行于9I数据库)或hcheck3.sql(for 9i+)
4.hcheck3.sql
--
--------------------------------------------------------------------------
-- hcheck.sql Version 3.50 Tue Mar 26 14:20:38 CEST 2013
--
-- Purpose:
-- To provide a single package which looks for common data dictionary
-- problems.
-- Note that this version has not been checked with locally managed
-- tablespaces and may give spurious output if these are in use.
-- This script is for use mainly under the guidance of Oracle Support.
--
-- Usage:
-- SQL> set serverout on size unlimited
-- SQL> exec hcheck.full [(parameters)]
--
-- Where parameters are
-- Verbose In Boolean - Verbose Output
-- RunAll In Boolean - Run All procedures despite of Release
-- VerChk In Number - Check against 1st 'VerChk' release numbers
--
-- Output is to the hOut package to allow output to be redirected
-- as required
--
-- Depends on:
-- hOut
--
-- Notes:
-- Must be installed in SYS schema
-- This package is intended for use in Oracle releases 9i onwards
-- This package will NOT work in 8i or earlier.
-- In all cases any output reporting "problems" should be
-- parsed by an experienced Oracle Support analyst to confirm
-- if any action is required.
--
-- CAUTION
-- The sample program in this article is provided for educational
-- purposes only and is NOT supported by Oracle Support Services.
-- It has been tested internally, however, and works as documented.
-- We do not guarantee that it will work for you, so be sure to test
-- it in your environment before relying on it.
--
--------------------------------------------------------------------------
--
Create Or Replace Package hcheck Is
Type sFuncNam Is Table Of Varchar2(32) Index By Binary_integer ;
Type sFuncRel Is Table Of Varchar2(32) Index By Binary_integer ;
--
sFn sFuncNam ; /* Function Names */
sFr sFuncRel ; /* Version Control: Fixed Release per function */
--
-- Procedure Definitions
--
Procedure SynLastDDLTim
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 1 */
Procedure LobNotInObj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 2 */
Procedure MissingOIDOnObjCol
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 3 */
Procedure SourceNotInObj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 4 */
Procedure IndIndparMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 5 */
Procedure InvCorrAudit
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 6 */
Procedure OversizedFiles
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 7 */
Procedure TinyFiles
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 8 */
Procedure PoorDefaultStorage
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 9 */
Procedure PoorStorage
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 10 */
Procedure MissTabSubPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 11 */
Procedure PartSubPartMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 12 */
Procedure TabPartCountMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 13 */
Procedure OrphanedTabComPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 14 */
Procedure ZeroTabSubPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 15 */
Procedure MissingSum$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 16 */
Procedure MissingDir$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 17 */
Procedure DuplicateDataobj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 18 */
Procedure ObjSynMissing
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 19 */
Procedure ObjSeqMissing
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 20 */
Procedure OrphanedUndo
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 22 */
Procedure OrphanedIndex
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 21 */
Procedure OrphanedIndexPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 23 */
Procedure OrphanedIndexSubPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 24 */
Procedure OrphanedTable
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 25 */
Procedure OrphanedTablePartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 26 */
Procedure OrphanedTableSubPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 27 */
Procedure MissingPartCol
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 28 */
Procedure OrphanedSeg$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 29 */
Procedure OrphanedIndPartObj#
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 30 */
Procedure DuplicateBlockUse
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 31 */
Procedure HighObjectIds
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 32 */
Procedure PQsequence
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 33 */
Procedure TruncatedCluster
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 34 */
Procedure FetUet
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 35 */
Procedure Uet0Check
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 36 */
Procedure ExtentlessSeg
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 37 */
Procedure SeglessUET
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 38 */
Procedure BadInd$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 39 */
Procedure BadTab$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 40 */
Procedure BadIcolDepCnt
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 41 */
Procedure WarnIcolDep
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 42 */
Procedure OnlineRebuild$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 43 */
Procedure DropForceType
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 44 */
Procedure TrgAfterUpgrade
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 45 */
Procedure FailedInitJVMRun
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 46 */
Procedure TypeReusedAfterDrop
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 47 */
Procedure Idgen1$TTS
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 48 */
Procedure DroppedFuncIdx
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 49 */
Procedure BadOwner
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 50 */
Procedure UpgCheckc0801070
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 51 */
Procedure BadPublicObjects
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 52 */
Procedure BadSegFreelist
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 53 */
Procedure BadCol#
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 54 */
Procedure BadDepends
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 55 */
Procedure CheckDual
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 56 */
Procedure ObjectNames
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 57 */
Procedure BadCboHiLo
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 58 */
Procedure ChkIotTs
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 59 */
Procedure NoSegmentIndex
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 60 */
Procedure BadNextObject
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 61 */
Procedure OrphanIndopt
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 62 */
Procedure UpgFlgBitTmp
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 63 */
Procedure RenCharView
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 64 */
Procedure Upg9iTab$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 65 */
Procedure Upg9iTsInd
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 66 */
Procedure Upg10gInd$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 67 */
Procedure DroppedROTS
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 68 */
Procedure ChrLenSmtcs
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 69 */
Procedure FilBlkZero
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 70 */
Procedure DbmsSchemaCopy
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 71 */
--
bRun Boolean ;
nFunc Number := 71 ; /* should be equal-to, not one-greater-than, the */
/* highest expected number of procedures to be run */
--
-- Function CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number ;
-- Procedure ChecknCatVnFR ( nCatV In Number, nFR In Number ) ;
--
-- Main
--
Procedure Full (Verbose In Boolean Default FALSE,
RunAll In Boolean Default FALSE,
VerChk In Number Default 5) ;
End hcheck;
/
Create Or Replace Package Body hcheck Is
Ver Varchar2(10) := '9i+/hc3.50';
Warn Number :=0 ;
Fatal Number :=0 ;
CatV Varchar2(10) ;
nCatV Number :=0 ;
Verbose Boolean ;
nFR Number :=0 ; /* Fixed Release */
--
Function InitsFr Return sFuncRel Is
AllReleases Varchar2(32) := '99.99.99.99.99' ;
Begin
--
-- Highest Relevant Release For Functions
-- If check against all releases, specify '99.99.99.99.99'
--
sFr (0) := AllReleases ; /* 0 */
sFr (1) := '10.1.0.2.0' ; /* 1 */
sFr (2) := '10.0.0.2.0' ; /* 2 */
sFr (3) := AllReleases ; /* 3 */
sFr (4) := '10.2.0.1.0' ; /* 4 */
sFr (5) := '11.2.0.1.0' ; /* 5 */
sFr (6) := '11.2.0.1.0' ; /* 6 */
sFr (7) := AllReleases ; /* 7 */
sFr (8) := '9.0.1.0.0' ; /* 8 */
sFr (9) := AllReleases ; /* 9 */
sFr(10) := AllReleases ; /* 10 */
sFr(11) := '9.0.1.0.0' ; /* 11 */
sFr(12) := '11.2.0.1.0' ; /* 12 */
sFr(13) := AllReleases ; /* 13 */
sFr(14) := '9.0.1.0.0' ; /* 13 */
sFr(15) := '9.2.0.1.0' ; /* 15 */
sFr(16) := AllReleases ; /* 16 */
sFr(17) := AllReleases ; /* 17 */
sFr(18) := AllReleases ; /* 18 */
sFr(19) := AllReleases ; /* 19 */
sFr(20) := AllReleases ; /* 20 */
sFr(21) := AllReleases ; /* 21 */
sFr(22) := AllReleases ; /* 22 */
sFr(23) := AllReleases ; /* 23 */
sFr(24) := AllReleases ; /* 24 */
sFr(25) := AllReleases ; /* 25 */
sFr(26) := AllReleases ; /* 26 */
sFr(27) := AllReleases ; /* 27 */
sFr(28) := AllReleases ; /* 28 */
sFr(29) := AllReleases ; /* 29 */
sFr(30) := '11.1.0.6.0' ; /* 30 */
sFr(31) := AllReleases ; /* 31 */
sFr(32) := '8.1.6.0.0' ; /* 32 */
sFr(33) := '8.0.6.0.0' ; /* 33 */
sFr(34) := '8.1.7.0.0' ; /* 34 */
sFr(35) := AllReleases ; /* 35 */
sFr(36) := AllReleases ; /* 36 */
sFr(37) := AllReleases ; /* 37 */
sFr(38) := AllReleases ; /* 38 */
sFr(39) := AllReleases ; /* 39 */
sFr(40) := AllReleases ; /* 40 */
sFr(41) := '11.1.0.7.0' ; /* 41 */
sFr(42) := '11.1.0.7.0' ; /* 42 */
sFr(43) := AllReleases ; /* 43 */
sFr(44) := '10.1.0.2.0' ; /* 44 */
sFr(45) := AllReleases ; /* 45 */
sFr(46) := AllReleases ; /* 46 */
sFr(47) := '9.0.1.0.0' ; /* 47 */
sFr(48) := '9.0.1.0.0' ; /* 48 */
sFr(49) := '9.2.0.1.0' ; /* 49 */
sFr(50) := '9.0.1.0.0' ; /* 50 */
sFr(51) := AllReleases ; /* 51 */
sFr(52) := AllReleases ; /* 52 */
sFr(53) := AllReleases ; /* 53 */
sFr(54) := '10.1.0.2.0' ; /* 54 */
sFr(55) := AllReleases ; /* 55 */
sFr(56) := AllReleases ; /* 56 */
sFr(57) := AllReleases ; /* 57 */
sFr(58) := AllReleases ; /* 58 */
sFr(59) := AllReleases ; /* 59 */
sFr(60) := AllReleases ; /* 60 */
sFr(61) := AllReleases ; /* 61 */
sFr(62) := '9.2.0.8.0' ; /* 62 */
sFr(63) := '10.1.0.1.0' ; /* 63 */
sFr(64) := '10.1.0.1.0' ; /* 64 */
sFr(65) := '9.2.0.4.0' ; /* 65 */
sFr(66) := '9.2.0.5.0' ; /* 66 */
sFr(67) := '10.2.0.0.0' ; /* 67 */
sFr(68) := AllReleases ; /* 68 */
sFr(69) := '11.1.0.6.0' ; /* 69 */
sFr(70) := AllReleases ; /* 70 */
sFr(71) := AllReleases ; /* 70 */
--
Return sFr ;
End ;
--
Function Owner (uid Number) Return Varchar2 Is
r Varchar2(30) := Null ;
Begin
Select name Into r
From user$
where user# = uid ;
return r ;
Exception
When NO_DATA_FOUND Then
Return ( '*UnknownOwnID='||uid||'*' ) ;
End ;
--
Function ObjName (objid Number) Return Varchar2 Is
r Varchar2(30) := Null ;
own Number ;
Begin
Select name, owner# Into r, own
From obj$
Where Obj# = objid ;
return r ;
Exception
When NO_DATA_FOUND Then
Return ( '*UnknownObjID='||objid||'*' ) ;
End ;
--
Function IsLastPartition( o number ) Return Boolean Is
n Number := 0 ;
Begin
Select partcnt Into n From partobj$ where obj#=o ;
If ( n>1 ) Then
Return(FALSE) ;
Else
Return(TRUE) ;
End If ;
End;
--
Function ObjectIsTemporary( o Number ) Return Boolean
-- Return TRUE if object is a TEMPORARY object
-- Return NULL if object does not exist
-- Return FALSE if object is not temporary
Is
Cursor cIsTemp Is
Select Bitand(nvl(flags,0), 2) IsTemp From obj$ Where obj#=o
;
ret Boolean := FALSE ;
begin
For R in cIsTemp Loop -- For loop just to keep cursor closed
If ( R.IsTemp=2 ) Then
ret := TRUE ;
End If;
End Loop ;
return ret ;
End;
--
Procedure DictAt( ts number, fi number, bl number ) is
Cursor cDictAt is
select typ, ts#,file#,block#,count('x') CNT
from (
select 'UNDO$' typ, u.ts#, u.file#, u.block# from undo$ u
where decode(u.status$,1,null,u.status$) is not null
UNION ALL
select 'TAB$' typ, a.ts#,a.file#,a.block# from tab$ a
UNION ALL
select 'CLU$' typ, b.ts#,b.file#,b.block# from clu$ b
UNION ALL
select 'TABPART$' typ, c.ts#,c.file#,c.block# from tabpart$ c
UNION ALL
select 'TABSUBPART$' typ, d.ts#,d.file#,d.block# from tabsubpart$ d
UNION ALL
select 'IND$' typ, e.ts#,e.file#,e.block# from ind$ e
UNION ALL
select 'INDPART$' typ, f.ts#,f.file#,f.block# from indpart$ f
UNION ALL
select 'INDSUBPART$' typ, g.ts#,g.file#,g.block# from indsubpart$ g
UNION ALL
select 'LOB$' typ, h.ts#,h.file#,h.block# from lob$ h
UNION ALL
select 'LOBFRAG$' typ, i.ts#,i.file#,i.block# from lobfrag$ i
-- UNION ALL
-- select 'RECYCLEBIN$' typ, j.ts#,j.file#,j.block# from recyclebin$ j
)
where ts#= TS and file# = FI and block#= BL
group by typ, ts#,file#,block#
;
Begin
For R in cDictAt
Loop
hout.put_line('^ '||R.typ||' has '||R.cnt||' rows');
End Loop;
End;
--
function IndexIsNosegment( o number ) return boolean is
Cursor cX is
select bitand(flags,4096) noseg from ind$ where obj#=o;
ret boolean:=null;
begin
For C in cX
loop
if C.noseg=4096 then
ret:=true;
else
ret:=false;
end if;
end loop;
return ret; /* true/false or NULL if not found */
end;
--
Procedure CheckIndPart( o number ) is
Cursor Cchk is
select i.obj#, i.dataobj#, i.ts#, i.file#, i.block#
from indpart$ i
where i.bo#=o
and (i.file#!=0 OR i.block#!=0);
begin
For R in Cchk Loop
hout.put_line(' ^- PROBLEM: Child INDPART$ with FILE/BLK (bug 4683380)');
hout.put_line(' ^- ( OBJ='||R.obj#|| ' DOBJ='||r.dataobj#||
' TS='||r.TS#||
' RFILE/BLOCK='||r.file#||' '||r.block#||')' );
Fatal:=Fatal+1;
end loop;
end;
--
Procedure ChecknCatVnFR ( nCatV In Number,
nFR In Number,
bRun In Out Boolean) Is
str1 Varchar2(10) := To_Char(nCatV) ;
str2 Varchar2(10) := To_Char(nFR) ;
Begin
Case
When ( nCatV = 0 ) Then
str1 := '*Any Rel*' ;
Else
Null ;
End Case ;
Case
When ( nFR = 9999999999 ) Then
str2 := '*All Rel*' ;
Else
Null ;
End Case ;
If ( nCatV > nFR ) Then
hout.put_line(Rpad(nCatv,10,' ')||' > '||Lpad(nFR,11,' ')||' : n/a');
bRun := FALSE ;
return ;
Else
hout.put_line(Rpad(str1,10,' ')||' <='||Lpad(str2,11,' ')||' : Ok') ;
bRun := TRUE ;
End If ;
End ;
--
Procedure strtok (tok In Out Varchar2, s In Out Varchar2, ct In Varchar2) Is
i Pls_integer ;
p Pls_integer ;
len Pls_integer ;
token_start Pls_integer ;
intoken Boolean := FALSE ;
Begin
-- dbms_output.put_line ( 'strtok string: '||s ) ;
If ( s Is Not NULL ) Then
len := length( s ) ;
i := 1 ;
While ( i <= len ) Loop
p := instr( ct, substr(s,i,1) );
If ( ( i = len ) Or ( p > 0 ) ) Then
If ( intoken ) Then
If ( p > 0 ) Then
tok := substr( s, token_start, i - token_start ) ;
s := substr( s, i+1 ) ;
Else
tok := substr( s, token_start, i - token_start + 1 ) ;
s := '' ;
End If ;
Exit When TRUE ;
End If ;
Elsif ( Not intoken ) Then
intoken := true ;
token_start := i ;
End If;
tok := s ;
i := i + 1 ;
End Loop;
End if;
End;
--
Function CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number As
type tok is table of Number index by binary_integer ;
tk tok ;
scp varchar2(16) ;
i number := 1 ;
scv Varchar2(16) := Null ;
Begin
scp := s ;
for i in 1..n loop
tk(i) := Null ;
strtok( tk(i), scp, '.' );
scv := scv || Lpad(tk(i),2,'0') ;
end loop ;
return To_Number(scv) ;
end;
--
Procedure SynLastDDLTim
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
Cursor sCur1 Is
Select Distinct o.obj#, o.owner#, o.name
From obj$ o, idl_ub1$ i
Where type# = 5
And ctime != mtime
And i.obj# = o.obj# /* Has IDL information */
;
nFr Number ;
ps1 Varchar2(10) := 'HCKW-0001' ;
ps1a Varchar2(65) :=
'Synonym''s LAST_DDL_TIME != CREATED' ;
bug1 Varchar2(80) :=
'Ref : Bug:2371453' ;
aff1 Varchar2(80) := 'Affects: Vers >=8.1.7.2 and BELOW 10.1 - '||
'Specifically: 8.1.7.4 9.0.1.3 9.2.0.1' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.5 9.0.1.4 9.2.0.2 10.1.0.2' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note: 2371453.8 - CREATE OR REPLACE SYNONYM can lead to inconsistent';
not2 Varchar2(80) :=
' dictionary (old IDL data)' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 in sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OBJ#='||c1.OBJ#||' Name='||Owner(c1.owner#)||'.'||
c1.name);
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure LobNotInObj
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select l.obj#, l.lobj#
From lob$ l, obj$ o
Where l.lobj# = o.obj#(+)
And o.obj# is null
;
ps1 Varchar2(10) := 'HCKE-0001' ;
ps1a Varchar2(65) := 'LOB$.LOBJ# not found in OBJ$' ;
bug1 Varchar2(80) :=
'Ref : Bug:2405258' ;
aff1 Varchar2(80) :=
'Affects: Vers >=8 and BELOW 10.1 - Specifically: 9.2.0.1' ;
fix1 Varchar2(80) :=
'Fixed : 9.2.0.2 10.1.0.2' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note: 2405258.8 - Dictionary corruption / OERI(15265) from MOVE LOB' ;
not2 Varchar2(80) :=
' to existing segment name' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' LOB$.LOBJ# has no OBJ$ entry for LOBJ#='||c1.lobj#||
' (OBJ#='||c1.obj#||')');
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure MissingOIDOnObjCol
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select o.obj# , o.type#, o.owner#, o.name, c.col#, c.intcol#,
c.name cname, t.property
From obj$ o, col$ c, coltype$ ct, oid$ oi, tab$ t
Where o.obj# = ct.obj#
And ct.obj# = c.obj#
And ct.col# = c.col#
And ct.intcol# = c.intcol#
And oi.oid$(+) = ct.toid
And o.obj# = t.obj#(+)
And oi.oid$ is null
;
ps1 Varchar2(10) := 'HCKE-0002' ;
ps1a Varchar2(65) := 'Object type column with missing OID$' ;
bug1 Varchar2(80) :=
'Ref : Bug:2728624' ;
aff1 Varchar2(80) :=
'Affects: Closed as not a Bug (92)' ;
fix1 Varchar2(80) :=
'Fixed : See Note.229583.1 for patching steps' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note.229583.1 - Bug:2728624 - Confirmation and Patching Notes' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OBJ#='||c1.obj#||' Name='||Owner(c1.owner#)||'.'
||c1.name||' IntCol#='||c1.intcol#||'='||c1.cname
||' TabProp='||c1.property);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure SourceNotInObj
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select Count('x') cnt, Count(Distinct s.obj#) nobj
From source$ s, obj$ o
Where s.obj# = o.obj#(+)
And o.obj# is null
Having Count('x') > 0
;
ps1 Varchar2(10) := 'HCKE-0003' ;
ps1a Varchar2(65) := 'SOURCE$ for OBJ# not in OBJ$' ;
bug1 Varchar2(80) :=
'Ref : Bug:3532977' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 10.2 Specifically: 9.2.0.4 10.1.0.4' ;
fix1 Varchar2(80) :=
'Fixed : 9.2.0.8 10.1.0.5 10.2.0.1' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line('SOURCE$ has '||c1.cnt||
' rows for '||c1.nobj||' OBJ# values not in OBJ$' ) ;
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure IndIndparMismatch
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select io.obj# io, io.name ionam, ipo.obj# ipo, ipo.name iponam
From obj$ io, indpart$ ip, obj$ ipo
Where ipo.type# = 20 /* IND PART */
And ip.obj# = ipo.obj#
And io.obj# (+) = ip.bo#
And nvl(io.name,'"') != ipo.name
;
ps1 Varchar2(10) := 'HCKE-0004' ;
ps1a Varchar2(65) := 'OBJ$.NAME mismatch for INDEX v INDEX PARTITION' ;
bug1 Varchar2(80) :=
'Ref : Bug:3753873' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 11.2 - Specifically: All 9.2 rels '||
'(9.2.0.4 through 9.2.0.8)' ;
aff2 Varchar2(80) :=
' 10.1.0.5 10.2.0.1 10.2.0.2 10.2.0.3 10.2.0.4 11.1.0.7' ;
fix1 Varchar2(80) :=
'Fixed : 11.2.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:3753873.8 - Minor dictionary corruption from DROP COLUMN' ;
not2 Varchar2(80) :=
' of partitioned table with LOB' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (aff2 Is Not Null) Then hout.put_line(aff2); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' Ind Part OBJ$.OBJ# '||c1.ipo||' '||c1.iponam||
'!='||c1.ionam||' OBJ#='||c1.io);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure InvCorrAudit
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select decode(aud.user#,
0, 'ANY CLIENT',
1, Null ,
client.name) username ,
proxy.name proxyname,
prv.name privilege,
decode(aud.success,
1, 'BY SESSION',
2, 'BY ACCESS' ,
'NOT SET') success ,
decode(aud.failure,
1, 'BY SESSION',
2, 'BY ACCESS' ,
'NOT SET') failure
From sys.user$ client ,
sys.user$ proxy ,
system_privilege_map prv ,
sys.audit$ aud
Where aud.option# = -prv.privilege
and aud.user# = client.user#
-- and aud.user# != 1 /* PUBLIC */
and aud.user# = 0 /* SYS */
and aud.proxy# = proxy.user# (+)
and aud.proxy# is null
;
ps1 Varchar2(10) := 'HCKE-0005' ;
ps1a Varchar2(65) := 'Invalid/Corrupted AUDIT$ entries' ;
bug1 Varchar2(80) :=
'Ref : Bug:6310840' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 11.2 - Specifically: 11.1.0.6' ;
fix1 Varchar2(80) :=
'Fixed : 11.1.0.7 11.2.0.1' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note.455565.1: Corrupted entries in DBA_PRIV_AUDIT_OPTS' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
variant Varchar2(30) := Null ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
If (c1.username = 'ANY CLIENT')
Then
variant := 'Corrupted -' ;
Else
variant := 'Invalid -' ;
End If ;
hout.put_line(variant||' USER#='''||c1.username||''' OPTION='''||
c1.privilege||''' SUCCESS='''||c1.success||''' FAILURE='''||
c1.failure||'''');
Fatal := Fatal + 1 ;
End Loop;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End;
--
Procedure OversizedFiles
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select f.ts# TS, f.relfile# RFILE, f.file# AFILE, v.name NAME, f.blocks
From ts$ ts, file$ f, v$datafile v
Where ts.ts# = f.ts#
And v.file# = f.file#
And f.blocks > 4194303 -- (4M -1 blocks)
And bitand(ts.flags,256) != 256
Order By f.ts#, f.relfile#
;
ps1 Varchar2(10) := 'HCKE-0006' ;
ps1a Varchar2(65) := 'Oversized datafile (blocks>4194303)' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OVERSIZED FILE ('||c1.blocks||' blocks) TS='||c1.TS||
' RFILE='||c1.RFILE||
' ABS='||c1.AFILE||' Name='||c1.NAME);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure TinyFiles
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
select file#, ts#, blocks
from file$
where status$ = 2
and blocks <= 1
;
ps1 Varchar2(10) := 'HCKE-0007' ;
ps1a Varchar2(65) := 'Tiny File size in FILE$' ;
bug1 Varchar2(80) :=
'Ref : Bug:1646512' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 9.0 - Specifically: 8.1.7.3' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.4 9.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' FILE$ FILE#='||c1.file#||' has BLOCKS='||c1.blocks);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure PoorDefaultStorage
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
select tablespace_name, initial_extent, next_extent, min_extents,
pct_increase, max_extents
from dba_tablespaces
where (initial_extent < 1024*1024
or
contents='TEMPORARY')
and next_extent < 65536
and min_extlen < 65536
and pct_increase < 5
and max_extents > 3000
;
ps1 Varchar2(10) := 'HCKW-0002' ;
ps1a Varchar2(65) := 'Poor Default Storage Clauses For Tablespace' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line(chr(10)||ps1||': '||ps1a);
hout.put_line(' '||rpad('Tablespace',30)||rpad('Init',10)||
rpad('Next',10)||rpad('Min',10)||rpad('Pct',4)||
'MaxExtents');
ps1:=null;
End If ;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' '
||rpad(c1.tablespace_name,30)
||rpad(c1.initial_extent,10)
||rpad(c1.next_extent,10)
||rpad(c1.min_extents,10)
||rpad(c1.pct_increase,4)
||c1.max_extents );
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure PoorStorage
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select owner ,
segment_name,
segment_type,
next_extent ,
extents ,
pct_increase,
max_extents
From dba_segments
Where ( initial_extent < 65535
And next_extent < 65536
And pct_increase < 5
And max_extents > 3000
And extents > 500
) Or extents > 3000
;
ps1 Varchar2(10) := 'HCKW-0003' ;
ps1a Varchar2(65) := 'Poor Storage Clauses For Object(s)' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' '||rpad('Segment',50)||rpad('Next',10)||
rpad('Exts',7)||rpad('Pct',4)||
'MaxExtents' ) ;
End If;
--
hout.put_line(' '||
rpad(c1.segment_type||' '
||c1.owner||'.'
||c1.segment_name,50)
||rpad(c1.next_extent,10)
||rpad(c1.extents,7)
||rpad(c1.pct_increase,4)
||c1.max_extents );
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure MissTabSubPart
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select o.obj# part_obj# ,
o.owner# ,
o.name ,
o.subname ,
p.subpartcnt ,
p.bo# table_obj#
From obj$ o ,
tabcompart$ p
Where o.type# = 19 /* PARTITION */
and o.obj# = p.obj# /* Has subpartitions */
and p.subpartcnt = 0 /* Has No entries in tabsubpart$ */
;
Cursor sCur2 Is
Select o.obj# part_obj# ,
o.owner# ,
o.name ,
o.subname ,
p.subpartcnt ,
p.bo# index_obj#
from obj$ o ,
indcompart$ p
where o.type# = 20 /* INDEX PARTITION */
and o.obj# = p.obj# /* Has subpartitions */
and p.subpartcnt = 0 /* Has No entries in indsubpart$ */
;
ps1 Varchar2(10) := 'HCKE-0008' ;
ps1a Varchar2(65) := 'Missing TABSUBPART$ entry/entries' ;
bug1 Varchar2(80) :=
'Ref : Bug:1360714' ;
aff1 Varchar2(80) :=
'Affects: Vers >=8.1.5 and BELOW 9.0 - Specifically: 8.1.7.1' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.2 9.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
sMsg Boolean := FALSE ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
--
hout.put_line(
' TABLE '||Owner(c1.owner#)||'.'||c1.name||
' Partition '||c1.subname||
' PartObj#='||c1.part_obj#||' TabObj#='||c1.table_obj#
) ;
If ( IsLastPartition ( c1.table_obj# ) ) Then
hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
End If ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
Fatal := Fatal + 1 ;
End Loop ;
--
For c2 In sCur2 Loop
If (ps1 Is Not Null) Then
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
--
hout.put_line(
' INDEX '||Owner(c2.owner#)||'.'||c2.name||
' Partition '||c2.subname||
' PartObj#='||c2.part_obj#||' IndObj#='||c2.index_obj#);
If ( IsLastPartition ( c2.index_obj# ) ) Then
hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
End If;
Fatal := Fatal+1 ;
sMsg := TRUE ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
--
If ( sMsg ) Then
hout.put_line('There are probably orphaned SEG$ entry/s with this') ;
End If ;
End ;
--
Procedure PartSubPartMismatch
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select po.obj# obj# ,
u.name owner,
o.name name,
Decode(o.type#, 1, 'INDEX', 'TABLE') type ,
Decode(po.parttype,
1, 'RANGE' ,
2, 'HASH' ,
3, 'SYSTEM',
4, 'LIST' ,
'Unknown') part ,
Decode(Mod(po.spare2, 256),
0, 'NONE' ,
2, 'HASH' ,
3, 'SYSTEM',
4, 'LIST' ,
'Unknown') subpart
From partobj$ po ,
obj$ o ,
user$ u
dd损坏通常包括:
1. Data Dictionary Inconsistency, missing rows in tables:
- Tab$/Ind$ with no entries in OBJ$
- Undo$/Tab$/Ind$ with no entries in SEG$
- Seg$ with no entries in TAB$/IND$/OBJ$
tab$和ind$的条目在OBJ$中不存在;Undo$/Tab$/Ind$的条目在SEG$中不存在;Seg$的条目在TAB$/IND$/OBJ$中不存在
2. Missing data dictionary objects
DD对象丢失
3. Corrupted data dictionary objects (table, index, or table-index inconsistency)
DD对象损坏
4. Invalid entries in data dictionary tables.
DD表中存在无效对象
1. Identifying Objects with Data Dictionary Inconsistency
首先需要安装hcheck包,参见Note136697.1
In order to detect data dictionary inconsistency we need to run hcheck.full procedure, see Note 136697.1.
a. Connect as SYS schema in sqlplus
b. Create package hOut as described in Note 101468.1 先创建hOut包,该包主要用于控制hcheck系列程序的输出,见附件hout.sql
c. Create package hcheck in SYS schema as described in Note 136697.1 attachment.
d. set serveroutput on
c. execute hcheck.full
The script will report various dictionary related issues that may or may not be a problem.
Any problems reported should be reviewed by an experienced support analyst as some
reported "problems" may be normal and expected.
Example of HCHECK.FULL output:
Problem: Orphaned IND$ (no SEG$) - See Note 65987.1 (Bug:624613/3655873)
ORPHAN IND$: OBJ=200449 DOBJ=200449 TS=0 RFILE/BLOCK=0 0 BO#=200446 SegType=
^- May be OK. Needs manual check
ORPHAN IND$: OBJ=39442 DOBJ=39442 TS=14 RFILE/BLOCK=2 49 BO#=39438 SegType=
Problem: Orphaned TAB$ (no SEG$)
ORPHAN TAB$: OBJ=1817074 DOBJ=0 TS=0 RFILE/BLOCK=0 0 BOBJ#= SegType=
^- May be OK. Needs manual check
ORPHAN TAB$: OBJ=2149126 DOBJ=2149126 TS=19 RFILE/BLOCK=31 44291 BOBJ#= SegType=
Problem: Orphaned SEG$ Entry
ORPHAN SEG$: SegType=INDEX TS=20 RFILE/BLOCK=33 28435
Based on the hcheck.full output you will have to identify the objects that show a dd inconsistency, and verify the reported inconsistency.
Select name,type# from obj$ where obj#=<OBJ>; /* 1=INDEX, 2=TABLE, 3=CLUSTER, 21=LOB, 25=IOT
Select object_name,owner,object_type from dba_objects where object_id=<OBJ>;
Some of the problems, mainly the one marked as 'May be OK. Needs manual check ' could be a false alarm.
注意有些alarm未必是真的存在问题。
Check the type of the object.
Lob Index on temporary table or IOT do not have a segment, than the problem message is a false alarm.
例如:临时表的LOB索引或者IOT表的索引不存在段,但是hcheck会抛出一个alarm。
附:
1.hout.sql
***Checked for relevance on 27-MAR-2013***
REM ======================================================================
REM hout.sql Version 1.1 29 Dec 2000
REM
REM Purpose:
REM To provide an output package for the h*.sql series of scripts.
REM All h*.sql scripts use this package to output their results
REM This allows one package to control where output is sent
REM to.
REM Eg: This package can be coded to output to DBMS_OUTPUT
REM or to use the UTL_FILE calls if required.
REM
REM This version of the script can write to both DBMS_OUTPUT and
REM to the users trace file.
REM
REM Usage:
REM See Note:101466.1 for details of using this and other h* packages
REM
REM Depends on:
REM dbms_output , dbms_system
REM
REM Notes:
REM Must be installed in SYS schema
REM For Oracle 7.3, 8.0, 8.1, 9.0, 9.2, 10.1, 10.2, 11.1 and 11.2
REM server versions
REM
REM CAUTION
REM The sample program in this article is provided for educational
REM purposes only and is NOT supported by Oracle Support Services.
REM It has been tested internally, however, and works as documented.
REM We do not guarantee that it will work for you, so be sure to test
REM it in your environment before relying on it.
REM
REM ======================================================================
REM
create or replace package hOut as
--
-- Output options - change these to default as required
-- You can override them at run time if required.
--
TO_DBMS_OUTPUT boolean := TRUE; -- Send output to DBMS_OUTPUT
TO_USER_TRACE boolean := TRUE; -- Send output to user trace file
IGNORE_ERRORS boolean := TRUE; -- Ignore DBMS_OUTPUT errors if
-- also writing to the trace file
--
-- Output methods
--
procedure put_line(txt varchar2);
procedure put(txt varchar2);
procedure new_line;
procedure wrap(txt varchar2, linelen number default 78);
procedure rule_off;
--
end hOut;
/
show errors
create or replace package body hOut as
-- 7.3 has problems with ksdwrt as it uses the wrong length info
-- putting nonsense on the end of lines.
-- As a workaround we copy the text to a TMP varchar, append a chr(0)
-- then reset the length back so we have an hidden chr(0) at the end
-- of the string.
tmp varchar2(2001);
--
APP_EXCEPTION EXCEPTION;
pragma exception_init(APP_EXCEPTION, -20000);
--
procedure put_line(txt varchar2) is
begin
tmp:=txt||chr(0);
tmp:=txt;
if TO_DBMS_OUTPUT then
begin
dbms_output.put_line(txt);
exception
when APP_EXCEPTION then
-- If DBMS_OUTPUT is full then carry on if we are writing to
-- the trace file and ignoring errors, otherwise error now
if TO_USER_TRACE and IGNORE_ERRORS then
begin
dbms_output.put_line('[TRUNCATED]');
exception
when APP_EXCEPTION then
null;
end;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,tmp);
end if;
end;
--
procedure put(txt varchar2) is
begin
tmp:=txt||chr(0);
tmp:=txt;
if TO_DBMS_OUTPUT then
begin
dbms_output.put(txt);
exception
when APP_EXCEPTION then
-- If DBMS_OUTPUT is full then carry on if we are writing to
-- the trace file and ignoring errors, otherwise error now
if TO_USER_TRACE and IGNORE_ERRORS then
begin
dbms_output.put('[TRUNCATED]');
exception
when APP_EXCEPTION then
null;
end;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,tmp);
end if;
end;
--
procedure new_line is
begin
if TO_DBMS_OUTPUT then
begin
dbms_output.new_line;
exception
when APP_EXCEPTION then
if TO_USER_TRACE and IGNORE_ERRORS then
null;
else
raise;
end if;
end;
end if;
if TO_USER_TRACE then
dbms_system.ksdwrt(1,' ');
end if;
end;
--
procedure wrap(txt varchar2, linelen number default 78) is
p integer:=1;
len integer;
pos integer;
chunk varchar2(2000);
xchunk varchar2(2000);
llen number:=linelen;
BEGIN
if (llen>2000) then
llen:=2000;
end if;
if (llen<=1) then
llen:=78;
end if;
len:=length(txt);
while (p<=len) loop
chunk:=substr(txt,p,llen);
pos:=instr(chunk,chr(10),-1);
if pos>0 then
-- We have a CR in the text - use it
put_line(substr(chunk,1,pos-1));
p:=p+pos;
else
-- No CR in the text so we will look for a split character
xchunk:=translate(chunk,' ,()=',',,,,,');
pos:=instr(xchunk,',',-1);
if pos>0 and len>llen then
put_line(substr(chunk,1,pos));
p:=p+pos;
else
put(chunk);
p:=p+llen;
end if;
end if;
end loop;
new_line;
END;
--
procedure rule_off is
begin
put_line('=========================================================');
end;
--
begin
dbms_output.enable(100000);
end hout;
/
REM ====================
2.hcheck使用方法
SQL> set serveroutput on size unlimited
SQL> spool outputfile
SQL> execute hcheck.full
SQL> spool off
3.安装hcheck
先安装hOut,再安装hcheck2.sql(for 8i,不能运行于9I数据库)或hcheck3.sql(for 9i+)
4.hcheck3.sql
--
--------------------------------------------------------------------------
-- hcheck.sql Version 3.50 Tue Mar 26 14:20:38 CEST 2013
--
-- Purpose:
-- To provide a single package which looks for common data dictionary
-- problems.
-- Note that this version has not been checked with locally managed
-- tablespaces and may give spurious output if these are in use.
-- This script is for use mainly under the guidance of Oracle Support.
--
-- Usage:
-- SQL> set serverout on size unlimited
-- SQL> exec hcheck.full [(parameters)]
--
-- Where parameters are
-- Verbose In Boolean - Verbose Output
-- RunAll In Boolean - Run All procedures despite of Release
-- VerChk In Number - Check against 1st 'VerChk' release numbers
--
-- Output is to the hOut package to allow output to be redirected
-- as required
--
-- Depends on:
-- hOut
--
-- Notes:
-- Must be installed in SYS schema
-- This package is intended for use in Oracle releases 9i onwards
-- This package will NOT work in 8i or earlier.
-- In all cases any output reporting "problems" should be
-- parsed by an experienced Oracle Support analyst to confirm
-- if any action is required.
--
-- CAUTION
-- The sample program in this article is provided for educational
-- purposes only and is NOT supported by Oracle Support Services.
-- It has been tested internally, however, and works as documented.
-- We do not guarantee that it will work for you, so be sure to test
-- it in your environment before relying on it.
--
--------------------------------------------------------------------------
--
Create Or Replace Package hcheck Is
Type sFuncNam Is Table Of Varchar2(32) Index By Binary_integer ;
Type sFuncRel Is Table Of Varchar2(32) Index By Binary_integer ;
--
sFn sFuncNam ; /* Function Names */
sFr sFuncRel ; /* Version Control: Fixed Release per function */
--
-- Procedure Definitions
--
Procedure SynLastDDLTim
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 1 */
Procedure LobNotInObj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 2 */
Procedure MissingOIDOnObjCol
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 3 */
Procedure SourceNotInObj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 4 */
Procedure IndIndparMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 5 */
Procedure InvCorrAudit
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 6 */
Procedure OversizedFiles
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 7 */
Procedure TinyFiles
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 8 */
Procedure PoorDefaultStorage
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 9 */
Procedure PoorStorage
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 10 */
Procedure MissTabSubPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 11 */
Procedure PartSubPartMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 12 */
Procedure TabPartCountMismatch
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 13 */
Procedure OrphanedTabComPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 14 */
Procedure ZeroTabSubPart
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 15 */
Procedure MissingSum$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 16 */
Procedure MissingDir$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 17 */
Procedure DuplicateDataobj
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 18 */
Procedure ObjSynMissing
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 19 */
Procedure ObjSeqMissing
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 20 */
Procedure OrphanedUndo
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 22 */
Procedure OrphanedIndex
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 21 */
Procedure OrphanedIndexPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 23 */
Procedure OrphanedIndexSubPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 24 */
Procedure OrphanedTable
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 25 */
Procedure OrphanedTablePartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 26 */
Procedure OrphanedTableSubPartition
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 27 */
Procedure MissingPartCol
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 28 */
Procedure OrphanedSeg$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 29 */
Procedure OrphanedIndPartObj#
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 30 */
Procedure DuplicateBlockUse
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 31 */
Procedure HighObjectIds
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 32 */
Procedure PQsequence
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 33 */
Procedure TruncatedCluster
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 34 */
Procedure FetUet
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 35 */
Procedure Uet0Check
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 36 */
Procedure ExtentlessSeg
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 37 */
Procedure SeglessUET
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 38 */
Procedure BadInd$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 39 */
Procedure BadTab$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 40 */
Procedure BadIcolDepCnt
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 41 */
Procedure WarnIcolDep
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 42 */
Procedure OnlineRebuild$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 43 */
Procedure DropForceType
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 44 */
Procedure TrgAfterUpgrade
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 45 */
Procedure FailedInitJVMRun
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 46 */
Procedure TypeReusedAfterDrop
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 47 */
Procedure Idgen1$TTS
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 48 */
Procedure DroppedFuncIdx
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 49 */
Procedure BadOwner
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 50 */
Procedure UpgCheckc0801070
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 51 */
Procedure BadPublicObjects
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 52 */
Procedure BadSegFreelist
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 53 */
Procedure BadCol#
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 54 */
Procedure BadDepends
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 55 */
Procedure CheckDual
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 56 */
Procedure ObjectNames
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 57 */
Procedure BadCboHiLo
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 58 */
Procedure ChkIotTs
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 59 */
Procedure NoSegmentIndex
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 60 */
Procedure BadNextObject
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 61 */
Procedure OrphanIndopt
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 62 */
Procedure UpgFlgBitTmp
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 63 */
Procedure RenCharView
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 64 */
Procedure Upg9iTab$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 65 */
Procedure Upg9iTsInd
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 66 */
Procedure Upg10gInd$
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 67 */
Procedure DroppedROTS
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 68 */
Procedure ChrLenSmtcs
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 69 */
Procedure FilBlkZero
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 70 */
Procedure DbmsSchemaCopy
(nF In Number Default 0, VerChk In Number Default 5,
Verbose In Boolean Default FALSE) ; /* 71 */
--
bRun Boolean ;
nFunc Number := 71 ; /* should be equal-to, not one-greater-than, the */
/* highest expected number of procedures to be run */
--
-- Function CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number ;
-- Procedure ChecknCatVnFR ( nCatV In Number, nFR In Number ) ;
--
-- Main
--
Procedure Full (Verbose In Boolean Default FALSE,
RunAll In Boolean Default FALSE,
VerChk In Number Default 5) ;
End hcheck;
/
Create Or Replace Package Body hcheck Is
Ver Varchar2(10) := '9i+/hc3.50';
Warn Number :=0 ;
Fatal Number :=0 ;
CatV Varchar2(10) ;
nCatV Number :=0 ;
Verbose Boolean ;
nFR Number :=0 ; /* Fixed Release */
--
Function InitsFr Return sFuncRel Is
AllReleases Varchar2(32) := '99.99.99.99.99' ;
Begin
--
-- Highest Relevant Release For Functions
-- If check against all releases, specify '99.99.99.99.99'
--
sFr (0) := AllReleases ; /* 0 */
sFr (1) := '10.1.0.2.0' ; /* 1 */
sFr (2) := '10.0.0.2.0' ; /* 2 */
sFr (3) := AllReleases ; /* 3 */
sFr (4) := '10.2.0.1.0' ; /* 4 */
sFr (5) := '11.2.0.1.0' ; /* 5 */
sFr (6) := '11.2.0.1.0' ; /* 6 */
sFr (7) := AllReleases ; /* 7 */
sFr (8) := '9.0.1.0.0' ; /* 8 */
sFr (9) := AllReleases ; /* 9 */
sFr(10) := AllReleases ; /* 10 */
sFr(11) := '9.0.1.0.0' ; /* 11 */
sFr(12) := '11.2.0.1.0' ; /* 12 */
sFr(13) := AllReleases ; /* 13 */
sFr(14) := '9.0.1.0.0' ; /* 13 */
sFr(15) := '9.2.0.1.0' ; /* 15 */
sFr(16) := AllReleases ; /* 16 */
sFr(17) := AllReleases ; /* 17 */
sFr(18) := AllReleases ; /* 18 */
sFr(19) := AllReleases ; /* 19 */
sFr(20) := AllReleases ; /* 20 */
sFr(21) := AllReleases ; /* 21 */
sFr(22) := AllReleases ; /* 22 */
sFr(23) := AllReleases ; /* 23 */
sFr(24) := AllReleases ; /* 24 */
sFr(25) := AllReleases ; /* 25 */
sFr(26) := AllReleases ; /* 26 */
sFr(27) := AllReleases ; /* 27 */
sFr(28) := AllReleases ; /* 28 */
sFr(29) := AllReleases ; /* 29 */
sFr(30) := '11.1.0.6.0' ; /* 30 */
sFr(31) := AllReleases ; /* 31 */
sFr(32) := '8.1.6.0.0' ; /* 32 */
sFr(33) := '8.0.6.0.0' ; /* 33 */
sFr(34) := '8.1.7.0.0' ; /* 34 */
sFr(35) := AllReleases ; /* 35 */
sFr(36) := AllReleases ; /* 36 */
sFr(37) := AllReleases ; /* 37 */
sFr(38) := AllReleases ; /* 38 */
sFr(39) := AllReleases ; /* 39 */
sFr(40) := AllReleases ; /* 40 */
sFr(41) := '11.1.0.7.0' ; /* 41 */
sFr(42) := '11.1.0.7.0' ; /* 42 */
sFr(43) := AllReleases ; /* 43 */
sFr(44) := '10.1.0.2.0' ; /* 44 */
sFr(45) := AllReleases ; /* 45 */
sFr(46) := AllReleases ; /* 46 */
sFr(47) := '9.0.1.0.0' ; /* 47 */
sFr(48) := '9.0.1.0.0' ; /* 48 */
sFr(49) := '9.2.0.1.0' ; /* 49 */
sFr(50) := '9.0.1.0.0' ; /* 50 */
sFr(51) := AllReleases ; /* 51 */
sFr(52) := AllReleases ; /* 52 */
sFr(53) := AllReleases ; /* 53 */
sFr(54) := '10.1.0.2.0' ; /* 54 */
sFr(55) := AllReleases ; /* 55 */
sFr(56) := AllReleases ; /* 56 */
sFr(57) := AllReleases ; /* 57 */
sFr(58) := AllReleases ; /* 58 */
sFr(59) := AllReleases ; /* 59 */
sFr(60) := AllReleases ; /* 60 */
sFr(61) := AllReleases ; /* 61 */
sFr(62) := '9.2.0.8.0' ; /* 62 */
sFr(63) := '10.1.0.1.0' ; /* 63 */
sFr(64) := '10.1.0.1.0' ; /* 64 */
sFr(65) := '9.2.0.4.0' ; /* 65 */
sFr(66) := '9.2.0.5.0' ; /* 66 */
sFr(67) := '10.2.0.0.0' ; /* 67 */
sFr(68) := AllReleases ; /* 68 */
sFr(69) := '11.1.0.6.0' ; /* 69 */
sFr(70) := AllReleases ; /* 70 */
sFr(71) := AllReleases ; /* 70 */
--
Return sFr ;
End ;
--
Function Owner (uid Number) Return Varchar2 Is
r Varchar2(30) := Null ;
Begin
Select name Into r
From user$
where user# = uid ;
return r ;
Exception
When NO_DATA_FOUND Then
Return ( '*UnknownOwnID='||uid||'*' ) ;
End ;
--
Function ObjName (objid Number) Return Varchar2 Is
r Varchar2(30) := Null ;
own Number ;
Begin
Select name, owner# Into r, own
From obj$
Where Obj# = objid ;
return r ;
Exception
When NO_DATA_FOUND Then
Return ( '*UnknownObjID='||objid||'*' ) ;
End ;
--
Function IsLastPartition( o number ) Return Boolean Is
n Number := 0 ;
Begin
Select partcnt Into n From partobj$ where obj#=o ;
If ( n>1 ) Then
Return(FALSE) ;
Else
Return(TRUE) ;
End If ;
End;
--
Function ObjectIsTemporary( o Number ) Return Boolean
-- Return TRUE if object is a TEMPORARY object
-- Return NULL if object does not exist
-- Return FALSE if object is not temporary
Is
Cursor cIsTemp Is
Select Bitand(nvl(flags,0), 2) IsTemp From obj$ Where obj#=o
;
ret Boolean := FALSE ;
begin
For R in cIsTemp Loop -- For loop just to keep cursor closed
If ( R.IsTemp=2 ) Then
ret := TRUE ;
End If;
End Loop ;
return ret ;
End;
--
Procedure DictAt( ts number, fi number, bl number ) is
Cursor cDictAt is
select typ, ts#,file#,block#,count('x') CNT
from (
select 'UNDO$' typ, u.ts#, u.file#, u.block# from undo$ u
where decode(u.status$,1,null,u.status$) is not null
UNION ALL
select 'TAB$' typ, a.ts#,a.file#,a.block# from tab$ a
UNION ALL
select 'CLU$' typ, b.ts#,b.file#,b.block# from clu$ b
UNION ALL
select 'TABPART$' typ, c.ts#,c.file#,c.block# from tabpart$ c
UNION ALL
select 'TABSUBPART$' typ, d.ts#,d.file#,d.block# from tabsubpart$ d
UNION ALL
select 'IND$' typ, e.ts#,e.file#,e.block# from ind$ e
UNION ALL
select 'INDPART$' typ, f.ts#,f.file#,f.block# from indpart$ f
UNION ALL
select 'INDSUBPART$' typ, g.ts#,g.file#,g.block# from indsubpart$ g
UNION ALL
select 'LOB$' typ, h.ts#,h.file#,h.block# from lob$ h
UNION ALL
select 'LOBFRAG$' typ, i.ts#,i.file#,i.block# from lobfrag$ i
-- UNION ALL
-- select 'RECYCLEBIN$' typ, j.ts#,j.file#,j.block# from recyclebin$ j
)
where ts#= TS and file# = FI and block#= BL
group by typ, ts#,file#,block#
;
Begin
For R in cDictAt
Loop
hout.put_line('^ '||R.typ||' has '||R.cnt||' rows');
End Loop;
End;
--
function IndexIsNosegment( o number ) return boolean is
Cursor cX is
select bitand(flags,4096) noseg from ind$ where obj#=o;
ret boolean:=null;
begin
For C in cX
loop
if C.noseg=4096 then
ret:=true;
else
ret:=false;
end if;
end loop;
return ret; /* true/false or NULL if not found */
end;
--
Procedure CheckIndPart( o number ) is
Cursor Cchk is
select i.obj#, i.dataobj#, i.ts#, i.file#, i.block#
from indpart$ i
where i.bo#=o
and (i.file#!=0 OR i.block#!=0);
begin
For R in Cchk Loop
hout.put_line(' ^- PROBLEM: Child INDPART$ with FILE/BLK (bug 4683380)');
hout.put_line(' ^- ( OBJ='||R.obj#|| ' DOBJ='||r.dataobj#||
' TS='||r.TS#||
' RFILE/BLOCK='||r.file#||' '||r.block#||')' );
Fatal:=Fatal+1;
end loop;
end;
--
Procedure ChecknCatVnFR ( nCatV In Number,
nFR In Number,
bRun In Out Boolean) Is
str1 Varchar2(10) := To_Char(nCatV) ;
str2 Varchar2(10) := To_Char(nFR) ;
Begin
Case
When ( nCatV = 0 ) Then
str1 := '*Any Rel*' ;
Else
Null ;
End Case ;
Case
When ( nFR = 9999999999 ) Then
str2 := '*All Rel*' ;
Else
Null ;
End Case ;
If ( nCatV > nFR ) Then
hout.put_line(Rpad(nCatv,10,' ')||' > '||Lpad(nFR,11,' ')||' : n/a');
bRun := FALSE ;
return ;
Else
hout.put_line(Rpad(str1,10,' ')||' <='||Lpad(str2,11,' ')||' : Ok') ;
bRun := TRUE ;
End If ;
End ;
--
Procedure strtok (tok In Out Varchar2, s In Out Varchar2, ct In Varchar2) Is
i Pls_integer ;
p Pls_integer ;
len Pls_integer ;
token_start Pls_integer ;
intoken Boolean := FALSE ;
Begin
-- dbms_output.put_line ( 'strtok string: '||s ) ;
If ( s Is Not NULL ) Then
len := length( s ) ;
i := 1 ;
While ( i <= len ) Loop
p := instr( ct, substr(s,i,1) );
If ( ( i = len ) Or ( p > 0 ) ) Then
If ( intoken ) Then
If ( p > 0 ) Then
tok := substr( s, token_start, i - token_start ) ;
s := substr( s, i+1 ) ;
Else
tok := substr( s, token_start, i - token_start + 1 ) ;
s := '' ;
End If ;
Exit When TRUE ;
End If ;
Elsif ( Not intoken ) Then
intoken := true ;
token_start := i ;
End If;
tok := s ;
i := i + 1 ;
End Loop;
End if;
End;
--
Function CatV2nCatV ( s In Varchar2, n in Number default 5 ) Return Number As
type tok is table of Number index by binary_integer ;
tk tok ;
scp varchar2(16) ;
i number := 1 ;
scv Varchar2(16) := Null ;
Begin
scp := s ;
for i in 1..n loop
tk(i) := Null ;
strtok( tk(i), scp, '.' );
scv := scv || Lpad(tk(i),2,'0') ;
end loop ;
return To_Number(scv) ;
end;
--
Procedure SynLastDDLTim
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
Cursor sCur1 Is
Select Distinct o.obj#, o.owner#, o.name
From obj$ o, idl_ub1$ i
Where type# = 5
And ctime != mtime
And i.obj# = o.obj# /* Has IDL information */
;
nFr Number ;
ps1 Varchar2(10) := 'HCKW-0001' ;
ps1a Varchar2(65) :=
'Synonym''s LAST_DDL_TIME != CREATED' ;
bug1 Varchar2(80) :=
'Ref : Bug:2371453' ;
aff1 Varchar2(80) := 'Affects: Vers >=8.1.7.2 and BELOW 10.1 - '||
'Specifically: 8.1.7.4 9.0.1.3 9.2.0.1' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.5 9.0.1.4 9.2.0.2 10.1.0.2' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note: 2371453.8 - CREATE OR REPLACE SYNONYM can lead to inconsistent';
not2 Varchar2(80) :=
' dictionary (old IDL data)' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 in sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OBJ#='||c1.OBJ#||' Name='||Owner(c1.owner#)||'.'||
c1.name);
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure LobNotInObj
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select l.obj#, l.lobj#
From lob$ l, obj$ o
Where l.lobj# = o.obj#(+)
And o.obj# is null
;
ps1 Varchar2(10) := 'HCKE-0001' ;
ps1a Varchar2(65) := 'LOB$.LOBJ# not found in OBJ$' ;
bug1 Varchar2(80) :=
'Ref : Bug:2405258' ;
aff1 Varchar2(80) :=
'Affects: Vers >=8 and BELOW 10.1 - Specifically: 9.2.0.1' ;
fix1 Varchar2(80) :=
'Fixed : 9.2.0.2 10.1.0.2' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note: 2405258.8 - Dictionary corruption / OERI(15265) from MOVE LOB' ;
not2 Varchar2(80) :=
' to existing segment name' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' LOB$.LOBJ# has no OBJ$ entry for LOBJ#='||c1.lobj#||
' (OBJ#='||c1.obj#||')');
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure MissingOIDOnObjCol
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select o.obj# , o.type#, o.owner#, o.name, c.col#, c.intcol#,
c.name cname, t.property
From obj$ o, col$ c, coltype$ ct, oid$ oi, tab$ t
Where o.obj# = ct.obj#
And ct.obj# = c.obj#
And ct.col# = c.col#
And ct.intcol# = c.intcol#
And oi.oid$(+) = ct.toid
And o.obj# = t.obj#(+)
And oi.oid$ is null
;
ps1 Varchar2(10) := 'HCKE-0002' ;
ps1a Varchar2(65) := 'Object type column with missing OID$' ;
bug1 Varchar2(80) :=
'Ref : Bug:2728624' ;
aff1 Varchar2(80) :=
'Affects: Closed as not a Bug (92)' ;
fix1 Varchar2(80) :=
'Fixed : See Note.229583.1 for patching steps' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note.229583.1 - Bug:2728624 - Confirmation and Patching Notes' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OBJ#='||c1.obj#||' Name='||Owner(c1.owner#)||'.'
||c1.name||' IntCol#='||c1.intcol#||'='||c1.cname
||' TabProp='||c1.property);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure SourceNotInObj
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select Count('x') cnt, Count(Distinct s.obj#) nobj
From source$ s, obj$ o
Where s.obj# = o.obj#(+)
And o.obj# is null
Having Count('x') > 0
;
ps1 Varchar2(10) := 'HCKE-0003' ;
ps1a Varchar2(65) := 'SOURCE$ for OBJ# not in OBJ$' ;
bug1 Varchar2(80) :=
'Ref : Bug:3532977' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 10.2 Specifically: 9.2.0.4 10.1.0.4' ;
fix1 Varchar2(80) :=
'Fixed : 9.2.0.8 10.1.0.5 10.2.0.1' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line('SOURCE$ has '||c1.cnt||
' rows for '||c1.nobj||' OBJ# values not in OBJ$' ) ;
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure IndIndparMismatch
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select io.obj# io, io.name ionam, ipo.obj# ipo, ipo.name iponam
From obj$ io, indpart$ ip, obj$ ipo
Where ipo.type# = 20 /* IND PART */
And ip.obj# = ipo.obj#
And io.obj# (+) = ip.bo#
And nvl(io.name,'"') != ipo.name
;
ps1 Varchar2(10) := 'HCKE-0004' ;
ps1a Varchar2(65) := 'OBJ$.NAME mismatch for INDEX v INDEX PARTITION' ;
bug1 Varchar2(80) :=
'Ref : Bug:3753873' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 11.2 - Specifically: All 9.2 rels '||
'(9.2.0.4 through 9.2.0.8)' ;
aff2 Varchar2(80) :=
' 10.1.0.5 10.2.0.1 10.2.0.2 10.2.0.3 10.2.0.4 11.1.0.7' ;
fix1 Varchar2(80) :=
'Fixed : 11.2.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:3753873.8 - Minor dictionary corruption from DROP COLUMN' ;
not2 Varchar2(80) :=
' of partitioned table with LOB' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (aff2 Is Not Null) Then hout.put_line(aff2); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
if (not2 Is Not Null) Then hout.put_line(not2); not2:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' Ind Part OBJ$.OBJ# '||c1.ipo||' '||c1.iponam||
'!='||c1.ionam||' OBJ#='||c1.io);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure InvCorrAudit
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select decode(aud.user#,
0, 'ANY CLIENT',
1, Null ,
client.name) username ,
proxy.name proxyname,
prv.name privilege,
decode(aud.success,
1, 'BY SESSION',
2, 'BY ACCESS' ,
'NOT SET') success ,
decode(aud.failure,
1, 'BY SESSION',
2, 'BY ACCESS' ,
'NOT SET') failure
From sys.user$ client ,
sys.user$ proxy ,
system_privilege_map prv ,
sys.audit$ aud
Where aud.option# = -prv.privilege
and aud.user# = client.user#
-- and aud.user# != 1 /* PUBLIC */
and aud.user# = 0 /* SYS */
and aud.proxy# = proxy.user# (+)
and aud.proxy# is null
;
ps1 Varchar2(10) := 'HCKE-0005' ;
ps1a Varchar2(65) := 'Invalid/Corrupted AUDIT$ entries' ;
bug1 Varchar2(80) :=
'Ref : Bug:6310840' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 11.2 - Specifically: 11.1.0.6' ;
fix1 Varchar2(80) :=
'Fixed : 11.1.0.7 11.2.0.1' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note.455565.1: Corrupted entries in DBA_PRIV_AUDIT_OPTS' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
variant Varchar2(30) := Null ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
If (c1.username = 'ANY CLIENT')
Then
variant := 'Corrupted -' ;
Else
variant := 'Invalid -' ;
End If ;
hout.put_line(variant||' USER#='''||c1.username||''' OPTION='''||
c1.privilege||''' SUCCESS='''||c1.success||''' FAILURE='''||
c1.failure||'''');
Fatal := Fatal + 1 ;
End Loop;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End;
--
Procedure OversizedFiles
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select f.ts# TS, f.relfile# RFILE, f.file# AFILE, v.name NAME, f.blocks
From ts$ ts, file$ f, v$datafile v
Where ts.ts# = f.ts#
And v.file# = f.file#
And f.blocks > 4194303 -- (4M -1 blocks)
And bitand(ts.flags,256) != 256
Order By f.ts#, f.relfile#
;
ps1 Varchar2(10) := 'HCKE-0006' ;
ps1a Varchar2(65) := 'Oversized datafile (blocks>4194303)' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' OVERSIZED FILE ('||c1.blocks||' blocks) TS='||c1.TS||
' RFILE='||c1.RFILE||
' ABS='||c1.AFILE||' Name='||c1.NAME);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure TinyFiles
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
select file#, ts#, blocks
from file$
where status$ = 2
and blocks <= 1
;
ps1 Varchar2(10) := 'HCKE-0007' ;
ps1a Varchar2(65) := 'Tiny File size in FILE$' ;
bug1 Varchar2(80) :=
'Ref : Bug:1646512' ;
aff1 Varchar2(80) :=
'Affects: Vers BELOW 9.0 - Specifically: 8.1.7.3' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.4 9.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' FILE$ FILE#='||c1.file#||' has BLOCKS='||c1.blocks);
Fatal := Fatal + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure PoorDefaultStorage
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
select tablespace_name, initial_extent, next_extent, min_extents,
pct_increase, max_extents
from dba_tablespaces
where (initial_extent < 1024*1024
or
contents='TEMPORARY')
and next_extent < 65536
and min_extlen < 65536
and pct_increase < 5
and max_extents > 3000
;
ps1 Varchar2(10) := 'HCKW-0002' ;
ps1a Varchar2(65) := 'Poor Default Storage Clauses For Tablespace' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line(chr(10)||ps1||': '||ps1a);
hout.put_line(' '||rpad('Tablespace',30)||rpad('Init',10)||
rpad('Next',10)||rpad('Min',10)||rpad('Pct',4)||
'MaxExtents');
ps1:=null;
End If ;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' '
||rpad(c1.tablespace_name,30)
||rpad(c1.initial_extent,10)
||rpad(c1.next_extent,10)
||rpad(c1.min_extents,10)
||rpad(c1.pct_increase,4)
||c1.max_extents );
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure PoorStorage
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select owner ,
segment_name,
segment_type,
next_extent ,
extents ,
pct_increase,
max_extents
From dba_segments
Where ( initial_extent < 65535
And next_extent < 65536
And pct_increase < 5
And max_extents > 3000
And extents > 500
) Or extents > 3000
;
ps1 Varchar2(10) := 'HCKW-0003' ;
ps1a Varchar2(65) := 'Poor Storage Clauses For Object(s)' ;
bug1 Varchar2(80) := Null ;
aff1 Varchar2(80) := Null ;
fix1 Varchar2(80) := Null ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) :=
'Note:50380.1 - ALERT: Using UNLIMITED Extent Format' ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
hout.put_line(' '||rpad('Segment',50)||rpad('Next',10)||
rpad('Exts',7)||rpad('Pct',4)||
'MaxExtents' ) ;
End If;
--
hout.put_line(' '||
rpad(c1.segment_type||' '
||c1.owner||'.'
||c1.segment_name,50)
||rpad(c1.next_extent,10)
||rpad(c1.extents,7)
||rpad(c1.pct_increase,4)
||c1.max_extents );
Warn := Warn + 1 ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
End ;
--
Procedure MissTabSubPart
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select o.obj# part_obj# ,
o.owner# ,
o.name ,
o.subname ,
p.subpartcnt ,
p.bo# table_obj#
From obj$ o ,
tabcompart$ p
Where o.type# = 19 /* PARTITION */
and o.obj# = p.obj# /* Has subpartitions */
and p.subpartcnt = 0 /* Has No entries in tabsubpart$ */
;
Cursor sCur2 Is
Select o.obj# part_obj# ,
o.owner# ,
o.name ,
o.subname ,
p.subpartcnt ,
p.bo# index_obj#
from obj$ o ,
indcompart$ p
where o.type# = 20 /* INDEX PARTITION */
and o.obj# = p.obj# /* Has subpartitions */
and p.subpartcnt = 0 /* Has No entries in indsubpart$ */
;
ps1 Varchar2(10) := 'HCKE-0008' ;
ps1a Varchar2(65) := 'Missing TABSUBPART$ entry/entries' ;
bug1 Varchar2(80) :=
'Ref : Bug:1360714' ;
aff1 Varchar2(80) :=
'Affects: Vers >=8.1.5 and BELOW 9.0 - Specifically: 8.1.7.1' ;
fix1 Varchar2(80) :=
'Fixed : 8.1.7.2 9.0.1.0' ;
tag1 Varchar2(80) :=
'CORR/DIC HCHECK '||ps1 ;
not1 Varchar2(80) := Null ;
CursorRun Boolean := FALSE ; V Boolean := Verbose ;
sMsg Boolean := FALSE ;
Begin
If ( nF = 0) Then
sFr := InitsFr ;
End If ;
nFr := hcheck.CatV2nCatV ( sFr(nF), VerChk );
ChecknCatVnFR (nCatV, nFR, bRun) ;
If ( bRun = FALSE ) Then return ; End If ;
For c1 In sCur1 Loop
If (ps1 Is Not Null) Then
CursorRun := TRUE ;
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
--
hout.put_line(
' TABLE '||Owner(c1.owner#)||'.'||c1.name||
' Partition '||c1.subname||
' PartObj#='||c1.part_obj#||' TabObj#='||c1.table_obj#
) ;
If ( IsLastPartition ( c1.table_obj# ) ) Then
hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
End If ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
Fatal := Fatal + 1 ;
End Loop ;
--
For c2 In sCur2 Loop
If (ps1 Is Not Null) Then
hout.put_line (chr(10)||ps1||': '||ps1a) ;
ps1:=null;
End If;
If ( V ) Then
if (bug1 Is Not Null) Then hout.put_line(bug1); bug1:=null; End If;
if (aff1 Is Not Null) Then hout.put_line(aff1); aff1:=null; End If;
if (fix1 Is Not Null) Then hout.put_line(fix1); fix1:=null; End If;
if (tag1 Is Not Null) Then hout.put_line(tag1); tag1:=null; End If;
if (not1 Is Not Null) Then hout.put_line(not1); not1:=null; End If;
hout.put(chr(10)); V := FALSE ;
End If ;
--
hout.put_line(
' INDEX '||Owner(c2.owner#)||'.'||c2.name||
' Partition '||c2.subname||
' PartObj#='||c2.part_obj#||' IndObj#='||c2.index_obj#);
If ( IsLastPartition ( c2.index_obj# ) ) Then
hout.put_line(' ^^ PARTOBJ$.PARTCNT<=1 - non standard corruption') ;
End If;
Fatal := Fatal+1 ;
sMsg := TRUE ;
End Loop ;
If ( CursorRun ) Then hout.put(chr(10)) ; End If ;
--
If ( sMsg ) Then
hout.put_line('There are probably orphaned SEG$ entry/s with this') ;
End If ;
End ;
--
Procedure PartSubPartMismatch
(nF In Number Default 0,
VerChk In Number Default 5,
Verbose In Boolean Default FALSE)
Is
nFr Number ;
Cursor sCur1 Is
Select po.obj# obj# ,
u.name owner,
o.name name,
Decode(o.type#, 1, 'INDEX', 'TABLE') type ,
Decode(po.parttype,
1, 'RANGE' ,
2, 'HASH' ,
3, 'SYSTEM',
4, 'LIST' ,
'Unknown') part ,
Decode(Mod(po.spare2, 256),
0, 'NONE' ,
2, 'HASH' ,
3, 'SYSTEM',
4, 'LIST' ,
'Unknown') subpart
From partobj$ po ,
obj$ o ,
user$ u