오류 (8)

안녕하세요, 케이치입니다.


오늘도 쉽게 넘어가지를 않고 에러가 발생하네요. 오늘은 윈도우용 도커를 설치를 했다가 jre 8 이 정상적으로 동작을 하지 못하게 된 케이스입니다.


jdk7, 8, jre7, 8을 윈도우10 에 설치해서 사용중인 환경인데요 jdk8을 설치해보신 분들은 아시겠지만 7버전 까지는 c:\Program Files\Java 밑에 설치가 되고 환경설정 변수에도 해당 경로의 bin디렉토리를 설정해줬었는데(C:\Program Files\Java\jre7\bin), 8버전부터는 C:\ProgramData\Oracle\Java\javapath\java.exe 를 환경변수에 가지도록 해놨더군요. 물론 설치 경로는 Program Files\Java\jdk1.8 이었는데도 불구하고 말이죠. 어찌되었건 잘 쓰고있었는데, 문제가 생긴건 챗봇 오픈소스 테스트를 하려고 윈도우용 도커를 설치해서 테스트를 하고난 뒤에 발생했습니다. 갑자기 이클립스(Oxygen)가 실행이 안되더군요. 

뭐지? 뭐지? 하다가, 이클립스를 다시 설치해보고 실행했더니 처음 한번은 잘 됩니다. 다시 이클립스를 종료했다가 실행시키면 또 안되고 참 희한한 현상이 발생했습니다. ㅠㅠ


아무튼 한참을 해메다가 neon 버전으로 다시 설치해서도 해보고 하다가 java를 실행해봤는데 아래와 같은 에러가 발생하더군요.


Error occurred during initialization of VM

java/lang/NoClassDefFoundError: java/lang/Object


허허, 이런 메시지는 또 처음 봐서 구글링을 해봤더니 jdk, jre 설치가 정상적으로 안된 케이스에서 발생하는 경우가 많은 것 같더군요.


조금 전까지 아무 문제 없던게 도커를 설치했더니 자바가 실행이 안된다? 좀 이해가 안되는 부분이라서 java명령어를 실행할 때 Program Files 하위의 java를 쓰는건지 ProgramData하위의 java를 쓰는건지 확인해보고 싶었습니다. 그때 사용한 명령어는 아래와 같습니다.


 for %i in (java.exe) do @echo. %~$PATH:i


윈도우에서 기본적으로 제공해주는 for 명령어를 이용한 것으로 도움말을 출력해보면 아래와 같습니다.



C:\Users\dev>for /?

파일 집합에서 각 파일에 대해 지정된 명령을 실행합니다.


FOR %변수 IN (집합) DO 명령어 [명령어 매개 변수]


  %변수      바꿀 수 있는 매개 변수를 한 문자로 지정합니다.

  (집합)      하나 이상의 파일을 지정합니다. 와일드카드를 사용할 수 있습니다.

  명령어      각 파일에 대해 수행할 명령을 지정합니다.

  명령어-매개 변수

              지정된 명령의 매개 변수나 스위치를 지정합니다.


일괄 프로그램에서 FOR 명령을 쓰려면, '%변수' 대신 '%%변수'를 지정하십시오.

변수 이름에서는 대문자와 소문자를 구별하므로 %i와 %I는 다릅니다.


명령 확장을 사용하면 FOR 명령에 아래와 같은 추가적인 형태가

지원됩니다.


FOR /D %변수 IN (집합) DO 명령 [명령-매개 변수]


   집합에 대표 문자가 있으면 파일 이름 대신 디렉터리 이름과

   일치하도록 지정합니다.


FOR /R [[드라이브:]경로] %변수 IN (집합) DO 명령 [명령-매개 변수]


   [드라이브:]경로를 루트로 하여 디렉터리 트리를 따라 내려가며

   FOR 구문을 트리의 각 디렉터리에서 실행합니다. /R 스위치 뒤에

   디렉터리가 지정되지 않으면 현재 디렉터리가 사용됩니다.

   집합에 마침표(.)가 사용되면 디렉터리 트리만 나열합니다.


FOR /L %변수 IN (시작,단계,끝) DO 명령 [명령-매개 변수]


   집합은 단계별로 증가/감소하는 시작부터 끝까지의 일련의 숫자입니다.

   따라서 (1,1,5)는 1 2 3 4 5를 나타내며 (5,-1,1)은 5 4 3 2 1을

   나타냅니다.


FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ("문자열") DO 명령어 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ('명령어') DO 명령어 [명령-매개 변수]


    또는 usebackq 옵션이 있는 경우:


FOR /F ["옵션"] %변수 IN (파일-집합) DO 명령 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN ('문자열') DO 명령어 [명령-매개 변수]

FOR /F ["옵션"] %변수 IN (`명령어`) DO 명령어 [명령-매개 변수]


   파일-집합은 하나 이상의 파일 이름입니다. 파일-집합의 각 파일은

   다음 파일로 이동하기 전에 열기 또는 읽기 등의 작업이 진행됩니다.

   파일을 읽어서 문자열을 한 행씩 분리하고 각 행을 0개 이상의

   토큰으로 구문 분석하는 과정으로 되어 있습니다. For 루프의 본문은발견된 토큰 문자열에 설정된 변수 값(들)과 함께 호출됩니다.

   기본값으로 /F는 파일의 각 행으로부터 분리된 토큰을 첫 번째 공백에전달합니다. 빈 행은 건너뜁니다. "옵션" 매개 변수를 지정하여

   기본 구문 분석 동작을 무시할 수 있습니다. 이것은 다른 구문 분석

   매개 변수를 지정하는 하나 이상의 키워드를 갖는 인용 부호로

   묶인 문자열입니다.

   키워드는 아래와 같습니다.


   eol=c  - 행 끝 설명 문자를 지정합니다 (하나만)

   skip=n  - 파일의 시작 부분에서 무시할 행의 개수를 지정합니다.

   delims=xxx  - 구분 문자 집합을 지정합니다.  이것은 공백 또


계속하려면 아무 키나 누르십시오 . . .


너무 길어서 짧게 끊었습니다. 위에서 사용한 명령어는 유닉스의 which java와 같이 PATH환경변수에 있는 디렉토리 경로를 훑으면서 제일 처음 만나는 java위치를 출력해줍니다. 즉, 윈도우용 which 명령어라고 생각하시면 될 것 같습니다.



이상입니다.




아래는 기록을 위해서 개인적으로 작성했던 노트입니다.

오픈소스 챗봇 테스트를 위해서 Docker 설치하고 테스트 한 이후부터 이클립스 실행이 안되는 현상 발생
    - 다시 동일한 디렉토리에 Oxygen버전 인스톨러를 이용해서 재설치 한 뒤 launch하면 기동이 되나, 재부팅 후에는 역시 또 안됨
    - Neon 버전처럼 패키지로 배포되는 이클립스는 새로 다운받아서 실행해도 실행 안됨
    - Java를 실행해보니 다음과 같은 에러 메시지 발생
        - Error occurred during initialization of VM
          java/lang/NoClassDefFoundError: java/lang/Object
    - 현재 jdk1.7과 1.8 버전이 설치되어있고 jre역시 7, 8 버전이 설치되어있음
    - 아래 명령어를 이용하여 어느 위치의 자바가 실행되고 있는지 확인
        for %i in (java.exe) do @echo. %~$PATH:i
        - C:\ProgramData\Oracle\Java\javapath\java.exe
    - jdk 1.8을 설치하면 환경변수에 위 경로로 세팅이 됨
    - Docker를 설치하고나서 위 java를 실행하면 에러가 발생함
    - jdk1.7, jdk1.8 의 java.exe를 실행하면 정상적으로  실행이 되는 것을 확인
    - jdk1.8을 재설치하여 정상적으로 java가 실행이 되도록 할 수도 있으나 일단은 환경변수 확인
    - 환경변수에는 JAVA_HOME에 jdk1.8의 패스가 잡혀있고 PATH에 %JAVA_HOME%\bin이 있음, 그리고 ProgramData\OracleJava\javapath도 잡혀있음
    - 환경변수에서 ProgramData\OracleJava\javapath 경로는 제거함
    - 다시 이클립스를 재기동 해보니 정상적으로 기동함

    - jre1.8의 java는 정상적으로 실행이 안됨 -> 재설치






💻 Programming/Oracle 11g

ORA-01157: cannot identify/lock data file

ORA-01157: cannot identify/lock data file

데이타 파일을 실수로 삭제해버렸다가 DB재시작하게되면 아래처럼 오류가 발생하게 된다.

