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에 추가