ORA 1578 error
Hi to all
when i am running DB13 for check database it is getting terminated. In system log it is giving ORA 1578 oracle block corrupted. when i go to brtools to run
command
brbackup -w only_dbv -c -t online it is giving error username and password not found
let me of the possible solution.
Thanks & regards
saurabh
Login as root
switch to ora<SID>,then execute the command
brbackup -u / -c force -w only_dbv -p init<SID>.sap -m ALL
Then you will not get this username and password not found.
Make sure that in your init<SID>.sap the back up type is specified as ONLINE or copy your init<SID>.sap to init<SID>.1.sap and change the type of backup to ONLINE in this file and use this as profile file in the command.
e.g. brbackup -u / -c force -w only_dbv -p init<SID>.1.sap -m ALL
Also see help block corrupted in PRD: how truncate a table?
Similar Messages
-
BLOCK CORRUPTION (ORACLE8 에서 ORA-1578 조치방법)
제품 : ORACLE SERVER
작성날짜 : 2002-04-26
BLOCK CORRUPTION (ORACLE8 에서 ORA-1578 조치방법)
================================================
PURPOSE
본 bulletin 에서는 Oracle8 에서의 data block corruption error
(ORA-1578) 에 대해서 조치방법을 알아본다.
BACKGROUND
ORA-1578 은 data block 에 corruption 이 생긴 경우에 발생한다.
이 error 는 corruption 이 발생한 곳의 file number 와 block
number 를 알려준다.
본 bulletin 에서는 file number 를 'f', block number 를 'b' 로
지칭하기로 한다. ORA-1578 과 함께 return 되는 file number는
relative file number 가 아닌 absolute file number 를 의미한다.
(Oracle8 에서 새롭게 소개된 relative file number 에 대해서는 본
bulletin 의 6번 항목에서 다루도록 한다.)
RESOLUTION
1. 최선의 해결책은 backup 받아둔 file 을 restore 한 후
recover 작업을 하는 것이다. 이 작업을 위해서는 archive
log mode 로 운영 중이어야 한다.
dba_data_files 또는 v$datafile 과 ORA-1578 error 에서
return 된 absolute file number 를 이용하여 corruption이
발생한 datafile 의 이름을 알아낼 수 있다.
Oracle8 에서는, dba_data_files 에 absolute file number
(file_id) 와 함께 relative file number (relative_fno) 를
가지고 있다.
v$datafile 에는 아직 absolute file number (file#) 만을 가진다.
backup 을 restore 하기 전에 hardware 의 문제를 fix 해야 할
필요가 있을 수 있다. 만약 corruption 이 disk 불량에 의해
발생하였다면, backup 받아둔 datafile 을 문제가 없는 disk 에
restore 하고, startup mount 한 후, 새로운 위치로 datafile
rename 을 하고 recover 한다.
만약 해당 datafile 이 system tablespace 에 속하지 않는다면
offline tablespace recovery 도 가능하다.
2. backup datafile 을 restore 하고 recover 하지 않을 것이라면
우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야
한다.
다음의 SQL 문을 이용한다.
SELECT owner, segment_name, segment_type, relative_fno
FROM dba_extents
WHERE file_id = f
AND b BETWEEN block_id AND block_id + blocks - 1 ;
3. 해당 segment 가 non-data dictionary index라면, 해당 index를
drop 한 후 재생성한다.
4. 해당 segment 가 table 이라면, corruption 이 발생한 block 의
data 는 소실된 것이다.
5. 만약 해당 table 에 대한 최근의 export dump file이 존재한다면,
해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
최근의 export dump file 이 없거나 이를 export 받을 수 있는
최근의 backup 이 없다면 다음과 같은 방법을 이용할 수 있다.
6. corruption 이 발생한 non-clustered table 에서 corrupted
block 을 access 하지 않고 나머지 data 들을 select 할 수
있도록 ROWID 를 이용할 수 있다. non-clustered table의 모든
row 들은 해당 row 의 물리적인 주소를 가리키는 고유한 ROWID를
갖는다(해당 row가 여러 block에 조각이 나 있다면 첫번째 조각에
대한 주소). clustered table 인 경우에는 서로 다른 table 의
data 들이 같은 block 에 존재할 수 있으며, 같은 ROWID 를 가질
수 있다.
Oracle 은 index 를 구성하기 위하여 내부적으로 ROWID 를 사용한다.
따라서 where 절에 ROWID 를 사용하여 select 하면 강제로 range
scan 를 할 수 있다.
Oracle8 에서는 이를 위하여 ROWID hint 를 사용할 필요가
없어졌다.
ROWID 를 이용하여 table 로부터 data 를 추출하기
예제로써 ACCT_NO, PERSON, WEEKNO 등의 column 으로 구성된
SCOTT user의 EXAMPLE 이라는 table 이 있다고 가정한다.
이때, ORA-1578 "ORACLE data block corrupted (file # 5,
block # 2) 가
발생하였다고 가정하자.
ROWID in Oracle8 :
Oracle8 에서의 ROWID 는 'OOOOOOFFFBBBBBBSSS' format 을 가진다.
OOOOOO = data object number
Oracle7 의 object_id 와는 별도로 segment 의 id 를 갖는다.
dba_objects 의 data_object_id 에서 확인가능
FFF = relative file number
BBBBBB = block number
SSS = row number
Oracle8에서의 ROWID 는 absolute file number 가 아닌 relative
file number 를 갖는다는 점에 주목해야 한다.
relative file number 는 tablespace 에 대해 상대적이며
(tablespace마다 첫번째, 두번째, 세번째 datafile 을 가질 수
있음을 의미) absolute file number 는 전체 database 내에서
고유하다. 두개의 서로다른 file 들이 동일한 relative file
number를 가질 수 있다.
만약 EXAMPLE table 에서 ACCT_NO, ROWID 를 select하면 다음과
같은 결과가 나올 수 있다.
ACCT_NO ROWID
12345 AAAAh3AAGAAACJAAAA
19283 AAAAh3AAGAAACJAAAB
22345 AAAAh4AAFAAAAADAAA
60372 AAAAh4AAFAAAAADAAB
33456 AAAAh5AAEAAAAIuAAA
29473 AAAAh5AAEAAAAIuAAB
이러한 format 을 extended ROWID character format 이라고
지칭한다.
extended ROWID 는 number 이므로 substr 함수를 이용하여
extended ROWID 로부터 일부를 떼어낼 수 없다.
ROWID 를 생성하기 위해서는 모든 component 를 알아야 한다.
그런다음, DBMS_ROWID package 의 function 을 이용하여 ROWID 를
생성할 수 있다.
function rowid_create(rowid_type IN number,
object_number IN number,
relative_fno IN number,
block_number IN number,
row_number IN number)
return rowid;
pragma RESTRICT_REFERENCES(rowid_create,WNDS,RNDS,WNPS,RNPS);
-- rowid_type - type (restricted=0/extended=1)
-- object_number - data object number
(rowid_object_undefined for )
-- restricted
-- relative_fno - relative file number
-- block_number - block number in this file
-- file_number - file number in this block
corruption 이 발생한 block 의 data object number 를 알기
위해서는 dba_objects 를 조회한다.
SELECT data_object_id FROM dba_objects
WHERE owner = 'SCOTT'
AND object_name = 'EXAMPLE' ;
DATA_OBJECT_ID
2168
우리는 이미, 위에서 사용한 다음의 SQL 에 의해서 relative file
number 를 알고 있다.
SELECT owner, segment_name, segment_type, relative_fno
FROM dba_extents
WHERE file_id = 5
AND 2 BETWEEN block_id AND block_id + blocks - 1 ;
OWNER SEGMENT_NAME SEGMENT_TYPE RELATIVE_F
SCOTT EXAMPLE TABLE 5
corruption 이 발생한 block 이 2이므로, block# 2 이전의 access
가능한 마지막 ROWID 는 block# 1 에 존재한다. 그리고 block# 2
이후의 access 가능한 첫 ROWID 는 block# 3에 존재한다. block
안에 몇개의 row number 가 존재할 지 모르므로 row number 0 을
이용한다.
이제 corrupted block 이전의 ROWID 와 이후의 ROWID 를 생성할
준비가 끝났다.
corrupted block 이전의 ROWID :
SELECT DBMS_ROWID.ROWID_CREATE(1,2168,5,1,0) FROM example ;
DBMS_ROWID.ROWID_C
AAAAh4AAFAAAAABAAA
corrupted block 이후의 ROWID :
SELECT DBMS_ROWID.ROWID_CREATE(1,2168,5,3,0) FROM example ;
DBMS_ROWID.ROWID_C
AAAAh4AAFAAAAADAAA
다음으로, EXAMPLE table 과 같은 spec 으로 table 을 하나 만든다.
CREATE TABLE temp AS SELECT * FROM example WHERE 1=2;
그리고 corrupted block 이외의 block 에서 data 를 추출하여
insert 한다.
INSERT INTO temp SELECT * FROM example
WHERE ROWID <= 'AAAAh4AAFAAAAABAAA';
INSERT INTO temp SELECT * FROM example
WHERE ROWID >= 'AAAAh4AAFAAAAADAAA';
이후 원본 table 을 drop 하고, TEMP 를 rename 한다.
7. 만약 data dictionary 에 속하는 table, index 또는 rollback
segment에 corrupted block 이 발생하였다면 Oracle Support 의
지원을 받는다.
8. 일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다.
하지만 만약에 ORA-600[3374] 가 발생한다면 memory 상에서
corruption 이 발생한 경우이다.
이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
Reference Documents
--------------------Hello,
Please check the link i posted.
Example: Detecting Corruption
The CHECK_OBJECT procedure checks the specified object, and populates the repair table with information about corruptions and repair directives. You can optionally specify a range, partition name, or subpartition name when you want to check a portion of an object.
Validation consists of checking all blocks in the object that have not previously been marked corrupt. For each block, the transaction and data layer portions are checked for self consistency. During CHECK_OBJECT, if a block is encountered that has a corrupt buffer cache header, then that block is skipped.
The following is an example of executing the CHECK_OBJECT procedure for the scott.dept table.
SET SERVEROUTPUT ON
DECLARE num_corrupt INT;
BEGIN
num_corrupt := 0;
DBMS_REPAIR.CHECK_OBJECT (
SCHEMA_NAME => 'SCOTT',
OBJECT_NAME => 'DEPT',
REPAIR_TABLE_NAME => 'REPAIR_TABLE',
CORRUPT_COUNT => num_corrupt);
DBMS_OUTPUT.PUT_LINE('number corrupt: ' || TO_CHAR (num_corrupt));
END;
SQL*Plus outputs the following line, indicating one corruption:
number corrupt: 1 -
제품 : ORACLE SERVER
작성날짜 : 2002-04-12
LAST ORA-1578 RECOVERY METHOD
=============================
Purpose
Ora-1578 error 에 대한 조치 방법에 대해 이해하도록 합니다.
Problem Description
일반적으로
ORA-1578 : ORACLE data block corrupted (file # num,block # num)
은 해당 objects를 drop하고 recreate하여 처리할 수 있읍니다.
하지만, backup이 안되어 있거나 되어 있더라도 시점에 문제가 생기면,
당황할 수 밖에 없습니다.
Solution Description
이 자료에서는 손상된 db block만을 제외한 다른 block들을 recover하는
방법을 알려 드립니다.
1. 손상된 table과 똑같은 spec의 new table생성
2. 아래의 pl/sql 실행
** This program uses a cursor to select the ROWID from INDEX
** for the corrupted table. And insert the all of the normal rows
** into the new table.
DECLARE
CURSOR c1 is
SELECT ROWID FROM corrupted_table
WHERE indexed_column > smallest_value_of_the_indexes
AND SUBSTR(ROWID,1,8) != '000005DA';
/* Here,the value of '000005DA' is displayed in decimal
when ORA-1578 error happens. */
rowid_value CHAR(18);
count_value NUMBER;
BEGIN
OPEN c1;
FOR i IN 1..total_number_of_the_rows_from_corrupted_table LOOP
FETCH c1 INTO rowid_value;
EXIT WHEN c1%NOTFOUND;
INSERT INTO new_table
SELECT * FROM corrupted_table WHERE ROWID = rowid_value;
count_value := count_value + 1;
IF count_value = 10000 THEN /* Let's think commit per 10000 rows */
COMMIT;
count_value := 0;
END-IF;
END LOOP;
CLOSE c1;
END;
3. new table의 data건수등 확인후에 기존 table을 다른 이름으로
rename한 후 new table을 original table name으로 rename
SQL> rename corrupted_table to table_save;
SQL> rename new_table to corrupted_table;
4. 필요한 index생성이나 constraint enable
5. 손상된 row에 대한 내용은,
최소한 primary key나 indexed columns에 대한 내용을
SQL> spool chk.log
SQL> select rowid,indexed_column1,indexed_column2,indexed_column3...
from corrupted_table
where indexed_column1 > smallest_value_of_the_index;
SQL> spool off
를 통하여 chk.log에 저장후,
SQL> select count(*) from corrupted_table;
혹은 table export등을 통하여 확인된 rowid의 block number를 비교하여
보면 됩니다.
주의사항은 여기에서 ora-1578과 동반되는 block number는 decimal이니,
hexa로 환산해야 합니다.you did not try to recover the datafile until get syncronyns with the controlfile ?
RECOVER
RECOVER {general | managed | END BACKUP}
where the general clause has the following syntax:
[AUTOMATIC] [FROM location]
{ {full_database_recovery | partial_database_recovery |LOGFILE filename}
[ {TEST | ALLOW integer CORRUPTION } [TEST | ALLOW integer CORRUPTION ]...]
|CONTINUE [DEFAULT]|CANCEL}
where the full_database_recovery clause has the following syntax:
[STANDBY] DATABASE
[ {UNTIL {CANCEL | TIME date | CHANGE integer} | USING BACKUP CONTROLFILE}
[UNTIL {CANCEL | TIME date | CHANGE integer} | USING BACKUP CONTROLFILE]...]
where the partial_database_recovery clause has the following syntax:
{TABLESPACE tablespace [, tablespace]... | DATAFILE datafilename [, datafilename]...
| STANDBY
{TABLESPACE tablespace [, tablespace]... | DATAFILE datafilename [, datafilename]...}
UNTIL [CONSISTENT] [WITH] CONTROLFILE }
where the managed clause has the following syntax:
MANAGED STANDBY DATABASE
[ {NODELAY | [TIMEOUT] integer | CANCEL [IMMEDIATE] [NOWAIT]}
| [DISCONNECT [FROM SESSION] ] [FINISH [NOWAIT] ] ]
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a90842/ch13.htm#1010523
Joel P�rez -
Hi exports,
I have Ora-1578 error and Ora-1110,
plz how to retify the problem help me
Best regardsOracle says
ORA-01578 ORACLE data block corrupted (file # string, block # string)
This error shows that particular data block corrupted. Run the following query. For FILE_ID and BLOCK_ID, take the values from above message.
SELECT SEGMENT_TYPE,OWNER||'.'||SEGMENT_NAME FROM DBA_EXTENTS
WHERE file = FILE_ID AND block BETWEEN BLOCK_ID AND BLOCK_ID+BLOCKS -1;
Try to restore the segment containing the block indicated. This may involve dropping the segment and re-creating it. If there is a trace file, report the errors in it to Oracle Support Services.
ORA-01110 is associated with ORA-01578.
-aijaz -
BLOCK CORRUPTION (ORA-1578) 처리 (ORACLE 8I NEW FEATURE)
제품 : ORACLE SERVER
작성날짜 : 2002-05-31
BLOCK CORRUPTION (ORA-1578) 처리 (ORACLE 8I NEW FEATURE)
========================================================
PURPOSE
Block Corruption의 처리 방안에 대해 알아본다.
Problem Description
block corruption 시 10210, 10211,10231 의 event 를 사용해서
해당 block 을 skip 할 수도 있지만 V8.1 이상에서는
dbms_repair.fix_corrupt_blocks ,
dbms_repair.skip_corrupt_block 를 이용하여
corrupt가 발생한 block을 detect하고 skip, 또는 repair해주는 방안이
제시되고 있다.
Workaround
Solution Description
- 먼저 detecting 을 위해 db_block_checking =true 를 init.ora 에 set
- dbms_repair 의 package 를 사용하는데 이 package 는 dbmsrpr.sql,
prvtrpr.plb를 수행한다 .
- sys 로 접속하여 package 를 실행한다.
다음의 예제를 살펴보자
T1 테이블에 corrupt 된 block 이 있다고 가정한다.
SQL> desc t1
Name Null? Type
COL1 NOT NULL NUMBER(38)
COL2 CHAR(512)
SQL> analyze table t1 validate structure;
analyze table t1 validate structure
ERROR at line 1:
ORA-01498: block check failure - see trace file
이때 ANALYZE로 부터 발생된 trace file 에 corrupt 된 block 에 3 row 의
(nrows = 3) data 가 있음을 알수 있다고 가정하자.
DBMS_REPAIR.ADMIN_TABLES (repair and orphan key)
================================================
ADMIN_TABLES 은 table 을 위한 repair table과,인덱스를 위한 orphan key
tables을 제공한다.
SQL> @adminCreate
SQL> connect sys/change_on_install
Connected.
SQL>
SQL> -- Repair Table
SQL>
SQL> declare
2 begin
3 -- Create repair table
4 dbms_repair.admin_tables (
5 -- table_name => 'REPAIR_TABLE',
6 table_type => dbms_repair.repair_table,
7 action => dbms_repair.create_action,
8 tablespace => 'USERS'); -- default TS of SYS if not specified
9 end;
10 /
PL/SQL procedure successfully completed.
SQL> select owner, object_name, object_type
2 from dba_objects
3 where object_name like '%REPAIR_TABLE';
OWNER OBJECT_NAME OBJECT_TYPE
SYS DBA_REPAIR_TABLE VIEW
SYS REPAIR_TABLE TABLE
SQL>
SQL> -- Orphan Key Table
SQL>
SQL> declare
2 begin
3 -- Create orphan key table
4 dbms_repair.admin_tables (
5 table_type => dbms_repair.orphan_table,
6 action => dbms_repair.create_action,
7 tablespace => 'USERS'); -- default TS of SYS if not specified
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> select owner, object_name, object_type
2 from dba_objects
3 where object_name like '%ORPHAN_KEY_TABLE';
OWNER OBJECT_NAME OBJECT_TYPE
SYS DBA_ORPHAN_KEY_TABLE VIEW
SYS ORPHAN_KEY_TABLE TABLE
DBMS_REPAIR.CHECK_OBJECT
=========================
CHECK_OBJECT procedure 는 기술된 object를 check 하고, repair 를 위한 정보를 수집하기 위함이다.
SQL> @checkObject
SQL> set serveroutput on
SQL>
SQL> declare
2 rpr_count int;
3 begin
4 rpr_count := 0;
5 dbms_repair.check_object (
6 schema_name => 'SYSTEM',
7 object_name => 'T1',
8 repair_table_name => 'REPAIR_TABLE',
9 corrupt_count => rpr_count);
10 dbms_output.put_line('repair count: ' || to_char(rpr_count));
11 end;
12 /
repair count: 1
PL/SQL procedure successfully completed.
SQL> desc repair_table
Name Null? Type
OBJECT_ID NOT NULL NUMBER
TABLESPACE_ID NOT NULL NUMBER
RELATIVE_FILE_ID NOT NULL NUMBER
BLOCK_ID NOT NULL NUMBER
CORRUPT_TYPE NOT NULL NUMBER
SCHEMA_NAME NOT NULL VARCHAR2(30)
OBJECT_NAME NOT NULL VARCHAR2(30)
BASEOBJECT_NAME VARCHAR2(30)
PARTITION_NAME VARCHAR2(30)
CORRUPT_DESCRIPTION VARCHAR2(2000)
REPAIR_DESCRIPTION VARCHAR2(200)
MARKED_CORRUPT NOT NULL VARCHAR2(10)
CHECK_TIMESTAMP NOT NULL DATE
FIX_TIMESTAMP DATE
REFORMAT_TIMESTAMP DATE
SQL> select object_name, block_id, corrupt_type, marked_corrupt,
2 corrupt_description, repair_description
3 from repair_table;
OBJECT_NAME BLOCK_ID CORRUPT_TYPE MARKED_COR
CORRUPT_DESCRIPTION
REPAIR_DESCRIPTION
T1 3 1 FALSE
kdbchk: row locked by non-existent transaction
table=0 slot=0
lockid=32 ktbbhitc=1
mark block software corrupt
Data Extraction
===============
repair table에 의하면 file 6 ,block 3 에 corrupt 이 났음을 알수 있다
그러나 아직 이 block 은 corrupt 로 mark 되어 있지 않으므로 필요 data 를
추출하여야 한다.
1. ALTER SYSTEM DUMP (nrows = 3) 에 의해 block안에 있는 row수를 결정한다.
2. corrupt object를 select 하여 가능한 정보를 추출한다.
SQL> -- The following query can be used to salvage data from a corrupt block.
SQL> -- Creating a temporary table facilitates data insertion.
SQL> create table temp_t1 as
2 select * from system.t1
3 where dbms_rowid.rowid_block_number(rowid) = 3
4 and dbms_rowid.rowid_to_absolute_fno (rowid, 'SYSTEM','T1') = 6;
Table created.
SQL> select col1 from temp_t1;
COL1
2
3
DBMS_REPAIR.FIX_CORRUPT_BLOCKS (ORA-1578)
============================================
FIX_CORRUPT_BLOCKS procedure는 repair table 의 정보를 이용하여 corrupt
blocks 을 fix 한다
그러나 아직 full table scan 시 여전히 error 가 발생한다
SQL> declare
2 fix_count int;
3 begin
4 fix_count := 0;
5 dbms_repair.fix_corrupt_blocks (
6 schema_name => 'SYSTEM',
7 object_name => 'T1',
8 object_type => dbms_repair.table_object,
9 repair_table_name => 'REPAIR_TABLE',
10 fix_count => fix_count);
11 dbms_output.put_line('fix count: ' || to_char(fix_count));
12 end;
13 /
fix count: 1
PL/SQL procedure successfully completed.
SQL> select object_name, block_id, marked_corrupt
2 from repair_table;
OBJECT_NAME BLOCK_ID MARKED_COR
T1 3 TRUE
SQL> select * from system.t1;
select * from system.t1
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
DBMS_REPAIR.DUMP_ORPHAN_KEYS
==============================
DUMP_ORPHAN_KEYS는 corrupt data 에 해당하는 index 를 나타내 준다
SQL> select index_name from dba_indexes
2 where table_name in (select distinct object_name from repair_table);
INDEX_NAME
T1_PK
SQL> @dumpOrphanKeys
SQL> set serveroutput on
SQL>
SQL> declare
2 key_count int;
3 begin
4 key_count := 0;
5 dbms_repair.dump_orphan_keys (
6 schema_name => 'SYSTEM',
7 object_name => 'T1_PK',
8 object_type => dbms_repair.index_object,
9 repair_table_name => 'REPAIR_TABLE',
10 orphan_table_name => 'ORPHAN_KEY_TABLE',
11 key_count => key_count);
12 dbms_output.put_line('orphan key count: ' || to_char(key_count));
13 end;
14 /
orphan key count: 3
PL/SQL procedure successfully completed.
SQL> desc orphan_key_table
Name Null? Type
SCHEMA_NAME NOT NULL VARCHAR2(30)
INDEX_NAME NOT NULL VARCHAR2(30)
IPART_NAME VARCHAR2(30)
INDEX_ID NOT NULL NUMBER
TABLE_NAME NOT NULL VARCHAR2(30)
PART_NAME VARCHAR2(30)
TABLE_ID NOT NULL NUMBER
KEYROWID NOT NULL ROWID
KEY NOT NULL ROWID
DUMP_TIMESTAMP NOT NULL DATE
SQL> select index_name, count(*) from orphan_key_table
2 group by index_name;
INDEX_NAME COUNT(*)
T1_PK 3
Note: orphan key table의 index 는 다시 rebuild 되어야 한다.
DBMS_REPAIR.SKIP_CORRUPT_BLOCKS
===============================
SKIP_CORRUPT_BLOCKS 은 table 과 index 의 corrupt block 을 skip 하는 것을 enable/disable 을 실시한다.
Suggestion: SKIP_CORRUPT_BLOCKS 가 enabled되면 orphan key table의 모든
index 는 모두 rebuild 되어야 한다. ( all index associated with object
if DUMP_ORPHAN_KEYS was omitted).
SQL> @skipCorruptBlocks
SQL> declare
2 begin
3 dbms_repair.skip_corrupt_blocks (
4 schema_name => 'SYSTEM',
5 object_name => 'T1',
6 object_type => dbms_repair.table_object,
7 flags => dbms_repair.skip_flag);
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> select table_name, skip_corrupt from dba_tables
2 where table_name = 'T1';
TABLE_NAME SKIP_COR
T1 ENABLED
SQL> -- rows in corrupt block skipped, no errors on full table scan
SQL> select * from system.t1;
COL1 COL2
4 dddd
5 eeee
--> Notice the pk index has not yet been corrected.
SQL> insert into system.t1 values (1,'aaaa');
insert into system.t1 values (1,'aaaa')
SQL> select * from system.t1 where col1 = 1;
no rows selected
DBMS_REPAIR.REBUILD_FREELISTS
===============================
REBUILD_FREELISTS rebuilds freelists for the specified object.
SQL> declare
2 begin
3 dbms_repair.rebuild_freelists (
4 schema_name => 'SYSTEM',
5 object_name => 'T1',
6 object_type => dbms_repair.table_object);
7 end;
8 /
PL/SQL procedure successfully completed.
Rebuild Index
=============
Note: Every index identified in the orphan key table should be rebuilt to
ensure consistent results.
SQL> alter index system.t1_pk rebuild online;
Index altered.
SQL> insert into system.t1 values (1, 'aaaa');
1 row created.
SQL> select * from system.t1;
COL1 COL2
4 dddd
5 eeee
1 aaaa
Reference Document
------------------Try look to alert<SID>.log file for full error report (you could paste it here).
Also from alert log you could get real values for db_block_buffers and shared_pool_size parameters that used during instance startup. -
ORACLE 8에서의 ORA-1578 조치 방법(UPDATE)
제품 : ORACLE SERVER
작성날짜 : 2003-06-12
Oracle 8에서의 ORA-1578(Data Block Corruption) 조치 방법
<사전에 알아두어야 할 사항>
# Oracle 8의 ROWID
1. FORMAT : OOOOOOFFFBBBBBBSSS
* OOOOOO - data object number 로서 물리적인 segment의 id를 의미
* FFF - row가 위치한 datafile의 relative datafile number
* BBBBBB - file 내에서의 block id
* SSS - block 내에서의 row의 sequence number
2. 각 구성 요소는 64진법으로 표기되어 진다.
3. DBMS_ROWID Package는 ROWID를 10진법으로 변환하는 FUNCTION과 ROWID를
생성하는 FUNCTION을 포함하고 있다.( 자세한 내용은 BULLETIN 11366 참조)
# DBA_OBJECTS에서 OBJECT_ID와 DATA_OBJECT_ID
Oracle 8에서는 DBA_OBJECTS 안에 physical segment id를 의미하는
data_object_id column을 가지고 있다. 이 column의 값은 ROWID의 object id
를 구성하는데 사용된다.
이 column은 대부분 object_id 값과 동일하나 partitioned table과
clustered table안에서는 다를 수 있다.
Partitioned table에서는 partition이 다른 tablespace로 이동하였을 경
우 object_id는 예전과 동일하나 data_object_id는 달라 진다.
Clustered table에서는 반대로 data_object_id는 동일하나 object_id가 다
른 경우가 발생한다.
(자세한 내용은 Bulletin 11604 참조)
# RELATIVE DATAFILE NUMBER
8.x 의 relative datafile number는 특정 tablespace 내에서만 고유하다.
따라서 서로 다른 두개의 tablespace에 속한 datafile들이 동일한 relative
datafile number를 가질 수 있다.
8.x 에서는 tablespace 당 최대 1023개의 datafile을 사용. 전체 database 의
datafile 갯수가 1023개를 넘기 전까지는 file_id와 relative_fno는 동일한
값을 갖음.
# ROWID 생성
DBMS_ROWID Package의 DBMS_ROWID.ROWID_CREATE Function사용.
Syntax : Function dbms_rowid.rowid_create( rowid_type in number,
object_number in number,
relative_fno in number,
block_number in number,
row_number in number ) return rowid;
SQL> select dbms_rowid.rowid_create(1,10116,4,5948,0) CREATE_ROWID
from dual;
CREATE_ROWID
AAACeEAAEAAABc8AAA
< 해결 방법 >
1. HARDWARE 문제가 있다면 이를 먼저 해결한다.
2. DATA DICTIONARY 의 INDEX나 TABLE이 손상되었다면 FULL BACKUP으로부터 복구.
3. NON-DICTIONARY OBJECT일 경우
# INDEX가 손상된 경우: INDEX를 REBUILD하면 된다.
# TABLE이 손상된 경우:
* EXPORT BACKUP이 있다면 손상된 TABLE을 DROP하고 IMPORT.
* ARCHIVE MODE라면 해당 DATAFILE을 RESTORE하고 RECOVERY.
* 만약 BACKUP이 전혀 없다면 ROWID를 이용하여 손상된 BLOCK을 제외한
나머지 BLOCK의 ROW들만을 추출한다.
이것은 반드시 INDEX가 생성된 TABLE에 한해서만 적용 가능하다.
4. 손상된 BLOCK을 제외한 나머지 BLOCK의 ROW들을 추출하는 방법.
ERROR MESSAGE :
ORA-1578 "ORACLE data block corrupted (file # 4, block # 1562)
- file# 4는 absolute datafile number 임.
STEP 1 : 어떤 OBJECT에서 발생하였는가를 파악
SELECT owner, segment_name, segment_type , relative_fno, partition_name
FROM dba_extents
WHERE file_id = 4 AND
1562 BETWEEN block_id AND ( block_id + (blocks - 1)) ;
OWNER SEGMENT_NAME SEGMENT_TYPE RELATIVE_FNO PARTITION_NAME
SCOTT EMP TABLE 4
* RELATIVE_FNO 확인
* PARTITIONED TABLE인지 확인
STEP 2 : DATA_OBJECT_ID를 추출
SELECT DATA_OBJECT_ID
FROM dba_objects
WHERE owner = 'SCOTT' AND object_name = 'EMP'
[ AND partition_name = *EMP_PART_2* ] ;
DATA_OBJECT_ID
7033
* [ ] 안의 내용은 partitioned table일 경우에 추가되는 조건임.
STEP 3 : ROWID 생성
생성해야할 ROWID는 BLOCK 1562 와 BLOCK 1563의 각 첫 번째 ROWID들이다.
STEP 1,2에서 다음과 같은 정보를 얻었다.
OBJECT_NUMBER = 7033, RELATIVE_FNO= 4 , BLOCK-_NUMBER=1562
각 BLOCK의 ROW SEQUENCE NUMBER는 0 부터 시작하므로 ROWID는 다음과 같이 생성할 수 있다.
SQL> SELECT DBMS_ROWID.ROWID_CREATE(1,7033,4,1562,0) FROM DUAL;
DBMS_ROWID.ROWID_C
AAABt5AAEAAAAYaAAA
SQL> SELECT DBMS_ROWID.ROWID_CREATE(1,7033,4,1563,0) FROM DUAL;
DBMS_ROWID.ROWID_C
AAABt5AAEAAAAYbAAA
# 위 부분에서 기존의 BULLETIN(11340)은 잘못 되어 있다.
즉 기존의 BULLETIN에서는 BLOCK 1561 과 BLOCK 1563의 첫 번째
ROWID를 구해서 ROW를 추출하였다. 그러나 이렇게하면 BLOCK 1561의 ROW 들
이 누락되는 현상이 발생하게 된다. 그러므로 이러한 현상을 방지하기 위해서
는 BLOCK 1561의 첫 번째 ROWID가 아닌 BLOCK 1562의 첫번째 ROWID를 구해야
한다.
STEP 4 : ROW 추출
* 먼저 TEMPORARY TABLE을 만든다
SQL> CREATE TABLE TEMP AS SELECT * FROM EMP WHERE 1=2;
* 손상된 BLOCK 1562의 첫 번째 ROWID보다 작은 ROWID를 가진 ROW 추출
SQL>INSERT INTO TEMP
SELECT * FROM EMP
WHERE EMPNO > 0 AND ROWID < 'AAABt5AAEAAAAYaAAA' ;
* 손상된 BLOCK 1562의 마지막 ROWID보다 큰 ROWID를 가진 ROW 추출
SQL>INSERT INTO TEMP
SELECT * FROM EMP
WHERE EMPNO > 0 AND ROWID >= 'AAABt5AAEAAAAYbAAA' ;
* 기존의 TABLE을 DROP하고 TEMP TABLE을 RENAME한다.
위 INSERT시 WHERE 조건에 EMPNO > 0을 추가한 이유는 INDEX
에 의한 RANGE SCAN을 반드시 수행하도록 하기 위해서이다.
기존의 BULLETIN은 이 부분을 또한 간과하였다.
즉 WHERE 절에 ROWID만을 기술했을 경우 TABLE을 FULL SCAN하
지 않고 RANGE SCAN을 하기 위해서는 반드시 TABLE이
ANALYZE되어 있어야만 한다. TABLE이 ANALYZE되어 있지 않으
면 FULL SCAN을 하게 된다.
아래는 각각에 대한 EXECUTION PLAN이다.
TABLE ANALYZE를 하지 않은 상태
CASE 1 ) ROWID로 QUERY
SQL>select *
from imsiemp
where rowid < 'AAABwSAAEAAABGhAAJ';
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'IMSIEMP'
CASE 2 ) INDEX COLUMN & ROWID로 QUERY
SQL> select *
from imsiemp
where empno < 10 and rowid < 'AAABwSAAEAAABGhAAJ'
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'IMSIEMP'
2 1 INDEX (RANGE SCAN) OF 'SYS_C003247' (UNIQUE)
TABLE ANALYZE가 수행된 상태
CASE 1) ROWID로 QUERY
SQL> select * from imsiemp where rowid < 'AAABwSAAEAAABGhAAJ'
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=36 Card=500 Bytes=19000)
1 0 TABLE ACCESS (BY ROWID RANGE) OF 'IMSIEMP' (Cost=36 Card=500 Bytes=19000)
CASE 2 ) INDEX COLUMN & ROWID로 QUERY
SQL> select *
from imsiemp
where empno < 10 and rowid < 'AAABwSAAEAAABGhAAJ';
Execution Plan
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=1 Bytes=38)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'IMSIEMP' (Cost=3 Card=1Bytes=38)
2 1 INDEX (RANGE SCAN) OF 'SYS_C003247' (UNIQUE) (Cost=2 Card=1)Let me give the details..
I1) I have installed 10.2.0.2 patch which is available in the service marketplace.
i have jus applied the patch after installing the oracle 10.2 software and its showing
10.2.0.2 in my status.
2) My kernel version is 239 (SAP R/3 4.7)
3) The env variables are give beolow.
DBMS_TYPE=ORA
DBS_ORA_SCHEMA=SAPR3
dbs_ora_tnsname=DEE
NLS_LANG=AMERICAN_AMERICA.WE8DEC
NUMBER_OF_PROCESSORS=8
ORACLE_HOME=D:\ORACLE\DEE\102
ORACLE_SID=DEE
OS=Windows_NT
Path=C:\Perl\bin\;D:\oracle\DEE\102\jre\1.4.2\bin\client;D:\oracle\DEE\102\jre\1
.4.2\bin;C:\Program Files\EMC\PowerPath\;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDO
WS\System32\Wbem;C:\Program Files\Dell\SysMgt\RAC5;C:\Program Files\Dell\SysMgt\
oma\bin;C:\Program Files\Dell\SysMgt\oma\oldiags\bin;C:\Program Files\EMC\Navisp
here CLI;C:\Program Files\Resource Kit\;D:\Oracle92\Opatch;D:\Oracle92\Opatch;d:
\oracle\DEE\102;D:\usr\sap\DEE\sys\exe\run;D:\Oracle\DEE\102\BIN;d:\oracle92;d:\
oracle92\bin;D:\usr\sap\DEE\sys\exe\run;
SAPARCH=E:\oracle\DEE\saparch
SAPBACKUP=E:\oracle\DEE\sapbackup
SAPCHECK=E:\oracle\DEE\sapcheck
SAPDATA_HOME=E:\oracle\DEE
SAPEXE=D:\usr\sap\DEE\SYS\exe\run
SAPLOCALHOST=awnts151
SAPREORG=E:\oracle\DEE\sapreorg
SAPTRACE=E:\oracle\DEE\saptrace
SAPTRANSHOST=AWNTS151
TNS_ADMIN=D:\usr\sap\DEE\sys\profile\ORACLE
USERDNSDOMAIN=AUDCO9.AILVALVES.COM
USERDOMAIN=AUDCO9
USERNAME=deeadm
USERPROFILE=C:\Documents and Settings\deeadm
USE_KIT=OFF
4) Since there is no application server i have not installed oracle client.
5) Kernel version is 640.
Please help.
Thanks and regards,
siddhartha. -
ORA-1578 encountered when generating server alert SMG-3503
In my system, the oracle version is 10.2.0.1.0
In the alert file I found below errors:
Mon Sep 12 18:48:33 2011
ORA-1578 encountered when generating server alert SMG-3503
ORA-1578 encountered when generating server alert SMG-4121
ORA-1578 encountered when generating server alert SMG-4121
Mon Sep 12 18:53:44 2011
ORA-1578 encountered when generating server alert SMG-4121
ORA-1578 encountered when generating server alert SMG-4121
Mon Sep 12 18:58:40 2011
ORA-1578 encountered when generating server alert SMG-3503
ORA-1578 encountered when generating server alert SMG-4121
ORA-1578 encountered when generating server alert SMG-4121
Mon Sep 12 19:03:47 2011
ORA-1578 encountered when generating server alert SMG-4121
ORA-1578 encountered when generating server alert SMG-4121
Is the error will impact the database or application system?
What is the cause and solution of this error?Hi,
please post the output of
select * from V$DATABASE_BLOCK_CORRUPTION; Do you have a standby for this database?
Edited by: Rodriguez on 02.02.2012 23:08 -
제품 : ORACLE SERVER
작성날짜 : 2000-08-28
ORA-1578 조치를 위한 event 10231
========================================================================
table access 시 ora-1578이 발생하는 경우, 이미 다른 bulletin(10062, 11885)에
정리된 것과 같이 corrupt된 block을 제외한 나머지 block의 data를 index
search를 통해 조회하여 다른 table로 copy하는 방법이 사용된다.
그런데, 만약 ora-1578을 만난 table에 index가 전혀 없다면 이 자료에서 설명할
event 10231을 사용할 수 있다.
이 event는 V7, V8 모두 적용 가능하다.
1. event 10231의 효과
~~~~~~~~~~~~~~~~~~~~~
event 10231은 full table scan 시에 corrupt된 block을 skip할 수 있도록
해주는 event이다. block corruption을 나타내는 ora-1578의 조치 방법으로
이용될 수 있으나, 이 event가 효과를 발휘하는 corruption의 형태가 모든 것을
포함하는 것은 아니기 때문에 이 event를 사용하여도 여전히 ora-1578이 발생할 수
있다.
대부분의 ora-1578에 대해서 corrupt된 block을 skip하는 것이 확인되었으나,
적용되지 않는 경우에 대해서 오라클이 보장하지는 않는다.
앞에서 설명한 바와 같이 이 event는 full table scan 시에 효과가 있으므로,
ora-1578이 발생하면 이것을 이용하여 corrupt된 block을 포함하는 table을
export 받아내거나, "create table as select" 구문을 이용하여 다른 table로
data를 copy할 수 있다.
corrupted된 block 내의 data는 잃게 된다.
Oracle 7.1.X version까지는 이 event가 물리적인 corruption을 제외한 'soft
corrupt' block에만 효과가 있었으나, Oracle 7.2 이상부터는 (V8포함) media
corruption을 포함한 다양한 형태의 corruption에 대해서 효과를 가지게 되어
더욱 유용해졌다.
그러나, 여전히 모든 case를 cover하는 보장은 되지 못한다.
[주의] 이 event는 data dictionary table에 대해서는 사용할 수 없다.
2. event 설정 및 사용 방법
~~~~~~~~~~~~~~~~~~~~~~~~~~
이 event는 disk로부터 읽는 block에만 효과가 있다. corrupt된 block이 memory,
즉, cache buffer 내에 이미 올라와 있다면 바라는 효과를 얻을 수 없기 때문에
일단 이 parameter를 사용하기 전에는 db를 shutdown시키는 것이 권고된다.
event를 사용하는 절차를 정리하면 다음과 같다.
(1) database shutdown
(2) cd $ORACLE_HOME/dbs
initSID.ora (SID는 env | grep SID하여 확인) file 내에 다음과 같이
event를 지정하는 parameter를 추가한다. 위치는 관계없다.
event="10231 trace name context forever, level 10"
(3) 다음과 같이 restrict mode로 startup하고, parameter가 설정되었는지
확인한다. startup 시 parameter error가 발생하면 위의 지정에서
콤마와 같은 부분이 문제가 있는지 다시 한번 확인한다.
SVRMGR>startup restrict;
SVRMGR>show parameter event
NAME TYPE VALUE
event string 10231 trace name context forev
(4) full table scan operation을 이용하여 table로 부터 data를 꺼낸다.
예를 들어 scott user의 dept에서 ora-1578이 발생한 것을 가정하고,
다음과 같은 조치가 가능하다.
<Example 1>
os> exp scott/tiger file=test.dmp tables=dept
<Example 2>
SQL> create table test as select * from dept;
3. data 발췌 후 작업
~~~~~~~~~~~~~~~~~~~~
일단 export나 create table as select 문장의 수행으로 인해 data를 얻었으면,
다음과 같이 작업한다.
(1) initSID.ora 화일에서 event를 지정한 line을 제거한다.
(2) db를 shutdown시키고 다시 startup시킨다.
(3) show parameter event 를 수행하여 제거되었는지 확인한다.
(4) corrupt된 table을 drop시키거나 rename시키고, table을 재생성한다.
즉, 앞에서 예를 든 경우의 후속 작업은 각각 다음과 같다.
<Example 1>
SQL> drop table dept; (혹은 SQL>rename table dept to test;)
os> imp scott/tiger file=test.dmp tables=dept
이 때, space에 여유가 있다면 drop보다는 rename한 후 나중에
import 결과를 확인하고 drop하는 것을 권고한다.
단, rename을 하게 되면 index 등은 rename이 안 되므로 import 시
index, constraint 등은 따로 생성하여야 한다.
<Example 2>
SQL> drop table dept;
SQL> rename test to dept;
(5) import 전에 rename한 경우나 create table as select를 이용하면,
index, constraint, trigger 등은 재생성하여야 한다.
또한, 필요한 권한을 grant하여 준다. -
ORA-1578 Cant open Database.
Hi. i am recieving the Error ORA-1578 CANT OPEN DATABASE.
Please tell me how i can rebuild the database.a 1578 is often accompanied by another error message number that tells us why it can't open the database.
in any case - search for the alert log (alert.log or alert_sid.log).
More than that we can't say until we get such minor tidbits as operating system and version of oracle, as well as a cut and paste of the console session during which you are attempting to open the system.
by the way - if you have support, you should have already opened a service request. unlimited oracle support calls are free with the support contract. -
Ora-00604 error and ora 01000 error while report generation.
hi all,
I am trying to generate the multiple reports of same template through a program.
While this job is running, i get the following error at the BIP console and the reports don't get generated.
[101711_044115578][][EXCEPTION] java.sql.SQLException: ORA-00604: error occurred
at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-00604: error occurred at recursive SQL level 1
ORA-01000: maximum open cursors exceeded
ORA-01000: maximum open cursors exceeded
Kindly help.
Thanks.Lots of resources with a simple search to see what this is about, for example:
http://www.orafaq.com/wiki/ORA-01000
ORA-01000: maximum open cursors exceeded
Cause: A host language program attempted to open too many cursors. The initialization parameter OPEN_CURSORS determines the maximum number of cursors per user.
Action: Modify the program to use fewer cursors. If this error occurs often, shut down Oracle, increase the value of OPEN_CURSORS, and then restart Oracle.
open_cursors parameter
http://download.oracle.com/docs/cd/E11882_01/server.112/e25513/initparams160.htm#REFRN10137
Oracle support note:
OERR: ORA-1000 maximum open cursors exceeded (Doc ID 18591.1) -
Ora-00604,ora-01422 error while dropping the table
Hi gurus,
I am using Oracle 10g R2 on windows 2000 platform,while dropping the table the following error occured.
ORA-00604 : error occurred at recursive sql level 1.
ORA-01422: exact fetch returns more than requested number of rows.
Need urgent help.
Thanks in advanceIs there an AFTER EVENT trigger defined on this database? Can you check that?
Secondly, was this database migrated from earlier version? I remember having seen this problem on 9i (it was 9.2.0.1 or 9.2.0.2; I can't recall exactly). -
Ora 600 error Arguments [25012] [11]
hi,
i've an ORA-00600: error Arguments [25012], [2], [11], [], [], [], [], [] by DELETE FROM table WHERE filed = :b1
ther are only 8 file in database. (not 11)
Can anybody help, or give me an information about Bug number: 742709
OS NT 4 / SP6 ORACLE RDBMS Version: 8.0.5.2.1.
Thank in advice
JFATrace File Contents:
============================================================================================
[oracle@oem trace]$ more /d01/app/guest/diag/rdbms/db11g/db11g/incident/incdir_191809/db11g_smon_4198_i191809.trc
Dump file /d01/app/guest/diag/rdbms/db11g/db11g/incident/incdir_191809/db11g_smon_4198_i191809.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /d01/app/guest/product/11.2.0/dbhome_1
System name: Linux
Node name: oem.tap.com
Release: 2.6.18-164.el5xen
Version: #1 SMP Thu Sep 3 02:41:56 EDT 2009
Machine: i686
Instance name: db11g
Redo thread mounted by this instance: 1
Oracle process number: 13
Unix process pid: 4198, image: [email protected] (SMON)
*** 2010-10-15 12:05:24.395
*** SESSION ID:(16.1) 2010-10-15 12:05:24.395
*** CLIENT ID:() 2010-10-15 12:05:24.395
*** SERVICE NAME:(SYS$BACKGROUND) 2010-10-15 12:05:24.395
*** MODULE NAME:() 2010-10-15 12:05:24.395
*** ACTION NAME:() 2010-10-15 12:05:24.395
Dump continued from file: /d01/app/guest/diag/rdbms/db11g/db11g/trace/db11g_smon_4198.trc
ORA-00600: internal error code, arguments: [13013], [5001], [267], [8444108], [2], [8444108], [17], [], [], [], [], []
========= Dump for incident 191809 (ORA 600 [13013]) ========
*** 2010-10-15 12:05:24.399
dbkedDefDump(): Starting incident default dumps (flags=0x2, level=3, mask=0x0)
----- Current SQL Statement for this session (sql_id=dma0vxbwh325p) -----
update smon_scn_time set time_mp=:1, time_dp=:2, scn=:3, scn_wrp=:4, scn_bas=:5, num_mappings=:6, tim_scn_map=:7 where scn = (sele
ct min(scn) from smon_scn_time)
========================================================================================== -
Ora-01008 error with bind variable
Hi,
We have a test program which have one bind variable on a column which is varchar2(20), in the test program we've passed a 20 character string to the variable. The program returns error in one of the databases but all others are successful. We've checked the column is same in all of them.
Exception in thread "main" java.sql.SQLException: ORA-00604: error occurred at recursive SQL level 1
ORA-01008: not all variables bound
Could you please advise how to troubleshoot this issue?
RegardsWe aren't going to be able to help you if you won't post the database code that is giving the error.
And now we need the Java code that is constructing the query that you are using.
Your error is saying there is a second variable that you are not providing a value for.
And you said
>
We have a test program which have one bind variable on a column which is varchar2(20), in the test program we've passed a 20 character string to the variable.
>
But you are using a string that is 23 characters long
"a3g34-b13fd-efaie-f83fk"How does 23 go into 20? -
Getting error-ORA-24381: error(s) in array DML
Hi i have written the following code to bulk insert into a database table.
I am getting an error while returning the result of the bulk insert query into the collection
I have tried to track it by using sql%bulk_exceptions.error_code.
But the error code that it is showing is just 1.
I trapped it using sqlerrm.
and that is showing-error(s) in array DML
What do i do?
DECLARE
CURSOR temp_rec_tap_cur
IS
SELECT *
FROM temp_records_tap;
TYPE temp_rec_tab IS TABLE OF temp_rec_tap_cur%ROWTYPE;
v_test_tab temp_rec_tab;
v_rec_num num_tab;
v_filename temp_records_tap.file_name%TYPE;
v_error_code tap_reject.error_code%type;
v_rej_value tap_reject.field_rej%type;
v_errors number;
BEGIN
SELECT file_name
INTO v_filename
FROM table1
WHERE ROWNUM<2;
OPEN temp_rec_tap_cur;
LOOP
BEGIN
FETCH temp_rec_tap_cur
BULK COLLECT INTO v_test_tab LIMIT 1000;
FORALL i IN v_test_tab.FIRST .. v_test_tab.LAST SAVE EXCEPTIONS
INSERT INTO tapdetail_tapin
VALUES v_test_tab (i)
RETURNING record_num
BULK COLLECT INTO v_rec_num;
EXCEPTION
WHEN DUP_VAL_ON_INDEX
THEN
NULL;
WHEN OTHERS
THEN
v_errors:=sql%bulk_exceptions.count;
for i in 1..v_errors
loop
dbms_output.put_line(sql%bulk_exceptions(i).error_code);
p3_errorlog ('TAPINDETAWARE', SQLERRM, v_filename);
end loop;
END;
--RAISE;
EXIT WHEN temp_rec_tap_cur%NOTFOUND;
END LOOP;
INSERT INTO table2
SELECT file_id, file_name, sender_pmn, recipient_pmn, call_date,
call_date_only, call_type, call_number, FIRST_RECORD,
service_type, service_code, home_bid, serve_bid,
chargeable_subs_type, imsi_min, msisdn_mdn, air_charges,
air_charges_sdr, air_time, national_call_charges,
national_call_charges_sdr, national_call_time,
international_call_charges, international_call_charges_sdr,
international_call_time, dir_assist_charges,
dir_assist_charges_sdr, dir_assist_time, other_charges,
other_charges_sdr, other_time, volume_charges,
volume_charges_sdr, volume_units, tot_charges, tot_charges_sdr,
tot_duration, state_tax, state_tax_sdr, local_tax,
local_tax_sdr, state_and_use_tax, state_and_use_tax_sdr, va_tax,
va_tax_sdr, other_tax, other_tax_sdr, charge_refund_indicator,
advised_charge_currency, advised_charge, advised_charge_sdr,
advised_charge_commission, advised_charge_commission_sdr,
exchange_rate, mcc, mnc, process_date, chargeable_units,
record_num, mscid,null,null,decode(call_type,0,'250',1,'251',5,'255'),null,'Duplicate Call'
from temp_records_tap
where record_num not in (select column_value from table(v_rec_num)) ;
EXCEPTION
WHEN OTHERS THEN
p3_errorlog ('TAP', SQLERRM, v_filename);
END;Edited by: user8731258 on Sep 14, 2010 2:58 AM
Edited by: user8731258 on Sep 14, 2010 3:01 AMWhat is the type declaration of num_tab and how is record_num defined?
ORA-24381: error(s) in array DML
Cause: One or more rows failed in the DML.indicates that you fail on the insert itself. Are the table definitions the same? Same primary/unique keys?
Edited by: MBr on 14-Sep-2010 03:16 -
PL/SQL: ORA-04052: error occurred when looking up remote object.
Hi All,
I'm getting the following error message while executing a PL/SQL Block.
PL/SQL: ORA-04052: error occurred when looking up remote object UPLDUSER.filestatushistory@FTS
ORA-00604: error occurred at recursive SQL level 1
ORA-03106: fatal two-task communication protocol error
ORA-02063: preceding line from FTSStatement
declare
v_coun number;
begin
select count(*) into v_coun
from updluser.filestatushistory@fts;
end;Back ground of the situation as follows,
My DataBase version 10.2.0.3 DB Name :DB1
Table Owner : UPLDUSER
Table Name : FILESTATUSHISTORY
I have a report user on the same database and I have grant all on the above table to report user
Report User : RPT_FTS
SQL> GRANT ALL ON FILESTATUSHISTORY_V TO RPT_FTS;Now Please find the below database details where I'm getting subjected error.
Database version : 9.2.0.8
DB Name : DB2
User Name : RPT_REPORTS
I Have create a dblink from RPT_REPORTS to RPT_FTS on DB1 and the dblink works fine. But getting the above error while running it.
but When I do the same other 10.2.0.3 db , the above PL/SQL block works fine without any problem.
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Now the strange about this is that I have Created a new table on DB1 db like below;
SQL> CREATE TABLE UPLDUSER.ABC AS SELECT * FROM FILESTATUSHISTORY;and retry my code on DB2 (9.2.0.8) after changing the table to ABC and it worked. Now I don't know whats wrong with a original table(FILESTATUSHISTORY).
To over come the problem and a work-a-round method I create a view on the DB1 (RPT_FTS) like the below
SQL> CREATE VIEW FILESTATUSHISTORY AS SELECT * FROM UPLDUSER.FILESTATUSHISTORY;and was able to run the PL/SQL block Remotely.
Just wants To know what whould have been the cause for this .
Cheers
KanchanaHi Kanchana,
Perhaps following link of google search has answer to your query
ORA-04052. The search result contains some useful articles whose URLs I shan't post in the forums.
HTH!
*009*
Maybe you are looking for
-
Please can someone help me? I have just changed my password on my work computer on gmail but my phonehas locked out of my emails now and will not accept my new password. it keeps telling me my username or password is incorrect. I have tried deleting
-
Can i the radio on my ipod classic?
can i use the radio on my ipod classic???
-
I have only a black screen in the viewer
I have only a black screen in the viewer.
-
NI LabVIEW 2014 Digital Electronics FPGA Board Driver
Hello all, When NI LabVIEW 2014 Digital Electronics FPGA Board Driver Release date? Thanks.
-
ITunes + Ping extremely slow with Library on external HD
Hi, My Library is on an external HD connected to an Airport Extreme base station. My MacBook is connected wired to Airport, so there are no possible wifi connection issues. iTunes is extremely slow since version 10. If I select a song and want to sel