'Oracle Troubleshooting'에 해당되는 글 5건

  1. [Oracle] ORA-01985: cannot create user as LICENSE_MAX_USERS parameter exceeded
  2. [Oracle] ORA-12541: TNS:no listener
  3. [Oracle] ORA-00604: error occurred at recursive SQL level 1
  4. [Oracle] EXP-00079: Data in table "COUNTRIES" is protected. Conventional path may only be exporting partial table.
  5. [Oracle] ORA-01403: no data found




Why ?

LICENSE_MAX_USER 파라미터가 제한을 넘었기 때문에 유저를 더 이상 생성 할 수 없을 경우 발생합니다.

사용자 사용권이 지정되어 있다면, 데이터베이스에서 생성할 수 있는 명명된 사용자 수를 제한할 수 있습니다.



How ?

사용자 수를 제한하려면 데이터베이스의 매개변수 파일에 LICENSE_MAX_USER 매개변수를 설정합니다.

최대 사용자 200명까지 설정이 가능하며, LICENSE_MAX_USER보다 많은 사용자가 있다면 Oracle은 경고를 보내고 Alert 파일에 기록되기 됩니다. 

사용자 수가 MAX보다 작아질 경우 추가 생성이 불가능 하며, 사용자 삭제 또는 Oracle Upgrade가 필요합니다.     

V$LICENSE 데이터 딕셔너리 뷰를 질의하면 인스턴스에 대한 모든 사용권 지정, 현재 세션 수, 최대 동시 세션 수에 대해 설정된 현재 한계를 볼 수 있다.

SELECT sessions_max s_max
      ,sessions_warning s_warning
      ,sessions_current s_current
      ,sessions_highwater s_high
      ,users_max          
  FROM v$license;
  
S_MAX  S_WARNING  S_CURRENT     S_HIGH  USERS_MAX
----------------------------------------------------------
    0          0          4         9   300
1 row selected.

현재 데이터베이스에 정의되어 있는 명명된 사용자 수를 보여주는 쿼리입니다.

SELECT COUNT(*) FROM dba_users;

  COUNT(*)
----------
        41
1 row selected.



Reproduce

    아래와 같이 해결합니다.

--you try to set the value for license_max_users, but provided a value that is lower than the defined users in the system.

SQL> alter system set license_max_users=1;
alter system set license_max_users=1
*
ERROR at line 1:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00035: LICENSE_MAX_USERS cannot be less than current number of users
Check the number of currently defined users and change the statement accordingly:

SQL> select count(*) from dba_users;

  COUNT(*)
----------
        37

SQL> alter system set license_max_users=37;

System altered.


저작자 표시 비영리 동일 조건 변경 허락
신고




Why ?

여러가지 문제점을 갖을 수 있습니다. 해당 Alert Log와 Trace File을 분석하여서 각 상황에 맞게 대처하시면 될 것 같습니다.


1. Listener Log File이 4G 이상일 경우 발생 할 수 있습니다.

2. 클라이언트의 데이터베이스 접근에 대한 요청을 받아들일 수 있기위해서 가동되어야 할 리스너가 제대로 가동되지 않고 있을 경우 발생 할 수 있습니다.

3. Listener 파일 설정이 올바르게 되지 않고 있을 경우 발생 할 수 있습니다.



How ?

Checked The Database Alert Log File & Listener Log File


1. 리스너 서비스를 중단하고 해당 리스너로그 파일 명을 변경하거나 삭제(백업 여부는 본인의 판단)하고 리스너를 재시작합니다.

SQL *Net V2, Net8 에서는 listener.log는 반드시 출력됩니다. Backup의 타이밍등으로 삭제하는 방법을 검토하는 것이 좋지만, Net8 에서는 아래 방법으로 리스너로그를 사전에 쌓지 않게 할 수 있습니다.

-- lsnrctl을 실행합니다.
    cmd 창에서  lsnrctl 을 실행
    LSNRCTL> set current_listener <리스너명>          <= 옵션(리스너명이 LISTENER 가 아닌 경우(*))
    LSNRCTL> set log_status OFF                      <= 출력 정지
    LSNRCTL> set log_status ON                       <= 출력 개시 
 
    (*) 여러개의 리스너를 띄울경우 선택적으로 로그 생성,비생성이 가능합니다.

--  미리 출력하지 않게 설정합니다.
    listener.ora 에 이하의 파라미터를 추가합니다.
    LOGGING_<리스너명>=OFF

2. 리스너 로그 파일 사이즈를 변경합니다.

Windows
C:\> cd \oracle\ora92\network\log
C:\oracle\ora92\network\log> lsnrctl set log_status off
C:\oracle\ora92\network\log> rename listener.log listener.old
C:\oracle\ora92\network\log> lsnrctl set log_status on

UNIX
% cd /u01/app/oracle/product/9.2.0/network/log
% lsnrctl set log_status off
% mv listener.log listener.old
% lsnrctl set log_status on

-- 11g 이상은 아래에 표시된 경로로 이동하여 수행합니다.


