2026년 09월 25일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-14424 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-14424 can not shrink a segment that does not have row movement enabled 는?
ORA-14424는 Oracle 데이터베이스에서 세그먼트(테이블, LOB 등)를 축소(SHRINK)하려고 할 때, 해당 세그먼트에 ROW MOVEMENT 기능이 활성화되어 있지 않은 경우 발생하는 에러입니다. Oracle의 SHRINK SPACE 기능은 내부적으로 행(Row)의 물리적 위치를 재배치하는 과정을 거치기 때문에, ROW MOVEMENT가 반드시 활성화되어 있어야 합니다. 주로 대용량 데이터 삭제 후 공간 회수를 위해 ALTER TABLE ... SHRINK SPACE 명령을 실행할 때 빈번하게 발생합니다.
주요 발생 원인
- ROW MOVEMENT가 비활성화된 테이블에 SHRINK 명령 실행
가장 흔한 원인으로, 테이블 생성 시 기본값으로 ROW MOVEMENT는 비활성화(DISABLED) 상태입니다. DBA 또는 개발자가 이 설정을 확인하지 않고 ALTER TABLE ... SHRINK SPACE 또는 ALTER TABLE ... SHRINK SPACE CASCADE 명령을 실행하면 ORA-14424가 즉시 발생합니다. 특히 자동화된 배치 스크립트나 공간 관리 스크립트에서 이 옵션을 빠뜨리는 경우가 많습니다.
- 파티션 테이블의 특정 파티션 SHRINK 시도
파티션 테이블의 경우, 테이블 전체가 아닌 특정 파티션에 대해 SHRINK를 시도할 때도 해당 파티션의 ROW MOVEMENT 설정이 확인됩니다. 파티션 테이블은 각 파티션 레벨이 아닌 테이블 레벨에서 ROW MOVEMENT를 활성화해야 하며, 이를 혼동하여 에러가 발생하는 경우가 있습니다. 파티션이 많은 대용량 테이블에서 간과하기 쉬운 원인입니다.
- LOB 세그먼트 또는 IOT(Index-Organized Table) SHRINK 시도
LOB 컬럼을 포함한 테이블이나 IOT 구조의 테이블에 SHRINK를 시도할 때도 동일한 에러가 발생할 수 있습니다. LOB 세그먼트는 별도의 세그먼트로 관리되며, 부모 테이블에 ROW MOVEMENT가 활성화되어 있더라도 LOB 세그먼트 자체의 설정이 영향을 줄 수 있습니다. IOT는 구조적 특성상 일반 SHRINK가 아닌 별도의 방법으로 접근해야 합니다.
해결 방법
원인 1 해결: ROW MOVEMENT 활성화 후 SHRINK 실행
가장 기본적인 해결책입니다. SHRINK 실행 전에 반드시 ROW MOVEMENT를 활성화하고, 작업 완료 후 필요에 따라 다시 비활성화합니다.
-- Step 1: 현재 ROW MOVEMENT 상태 확인
SELECT table_name, row_movement
FROM dba_tables
WHERE table_name = 'YOUR_TABLE_NAME'
AND owner = 'YOUR_SCHEMA';
-- Step 2: ROW MOVEMENT 활성화
ALTER TABLE your_schema.your_table ENABLE ROW MOVEMENT;
-- Step 3: 세그먼트 축소 실행 (데이터 재구성)
ALTER TABLE your_schema.your_table SHRINK SPACE;
-- Step 4: 하이워터마크까지 압축 및 공간 반환
ALTER TABLE your_schema.your_table SHRINK SPACE COMPACT;
-- Step 5: CASCADE 옵션으로 인덱스까지 함께 축소
ALTER TABLE your_schema.your_table SHRINK SPACE CASCADE;
-- Step 6: 작업 완료 후 ROW MOVEMENT 비활성화 (선택)
ALTER TABLE your_schema.your_table DISABLE ROW MOVEMENT;
원인 2 해결: 파티션 테이블 SHRINK
파티션 테이블의 경우 테이블 레벨에서 ROW MOVEMENT를 활성화하면 모든 파티션에 적용됩니다.
-- 파티션 테이블 ROW MOVEMENT 활성화
ALTER TABLE your_schema.your_partitioned_table ENABLE ROW MOVEMENT;
-- 특정 파티션만 SHRINK
ALTER TABLE your_schema.your_partitioned_table
MODIFY PARTITION partition_name SHRINK SPACE;
-- 파티션 상태 확인
SELECT partition_name, segment_type, blocks, empty_blocks
FROM dba_segments s
JOIN dba_tab_partitions p
ON s.segment_name = p.table_name
AND s.partition_name = p.partition_name
WHERE p.table_name = 'YOUR_PARTITIONED_TABLE'
AND p.table_owner = 'YOUR_SCHEMA';
원인 3 해결: LOB 세그먼트 SHRINK
-- LOB 컬럼 포함 테이블 ROW MOVEMENT 활성화
ALTER TABLE your_schema.your_table ENABLE ROW MOVEMENT;
-- LOB 세그먼트 개별 SHRINK
ALTER TABLE your_schema.your_table
MODIFY LOB (your_lob_column) (SHRINK SPACE);
-- LOB 세그먼트 정보 확인
SELECT column_name, segment_name, tablespace_name
FROM dba_lobs
WHERE table_name = 'YOUR_TABLE'
AND owner = 'YOUR_SCHEMA';
전체 스키마 대상 일괄 처리 스크립트
실무에서 여러 테이블을 한 번에 처리해야 할 경우 유용한 스크립트입니다.
-- ROW MOVEMENT가 비활성화된 테이블 목록 조회
SELECT owner, table_name, row_movement
FROM dba_tables
WHERE owner = 'YOUR_SCHEMA'
AND row_movement = 'DISABLED';
-- 동적 SQL을 사용한 일괄 ROW MOVEMENT 활성화 및 SHRINK
BEGIN
FOR rec IN (
SELECT owner, table_name
FROM dba_tables
WHERE owner = 'YOUR_SCHEMA'
AND row_movement = 'DISABLED'
) LOOP
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE ' || rec.owner || '.' || rec.table_name
|| ' ENABLE ROW MOVEMENT';
EXECUTE IMMEDIATE 'ALTER TABLE ' || rec.owner || '.' || rec.table_name
|| ' SHRINK SPACE CASCADE';
DBMS_OUTPUT.PUT_LINE('SUCCESS: ' || rec.table_name);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('ERROR on ' || rec.table_name || ': ' || SQLERRM);
END;
END LOOP;
END;
/
예방 방법
- 테이블 생성 시 ROW MOVEMENT 기본 활성화 정책 수립
SHRINK SPACE 작업이 예상되는 테이블(대용량 데이터의 주기적 삭제가 발생하는 테이블 등)은 처음 생성 시부터 ENABLE ROW MOVEMENT 옵션을 포함하는 것을 표준으로 삼으세요. DBA 팀 내 테이블 생성 가이드라인에 이 항목을 명시하고, DDL 리뷰 프로세스에서 반드시 체크하도록 합니다. 이를 통해 운영 중 갑작스러운 에러 발생을 원천 차단할 수 있습니다.
“`sql
— 테이블 생성 시 ROW MOVEMENT 활성화 포함
CREATE TABLE your_schema.your_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(100),
reg_date DATE DEFAULT SYSDATE
)
ENABLE ROW MOVEMENT;
“`
- 정기적인 공간 관리 스크립트에 사전 확인 로직 포함
공간 회수를 위한 자동화 스크립트나 배치 작업을 작성할 때, SHRINK 명령 실행 전 반드시 ROW MOVEMENT 상태를 확인하고 자동으로 활성화하는 로직을 포함시킵니다. 또한 SHRINK 작업 전후의 세그먼트 크기를 기록하여 실제 공간 회수량을 모니터링하고, 이를 정기 리포트로 관리하면 전체적인 공간 관리 효율을 높일 수 있습니다.
관련 에러
- ORA-10636: ROW MOVEMENT 관련 내부 오류로, SHRINK 작업 중 행 이동이 실패할 때 발생할 수 있습니다.
- ORA-14412: 파티션 또는 서브파티션에 대한 SHRINK 작업이 지원되지 않는 환경에서 발생하는 에러입니다.
- ORA-14400: 삽입된 파티션 키가 파티션 범위에 맞지 않을 때 발생하며, ROW MOVEMENT 활성화 후 행 재배치 과정에서 드물게 연관되어 나타납니다.
- ORA-01654: 테이블스페이스의 공간 부족으로 세그먼트 확장이 불가능할 때 발생하며, SHRINK 작업 전 공간을 확인하지 않았을 때 연이어 발생할 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.