결국 문제는 pk 인덱스가 깨져서 일어났던문제입니다.
혹시라도 저같은 경우을 격지말시라고 글남깁니다. 에러처리시 리턴값이 없다면 SELECT 대신 PERFORM 을 사용하세요. SQLERRM,SQLSTATE 를 사용하여 에러명을 꼭 확인하세요.
아래 쿼리에서 빨간색으로 표시한곳입니다. 저걸로 에러를 추적하시면 EXCEPTION 처리되었을때 해당 에러를 알려줍니다. 아래 게시물의 경우 read block 에러가 나서 안되었던겁니다. 시스템특성상 delete insrt 가 빈번한대
그러다보니 서버가 죽거나 ㅡㅡ; 자주 인덱스가깨지는 문제가있었습니다.
/* 에러처리 */
EXCEPTION
/* 중복에러 */
WHEN DUP_VAL_ON_INDEX
THEN PERFORM indigo.FN_SAVE_DATA_ERROR_LOG(V_START_DT, V_SEQ_NO);
RAISE NOTICE '중복에러 !';
/* 그밖의 에러 */
WHEN OTHERS
THEN PERFORM indigo.FN_SAVE_DATA_ERROR_LOG(V_START_DT, V_SEQ_NO);
RAISE NOTICE '% %',SQLERRM,SQLSTATE;
RETURN 리턴값
----------------------------------------------------------------read block 가 일어난 오브잭트를 찾는 방법
이건 EXTENSION 을 활용한 방법이고 PostgreSQL versions 9.6 (before 9.6.1), 9.5 (before 9.5.5), 9.4 (before 9.4.10), and 9.3 (before 9.3.15) 에서 지원하는 방법입니다.
CREATE EXTENSION pg_freespacemap;
SELECT oid::regclass AS relname, pg_relation_filepath(oid) || '_fsm' AS fsm
FROM pg_class, CAST(current_setting('block_size') AS BIGINT) AS bs
WHERE relkind IN ('r', 'i', 't', 'm') AND EXISTS (SELECT 1 FROM generate_series(pg_relation_size(oid) / bs, (pg_relation_size(oid, 'fsm') - 2*bs) / 2) AS blk
문제가 되는 오브잭트의 문제점을 해결하시면 됩니다.
자세한 내용은 여기 를 들어가보시면 있습니다.
|