내가 아닌 누군가가 dbf생성했다가 drop명령을 쓰지않고 unix 콘솔에서 dbf파일을 삭제하게 되면 발생하게되는 오류인데 생각보다 쉽게 해결할 수 있습니다.



ERROR at line 1:
ORA-01157: cannot identify/lock data file 29 - see DBWR trace file
ORA-01110: data file 29:
'/opt/oracle/product/oracle9i/dbs/C:oracleproduct10.2.0oradatapentahoptho_ts.dbf
'

from above datafile name you have realized that its a kinda jerk :s someone has made a datafile with no sense and then he/she have removed the file by O.S command, but he/she did'nt updated database about it !

So during the test when we were starting this database it came untill mount stage and then got stuck !!! i.e.

Problem:

SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file 29 - see DBWR trace file
ORA-01110: data file 29:
'/opt/oracle/product/oracle9i/dbs/C:oracleproduct10.2.0oradatapentahoptho_ts.dbf
'

so to fix it, i did following:

Solution:


SQL>alter database datafile 29 OFFLINE DROP;
SQL>alter database open;


출처 : http://nayyares.blogspot.kr/2009/08/ora-01157-cannot-identifylock-data-file.html


아...슬프도다....이 에러의 원인을 찾느라 얼마나 헤맸던지...

쿼리문의 인자로 들어가는 녀석들이 13개이고 이 쿼리문을 스트링 + 스트링 형식으로 묶어놨는데 콤마가 빠진 이유로 변수명이 부적합하다는 오류를 찍어대니 이거 원인을 어떻게 찾으라고.!!!!!!

 

구글링 해보니......

 

콤마가 빠져도 저런 오류를 뿌린다는 것...

 

잘 보니 인자가 많아서 줄바꿈할 때 쉼표를 하나 빼먹었던 것.


이 에러가 났을 때 뭐 때문에 busy라고 나오는지 궁금하다면??

sysdba권한으로 아래 쿼리를 날려보자. 무슨쿼리 때문에 어느 테이블이 lock이 걸려있는지 확인할 수 있다. 

SELECT O.OBJECT_NAME, S.SID, S.SERIAL#, P.SPID, S.PROGRAM,S.USERNAME,
S.MACHINE,S.PORT , S.LOGON_TIME,SQ.SQL_FULLTEXT 
FROM V$LOCKED_OBJECT L, DBA_OBJECTS O, V$SESSION S, 
V$PROCESS P, V$SQL SQ 
WHERE L.OBJECT_ID = O.OBJECT_ID 
AND L.SESSION_ID = S.SID AND S.PADDR = P.ADDR 
AND S.SQL_ADDRESS = SQ.ADDRESS;


위 쿼리를 실행해서 SID와 SERIAL#을 알아내면 아래와 같은 명령으로 해당 세션을 죽일 수 있다.

ALTER SYSTEM KILL SESSION 'SID, SERIAL#';

이상~!!! 당신에게 노력과 행운의 여신이 함께하여 문제가 해결되기를~~


테이블 스페이스를 튜닝하려고 아래 명령어를 입력하였다.

 

ALTER TABLESPACE 테이블스페이스명 AUTOEXTEND ON NEXT 1024K;

 

그랬더니 아래처럼 오류가 떨어졌다.

 

ORA-32773: operation not supported for smallfile tablespace 테이블스페이스명  

 

구글링해서 얻어온 해결책 하나. 아래 경우를 살펴보기 바란다.

 

 

SQL> alter tablespace users resize 300m;
alter tablespace users resize 300m
*
ERROR at line 1:
ORA-32773: operation not supported for smallfile tablespace USERS

SQL> select file_id, tablespace_name from dba_data_files;

   FILE_ID TABLESPACE_NAME
---------- ------------------------------
         1 SYSTEM
         2 UNDOTBS1
         3 SYSAUX
         4 USERS

SQL> alter database datafile 4 resize 300m;

Database altered.

//--------Description from online documents------------------------------------------------------------------
ORA-32773: operation not supported for smallfile tablespace string
Cause:
An attempt was made to perform. an operation which is supported only for bigfile tablespaces, e.g. resize tablespace.
Action: Use the appropriate clause of the ALTER DATABASE DATAFILE command instead.


SQL> alter tablespace users autoextend off;
alter tablespace users autoextend off
*
ERROR at line 1:
ORA-32773: operation not supported for smallfile tablespace USERS