3. Trace File을 확인하여 ORA-02062 또는 Trace File의 이름이 reco로 생성되면 아래와 같이 해결합니다. (Reproduce 참고)


cf - 리스너로그 파일은 아래의 위치에서 찾을 수 있습니다.

-- 10g 
$ORACLE_HOME/network/log/리스너이름.log
 
-- 11g
$ORACLE_BASE/diag/tnslsnr/인스턴스명/리스너명/trace/리스너이름.log



Reproduce

Trace File 에 아래와 같은 메시지가 표시되었을 경우를 가정합니다.

-- Trace File NAME
-- [oracle:/u01/sq/ora_1/oracle/diag/rdbms/dbjongjin/listener/trace]$ vi /u01/sq/ora_1/oracle/diag/rdbms/dbjongjin/listener/trace/listener_reco_14568.trc

-- Trace File 내용
Fatal NI connect error 12541, connecting to:
 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.99.205)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=DYACCT3)(CID=(PROGRAM=oracle)(HOST=test)(USER=oracle))))

        TNS for Solaris: Version 11.2.0.3.0 - Production
        TCP/IP NT Protocol Adapter for Solaris: Version 11.2.0.3.0 - Production
  Time: 13-1월 -2014 06:49:09
  Tracing not turned on.
  Tns error struct:
    ns main err code: 12541

TNS-12541: TNS:리스너가 없습니다.
    ns secondary err code: 12560
    nt main err code: 511

TNS-00511: 리스너가 없습니다.
    nt secondary err code: 146
    nt OS err code: 0
Errors in file /u01/sq/ora_1/oracle/diag/rdbms/dbjongjin/listener/trace/listener_reco_14568.trc;
ORA-02062: distributed recovery received DBID 6827025b, expected dcb2d01b
ORA-02062: distributed recovery received DBID 6827025b, expected 798cbc11
ORA-12541: TNS:no listener
ORA-12541: TNS:no listener
Mon Jan 13 07:00:01 2014
ALTER SYSTEM ARCHIVE LOG
Mon Jan 13 07:00:03 2014
Thread 1 advanced to log sequence 79027 (LGWR switch)
  Current log# 2 seq# 79027 mem# 0: /dbjongjin/oradata/test/redo1_21.log
  Current log# 2 seq# 79027 mem# 1: /dbjongjin/oradata/test/redo1_22.log
Mon Jan 13 07:00:04 2014
Archived Log entry 120041 added for thread 1 sequence 79026 ID 0x7ba901e7 dest 1:
Mon Jan 13 07:03:14 2014
Adjusting the default value of parameter parallel_max_servers
from 2560 to 135 due to the value of parameter processes (150)
Starting ORACLE instance (normal)
~
~

로컬 DB에서 디비링크를 통해서 리모트 DB(원래의 ID = dcb2d01b)에 대해 연결을 시도했지만 리모트 디비가 다른 ID(6827025b)를 갖고 있어 에러가 발생한 듯 보입니다. 따라서, 리모트 DB 상태를 확인하고 DB LINK를 다시 생성해야 합니다. 참고로  DB를 복구할 수 없어서, DB를 같은 이름으로 다시 생성해도 새로운 DBID를 갖게 됩니다. 


해당 DBID는 아래 쿼리로 구별 가능합니다.

SELECT DBID FROM V$DATABASE;

또 다른 경우로 현재 Trace File 명을 보게 되면 reco가 포함되어 있습니다. 이 경우는 DB LINK를 통해 Transaction도중 연결이 끊어지고 계속 Rollback을 시도중일 수 도 있습니다. 이 경우는 dba_2pc_pendig을 조회하여 해당 정보가 남아 있으면 purge 하여야 합니다.

SYS> SELECT LOCAL_TRAN_ID, GLOBAL_TRAN_ID,to_char(FAIL_TIME,'dd-mon-yyyy HH24:MI:SS'),STATE, MIXED FROM DBA_2PC_PENDING;

