-----
현상 : ORA-1034, "ORACLE not available"
ORA-7320, "smsget: shmat error when trying to attach sga."
ORA-7429, "smsgsg: shmget() failed to get segment."
원인 : ORACLE DBA 사용자만 데이타베이스를 ACESS할수 있고 다른 사용자는 SQL*PLUS 등을 통하여
CONNECT를 하려고 할때 다음 에러가 발생 할경우
-----
현상 : TPFAILED ......................
sqlca.sqlcode ==> -1036
ORACLE에서 단독으로 실행하면 문제가 발생되지 않고 OUTPUT을 정확하게 출력하지만
TP/M와 함께 실행이 되면 SQL SELECT문을 수행하지 못하고 sqlca.sqlcode ==> -1036의
MESSAGE를 뿌리고 실행을 멈춘다.
원인 : ORACLE에서 Version간의 Segment 정의부분이 다르기 때문
조치 : makefile 혹은 proc.mk file에서
sqlcheck=semantic userid=scrjpcs/scrjpcs를 포함시킨다.
-----
현상 : ORA-1039: insufficient privileges on underlying objects of the view.
원인 : SYS user가 아닌 다른 user로 SQL Analyze에 로그인하여 SQL statement에 대한 explain plan 옵션을 사용할 때 다음과 같은 에러가 발생
조치 : 1.dictionary table/view들을 validate시켜 놓으려면 dba가 read 권한만 SQL Analyze를 수행하는 user에게 grant하면 충분하다.
2.SYS user로서 SQL explaining을 수행하는 것이다.
-----
현상 : ORA-9992 scumnt: failed to open
ORA-9993 scumnt: failed to lock
ORA-1102 cannot mount database in exclusive mode
원인 : 서로 독립적인 두개의 instance가 동일한 database file들을 동기화 (synchronisation)없이 access할 수 있기 때문에 database corruption을 유발시킬 수 있었다.
조치 : database의 db_name이 변경되면 각각의 lk file을 생성.
-----
현상 : ORA-01118: cannot add any more database files: limit of XXX exceeded
원인 : 데이타 화일의 갯수가 MAXDATAFILES 값에 도달한 경우 발생
조치 : MAXDATAFILES를 늘리기 위해서는 DB를 새로 만들어야 하며 그 이후 버젼을 사용중이라면 콘트롤
화일을 새로 만들어서 MAXDATAFILES를 늘릴 수 있다
-----
현상 : ORA-1157 : cannot identify data file 11 - file not found
ORA-1110 : data file 11 : '/user1/oracle7/dbs/user2.dbf'
원인 : OS 명령으로 DATA FILE 을 삭제한 경우
조치 : DATABASE STARTUP시 STARTUP MOUNT 단계까지 실행한 후, 문제의 데이타 화일을 OFFLINE 시킨다.
데이타베이스를 오픈한다. 단 데이타베이스 오픈이 정상적으로 수행되면 문제가 발생한 데이타
화일을 포함하고 있는 TABLESPACE를 DROP하지 않을 경우에는 DATABASE STARTUP시 항상 데이타
화일의 오픈 단계에서 에러가 발생된다. 따라서, 문제의 데이타 화일의 OFFLINE과 TABLESPACE의
DROP전에 반드시 해당 TABLESPACE를 사용하고 있는 USER의 데이타 백업을 수행해야 한다.

데이타 화일의 OFFLINE과 관련된 명령은 다음과 같다.
SQLDBA를 COMMAND LINE MODE로 기동시킨다.

