sql server의 데이터를 백업한 47GB 쿼리 파일에서 일부 내용을 변경해야 되는 상황이 발생했습니다.

CREATE DATABASE [DB_OP_2020]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'DB_OSPermit', FILENAME = N'D:\DB\DB_OP_2020.mdf' , SIZE = 33436928KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DB_OSPermit_log', FILENAME = N'D:\DB\DB_OP_2020_1.ldf' , SIZE = 2392576KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
COLLATE Korean_Wansung_CI_AS
GO

아래 명령으로 변경하면 되지만 파일 크기가 47GB라서 너무 오래 걸립니다.

sed -i 's|D:\DB\|/var/opt/mssql/data/|g' /var/opt/mssql/backup.sql

빠른 치환

아래 2개의 명령으로 블럭 단위로 변환하면 됩니다.

dd if=/var/opt/mssql/backup.sql bs=4M count=1 | sed 's|D:\DB|/var/opt/mssql/data/|g' > /var/opt/mssql/backup2.sql

dd if=/var/opt/mssql/backup.sql bs=4M skip=1 >> /var/opt/mssql/backup2.sql

명령 설명

[첫 번째 명령]
  • if=/var/opt/mssql/backup.sql: 입력 파일
  • bs=4M: 블록 사이즈를 4MB로 설정
  • count=1: 1개의 블록(4MB)만 읽음
  • 결과를 sed로 처리하여 backup2.sql에 저장
  • 파일의 처음 4MB만 잘라내고 그 내용에서 특정 문자열을 변환을 하고 backup2.sql로 저장
[두 번째 명령]
  • if=/var/opt/mssql/backup.sql: 입력 파일
  • bs=4M: 블록 사이즈를 4MB로 설정
  • skip=1: 첫 번째 4MB 블록을 건너뛰고 복사
  • 결과를 backup2.sql에 추가
  • 원본 파일의 처음 4MB 이후의 데이터를 backup2.sql에 추가