SQL 서버 간 대량 데이터를 전송하기 위해 여러 전략이 사용되며, 여기에는 대량 삽입(bulk insert), ETL 프로세스(추출-변환-로드), 복제(replication) 및 백업/복구 메커니즘, DB 링크(db-link) 및 내장된 내보내기-가져오기 도구가 포함됩니다.
배치 전송 메커니즘을 사용하는 것이 최적입니다. SQL Server의 예로, 대용량 파일을 로드하기 위한 BULK INSERT 또는 복잡한 ETL 시나리오를 위한 SSIS/Integration Services가 있습니다. 더 이동성이 있는 경우, LIMIT/OFFSET과 전송 위치 고정을 사용하는 스크립트를 사용할 수 있습니다. 신뢰성을 높이기 위해 다음을 자주 사용합니다:
-- 데이터베이스 간의 배치별 데이터 전송 (PostgreSQL) INSERT INTO target_db.public.data_table (col1, col2) SELECT col1, col2 FROM source_db.public.data_table WHERE transferred = FALSE LIMIT 10000;
복제와 내보내기-가져오기 간의 차이점은 무엇이며, 대규모 역사적 아카이브 마이그레이션에 복제가 항상 적합하지 않은 이유는 무엇입니까?
답변: 복제는 현재 변경 사항을 동기화하고 "실시간" 데이터에 대해 효율적으로 작동합니다. 역사적 아카이브의 마이그레이션을 위해 복제는 충분히 빠르고 유연하지 않아 사용자 정의 변환을 지원하지 않으며 일회성 대량 전송 문제를 해결하지 않기 때문에 ETL을 자주 사용합니다.
이야기
한 기업이 여러 지역 데이터베이스를 단일 저장소로 통합했습니다. 배치 없이 대량 수입을 할 때 시스템이 메모리 부족으로 "중단"되었고, 이는 부분 커밋과 반수동 복구 상태로 이어졌습니다. 프로그레스를 로깅하면서 배치 수출로 전환하여 수정되었습니다.
이야기
대량 파일을 BULK INSERT를 사용하여 전송할 때 체크섬 제어가 올바르지 않아 일부 정보가 손상되었지만 이 사실은 몇 주 후에 발견되었습니다. 솔루션은 각 배치 전에 후에 체크섬을 다시 계산하고 불일치 시 자동 반복하는 것이었습니다.
이야기
100+ 백만 행을 표준 내보내기-가져오기 방법으로 마이그레이션 시도에서 한 개발자는 잠금 관리(Local Management)를 고려하지 않았습니다: 대상 서버의 테이블 잠금은 몇 시간 동안 비즈니스 작업을 중단시켰습니다. 결론 — 이러한 작업에는 야간 창과 단계별 복사 및 임시 재인덱싱만 사용하는 것이 좋습니다.