MySQL 가져오기 가이드: SQL 덤프 및 CSV 빠르게 가져오기 (LOAD DATA, Workbench, phpMyAdmin)

目次

1. 이 문서에서 할 수 있는 일

Many people searching for “MySQL data import” are in a situation where they want to:

  • “.sql 파일 복원”
  • “CSV 가져오기”
  • “오류가 발생하며 중단됨”
  • “Workbench 또는 phpMyAdmin에서 작동하지 않음”

즉, 지금 바로 적용할 수 있는 해결책을 원합니다.

먼저, 목표별 가장 짧은 “성공 경로”를 소개합니다.

🔹 SQL 파일 (.sql) 가져오기 가장 빠른 명령

백업 복원이나 서버 마이그레이션의 경우, 이것이 가장 빠릅니다.

mysql -u username -p database_name < backup.sql

사전에 확인할 사항

  • 대상 데이터베이스가 존재합니까?
  • 연결된 사용자가 대상 DB에 대한 권한을 가지고 있습니까?
  • SQL 파일 인코딩 (보통 UTF-8)

데이터베이스가 아직 생성되지 않은 경우:

CREATE DATABASE example_db;

🔹 CSV 파일 가져오기 가장 빠른 방법 (추천)

대용량 데이터를 빠르게 가져오려면 LOAD DATA가 이상적입니다.

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');

핵심 포인트

  • Windows 줄 끝 → '\r\n'
  • 헤더 행이 있는 경우 → IGNORE 1 LINES
  • 빈 문자열을 NULL로 변환 → NULLIF()
  • 많은 환경에서 LOCAL이 필요함 (아래에서 설명)

🔹 GUI를 통해 가져오고 싶다면

MySQL Workbench

  • Server → Data Import → 파일 선택 → 실행

phpMyAdmin

  • 대상 DB 선택 → Import → 파일 선택 → 실행

⚠ 그러나 대용량 파일과 신뢰할 수 있는 오류 처리를 위해서는 CLI(명령줄)가 더 안정적입니다.

🔹 가져오기 전에 반드시 확인해야 할 3가지 항목

1. 문자 집합 (가장 중요함)

SHOW VARIABLES LIKE 'character_set%';

추천: utf8mb4

2. INFILE 관련 오류를 일으키는 설정

SHOW VARIABLES LIKE 'local_infile';
SHOW VARIABLES LIKE 'secure_file_priv';

3. 권한 확인

SHOW GRANTS FOR 'user'@'localhost';

✔ 이 문서의 다음 내용

  • SQL 파일 가져오기 상세 방법
  • 실용적인 CSV 가져오기 기술
  • INFILE 실패 원인 전체 분석
  • 오류 유형별 가장 빠른 해결책
  • 대용량 데이터셋을 위한 실제 기술

MySQL data import workflow diagram showing SQL file, CSV file, LOAD DATA LOCAL INFILE, mysql command, and MySQL server process

2. MySQL 가져오기 유형 및 사용 시점

MySQL에 데이터를 가져오는 방법은 여러 가지가 있지만, 최적의 선택은 사용 사례에 따라 달라집니다.
이를 올바르게 이해하면 불필요한 문제를 피할 수 있습니다.

2.1 SQL 덤프 (.sql) 가져오기 시점

일반적인 사용 사례

  • 백업 복원
  • 서버 마이그레이션
  • 프로덕션과 유사한 데이터를 개발 환경에 적용
  • mysqldump 로 내보낸 데이터를 재가져오기

특징

  • 전체 테이블 구조와 데이터를 복원
  • 높은 재현성
  • 트랜잭션 포함 가능
  • 일반적으로 가장 안전한 옵션

일반적인 방법

mysql -u user -p dbname < dump.sql

또는 MySQL 내부에서:

SOURCE /path/to/dump.sql;

적합한 경우

  • 기존 DB 전체 복원
  • 프로덕션 환경 재구축
  • CI/CD 환경을 위한 데이터 로드

2.2 CSV / TSV 가져오기 시점

일반적인 사용 사례

  • 외부 시스템으로부터 데이터 수신
  • Excel 데이터 가져오기
  • ETL 처리
  • 특정 테이블만 업데이트

특징

  • 데이터만 로드 (스키마는 별도로 존재해야 함)
  • 빠름 (LOAD DATA는 매우 빠름)
  • 가져오기 중 변환 로직 적용 가능

일반적인 방법

LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

적합한 경우

  • 정기 배치 작업
  • 데이터 통합
  • 대량 행 수의 고속 수집

