현상
int max value 값(2147483647) 이상으로 table에 row가 있을 때 tbexport 과정에서 JDBC-90613:Number of fetched rows exceeds the maximum 오류가 발생했습니다.
원인
JDBC에 1.8 패치 미적용으로 resultset값이 int max value 이상을 처리하지 못해 row 추출 과정에서 오류가 발생하였습니다.
해결
1.
패치를 적용합니다. (적용 패치: FS02_315042a_expimp)
주의
티맥스티베로에서 제공하는 기술지원을 통해 패치를 적용합니다.
•
FS02_315042a_expimp 패치 설명: export 모듈 자체적으로 ora_hash 이용하여 버킷을 나누어 integer max value 이상의 값을 처리 할 수 있도록 ora_hash라는 hidden parameter 생성합니다.
•
패치 적용 후 결과
tbexport/import username=tibero password=tibero sid=tibero ip=xxx.xxx.xxx port=xxxx file=test.dat log=test.log user=test ora_hash=y
SQL
복사
2.
회피책을 설정하여 오류 해결을 시도할 수 있습니다.
•
회피책: row를 Integer.Max_Value 값 미만으로 설정하여 데이터를 나누어 삽입합니다.
ORA_HASH 함수를 활용합니다. (데이터를 특정 bucket 수만큼 분할할 수 있고, ROWID를 기반으로 하면 데이터가 적절히 분산되도록 할 수 있습니다.)
2.1) 테이블 구조 생성
-- 원본 테이블
CREATE TABLE t1 (
c1 NUMBER,
c2 VARCHAR2(100),
c3 DATE
);
-- 테스트용 샘플 데이터 삽입
INSERT INTO t1
SELECT level, 'value_' || level, SYSDATE - level
FROM dual
CONNECT BY level <= 1000;
commit;
-- 분산 저장할 서브 테이블 생성 (원본과 구조 동일)
CREATE TABLE t1_1 AS SELECT * FROM t1 WHERE 1=0;
CREATE TABLE t1_2 AS SELECT * FROM t1 WHERE 1=0;
CREATE TABLE t1_3 AS SELECT * FROM t1 WHERE 1=0;
CREATE TABLE t1_4 AS SELECT * FROM t1 WHERE 1=0;
SQL
복사
2.2) ORA_HASH(ROWID, 3)를 이용한 데이터 분할
-- bucket 0
INSERT INTO t1_1
SELECT * FROM t1 WHERE ora_hash(rowid, 3) = 0;
-- bucket 1
INSERT INTO t1_2
SELECT * FROM t1 WHERE ora_hash(rowid, 3) = 1;
-- bucket 2
INSERT INTO t1_3
SELECT * FROM t1 WHERE ora_hash(rowid, 3) = 2;
-- bucket 3
INSERT INTO t1_4
SELECT * FROM t1 WHERE ora_hash(rowid, 3) = 3;
SQL
복사
2.3) 데이터 검증
-- 각 테이블의 row count 확인
SELECT 't1_1' AS table_name, COUNT(*) FROM t1_1
UNION ALL
SELECT 't1_2', COUNT(*) FROM t1_2
UNION ALL
SELECT 't1_3', COUNT(*) FROM t1_3
UNION ALL
SELECT 't1_4', COUNT(*) FROM t1_4;
-- 원본 데이터와 비교
SELECT COUNT(*) FROM t1; -- 전체 건수
SQL
복사