$ sqldba lmode=y
SQLDBA> CONNECT INTERNAL;
SQLDBA> STARTUP MOUNT;
ORACLE instance started.
Database mounted.
SQLDBA> ALTER DATABASE DATAFILE '/user1/oracle7/dbs/user2.dbf'
OFFLINE DROP;
Statement processed.
SQLDBA> ALTER DATABASE OPEN;
Statement processed.
SQLDBA> DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
Statement
-----
현상 : ORA-01237 cannot extend datafile %s
원인 : O/S 레벨에서는 file size를 1TB 이상 지원한다고 하는데, oracle datafile을 2G 이상으로 resize하려고 한다거나 tablespace에 datafile을 추가하거나 생성할 때, 2G 이상 주면 file size limit에 걸리는 현상 발생
조치 : 화일 시스템에서 large file을 사용하기 위해서는 화일 시스템을 'largefiles' option으로 mount해야 한다.
-----
현상 : ORA-1400 primary key or mandatory(NOT NULL) column is missing or NULL during insert
원인 : 어떤 필수적인 열을 위한 값을 공급하지 않은 경우
-----
현상 : ORA-1401 inserted value too large for column(열에 입력한 값이 너무 큽니다.)
원인 : 문자열을 할당하고자 할때 길이가 최대치를 초과한 경우
-----
현상 : ORA-1403 no dada found
원인 : 사실상 전혀 Error가 아니다.
-----
현상 : ORA-1405 fetched column value is NULL
원인 : ERROR 가 아니고 WARNING MESSAGE 이다.
조치 : dbms=v6 를 PRECOMPILER OPTION 에 추가해준다. dbms=v6 로 SETTING 할경우는 HOST 변수에
NULL 이 RETURN 되더라도 sqlca.sqlcode 는 0 이 된다.
-----
현상 : ORA-1407 cannot update mandatory(NOT NULL) column to NULL
원인 : 필수적인 열의 값을 NULL에 설정한 경우에 발생
-----
현상 : ORA-1408 such column list already indexed
원인 : 이미 동일한 열 List에 기초한 Index를 갖고 있는 Table에서 Index를 작성하고자 하는 경우에 발생
-----
현상 : ORA-1410 invalid ROWID
원인 : 1.적절한 Format으로 ROWID를 상술하지 않은 경우에 발생
2.지정된 ROWID가 존재하지 않은 경우에 발생
-----
현상 : ORA-01438: 지정한 정도를 초과한 값이 열에 지정되었습니다.
원인 : 지정한 자릿수를 초과한 Column이 존재한 경우에 발생
-----
현상 : ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "SYS.STANDARD", line 648
ORA-06512: at "BETH.BETH", line 6
ORA-06512: at line 1
원인 : SELECT 문에서 조건에 해당하는 row가 2건 이상
return되었을 때 발생하는 TOO_MANY_ROWS 에러와 동일한 에러이다.
조치 : 확인한 결과 DUAL table에서는 비록 2개의 ROWID를 볼 수는 없지만,
실제 2개의 row가 DUAL table에 존재하는 상황이다.
따라서, 다음 명령을 이용하여 여분의 필요없는 row를 delete해야 한다.
-----
현상 : ORA-1449 column contains NULL values; cannot alter to NOT NULL
원인 : 어떤 열을 필수적인 것으로 변경하고자 하나 적어도 테이블 내의 한 행이 그 열을 위한 NULL값을
가질 때 발생
-----
현상 : ORA-1452 cannot CREATE UNIQUE INDEX; duplicate keys found
원인 : 값이 독특하지 않은 일련의 열에서 독특한 인덱스를 작성한 경우에 발생
-----
현상 : ORA-1453 SET TRANSACTION must be first statement of transaction
원인 : 모종의 다른 SQL문 이후에 SET TRANSACTION문을 기동할 때 발생
-----
현상 : ORA-01458 Invalid length inside variable character string
원인 : DB Table field의 길이와 Host Variable의 길이 차이가 있을때 발생한다.
그러므로 Table field의 길이와 Host Variable의 길이를 비교해 본다. 혹은 Stored
Procedure의 Input Parameter가 Null 값으로 넘겨질 때도 발생한다.
조치 : DB Table field와 Host Variable의 길이를 조정한다.
Stored Procedure의 Input Parameter에 Null값을 0의 값을 채워서 넘긴다.
주의 : Stored Procedure에서 Cursor를 사용할 때
FOR ... LOOP를 사용할 때 주의를 해야한다.
FOR i IN 1..batch_size LOOP
FETCH get_emp
INTO
emp_name( i )
,job( i )
,sql( i )
;