2.3 GUI 도구 사용 시점

일반적인 도구:

  • MySQL Workbench
  • phpMyAdmin

특징

  • 직관적인 조작
  • 초보자 친화적
  • 소규모 데이터셋에 적합

주의사항

  • 업로드 제한 (phpMyAdmin)
  • 타임아웃
  • 대용량 데이터 시 불안정
  • 오류 분석이 어려움

2.4 방법별 비교 (실무 관점)

MethodSpeedStabilityLarge-file supportError analysisRecommendation
mysql command★★★★★
LOAD DATA★★★★★
Workbench★★★
phpMyAdmin×★★

✔ 실제 작업에서 권장 선택

  • 백업 복원 → mysql 명령
  • 고속 CSV 가져오기 → LOAD DATA LOCAL INFILE
  • 작은 일회성 작업 → GUI

확신이 서지 않을 경우, CLI(명령줄)를 선택하는 것이 가장 안정적인 옵션.

3. SQL 파일 가져오기 (가장 빠른 성공 경로)

.sql 파일을 가져오는 것은 백업 복원 및 서버 마이그레이션에 가장 일반적인 방법입니다.
여기서는 “가능한 한 빨리 성공”하는 것이 목표이므로 실제 작업에서 사용되는 실용적인 단계에만 집중합니다.

3.1 한 줄 복원 (가장 일반적인 방법)

이 방법이 가장 신뢰할 수 있고 빠른 방법입니다.

mysql -u username -p database_name < backup.sql

실행 후 비밀번호를 입력하라는 프롬프트가 표시됩니다.

✔ 사전 점검 (실패 방지용)

① 데이터베이스가 존재합니까?
SHOW DATABASES;

존재하지 않을 경우:

CREATE DATABASE example_db;
② 사용자가 권한을 가지고 있습니까?
SHOW GRANTS FOR 'user'@'localhost';

권한이 없을 경우:

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
③ 파일 인코딩

보통 UTF-8입니다.
문자 깨짐이 보이면 명시적으로 지정하십시오.

mysql --default-character-set=utf8mb4 -u user -p dbname < backup.sql

3.2 MySQL 내부에서 실행 (SOURCE 명령)

이 방법은 MySQL에 로그인한 후에 실행됩니다.

mysql -u user -p
USE example_db;
SOURCE /path/to/backup.sql;

유용한 경우

  • SQL 파일의 일부만 실행하고 싶을 때
  • 정확한 오류 위치를 파악하고 싶을 때
  • 실행 로그를 시각적으로 확인하고 싶을 때

3.3 일반적인 오류와 해결 방법

❌ ERROR 1049: 알 수 없는 데이터베이스

→ DB가 존재하지 않음
CREATE DATABASE 실행

❌ ERROR 1045: 접근 거부

→ 권한 부족
SHOW GRANTS 로 확인

❌ 중간에 중단 / 오류 위치 불명확

해결 방법:

  1. 파일의 시작과 끝을 확인
    head backup.sql
    tail backup.sql
    
  1. 오류 직전 라인을 확인
  2. 파일이 크면 나누어 부분적으로 실행
    split -l 10000 backup.sql part_
    

3.4 대용량 SQL 가져오기 안정화 팁

① 트랜잭션 설정 확인

SET autocommit=0; 가 포함되어 있는지 확인

② 외래키 제약이 문제인 경우

SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;

③ SQL 모드 확인

SELECT @@sql_mode;

Strict 모드가 가져오기에 영향을 줄 수 있습니다.

✔ 실무 권장 사항

  • 프로덕션 복원 → mysql 명령
  • 디버깅 → SOURCE
  • 대용량 파일 → CLI + 분할 고려

4. CSV 가져오기 (가장 중요: LOAD DATA로 가장 빠르게)

CSV 데이터를 가져올 때, 가장 빠르고 실용적인 방법은 LOAD DATA입니다.
대용량 데이터셋의 경우 INSERT 문보다 압도적으로 빠릅니다.

여기서는 올바른 “복사‑붙여넣기 후 실행” 형식을 제공하고 일반적인 오류 지점을 강조합니다.

4.1 먼저: CSV 전제 조건

가져오기 전에 다음 사항을 반드시 확인하십시오.

✔ 구분자

  • 쉼표 ,
  • \t
  • 세미콜론 ; (해외 데이터에서 일반적)

✔ 인용 문자

  • 값이 double quote("value") 로 감싸져 있는지 여부

✔ 줄 끝

  • Linux / Mac → \n
  • Windows → \r\n