LOCAL_TRAN_ID                            GLOBAL_TRAN_ID                           TO_CHAR(FAIL_TIME,'DD-M STATE            MIX
---------------------------------------- ---------------------------------------- ----------------------- ---------------- ---
68.26.9771                               DYAMS11P.7e048ab7.68.26.9771             01-jul-2011 21:45:18    collecting       no

Elapsed: 00:00:00.00

SYS> EXECUTE DBMS_TRANSACTION.PURGE_LOST_DB_ENTRY ('68.26.9771');

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.06

SYS> commit;

Commit complete.

저작자 표시 비영리 동일 조건 변경 허락
신고




Why ?

1. 내부적인 SQL 실행 시 발생할 수 있습니다. (할당된 익스텐트가 가득 차서 다음 익스텐트를 할당받으려 할 때 오라클이 다음 익스텐트 크기 및 위치를 결정하는 SELECT 명령어를 내리는 경우)

2. INIT.ORA 파일의 매개변수 가운데 DC_FREE_EXTENTS, ROW_CACHE_ENQUEUES의 값이 너무 작게 할당되어 있을 경우 발생할 수 있습니다.

3. Tablespace FULL 또는 Extent 갯수의 최대 허용값을 초과하여 발생하는 경우 나타날 수 있습니다.



How ?

Checked The Database alert log file.


1. $ORACLE_HOME/dbs/init<SID>.ora 파일에 지정된 open_cursor의 크기를 재 설정합니다. 만약 설정이 되어 있지 않을 경우 기본값 500으로 설정되어 있습니다.

   open_cursors값을 255로 변경합니다.

2. DC_FREE_EXTENTS, ROW_CACHE_ENQUEUES 값들을 크게 설정합니다.

3. Tablespace 용량을또는 Extent를 확장합니다.



Reproduce

alert log file에 아래와 같은 메시지가 표시되었을 경우를 가정합니다.


 ORA-1655: unable to extend table SYS.SMON_SCN_TO_TIME_AUX by 128 in                 tablespace SYSAUX

우린 사용량 확인을 위해 다음과 같은 SQL로 테이블스페이스 확장공간을 확인합니다.

SELECT total.tablespace_name, ROUND (total.mb, 2) AS total_mb,
       ROUND (total.mb - free.mb, 2) AS used_mb,
       ROUND ((1 - free.mb / total.mb) * 100, 2) || '%' AS used_pct
  FROM (SELECT   tablespace_name, SUM (BYTES) / 1024 / 1024 AS mb
            FROM dba_free_space
        GROUP BY tablespace_name) free,
       (SELECT   tablespace_name, SUM (BYTES) / 1024 / 1024 AS mb
            FROM dba_data_files
        GROUP BY tablespace_name) total
 WHERE free.tablespace_name = total.tablespace_name;

SYSAUX 테이블스페이스의 Extent 부족을 확인하고 아래와 같이 확장작업을 합니다.

ALTER DATABASE DATAFILE ' /oracle/DEV/db/apps_st/data/sysaux01.dbf'' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED;

해당 작업은 각 데이터베이스 환경에 따라 달라질 수 있습니다.

저작자 표시 비영리 동일 조건 변경 허락
신고




Why ?

EXP를 사용하여 테이블에 데이터를 추출할 때, 해당 테이블에 FGA control policy가 적용 되어져 있는 경우 발생하는 에러입니다. 

FGA또는 FGAC가 적용되어 있는지 확인하는 방법은 실제 EXP 로그에 나오는 Data의 건수와, SYS사용자로 로그인 하여 Select한 수를 비교해보면 됩니다.



How ?

SYSDBA 권한을 가진 유저가 Export하면 되지만, 근본적인 원인은 해당 유저에게 다음 권한을 부여하면 해결 가능합니다.

SQL> grant exempt access policy to 'EXP 해당 유저';



Reproduce

SYSDBA 권한을 가진 유저가 Export하면 되지만, 근본적인 원인은 해당 유저에게 다음 권한을 부여하면 해결 가능합니다.

-- 에러 로그
. . exporting table                 CTESTS         819 rows exported
EXP-00079: Data in table "COUNTRIES " is protected. Conventional path may only be exporting partial table.
. . exporting table                DEPARTMENTS        346 rows exported
EXP-00079: Data in table "DEPARTMENTS" is protected. Conventional path may only be exporting partial table.
. . exporting table                   DEPARTMENTS      10135 rows exported
EXP-00079: Data in table "JOBS" is protected. Conventional path may only be exporting partial table.
. . exporting table                 JOBS        308 rows exported
EXP-00079: Data in table "EMPLOYEES" is protected. Conventional path may only be exporting partial table.
. . exporting table               EMPLOYEES          0 rows exported

-- 권한 부여
SQL> grant exempt access policy to test1;

Grant succeeded.

-- 정상 로그
 exporting table                   COUNTRIES    10135 rows exported
 exporting table                   REGIONS        308 rows exported
 exporting table                   LOCATIONS        0 rows exported
 exporting table                   JOBS             0 rows exported

저작자 표시 비영리 동일 조건 변경 허락
신고



Why ?

실행된 쿼리 DML(SELECT, UPDATE, DELETE)에 대해 만족하는 값을 얻지 못 할때 발생하는 에러입니다.

쿼리에 WHERE절 조건이 있다면, 그에 해당하는 조건을 만족하는 대상이 없거나, 대상 테이블이 비어있는 경우라고 볼 수 있습니다.



How ?

프로시저 컴파일 시 결과가 no data found라 나온 경우 아래와 같이 exception절을 추가하여 해결 가능합니다.

 begin
          select   NVL(FIRST_ZERO_APPROVED,'Y')
         ,from   aaa
          into   VVV_FIRST_ZERO_APPROVED
         ,       VVV_ASSESSMENT_STATUS
          from   gbsc_plan_manage_header
          where  le              = :parameter.le
          and    periods_seq     = :SEARCH.PERIODS_SEQ
          and    EMPLOYEE_NUMBER = :parameter.employee_number;
exception
    when no_data_found then null;



저작자 표시 비영리 동일 조건 변경 허락
신고