IF get_emp%NOTFOUND THEN -- if no row was found
CLOSE get_emp;
done_fetch := 100; -- indicate all none
EXIT;
ELSE
done_fetch := 900; -- indicate all none
found := found + 1; -- count row
END IF;
END LOOP;
에서 Fetch Array의 0번째에 Data를 저장할 때 문제가 생긴다.
그러므로, emp_name( 0 )이라고 하면 Error를 발생한다.
-----
현상 : ORA-01476: divisor is equal to zero
원인 : Zero값으로 임의의 수를 나누었을때 발생
-----
현상 : ORA-01480: trailing null missing from STR bind value
원인 : 1.해당 Column의 Size 보다 더 큰 값이 들어온 경우에 발생
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size 만큼의 변수길이를 선언한 경우 발생
조치 : 1.해당 Column의 Size와 해당값을 확인
2.Character Type(CHAR, VARCHAR)의 Host variable인 경우 변수 선언시 Table의 Column size에 1를 더해 주어야 한다.
(데이터의 마지막에 NULL 문자를 포함해야 하기 때문에)
-----
현상 : ORA-1481 invalid number format model
원인 : 어떤 숫자 Format Model이 미정의 문자를 포함한 경우에 발생
-----
현상 : ORA-1547 : Failed to allocate extent of size 'num' in tablespace 'TOOLS
원인 : TABLESPACE가 에러에 명시된 ORACLE block 수 만큼의 요청된 EXTENT를 할당할 충분한 FREE
SPACE를 갖고있지 못할 경우에 발생
조치 : 1.해당 TABLESPACE내에서 연속된 영역의 ORACLE block 할당할 수 있도록 데이타 화일을 추가
2.TABLE의 STORAGE PARAMETER에서 INITIAL EXTENT, NEXT EXTENT의 크기를 조정하여 TABLE을
재구축
3.다음의 방법으로는 관련 TABLESPACE를 재구성하는 것
-----
현상 : ORA-1552 (CANNOT USE SYSTEM ROLLBACK SEGMENT FOR NON-SYSTEM TABLESPACE '%S')
원인 : SYSTEM TABLESPACE 이외의 TABLESPACE를 포함한 OPERATION을 위하여 SYSTEM TABLESPACE의
ROLLBACK SEGMENT를 사용할 경우에 발생
조치 : SYSTEM TABLESPACE에 하나 이상의 ROLLBACK SEGMENT를 추가한 다음, 데이타베이스 오브젝트를
생성
-----
현상 : ORA-1555 Snapshot Too Old
원인 : 1.데이타의 변경이 심한 데이타베이스에서 롤백 세그먼트의 갯수와 크기가 작을 경우에 발생
2.롤백 세그먼트가 손상되어 읽을 수 없게 된 경우
3.Fetch Across Commit(테이블에 대하여 Query가 커서를 열고 루프 내에서 데이타를 Fetch
하고 변경하고 커밋하는 과정에서 발생)
4.Delayed Block Clean Out(데이타 블럭이 변경되고 커밋되면 오라클은 롤백세그먼트 헤더에
그 트랜잭션이 커밋되었다고 기록하지만 데이타 블럭을 바로 변경하지는 않는다 (Fast
Commit). 그리고 다음 트랜잭션이 변경된 블럭을 요구할 때야 비로소 변경 시키는것
조치 : 1.커서가 Open된 상태에서는 커밋을 자주하지 않고 롤백 세그먼트 크기를 키워 나가도록
2.커서를 사용하기 전에 Full Table Scan을 해주면 예방이 가능
-----
현상 : ORA-1562(Failed to extend rollback segment(id = %s))
원인 : 1.사용중인 ACTIVE 상태의 ROLLBACK SEGMENT가 다음 EXTENT를 할당하고자 할 경우
2.해당 ROLLBACK SEGMENT에 대하여 발생 가능한 최대 EXTENT 수를 초과할때 발생
조치 : ROLLBACK SEGMENT의 재생성
-----
현상 : ORA-01578: ORACLE data block corrupted (file # 6, block # 3)
ORA-01110: data file 6: '/tmp/ts_corrupt.dbf'
원인 :
조치 : 해당 objects를 drop하고 recreate하여 처리
-----
현상 : ORA-01578
원인 : data block 에 corruption 이 생긴 경우에 발생.
조치 : 1.최선의 해결책은 backup 받아둔 file 을 restore 한 후 recover 작업을 하는 것이다.
2.backup datafile 을 restore 하고 recover 하지 않을 것이라면 우선, 어떤 object 에서 corruption 이 발생하였는지 확인해야 한다.
3.해당 segment 가 non-data dictionary index 라면, 해당 index 를 drop 한 후 재생성한다.
4.해당 segment 가 table 이라면, corruption 이 발생한 block 의 data 는 소실된 것이다.
5.만약 해당 table 에 대한 최근의 export dump file 이 존재한다면, 해당 table 을 drop 한 후 import 함으로써 복구할 수 있다.
6.corruption 이 발생한 non-clustered table 에서 corrupted block 을
access 하지 않고 나머지 data 들을 select 할 수 있도록 ROWID 를 이용할
수 있다.
7.만약 data dictionary 에 속하는 table, index 또는 rollback segment에
corrupted block 이 발생하였다면 Oracle Support 의 지원을 받는다.
8.일반적으로, ORA-1578 은 hardware 의 문제때문에 유발된다. 하지만 만약에
ORA-600[3374] 가 발생한다면 memory 상에서 corruption 이 발생한
경우이다. 이 경우 database 를 restartup 하면 문제가 해결될 수 있다.
-----
현상 : ORA-1591(Pending Transaction의 처리)
원인 : 분산 트랜잭션의 경우 2 phase commit수행 단계중에 fail이 발생하게 되면 관여된 일부 database에서는 rollback 혹은 commit이 되고, 일부는 distributed lock이 걸린 상태로 계속 지속될 수 있다.
이렇게 pending된 transaction에 대해서는 기본적으로 Oracle의 background process인 RECO process가 자동으로 정리하여 주나, 경우에 따라 자동으로 정리가 되지 못하는 상황이 발생
조치 : STEP 1: alert.log file을 check한다.
STEP 2: network 환경을 확인한다.
STEP 3: RECO process가 떠 있는지 확인한다.
STEP 4: DBA_2PC_PENDING을 조회해 본다.
STEP 5: DBA_2PC_NEIGHBORS view를 조회해 본다.
STEP 6: commit point site를 확인한다.
STEP 7: DBA_2PC_PENDING의 MIXED column을 확인한다.
STEP 8: DBA_2PC_PENDING의 STATE column의 값을 확인한다.
STEP 9: 불일치 사항을 파악하고 DBA_2PC_PENDING을 정리한다.

2PC에서 1st phase commit(xa_prepare)이 정상적으로 종료되면 Oracle의 dba_pending_transaction에 해당
Transaction에 대한 정보가 나타난다.

formatid 40
globalid 636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
branchid 0000006600000065

이 상태에서 일정한 시간 내에 2nd phase commit(xa_commit)에 끝나지 않으면 dba_2pc_pending에도 이
Transaction이 나타난다.

local_tran_id 4.24.3026
global_tran_id 40.636861656A750000000000000000000000000000000000
5B5103A6BEC9900000DE8
state prepared
mixed no
advice
tran_comment
fail_time
force_time
retry_time
os_user jun
os_termina
host chaeju
db_user
commit# 5332231

위에서 "일정한 시간"이란 용어를 사용했는데 Oracle의 문서에는 이에 관한 정확한 언급은 없다.
다만, 다른 Transaction에서 해당 레코드를 참조하려고 할 때 이미 lock이 걸려 있으므로 대기하는
시간에 대해서는 init.ora에서 지정하는 distributed_lock_timeout에 대해서만 언급하고 있다. 그런데
oracle 8.1.7에서는 distributed_lock_timeout을 설정하면 obsolete로 나온다.

이 시간 동안에 해당 레코드에 대한 lock이 풀리지 않으면 아래와 같은 에러를 만난다.

ORA-02049: time-out: distributed transaction waiting for lock

위의 에러가 발생한 이후에 이 레코드를 참조하려고 하면 1591 에러가 나타난다.

ORA-01591: lock held by in-doubt distributed transaction '4.24.3026'

보는 것처럼 ORA-01591 에러 메시지에는 local_tran_id가 있다. 이를 이용하여 dba_2pc_pending에서
global_tran_id를 조회하고, 이 데이터는 dba_pending_transaction의 formatid와 globalid로 이루어져
있으므로 이를 이용하여 dba_pending_transaction에서 branchid도 얻을 수 있다.

이들로 부타 아래와 같이 XID를 얻을 수 있다.

xid.formatid = dba_pending_transactions.formatid
xid.gtrid_length = len(dba_pending_transactions.globalid)
xid.bqual_length = len(dba_pending_transactions.branchid)
xid.data = dba_pending_transactions.globalid + dba_pending_transactions.branchid

여기까지는 Oracle로 부터 XID를 얻는 과정이다.

tpconvert(str, (char *)&xid, TPTOSTRING | TPCONVXID)를 이용하여 XID의 string 표현을 얻을 수 있고
이값을 이용하여 .TMIB 서비스를 호출하면 아래와 같은 정보를 얻을 수 있다.

TA_ERROR 0
TA_MORE 0
TA_OCCURS 1
TA_GRPCOUNT 2
TA_GRPINDEX 0
TA_GRPNO 102
TA_GRPNO 101
TA_TIMEOUT 9
TA_COORDGRPNO 102
TA_CLASS T_TRANSACTION
TA_STATE READY
TA_COORDLMID SITE1
TA_GSTATE READY
TA_GSTATE READY
TA_TPTRANID 0x0 0x3a6bec99 0xde8 0x28 0x0 0x0
TA_XID 0x0 0x3a6bec99 0xde8 0x28 0x66
TA_COORDSRVGRP APPGRP2
TA_LMID SITE1
TA_SRVGRP APPGRP2
TA_SRVGRP APPGRP1

위의 경우에는 아직 Tuxedo가 transaction에 대한 정보를 가지고 있기 때문에 별다른 조치가 필요없다.
하지만, Oracle의 dba_2pc_pending에는 있는데 Tuxedo에서 해당 Transaction에 대한 정보를 가지고
있지 않은 경우에는 Oracle에서 rollback force나 commit force를 이용하여 pending transaction을
정리해 주어야만 lock이 풀린다.
-----
현상 : ORA-1628, 00000, "max # extents (%s) reached for rollback segment %s"
ORA-1630, 00000, "max # extents (%s) reached in temp segment in tablespace %s"
ORA-1631, 00000, "max # extents (%s) reached in table %s.%s"
ORA-1632, 00000, "max # extents (%s) reached in index %s.%s"
원인 : 오브젝트의 익스텐트가 MAX # 에 도달 했기 때문에 발생되며 오브젝트의 MAXEXTENTS는
STORAGE 의 MAXEXTENTS 파라미터에 의해 결정
조치 : ALTER TABLE .. STORAGE (MAXEXTENTS n)를 사용하여 최대 MAXEXTENTS 값보다 작은 수로
MAXEXTENTS를 늘려준다.
-----
현상 : ORA-1652, 00000, "unable to extend temp segment by 6144 in tablespace "VESSEL"
원인 : 테이블이나 인덱스 등을 만들 때 자신의 TEMP TABLESPACE 가 아닌 곳에서 ORA-1652(temp
tablespace가 부족함) 에러가 발생
조치 : 에러메시지에서 보여주는 대로 해당 테이블스페이스에 Temporary Segment 가 생성될 만한
연속된 공간을 마련하여 주는 것
-----
현상 : ORA-1653
원인 : 특정 tablespace 에 space 가 부족해서 table의 extent가 일어나지 못해서 발생
조치 : user의 default tablespace 를 변환한 후, 이 default tablespace
안에 create table을 다시 한 후 sql*loader 를 실행한다
-----
현상 : ORA-1654 ERROR ON INDEX SEGMENT
원인 : tablespace가 적어 extent 영역을 할당할 수 없어서 발생
조치 : datafile을 추가 시 이전값 이상의 사이즈를 추가해야 함.
-----
현상 : ORA-1722 invalid number
원인 : 수치값이 불법일 경우
-----
현상 : ORA-1747 열명을 올바르게 지정해 주십시요.
원인 : 열명이 다른 경우(SQL문장 기술시 첫번째 열명 앞에 Comma를 삽입한 경우)
-----
현상 : tb_ra315 insert error ORA-02291: integrity constraint (SCRJAPPR.A315_E007_FK)
violated - parent ....
원인 : Table과 관련된 Reference 관계로 parent table의 data가 없는 관계로 data 입력불가
조치 : Reference 관계를 끈어주든지 아니면 관계된 Table에 Data를 모두 입력하는 방법.
-----
현상 : ORA-02303: cannot drop or replace a type with type or table dependents
원인 : Type이나 table의 dependency가 있는 type을 drop하거나 replace하고자 할 때 발생.
조치 : SQL Reference guide에 의하면 DROP TYPE FORCE 옵션은 recommend하지 않는다.
왜냐하면 이 옵션을 쓰게 되면 복구가 불가능하고 dependency가 있던 table들은
access하지 못하는 결과를 초래한다.


'IT > DB' 카테고리의 다른 글

[DB2] DB2 - SQL state [54048]; error code [-1585];  (0) 2008.09.20
[DB2] 명령어 모음  (0) 2008.09.20
[ORACLE] 파티션테이블  (0) 2008.09.19
[MSSQL] 날짜 형식 변환  (0) 2007.06.29
[ORACLE] CREATE USER  (0) 2007.03.16

+ Recent posts