✔ 문자 집합 / 인코딩

  • 권장: utf8mb4
  • Windows에서 만든 CSV는 Shift-JIS일 수 있음
  • BOM이 포함된 UTF-8은 오류를 일으킬 수 있음

예시 확인:

file -i example.csv

4.2 복사‑붙여넣기 가능한 기본 형식 (헤더 포함 CSV)

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');

각 옵션의 의미

  • LOCAL 클라이언트 측에서 파일을 읽음 (많은 환경에서 필요함)
  • IGNORE 1 LINES 헤더 행을 건너뜀
  • @age 저장하기 전에 값을 변환하는 데 사용되는 임시 변수
  • NULLIF() 빈 문자열을 NULL로 변환

4.3 필요​한 열만 가져오기

If the CSV has unnecessary columns:
CSV에 불필요한 열이 있는 경우:

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, @dummy, age);

Map unwanted columns to @dummy.
원하지 않는 열을 @dummy에 매핑합니다.

4.4 가져오는 동안 날짜와 유형 변환

Example: convert MM/DD/YYYY → MySQL format
예시: MM/DD/YYYY → MySQL 형식으로 변환

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(@date_col, name)
SET date_col = STR_TO_DATE(@date_col, '%m/%d/%Y');

4.5 탭 구분 파일(TSV)용

FIELDS TERMINATED BY '\t'

4.6 성능을 더 향상시키기 (대용량 데이터용)

Temporarily disable indexes

인덱스 일시적으로 비활성화

ALTER TABLE example_table DISABLE KEYS;
-- Run LOAD DATA
ALTER TABLE example_table ENABLE KEYS;

Temporarily disable foreign keys

외래키 일시적으로 비활성화

SET FOREIGN_KEY_CHECKS=0;
-- Run LOAD DATA
SET FOREIGN_KEY_CHECKS=1;

Why LOCAL is often required

왜 LOCAL가 자주 필요한가

  • LOAD DATA INFILE → 서버 측 파일을 읽음
  • LOAD DATA LOCAL INFILE → 클라이언트 측 파일을 읽음

많은 환경에서 LOCAL를 사용하는 것이 성공률이 더 높습니다.

✔ 실용적인 권장 형태

In most cases:
대부분의 경우:

LOAD DATA LOCAL INFILE
+ explicit delimiter
+ explicit line endings
+ IGNORE 1 LINES
+ type conversion

This is the most stable approach.
가장 안정적인 접근 방식입니다.

5. INFILE이 실패하는 주요 4가지 이유 (가장 중요한 섹션)

Most LOAD DATA INFILE failures are caused by settings, privileges, or misunderstanding the source location.
If you understand this, you can resolve most errors immediately.
대부분의 LOAD DATA INFILE 실패는 설정, 권한, 또는 소스 위치에 대한 오해 때문에 발생합니다.
이 점을 이해하면 대부분의 오류를 즉시 해결할 수 있습니다.

5.1 INFILELOCAL INFILE의 차이점

This is the key basic concept.
이것이 핵심 기본 개념입니다.

CommandWhere it reads fromTypical use
LOAD DATA INFILEFile on the serverA fixed path on the server
LOAD DATA LOCAL INFILEFile on the clientA CSV on your local PC

Common misunderstandings

일반적인 오해

  • INFILE로 로컬 PC 파일을 읽으려다 실패
  • 서버에 파일이 존재하지 않음

✔ Quick rule of thumb

✔ 간단한 규칙

  • 내 PC에 있는 CSV → LOCAL
  • 서버에 배치된 CSV → INFILE

If unsure, using LOCAL is the safest choice.
확실하지 않다면 LOCAL를 사용하는 것이 가장 안전한 선택입니다.

5.2 local_infile이 비활성화됨 (ERROR 1148 원인)

Example error:
예시 오류:

ERROR 1148 (42000): The used command is not allowed with this MySQL version

Cause:
원인:

local_infile is OFF
local_infile이 OFF 상태입니다

✔ Check the current setting

✔ 현재 설정 확인

SHOW VARIABLES LIKE 'local_infile';

✔ Enable it when connecting (client-side)

✔ 연결 시 활성화 (클라이언트 측)

mysql --local-infile=1 -u user -p

✔ Enable permanently (config file)

✔ 영구적으로 활성화 (설정 파일)

Add to my.cnf or my.ini:
my.cnf 또는 my.ini에 추가:

[mysqld]
local_infile=1

You must restart the server.
서버를 재시작해야 합니다.

