Skip to content
13.7 스키마 변경 체크리스트

13.7 스키마 변경 체크리스트

운영 중 스키마 변경 전에 아래 항목을 순서대로 확인합니다.

변경 전 점검

1. 테이블 타입 확인

SELECT NAME AS TABLE_NAME, TYPE AS TABLE_TYPE
  FROM M$SYS_TABLES
 WHERE NAME = 'TARGET_TABLE';

테이블 타입별 ALTER TABLE 지원 범위가 다릅니다. 테이블 타입별 관리 가능 범위를 미리 확인하십시오.

2. 현재 스키마 확인

-- 컬럼 정보 확인
DESC target_table;

-- 인덱스 확인
SELECT i.NAME AS INDEX_NAME, i.TYPE AS INDEX_TYPE
  FROM M$SYS_INDEXES i
  JOIN M$SYS_TABLES t
    ON i.DATABASE_ID = t.DATABASE_ID
   AND i.TABLE_ID = t.ID
 WHERE t.NAME = 'TARGET_TABLE';

3. 데이터 볼륨 확인

SELECT COUNT(*) FROM target_table;

대용량 테이블의 스키마 변경은 시간이 걸릴 수 있습니다. 테스트 환경에서 소요 시간과 잠금 영향을 측정한 뒤 서비스의 유지보수 시간에 실행하십시오.

4. Retention Policy 적용 여부

SELECT * FROM V$RETENTION_JOB WHERE TABLE_NAME = 'TARGET_TABLE';

스키마 변경 전 Retention Policy가 실행 중이라면 완료 후 작업하십시오.

5. DDL 충돌 정책 설정

Standard Edition은 서로 다른 객체의 DDL을 동시에 수행할 수 있습니다. 같은 객체나 직접 관련된 객체의 DDL은 충돌하므로 운영 배포 세션에서 허용할 대기 시간을 먼저 설정합니다.

-- 충돌한 DDL 잠금을 최대 10초 동안 대기
ALTER SESSION SET DDL_LOCK_TIMEOUT = 10;

-- 세션별 설정값 확인
SELECT id, user_name, ddl_lock_timeout
  FROM v$session
 WHERE closed = 0
 ORDER BY id;
동시 실행 대상판단
이름이 서로 다른 독립 테이블병렬 실행 가능
동일 객체 또는 동일 이름충돌
테이블 변경·삭제 DDL과 해당 테이블의 인덱스 DDL충돌
뷰 DDL과 원본 테이블의 변경·삭제 DDL충돌
TAG 테이블 변경·삭제 DDL과 해당 Rollup 또는 Retention DDL충돌

Cluster Edition에는 DDL_LOCK_TIMEOUT이 없으며 기존 DDL 직렬화 정책을 사용합니다. 자세한 동작은 DDL 동시성과 잠금을 참고하십시오.


컬럼 추가 체크리스트

  • 추가할 컬럼의 데이터 타입이 해당 테이블 타입에서 지원되는가?
  • LOG/TRANSACTION 테이블 컬럼 추가 시 기존 데이터의 새 컬럼 값은 NULL로 채워짐을 인지하고 있는가?
  • 컬럼명 중복 여부 확인
ALTER TABLE sensor_log ADD COLUMN (new_col DOUBLE);

컬럼 삭제 체크리스트

  • 삭제할 컬럼이 인덱스에 포함되어 있는가? (인덱스 먼저 삭제 필요)
  • 애플리케이션에서 해당 컬럼을 참조하는 쿼리가 있는가?
  • 컬럼 삭제 후 데이터는 복구 불가
ALTER TABLE sensor_log DROP COLUMN (old_col);

인덱스 변경 체크리스트

  • 인덱스 생성/삭제는 쿼리 성능에 직접 영향
  • 인덱스 생성 작업은 기존 데이터에 대한 인덱싱을 포함하므로, 대용량 테이블에서는 시간이 소요됨
  • 사용하지 않는 인덱스는 INSERT 성능을 저하시키므로 삭제 고려
  • IF NOT EXISTS 사용 시 같은 이름의 기존 인덱스 정의를 별도로 확인
-- 반복 배포에서 조건부 생성
CREATE INDEX IF NOT EXISTS idx_new ON sensor_log (sensor_id);

-- name-only no-op일 수 있으므로 실제 mapping 확인
SHOW INDEX idx_new;

-- 불필요한 인덱스 삭제
DROP INDEX idx_old;

IF NOT EXISTS는 같은 데이터베이스와 소유자의 인덱스 이름만 확인합니다. 기존 인덱스의 테이블, 컬럼, 타입과 설정 속성이 배포 의도와 일치하는지는 INDEX 문법의 규칙에 따라 별도로 검증합니다.


Retention Policy 변경 체크리스트

  • 정책 변경 필요 시: 기존 정책 해제 → 새 정책 생성/적용
  • 보존 기간 단축 시: 다음 삭제 작업에서 대상이 늘어날 수 있으므로 데이터 손실 가능성 검토
-- 기존 정책 해제
ALTER TABLE sensor_tag DROP RETENTION;

-- 새 정책 적용
ALTER TABLE sensor_tag ADD RETENTION new_policy;

DDL 충돌 처리

기본 DDL_LOCK_TIMEOUT=0에서는 충돌 시 ERR-02031: Resource busy (<object>)가 즉시 반환됩니다.

  1. ERR-02031만 제한된 횟수와 대기 간격을 두고 재시도합니다.
  2. 재시도하기 전에 대상 객체와 의존 객체의 현재 상태를 다시 조회합니다.
  3. 대기 후에는 선행 DDL의 결과에 따라 already existstable not found가 반환될 수 있습니다.
  4. 문법 오류, 권한 오류, already exists, table not found는 같은 SQL로 반복 재시도하지 않습니다.
  5. machsql을 사용하는 자동화는 프로세스 종료 코드뿐 아니라 출력의 ERR-도 확인합니다.

DDL 대기 시간이 끝나거나 작업이 취소된 뒤에는 다시 실행할 수 있지만, 선행 작업의 반영 여부를 확인한 다음 재시도해야 합니다.


변경 후 검증

-- 스키마 변경 확인
DESC target_table;

-- 데이터 정합성 확인
SELECT COUNT(*) FROM target_table;

-- 인덱스 상태 확인
SELECT i.NAME AS INDEX_NAME, i.TYPE AS INDEX_TYPE
  FROM M$SYS_INDEXES i
  JOIN M$SYS_TABLES t
    ON i.DATABASE_ID = t.DATABASE_ID
   AND i.TABLE_ID = t.ID
 WHERE t.NAME = 'TARGET_TABLE';

다음으로 읽을 내용:

최근 업데이트