모든 작업에 데이터베이스 전체가 필요한 것은 아닙니다. 로컬에서 기능을 개발할 때, 전체 운영 덤프로 디스크를 가득 채우고 가져오는 데 한 시간을 쓰고 싶은 경우는 드뭅니다. 그 기능이 실제로 건드리는 몇 개의 테이블만 원할 뿐입니다.
단일 테이블을 디버깅할 때도 마찬가지입니다. orders의 데이터 문제를 재현하는 데 나머지 126개 테이블이 필요하지 않습니다. 또는 몇 개 테이블만 새 서비스로 옮기는 부분 마이그레이션도 그렇습니다. 이 모든 경우에서 질문은 같습니다. 거대한 덤프에서 이 테이블들만을 어떻게 깔끔하고 빠르게 뽑아낼까요?
sed/grep 방식과 그것이 깨지는 이유
고전적인 답은 mysqldump가 각 테이블마다 기록하는 섹션 헤더 사이를 sed로 잘라내는 것입니다:
# mysqldump 파일에서 users 테이블 뽑아내기
sed -n '/-- Table structure for table `users`/,/-- Table structure for table/p' dump.sql > users.sql
영리해 보이고, 작고 깔끔한 덤프에서는 한 번쯤 동작할 수도 있습니다. 하지만 실제 7GB 파일에서는 여러 미묘한 지점에서 무너집니다:
- 여러 줄 INSERT. 하나의
INSERT INTO ... VALUES가 수천 줄에 걸칠 수 있습니다.sed나grep같은 줄 단위 도구는 그런 행을 반토막 내서 파싱되지 않는 파일을 만듭니다. - 백틱과 특수 문자. 컬럼 값에는
--, 세미콜론, 백틱, 따옴표, 문자열 안의 개행이 들어 있습니다. 패턴이 구분자로 의도된 적 없는 데이터 내부의 텍스트에 매칭됩니다. - 부분 문자열로서의 테이블 이름.
user를 추출하면user_roles,user_sessions,password_user까지 걸립니다. 그 이름이 다른 이름의 부분 문자열로 나타나기 때문입니다. - 주석과 헤더의 변동. 정확한 주석 텍스트는 MySQL, MariaDB, PostgreSQL 버전마다 다르고,
pg_dump는 같은 헤더를 아예 쓰지 않습니다. 그래서 같은 명령이 조용히 아무것도 반환하지 않습니다. - 외래 키 인식 없음.
orders를 완벽하게 잘라내더라도 그 행들은users를 참조합니다.sed는 이를 전혀 알지 못하므로, 추출한 파일은 외래 키 오류와 함께 가져오기에 실패합니다.
결국 grep 위에 sed, 그 위에 awk를 쌓고, 부분집합으로 테스트하면서도 여전히 결과를 믿지 못하게 됩니다. 더 나은 방법이 있습니다.
DumpCleaner로 테이블 추출하기
DumpCleaner는 덤프를 제대로 파싱합니다. 문장 경계, 여러 줄 INSERT, 백틱, 주석을 이해하므로 항상 올바른 줄에서 자릅니다. 필요한 테이블을 추출하는 데 네 단계면 됩니다:
.sql덤프를 끌어다 놓습니다. DumpCleaner는 파일을 스트리밍하므로 7GB 덤프도 전체를 로드하는 대신 일정한 메모리로 열립니다.- 자동 감지된 테이블 목록을 봅니다. 모든 테이블이 파싱되어 행 수와 크기와 함께 나열됩니다. 무엇이 있는지 찾으려고 수백만 줄을 스크롤할 필요가 없습니다.
- 원하는 테이블을 고릅니다.
users,orders,products를 체크하거나,*_logs같은 정규식 / 제외 패턴을 입력해 그룹 전체를 한 번에 제외합니다. - 외래 키 부모를 포함하고 내보냅니다. 원한다면 참조되는 부모 테이블을 자동으로 함께 가져온 뒤, 깔끔하고 가져올 수 있는 파일을 내보냅니다.
몇 가지 기능이 셸 도구보다 훨씬 덜 번거롭게 만들어 줍니다:
- 제외 패턴(
*_logs나*_sessions같은)은 수십 개의 테이블을 손으로 하나씩 체크 해제하지 않고도 감사·세션 잡음을 걷어냅니다. - 정규식 필터로 접두사, 접미사 또는 어떤 패턴으로든 매칭할 수 있습니다. 예를 들어
shop_*에 매칭되는 모든 것을 유지합니다. - 실시간 미리보기가 선택을 바꿀 때마다 어떤 테이블이 출력에 들어갈지 정확히 보여줍니다.
- 예상 출력 크기가 내보내기 전에 추출 결과가 얼마나 클지 알려주므로, 로컬에 들어갈지 미리 확신할 수 있습니다.
- 외래 키 의존 관계를 자동으로 포함할 수 있어,
orders를 고르면users가 조용히 따라오고 추출한 파일이 제약 조건 오류 없이 가져와집니다.
필요한 테이블만 — 그 외에는 아무것도
DumpCleaner는 크기에 상관없이 덤프에서 특정 테이블을 추출합니다. 스트리밍 방식으로 일정한 메모리를 쓰며, 외래 키까지 대신 해결해 줍니다. 네이티브 macOS & iPadOS 앱, 한 번 구매로 끝.
App Store에서 다운로드자주 묻는 질문
여러 테이블을 한 번에 추출할 수 있나요?
네. 원하는 만큼 테이블을 체크하세요. users, orders, products를 함께요. DumpCleaner가 한 번의 처리로 모두 하나의 파일에 씁니다.
외래 키 의존 관계를 유지하나요?
원한다면요. 외래 키 의존 관계 포함을 켜면 선택한 테이블이 참조하는 부모 테이블이 자동으로 함께 들어옵니다. 그래서 추출한 파일이 제약 조건 오류 없이 가져와집니다.
패턴으로 테이블을 제외할 수 있나요?
네. *_logs나 *_sessions 같은 제외 패턴 또는 정규식을 사용해, 테이블을 하나씩 체크 해제하는 대신 그룹 전체를 제외하세요.
PostgreSQL에서도 동작하나요?
네. DumpCleaner는 MySQL, MariaDB, PostgreSQL(pg_dump) 덤프를 읽으며, 테이블을 추출할 때 public.users 같은 스키마 한정 이름을 처리합니다.
sed와 grep과 씨름하지 마세요
끌어다 놓고, 테이블을 고르고, 내보내기. DumpCleaner는 어떤 덤프에서든 필요한 테이블만 외래 키와 함께 정확히 뽑아냅니다.
App Store에서 다운로드