5.3 secure_file_priv 제한

This occurs when using LOAD DATA INFILE (without LOCAL).
LOAD DATA INFILE(LOCAL 없이) 사용할 때 발생합니다.

Check:
확인:

SHOW VARIABLES LIKE 'secure_file_priv';

Example output

예시 출력

/var/lib/mysql-files/

→ You can only read files inside this directory.
→ 이 디렉터리 내부의 파일만 읽을 수 있습니다.

✔ Fix

✔ 해결 방법

  • CSV를 허용된 디렉터리로 이동
  • 또는 LOCAL 사용

5.4 권한 부족 (FILE 권한 / OS 권한)

Example error:
예시 오류:

ERROR 1045: Access denied

Check:
확인:

SHOW GRANTS FOR 'user'@'localhost';

✔ Required privilege

✔ 필요한 권한

GRANT FILE ON *.* TO 'user'@'localhost';

※ For security, operate with the least privileges possible.
※ 보안을 위해 가능한 최소 권한으로 운영하십시오.

5.5 잘못된 경로 지정

  • 상대 경로가 아니라 절대 경로 사용
  • Windows에서는 C:/path/file.csv를 권장
  • 슬래시(/)가 백슬래시(\)보다 안전

✔ INFILE 문제에 대한 빠른 문제 해결 흐름

  1. LOCAL를 추가했나요?
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. 권한 확인 (SHOW GRANTS)
  5. 경로 확인 (절대 경로)

In this order, you can solve most cases.
이 순서대로 진행하면 대부분의 경우를 해결할 수 있습니다.

6. GUI를 통한 가져오기 (Workbench / phpMyAdmin)

The command line is the most stable, but there are situations where you want to use GUI tools.
Here, we’ll focus on the common points where people get stuck in real work.

6.1 MySQL Workbench로 가져오기

SQL 파일 가져오기 (백업 복원)

  1. Workbench 실행
  2. 메뉴 → Server → Data Import
  3. “Import from Self-Contained File” 선택
  4. .sql 파일 선택
  5. 대상 스키마(데이터베이스) 선택
  6. “Start Import” 클릭

CSV 가져오기 (테이블별)

  1. 대상 테이블을 오른쪽 클릭
  2. Table Data Import Wizard 선택
  3. CSV 파일 선택
  4. 구분자와 헤더 존재 여부 설정
  5. 실행

⚠ Workbench가 멈추는 일반적인 이유

  • 대용량 파일(수백 MB 이상)
  • 시간 초과
  • 인코딩 불일치
  • secure_file_priv 제한

👉 대용량 파일이나 프로덕션 환경에서는 CLI를 권장합니다.

6.2 phpMyAdmin으로 가져오기

단계

  1. 대상 데이터베이스 선택
  2. “Import” 탭 열기
  3. 파일 선택
  4. 포맷 선택 (SQL / CSV)
  5. 실행

⚠ phpMyAdmin 제한 사항

① 업로드 크기 제한

upload_max_filesize
post_max_size

대용량 파일은 실패합니다.

② 시간 초과
max_execution_time

오래 걸리는 가져오기는 중간에 멈출 수 있습니다.

③ 메모리 부족
memory_limit

6.3 GUI를 사용해야 할 때

  • 작은 데이터셋(몇 MB 정도)
  • 개발 환경
  • 일시적인 단발 작업

6.4 CLI를 사용해야 할 때 (권장)

  • 프로덕션 환경
  • 수십 MB 이상
  • 대용량 CSV 가져오기
  • 오류 분석이 필요할 때
  • 서버 간 마이그레이션

✔ 실용적인 결론

GUI는 “쉽다”고 할 수 있지만
CLI는 안정성, 재현성, 대용량 파일 처리 측면에서 압도적으로 우수합니다.

문제 해결을 위해서는 CLI 작업을 배우는 것이 궁극적으로 권장됩니다.

7. 문제 해결 (오류별: 원인 → 가장 빠른 해결책)

대부분의 MySQL 가져오기 오류는 매우 패턴화되어 있습니다.
여기서는 “원인 → 첫 번째 조치 → 검증 명령” 순서대로 정리합니다.

7.1 ERROR 1148 (42000)

이 MySQL 버전에서는 사용된 명령이 허용되지 않습니다

🔎 원인

  • LOAD DATA LOCAL INFILE이 비활성화됨
  • local_infile이 OFF 상태

✅ 가장 빠른 해결책

① 현재 설정 확인

SHOW VARIABLES LIKE 'local_infile';

