2015년 11월 25일 수요일

오라클(oracle) 11g 에서 사용하지 않은 테이블이 exp 되지 않을 때

오라클 백업 및 복원시 exp / imp 명령을 사용해서 복원했는데, 테이블의 개수가 다른 경우가 있다.
11g 부터 생성하고 한번도 사용하지 않은 테이블의 경우 dmp에서 제외된다고 한다.

이럴때 강제로 테이블에 segment를 할당하기 위해,

ALTER TABLE <table_name> ALLOCATE EXTENT;

쿼리를 활용하면 됨.


빈 테이블만 ALTER 쿼리를 만들기 위해,

SELECT 'ALTER TABLE '||table_name||' ALLOCATE EXTENT;' FROM user_tables WHERE segment_created = 'NO';

를 실행하고, 쿼리 결과를 다시 실행한 다음 exp를 실행하면
모든 테이블을 export 받을 수 있다.


2015년 11월 20일 금요일

Tomcat 오라클에서 오류. ORA-01000: 최대 열기 커서 수를 초과했습니다

http://serendipity.tistory.com/65 를 참고했습니다.

톰캣에서 "ORA-01000: 최대 열기 커서 수를 초과했습니다" 오류가 발생하는 것은
오라클 프로세스당 커서수가 증가되어 발생되는 에러.


1) 쿼리로 오라클 프로세스 당 커서수를 확인

SELECT sid, count(sid) AS cursor
FROM V$OPEN_CURSOR
WHERE user_name = 'SCOTT'
GROUP BY sid
ORDER BY cursor DESC

접속자수에 따라 다르지만, 오라클 cursor 수가 100개(일반적인 사이트는 20개)가 넘는 세션에서 사용하는 SQL문장은 의심할 필요 있음.



2) SQL문에서 사용하는 커서수

SELECT sql_text, count(sid) cnt
FROM V$OPEN_CURSOR
GROUP BY sql_text
ORDER BY cnt DESC

커서수가 많은 sql 문장을 찾아보면, 자바에서 preparedStatement가 close()되지 않았을 확률이 높음
특히 for문이나 Loop문에서 preparedStatement를 사용하는 부분 확인 필요.