SQL> alter database datafile 4 autoextend off;

Database altered.

 

출처 : http://blog.itpub.net/9765498/viewspace-259958/ 


ORA-00845: MEMORY_TARGET not supported on this system 오류가 발생했다!!!!!

으악!!!!

 

오라클을 재시작하려고 shutdown시킨 뒤 startup을 실행시켰더니 갑자기 이런 오류가 발생했다.

뭥미?? 처음 본 오류라 당황ㅠㅠ

 

구글링해보니 /dev/shm 마운트한거랑 관련이 있었다. 무슨 이유 때문에 발생했는지는 아직도 확실치 않지만...아래와 같이 해결했다.

 

$ umount -l tmpfs

( tmpfs는 /dev/shm이 마운트된 이름이다. 쉘에서 mount명령어로 확인했을때 제일 좌측에 나오는 이름 )

( -l (소문자L)옵션없이 언마운트시키려고 했을때는 busy라고 계속뜨길래 옵션을 주고 언마운트 시켰다. lazy umount 옵션이다. )

 

$ mount -t tmpfs tmpfs /dev/shm

( 다시 마운트 하기 ) 

 

그리고 sqlplus에 sysdba로 conn해서 

SQL> startup

 

게임오버~!  

 

좀 더 자세한 사항은 이곳을 참조하세요. 

device is busy 문제로 umount가 안된다면 이곳을 참조하세요. 


파티셔닝된 테이블의 테이블 스페이스를 옮기려고 할 때 발생했던 오류.

SQL> alter table 테이블명 move tablespace 테이블스페이스명

 

이런경우​에는 아래와 같은 명령어를 사용하자.

 

SQL> alter table 테이블명 modify default attributes tablespace 테이블스페이스명;

 

​그리고 부가적으로 처리해야 하는 일들이 좀 있다.

자세한 사항은 아래 영문을 확인해보길 바란다.

 

출처 : http://amit7oracledba.blogspot.kr/2013/03/move-partitioned-tables-to-different.html 

 

 

How to move partitioned tables to different tablespace

Yesterday I was trying to move a partitioned table to different tablespace using move command I got the following error:-

SQL> alter table partition move tablespace users parallel 10;
alter table partition move tablespace users parallel 10
            *
ERROR at line 1:
ORA-14511: cannot perform operation on a partitioned object


Default tablespace of partitioned table :-

SQL> select TABLE_NAME,PARTITIONING_TYPE,DEF_TABLESPACE_NAME from dba_part_tables where table_name='PARTITION';

TABLE_NAME                     PARTITIONING_TYPE                 DEF_TABLESPACE_NAME
----------------------------------------------------------------------------------------------------------------
PARTITION                          LIST                                               SYSTEM

Changing the default tablespace of Partition table. Now new partitions will be created in the new default tablespace, but old partitions will remain in the old default tablespace :-


SQL> alter table partition modify default attributes tablespace users;

Table altered.

SQL> select TABLE_NAME,PARTITIONING_TYPE,DEF_TABLESPACE_NAME from dba_part_tables where table_name='PARTITION';

TABLE_NAME                     PARTITIONING_TYPE                             DEF_TABLESPACE_NAME
----------------------------------------------------------------------------------------------------------------
PARTITION                          LIST                                               USERS

SQL> SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,NUM_ROWS FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='PARTITION';

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME                  NUM_ROWS
----------------------------------------------------------------------------------------------------------------------------
PARTITION                          PAR1                                       SYSTEM
PARTITION                          PAR2                                       SYSTEM

SQL> SELECT * FROM PARTITION;

        ID NAME
---------- ---------------------
         1 d
         3 f
         7 y
         8 t

Analyzing above select statements, table partition have 4 records but records won't reflect in the NUM_ROWS column of USER_TAB_PARTITIONS  view. We need to gather the stats of Table "PARTITION" to reflect the records in NUM_ROWS column.


SQL> SHOW USER
USER is "SYS"
SQL> EXEC DBMS_STATS.gather_table_stats('SYS', 'PARTITION', granularity=>'ALL');

PL/SQL procedure successfully completed.


SQL> SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,NUM_ROWS FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='PARTITION'

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME                  NUM_ROWS
-------------------------------------------------------------------------------------------------------------------------
PARTITION                         PAR1                                         SYSTEM                                  2
PARTITION                         PAR2                                         SYSTEM                                  2