② 연결 시 활성화 (클라이언트 측)

mysql --local-infile=1 -u user -p

③ 영구적으로 활성화 (필요한 경우)

[mysqld]
local_infile=1

→ MySQL 재시작

7.2 ERROR 1366

잘못된 문자열 값

🔎 원인

  • 인코딩 불일치
  • utf8과 utf8mb4 간 불일치
  • Shift-JIS 혼합

✅ 가장 빠른 해결책

① 현재 문자 집합 확인

SHOW VARIABLES LIKE 'character_set%';

② 테이블을 utf8mb4로 변환

ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;

③ 가져오기 시 명시적으로 지정

mysql --default-character-set=utf8mb4 -u user -p db < file.sql

7.3 ERROR 1062

중복 항목

🔎 원인

  • 중복된 기본 키
  • UNIQUE 제약 조건 위반

✅ 해결 옵션

옵션 1: 중복 무시
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE example_table
IGNORE;
옵션 2: 중복 시 업데이트
INSERT INTO example_table (id, name)
VALUES (1,'John')
ON DUPLICATE KEY UPDATE name=VALUES(name);
옵션 3: 스테이징 테이블 사용
CREATE TEMPORARY TABLE temp LIKE example_table;
-- LOAD into temp first
INSERT INTO example_table
SELECT * FROM temp;

7.4 ERROR 1045

사용자 접근 거부

🔎 원인

  • DB 권한 부족
  • FILE 권한 부족
  • 경로에 대한 OS 권한 부족

✅ 확인

SHOW GRANTS FOR 'user'@'localhost';

✅ 예시 필요한 권한

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

※ FILE 권한을 부여할 때는 주의하십시오.

7.5 대용량 파일에서 중간에 멈춤

🔎 원인

  • 타임아웃
  • 메모리 부족
  • PHP 제한 (phpMyAdmin)

✅ 가장 빠른 대책

타임아웃 증가
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
파일 분할
split -l 100000 large.csv part_

✔ 오류 해결 흐름 (가장 빠름)

  1. 인코딩 확인
  2. local_infile 확인
  3. secure_file_priv 확인
  4. 권한 확인
  5. 줄 끝 확인 ( \n / \r\n )

이 순서대로 하면 대부분의 문제를 해결할 수 있습니다.

8. 대용량 데이터셋을 위한 실제 기술 (실패 방지 운영)

수십만에서 수백만 행을 가져올 때,
일반적인 방법은 느리거나, 중단되거나, 깨질 수 있습니다.

다음은 프로덕션에서 일반적으로 사용되는 안정적인 기술들입니다.

8.1 파일을 분할하고 단계별로 가져오기

한 번에 거대한 CSV/SQL을 입력하면 메모리와 타임아웃 문제가 발생할 수 있습니다.

✔ Linux / Mac

split -l 100000 large.csv part_

→ 파트당 100,000줄로 분할

✔ Windows (PowerShell 예시)

Get-Content large.csv -TotalCount 100000 > part_1.csv

✔ 단계별 가져오기 장점

  • 부분 실패 후 재시도가 더 쉬움
  • 오류 위치를 더 쉽게 파악
  • 서버 부하가 더 안정적

8.2 인덱스와 외래키 일시적 비활성화

가져오는 동안 인덱스 업데이트가 종종 병목이 됩니다.

✔ 인덱스 일시적 비활성화

ALTER TABLE example_table DISABLE KEYS;
-- LOAD DATA
ALTER TABLE example_table ENABLE KEYS;

※ 주로 MyISAM용. InnoDB에서는 효과가 제한적입니다.

✔ 외래키 비활성화

SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;

8.3 autocommit 제어 (속도 향상)

SET autocommit=0;
-- LOAD DATA
COMMIT;
SET autocommit=1;

8.4 대량 로드를 위한 권장 설정

SET UNIQUE_CHECKS=0;
SET FOREIGN_KEY_CHECKS=0;
SET AUTOCOMMIT=0;

가져온 후:

COMMIT;
SET UNIQUE_CHECKS=1;
SET FOREIGN_KEY_CHECKS=1;
SET AUTOCOMMIT=1;

⚠ 프로덕션에서 신중히 사용하세요.

8.5 타임아웃 증가

SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;

8.6 스테이징 테이블 전략 (안전한 작업)

프로덕션 테이블에 직접 가져오는 대신, 먼저 검증 테이블을 사용합니다.

CREATE TABLE staging LIKE example_table;
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE staging;

검증 후:

