SQL 데이터 처리 방법
다음은 SQL 파일을 처리하고 각 테이블에 대한 데이터를 추출하여 분리하는 스크립트입니다. 이 예제에서는 bash와 sed, awk 등을 사용하여 대용량 SQL 파일을 효율적으로 처리하는 방법을 보여줍니다.
스크립트 예시
#!/usr/bin/bash
# 작업 디렉토리로 이동
cd /path/to/sql/files
# 처리할 SQL 파일 목록
files=("table_data1.sql" "table_data2.sql" "table_data3.sql")
# 각 파일에 대해 처리
for file in "${files[@]}"; do
# CREATE TABLE 구문에서 테이블 이름 추출
tables=$(grep 'CREATE TABLE' "$file" | awk -F\` '{print $2}')
# 추출된 테이블 이름으로 데이터 필터링
for table in $tables; do
# 해당 테이블의 INSERT 문 추출 (처음 5000개만)
grep "INSERT INTO \`$table\`" "$file" | head -n 5000 >> "${table}.sql"
done
done
효율성 개선
위 스크립트는 간단하지만 대규모 파일에서 여러 번 파일을 읽어들이므로 성능 문제가 있을 수 있습니다. 이를 개선하기 위해 sed 명령어를 활용하면 단일 패스로 처리할 수 있습니다.
#!/usr/bin/bash
# 작업 디렉토리로 이동
cd /path/to/sql/files
# 처리할 SQL 파일 목록
files=("data_file1.sql" "data_file2.sql" "data_file3.sql")
for file in "${files[@]}"; do
# 테이블 이름과 해당 데이터를 한 번에 추출
grep 'CREATE TABLE' "$file" | awk -F\` '{print $2}' | while read -r table; do
sed -n "/INSERT INTO \`$table\`/,/;/p" "$file" >> "${table}_output.sql"
done
done
대체 해결책: Python 사용
Shell 스크립트 외에도 Python을 사용하면 더 직관적이고 확장 가능한 코드를 작성할 수 있습니다. 아래는 Python 버전의 예제입니다.
import re
# 입력 파일 경로 설정
input_files = ['/path/to/data/file1.sql', '/path/to/data/file2.sql']
# 각 파일 처리
for input_file in input_files:
with open(input_file, 'r') as f:
content = f.read()
# CREATE TABLE 구문에서 테이블 이름 찾기
table_pattern = re.compile(r'CREATE TABLE \`([^\`]*)\`')
tables = table_pattern.findall(content)
# 각 테이블의 INSERT 문 추출
for table in tables:
insert_pattern = re.compile(rf'INSERT INTO \`{table}\`.+?;', re.DOTALL)
matches = insert_pattern.findall(content)
# 결과 저장
output_file = f'{table}.sql'
with open(output_file, 'w') as out_f:
for match in matches[:5000]: # 처음 5000개만 저장
out_f.write(match + '\n')
결론
대용량 SQL 파일을 처리할 때는 적절한 도구 선택이 중요합니다. Shell 스크립트는 간단한 작업에 유용하지만 복잡한 로직이나 대규모 데이터 처리에는 Python과 같은 고급 언어가 더 적합할 수 있습니다.