Moving OLD partitions to different tablespace :-


SQL> select 'alter table ' || table_name || ' move partition ' || partition_name|| ' tablespace users parallel 10;' "PARTITION_MOVE_SCRIPT" from user_tab_partitions where table_name='PARTITION';

PARTITION_MOVE_SCRIPT
----------------------------------------------------------------------------------------------------------------------
alter table PARTITION move partition PAR1 tablespace users parallel 10;
alter table PARTITION move partition PAR2 tablespace users parallel 10;

After moving a table or partitioned table to different tablespace , indexes associated to the tablespace become unusable. We need to rebuild the associated indexes to make them usable.

Status of Indexes before moving a table :-


SQL>  select index_name,PARTITION_NAME,status from user_IND_PARTITIONS where TABLESPACE_NAME='SYSTEM';

INDEX_NAME                     PARTITION_NAME                 STATUS
----------------------------------------------------------------------------------------
PAR_IDX                             PAR1                                        USABLE
PAR_IDX                            PAR2                                         USABLE

 SQL> alter table PARTITION move partition PAR1 tablespace users parallel 10;

Table altered.

SQL> alter table PARTITION move partition PAR2 tablespace users parallel 10;

Table altered.

SQL>
SQL> SELECT TABLE_NAME,PARTITION_NAME,TABLESPACE_NAME,NUM_ROWS FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='PARTITION';

TABLE_NAME                     PARTITION_NAME                 TABLESPACE_NAME                  NUM_ROWS
--------------------------------------------------------------------------------------------------------------------------
PARTITION                          PAR1                                        USERS                                   2
PARTITION                          PAR2                                        USERS                                   2

SQL> select index_name,PARTITION_NAME,status from user_IND_PARTITIONS where TABLESPACE_NAME='SYSTEM';

INDEX_NAME                     PARTITION_NAME                 STATUS
-----------------------------------------------------------------------------------------
PAR_IDX                              PAR1                                       UNUSABLE
PAR_IDX                              PAR2                                       UNUSABLE

It seems that the indexes becomes unusable. We need to rebuild the indexes to make them usable.

SQL> select 'alter index ' || a.index_name ||  ' rebuild partition ' || a.PARTITION_NAME || ' tablespace USERS parallel 10;' from user_ind_partitions a, user_tab_partitions b where a.partition_name=b.partition_name and b.table_name='PARTITION';


'ALTERINDEX'||A.INDEX_NAME||'REBUILDPARTITION'||A.PARTITION_NAME||'TABLESPACEUSERSPARALLEL10;'
-------------------------------------------------------------------------------------------------------------------------
alter index PAR_IDX rebuild partition PAR1 tablespace USERS parallel 10;
alter index PAR_IDX rebuild partition PAR2 tablespace USERS parallel 10;

SQL> select index_name,PARTITION_NAME,status from user_IND_PARTITIONS where TABLESPACE_NAME='USERS';

INDEX_NAME                     PARTITION_NAME                 STATUS
------------------------------------------------------------------------------------------
PAR_IDX                              PAR1                                        USABLE
PAR_IDX                              PAR2                                        USABLE

This way we can move a partitioned table having n number of partitions to different tablespace.


오라클 DB를 백업할때 exp명령어를 이용할 때 아래와 같은 오류메시지를 본 적이 있을 것이다.

 

EXP-00091 Exporting questionable statistics

 

이 에러는 data를 export할 때 해당 데이타와 관련된 optimizer statistics를 함께 export하려고 할 때 발생한다고 한다. export를 한다는 것은 단순히 백업용도로 사용하는 경우도 있겠지만 다른 서버로 데이타를 이전 할 때 사용하기도 한다. 데이터를 이전하게되면 오라클은 변경된 환경에 맞게끔 plan을 세워야 하는데 기존의 통계를 함께 export하게되면 plan을 정할 때 최적화된 plan을 세우는데 영향을 미칠 수 있기 때문에 경고메시지를 띄워주는 것이다.

 

통계를 제외하고 데이타만 export하기 위해서는 exp명령어 옵션 중에 statistics=none이라는 옵션을 추가로 붙여주면 된다. 

 

좀 더 자세한 사항은 아래 링크를 참조하길 바란다.

http://www.dba-oracle.com/t_exp_00091_exporting_questionable_statistics.htm