INSERT INTO example_table
SELECT * FROM staging;

✔ 가장 안정적인 실제 패턴

  1. 스테이징 테이블에 로드
  2. 행 수 확인
  3. 제약 조건 검증
  4. 프로덕션에 적용
  5. 로그 저장

✔ 대용량 데이터에 대한 결론

  • 가능하면 CLI 사용
  • 가져오기 분할
  • 스테이징을 거침
  • 제약 조건 일시적 비활성화
  • 로그 확인

이렇게 하면 수백만 행에서도 가져오기가 안정적으로 유지됩니다.

9. FAQ (자주 묻는 질문)

다음은 자주 검색되는 MySQL 가져오기 질문에 대한 빠르고 실용적인 답변입니다.

Q1. CSV에서 특정 열만 가져올 수 있나요?

예, 가능합니다.

불필요한 열을 변수(예: @dummy)에 매핑하고 무시할 수 있습니다.

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(id, @dummy, age);

특정 열만 원한다면, 열 순서를 명시적으로 지정해야 합니다.

Q2. 빈 셀을 NULL로 처리하려면?

NULLIF()를 사용합니다.

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, @age)
SET age = NULLIF(@age,'');

빈 문자열(”)을 NULL로 변환합니다.

Q3. 헤더 행을 건너뛰려면?

IGNORE 1 LINES

예시:

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Q4. 가져오기 결과를 어떻게 검증할 수 있나요?

✔ 행 수 확인

SELECT COUNT(*) FROM example_table;

✔ 경고/오류 확인

MySQL 경고를 확인하세요:

SHOW WARNINGS;

✔ 스테이징 테이블 전략 (권장)

먼저 스테이징 테이블에 로드한 다음, 프로덕션에 적용합니다.

Q5. 가장 빠른 방법은 무엇인가요?

결론:

  • CSV → LOAD DATA LOCAL INFILE (가장 빠름)
  • 백업 복원 → mysql 명령

GUI는 편리하지만, 속도와 안정성에서는 CLI가 우수합니다.

Q6. Windows에서 줄 끝 오류가 발생합니다

이는 줄 끝 형식 때문입니다.

Windows:

LINES TERMINATED BY '\r\n'

Linux / Mac:

LINES TERMINATED BY '\n'

Q7. secure_file_priv 오류가 발생합니다

확인:

SHOW VARIABLES LIKE 'secure_file_priv';

해결 방법:

  • CSV를 허용된 디렉터리에 넣기
  • 또는 LOCAL 사용

✔ FAQ 요약

  • 컬럼 매핑 → @dummy
  • NULL 변환 → NULLIF
  • 헤더 건너뛰기 → IGNORE 1 LINES
  • 고속 임포트 → LOAD DATA
  • 주요 “걸림” 포인트 → local_infile / secure_file_priv / 인코딩

10. 요약

MySQL 임포트는 처음에 복잡해 보일 수 있지만,
목표에 따라 정리하면 매우 간단합니다.

가장 짧은 성공 경로를 정리해 보겠습니다.

✔ SQL 파일 복원 (.sql)

가장 빠르고 안정적인 방법:

mysql -u user -p dbname < backup.sql
  • 데이터베이스가 존재하는지 확인
  • 권한 확인
  • 인코딩으로 utf8mb4 권장

✔ CSV 가져오기 (빠름)

기본 형식:

LOAD DATA LOCAL INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

핵심 포인트:

  • Windows 줄 끝 → \r\n
  • 빈 문자열 → NULLIF()
  • 실패 시 local_infile 확인

✔ 문제 해결 체크 순서

  1. 인코딩 (utf8mb4 권장)
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. 권한 (SHOW GRANTS)
  5. 줄 끝

이 순서대로 진행하면 대부분의 문제를 해결할 수 있습니다.

✔ 대용량 데이터셋을 위한 핵심 원칙

  • CLI 사용
  • 임포트를 분할
  • 스테이징 테이블을 거치기
  • 외래키/제약조건을 일시적으로 비활성화
  • 로그 확인

✔ 최종 결론

  • 백업 복원 → mysql 명령
  • 고속 CSV 임포트 → LOAD DATA LOCAL INFILE
  • 소규모 일회성 작업 → GUI

확신이 서지 않을 경우, CLI를 사용하는 것이 가장 안정적인 선택입니다.

이제 MySQL 임포트에 대한 완전한 지식을 갖추게 되었습니다.

환경에서 직접 시도해 보고 안정적인 운영 워크플로우를 구축해 보세요.