Hướng Dẫn Nhập MySQL: Nhập Dump SQL & CSV Nhanh (LOAD DATA, Workbench, phpMyAdmin)

目次

1. Những gì bạn có thể làm trong bài viết này

Nhiều người tìm kiếm “MySQL data import” đang ở trong tình huống muốn:

  • “khôi phục một tệp .sql”
  • “nhập một tệp CSV”
  • “nó dừng lại với lỗi”
  • “nó không hoạt động trong Workbench hoặc phpMyAdmin”

Nói cách khác, bạn muốn một giải pháp bạn có thể áp dụng ngay lập tức.

Đầu tiên, đây là các “đường thành công” ngắn nhất theo mục tiêu.

🔹 Lệnh nhanh nhất để nhập tệp SQL (.sql)

Đối với khôi phục sao lưu hoặc di chuyển máy chủ, đây là cách nhanh nhất.

mysql -u username -p database_name < backup.sql

Những điều cần kiểm tra trước

  • Cơ sở dữ liệu đích có tồn tại không?
  • Người dùng kết nối có quyền cho DB mục tiêu không?
  • Mã hoá tệp SQL (thường là UTF-8)

Nếu cơ sở dữ liệu chưa được tạo:

CREATE DATABASE example_db;

🔹 Cách nhanh nhất để nhập tệp CSV (được đề xuất)

Để nhập lượng dữ liệu lớn nhanh chóng, LOAD DATA là lý tưởng.

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,'');

Các điểm quan trọng

  • Kết thúc dòng Windows → '\r\n'
  • Nếu có hàng tiêu đề → IGNORE 1 LINES
  • Chuyển chuỗi rỗng thành NULL → NULLIF()
  • Nhiều môi trường yêu cầu LOCAL (được giải thích sau)

🔹 Nếu bạn muốn nhập qua GUI

MySQL Workbench

  • Server → Data Import → chọn tệp → chạy

phpMyAdmin

  • Chọn DB mục tiêu → Import → chọn tệp → chạy

⚠ Tuy nhiên, đối với các tệp lớn và xử lý lỗi đáng tin cậy, CLI (dòng lệnh) đáng tin hơn.

🔹 3 mục cần kiểm tra trước khi nhập

1. Bộ ký tự (quan trọng nhất)

SHOW VARIABLES LIKE 'character_set%';

Khuyến nghị: utf8mb4

2. Cài đặt gây lỗi liên quan đến INFILE

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

3. Kiểm tra quyền

SHOW GRANTS FOR 'user'@'localhost';

✔ Những gì tiếp theo trong bài viết này

  • Các cách chi tiết để nhập tệp SQL
  • Kỹ thuật nhập CSV thực tế
  • Phân tích đầy đủ lý do INFILE thất bại
  • Các giải pháp nhanh nhất theo loại lỗi
  • Kỹ thuật thực tế cho bộ dữ liệu lớn

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

2. Các loại nhập MySQL và Khi nào nên dùng

Có nhiều cách để nhập vào MySQL, nhưng lựa chọn tốt nhất phụ thuộc vào trường hợp sử dụng của bạn.
Nếu bạn hiểu đúng, bạn có thể tránh những rắc rối không cần thiết.

2.1 Khi nào nhập dump SQL (.sql)

Các trường hợp sử dụng phổ biến

  • Khôi phục từ bản sao lưu
  • Di chuyển máy chủ
  • Áp dụng dữ liệu giống môi trường production vào môi trường dev
  • Nhập lại dữ liệu được xuất bằng mysqldump

Đặc điểm

  • Khôi phục toàn bộ cấu trúc bảng + dữ liệu
  • Tính tái tạo cao
  • Có thể bao gồm giao dịch
  • Thông thường là lựa chọn an toàn nhất

Các phương pháp điển hình

mysql -u user -p dbname < dump.sql

Hoặc trong MySQL:

SOURCE /path/to/dump.sql;

Phù hợp cho

  • Khôi phục toàn bộ DB hiện có
  • Xây dựng lại môi trường production
  • Tải dữ liệu cho môi trường CI/CD

2.2 Khi nào nhập CSV / TSV

Các trường hợp sử dụng phổ biến

  • Nhận dữ liệu từ hệ thống bên ngoài
  • Nhập dữ liệu Excel
  • Xử lý ETL
  • Cập nhật chỉ các bảng cụ thể

Đặc điểm

  • Chỉ tải dữ liệu (schema phải tồn tại riêng)
  • Nhanh ( LOAD DATA cực kỳ nhanh)
  • Cho phép logic chuyển đổi trong quá trình nhập

Phương pháp điển hình

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

Phù hợp cho

  • Các công việc batch định kỳ
  • Tích hợp dữ liệu
  • Tiêu thụ nhanh lượng hàng lớn

2.3 Khi nào sử dụng công cụ GUI

Các công cụ phổ biến:

  • MySQL Workbench
  • phpMyAdmin

Đặc điểm

  • Vận hành trực quan
  • Thân thiện với người mới
  • Thích hợp cho bộ dữ liệu nhỏ

Lưu ý

  • Giới hạn tải lên (phpMyAdmin)
  • Hết thời gian
  • Không ổn định với dữ liệu lớn
  • Khó phân tích lỗi hơn

2.4 So sánh theo phương pháp (góc nhìn thực tiễn)

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

✔ Lựa chọn đề xuất trong công việc thực tế

  • Khôi phục sao lưu → lệnh mysql
  • Nhập CSV tốc độ cao → LOAD DATA LOCAL INFILE
  • Công việc nhỏ, một lần → GUI

Nếu bạn không chắc, chọn CLI (dòng lệnh) là lựa chọn ổn định nhất.

3. Nhập tệp SQL (Con đường nhanh nhất đến thành công)

Nhập một tệp .sqlphương pháp phổ biến nhất cho việc khôi phục sao lưu và di chuyển máy chủ.
Ở đây, mục tiêu là “thành công càng nhanh càng tốt,” vì vậy chúng ta sẽ chỉ tập trung vào các bước thực tiễn được sử dụng trong công việc thực tế.

3.1 Khôi phục trong một dòng (phương pháp phổ biến nhất)

Đây là phương pháp đáng tin cậy và nhanh nhất.

mysql -u username -p database_name < backup.sql

Sau khi chạy, bạn sẽ được yêu cầu nhập mật khẩu.

✔ Kiểm tra trước (để tránh lỗi)

① Cơ sở dữ liệu có tồn tại không?
SHOW DATABASES;

Nếu nó không tồn tại:

CREATE DATABASE example_db;
② Người dùng có quyền không?
SHOW GRANTS FOR 'user'@'localhost';

Nếu thiếu quyền:

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
③ Mã hoá tệp

Thường là UTF-8.
Nếu bạn thấy ký tự bị lỗi, hãy chỉ định rõ ràng.

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

3.2 Chạy từ bên trong MySQL (lệnh SOURCE)

Phương pháp này chạy sau khi bạn đăng nhập vào MySQL.

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

Khi nó hữu ích

  • Khi bạn muốn chạy chỉ một phần của tệp SQL
  • Khi bạn muốn xác định vị trí lỗi chính xác
  • Khi bạn muốn xác nhận trực quan nhật ký thực thi

3.3 Các lỗi thường gặp và cách khắc phục

❌ LỖI 1049: Cơ sở dữ liệu không tồn tại

→ DB không tồn tại
→ Chạy CREATE DATABASE

❌ LỖI 1045: Truy cập bị từ chối

→ Thiếu quyền
→ Kiểm tra bằng SHOW GRANTS

❌ Dừng giữa chừng / vị trí lỗi không rõ ràng

Cách khắc phục:

  1. Kiểm tra phần đầu và phần cuối của tệp
    head backup.sql
    tail backup.sql
    
  1. Kiểm tra các dòng ngay trước lỗi
  2. Nếu tệp lớn, chia nhỏ và chạy từng phần
    split -l 10000 backup.sql part_
    

3.4 Mẹo để ổn định việc nhập SQL lớn

① Kiểm tra cài đặt giao dịch

Xem liệu có bao gồm SET autocommit=0; không

② Nếu ràng buộc khóa ngoại là vấn đề

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

③ Kiểm tra chế độ SQL

SELECT @@sql_mode;

Chế độ strict có thể ảnh hưởng đến việc nhập.

✔ Khuyến nghị thực tiễn

  • Khôi phục sản xuất → lệnh mysql
  • Gỡ lỗi → SOURCE
  • Tệp lớn → CLI + cân nhắc chia nhỏ

4. Nhập CSV (Quan trọng nhất: Nhanh nhất với LOAD DATA)

Khi nhập dữ liệu CSV, phương pháp nhanh nhất và thực tiễn nhất là LOAD DATA.
Đối với bộ dữ liệu lớn, nó nhanh hơn hẳn so với các câu lệnh INSERT.

Ở đây, chúng tôi sẽ cung cấp định dạng “sao chép-dán và chạy” đúng và nêu bật các điểm lỗi thường gặp.

4.1 Đầu tiên: Các yêu cầu CSV

Trước khi nhập, hãy chắc chắn kiểm tra các mục sau.

✔ Dấu phân cách

  • Dấu phẩy ,
  • Tab \t
  • Dấu chấm phẩy ; (thường gặp trong dữ liệu nước ngoài)

✔ Ký tự trích dẫn

  • Giá trị có được bao quanh như "value" bằng dấu ngoặc kép hay không

✔ Kết thúc dòng

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

✔ Bộ ký tự / mã hoá

  • Đề xuất: utf8mb4
  • CSV tạo trên Windows có thể là Shift-JIS
  • UTF-8 có BOM đôi khi gây lỗi

Example check:

file -i example.csv

4.2 Định dạng cơ bản sẵn sàng sao chép-dán (CSV có tiêu đề)

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,'');

Ý nghĩa của mỗi tùy chọn

  • LOCAL  Đọc một tệp từ phía client (cần thiết trong nhiều môi trường)
  • IGNORE 1 LINES  Bỏ qua hàng tiêu đề
  • @age  Biến tạm được dùng để chuyển đổi giá trị trước khi lưu
  • NULLIF()  Chuyển các chuỗi rỗng thành NULL

4.3 Chỉ nhập các cột bạn cần

Nếu CSV có các cột không cần thiết:

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

Ánh xạ các cột không cần thiết tới @dummy.

4.4 Chuyển đổi ngày và kiểu dữ liệu trong quá trình nhập

Ví dụ: chuyển đổi MM/DD/YYYY → định dạng 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 Đối với tệp phân tách bằng tab (TSV)

FIELDS TERMINATED BY '\t'

4.6 Cải thiện hiệu suất hơn nữa (cho dữ liệu lớn)

Tạm thời vô hiệu hoá chỉ mục

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

Tạm thời vô hiệu hoá khóa ngoại

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

Tại sao LOCAL thường được yêu cầu

  • LOAD DATA INFILE → đọc một tệp ở phía máy chủ
  • LOAD DATA LOCAL INFILE → đọc một tệp ở phía client

Trong nhiều môi trường, sử dụng LOCAL có tỷ lệ thành công cao hơn.

✔ Hình thức đề xuất thực tế

Trong hầu hết các trường hợp:

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

Đây là cách tiếp cận ổn định nhất.

5. Top 4 Nguyên nhân INFILE Thất bại (Phần Quan trọng Nhất)

Hầu hết các lỗi LOAD DATA INFILE đều do cài đặt, quyền hạn, hoặc hiểu sai vị trí nguồn.
Nếu bạn hiểu điều này, bạn có thể giải quyết hầu hết các lỗi ngay lập tức.

5.1 Sự khác biệt giữa INFILELOCAL INFILE

Đây là khái niệm cơ bản quan trọng.

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

Những hiểu lầm phổ biến

  • Cố gắng đọc tệp trên PC cá nhân bằng INFILE và gặp lỗi
  • Tệp không tồn tại trên máy chủ

✔ Nguyên tắc nhanh

  • CSV trên PC của bạn → LOCAL
  • CSV đặt trên máy chủ → INFILE

Nếu không chắc, sử dụng LOCAL là lựa chọn an toàn nhất.

5.2 local_infile bị tắt (nguyên nhân của LỖI 1148)

Ví dụ lỗi:

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

Nguyên nhân:

local_infile đang TẮT

✔ Kiểm tra cài đặt hiện tại

SHOW VARIABLES LIKE 'local_infile';

✔ Bật nó khi kết nối (phía client)

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

✔ Bật vĩnh viễn (tệp cấu hình)

Thêm vào my.cnf hoặc my.ini:

[mysqld]
local_infile=1

Bạn phải khởi động lại máy chủ.

5.3 Hạn chế secure_file_priv

Điều này xảy ra khi sử dụng LOAD DATA INFILE (không có LOCAL).

Kiểm tra:

SHOW VARIABLES LIKE 'secure_file_priv';

Ví dụ đầu ra

/var/lib/mysql-files/

→ Bạn chỉ có thể đọc các tệp trong thư mục này.

✔ Khắc phục

  • Di chuyển CSV vào thư mục được phép
  • Hoặc sử dụng LOCAL

5.4 Quyền không đủ (quyền FILE / quyền hệ điều hành)

Ví dụ lỗi:

ERROR 1045: Access denied

Kiểm tra:

SHOW GRANTS FOR 'user'@'localhost';

✔ Quyền cần thiết

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

※ Vì bảo mật, hãy vận hành với quyền tối thiểu có thể.

5.5 Đặc tả đường dẫn không đúng

  • Sử dụng đường dẫn tuyệt đối, không phải đường dẫn tương đối
  • Trên Windows, nên dùng C:/path/file.csv
  • Dấu gạch chéo xuôi (/) an toàn hơn dấu gạch chéo ngược ()

✔ Quy trình khắc phục nhanh cho các vấn đề INFILE

  1. Bạn đã thêm LOCAL chưa?
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. Kiểm tra quyền (SHOW GRANTS)
  5. Kiểm tra đường dẫn (đường dẫn tuyệt đối)

Theo thứ tự này, bạn có thể giải quyết hầu hết các trường hợp.

6. Nhập dữ liệu qua GUI (Workbench / phpMyAdmin)

Dòng lệnh là ổn định nhất, nhưng có những tình huống bạn muốn sử dụng công cụ GUI.
Ở đây, chúng ta sẽ tập trung vào những điểm chung mà mọi người gặp khó khăn trong công việc thực tế.

6.1 Nhập dữ liệu với MySQL Workbench

Nhập file SQL (khôi phục bản sao lưu)

  1. Khởi chạy Workbench
  2. Menu → Server → Data Import
  3. Chọn “Import from Self-Contained File”
  4. Chọn file .sql
  5. Chọn Target Schema (cơ sở dữ liệu)
  6. Nhấp “Start Import”

Nhập CSV (theo bảng)

  1. Nhấp chuột phải vào bảng đích
  2. Chọn Table Data Import Wizard
  3. Chọn file CSV
  4. Đặt dấu phân cách và xem có tiêu đề không
  5. Chạy

⚠ Các lý do phổ biến khiến Workbench bị kẹt

  • File lớn (hàng trăm MB hoặc hơn)
  • Hết thời gian
  • Không khớp mã hóa
  • Hạn chế secure_file_priv

👉 Đối với file lớn hoặc môi trường sản xuất, CLI được khuyến nghị.

6.2 Nhập dữ liệu với phpMyAdmin

Các bước

  1. Chọn cơ sở dữ liệu đích
  2. Mở tab “Import”
  3. Chọn file
  4. Chọn định dạng (SQL / CSV)
  5. Chạy

⚠ Hạn chế của phpMyAdmin

① Giới hạn kích thước tải lên

upload_max_filesize
post_max_size

File lớn sẽ thất bại.

② Hết thời gian
max_execution_time

Các nhập dữ liệu chạy lâu có thể dừng giữa chừng.

③ Hết bộ nhớ
memory_limit

6.3 Khi nào bạn nên sử dụng GUI

  • Tập dữ liệu nhỏ (vài MB)
  • Môi trường phát triển
  • Công việc tạm thời một lần

6.4 Khi nào bạn nên sử dụng CLI (khuyến nghị)

  • Môi trường sản xuất
  • Hàng chục MB hoặc hơn
  • Nhập CSV lớn
  • Khi bạn cần phân tích lỗi
  • Di chuyển server-to-server

✔ Kết luận thực tế

GUI là “dễ dàng,” nhưng
CLI vượt trội hơn hẳn về độ ổn định, khả năng tái tạo, và xử lý file lớn.

Để khắc phục sự cố, học các hoạt động CLI cuối cùng được khuyến nghị.

7. Khắc phục sự cố (Theo Lỗi: Nguyên nhân → Cách sửa nhanh nhất)

Hầu hết các lỗi nhập dữ liệu MySQL đều có mẫu hình cao.
Ở đây, chúng ta sẽ tổ chức chúng theo thứ tự “nguyên nhân → hành động đầu tiên → lệnh xác minh.”

7.1 ERROR 1148 (42000)

Lệnh được sử dụng không được phép với phiên bản MySQL này

🔎 Nguyên nhân

  • LOAD DATA LOCAL INFILE bị vô hiệu hóa
  • local_infile là OFF

✅ Cách sửa nhanh nhất

① Kiểm tra cài đặt hiện tại

SHOW VARIABLES LIKE 'local_infile';

② Bật khi kết nối (phía client)

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

③ Bật vĩnh viễn (nếu cần)

[mysqld]
local_infile=1

→ Khởi động lại MySQL

7.2 ERROR 1366

Giá trị chuỗi không đúng

🔎 Nguyên nhân

  • Không khớp mã hóa
  • Không nhất quán giữa utf8 và utf8mb4
  • Trộn Shift-JIS

✅ Cách sửa nhanh nhất

① Kiểm tra bộ ký tự hiện tại

SHOW VARIABLES LIKE 'character_set%';

② Chuyển bảng sang utf8mb4

ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;

③ Chỉ định rõ ràng tại thời điểm nhập

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

7.3 ERROR 1062

Mục trùng lặp

🔎 Nguyên nhân

  • Khóa chính trùng lặp
  • Vi phạm ràng buộc UNIQUE

✅ Các tùy chọn sửa

Tùy chọn 1: Bỏ qua trùng lặp
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE example_table
IGNORE;
Tùy chọn 2: Cập nhật khi trùng lặp
INSERT INTO example_table (id, name)
VALUES (1,'John')
ON DUPLICATE KEY UPDATE name=VALUES(name);
Tùy chọn 3: Sử dụng bảng tạm
CREATE TEMPORARY TABLE temp LIKE example_table;
-- LOAD into temp first
INSERT INTO example_table
SELECT * FROM temp;

7.4 ERROR 1045

Truy cập bị từ chối cho người dùng

🔎 Nguyên nhân

  • Quyền DB không đủ
  • Quyền FILE không đủ
  • Quyền OS cho đường dẫn không đủ

✅ Kiểm tra

SHOW GRANTS FOR 'user'@'localhost';

✅ Ví dụ quyền yêu cầu

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

※ Hãy cẩn thận khi cấp quyền FILE.

7.5 Nó dừng giữa chừng với file lớn

🔎 Nguyên nhân

  • Hết thời gian
  • Hết bộ nhớ
  • Giới hạn PHP (phpMyAdmin)

✅ Các biện pháp nhanh nhất

Tăng thời gian chờ
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
Chia tệp
split -l 100000 large.csv part_

✔ Quy trình giải quyết lỗi (nhanh nhất)

  1. Kiểm tra mã hoá
  2. Kiểm tra local_infile
  3. Kiểm tra secure_file_priv
  4. Kiểm tra quyền
  5. Kiểm tra ký tự kết thúc dòng ( \n / \r\n )

Theo thứ tự này, bạn có thể giải quyết hầu hết các vấn đề.

8. Kỹ thuật thực tế cho bộ dữ liệu lớn (Hoạt động không lỗi)

Khi nhập hàng trăm ngàn đến hàng triệu dòng,
các phương pháp thông thường có thể chậm, dừng hoặc bị lỗi.

Dưới đây là các kỹ thuật ổn định thường được sử dụng trong môi trường sản xuất.

8.1 Chia tệp và nhập theo giai đoạn

Nhập một tệp CSV/SQL khổng lồ một lần có thể gây ra vấn đề về bộ nhớ và thời gian chờ.

✔ Linux / Mac

split -l 100000 large.csv part_

→ Chia thành 100.000 dòng mỗi phần

✔ Windows (ví dụ PowerShell)

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

✔ Lợi ích của việc nhập theo giai đoạn

  • Dễ dàng thử lại sau khi gặp lỗi một phần
  • Dễ dàng xác định vị trí lỗi
  • Tải máy chủ ổn định hơn

8.2 Tạm thời vô hiệu hoá chỉ mục và khóa ngoại

Trong quá trình nhập, việc cập nhật chỉ mục thường trở thành nút thắt.

✔ Tạm thời vô hiệu hoá chỉ mục

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

※ Chủ yếu dành cho MyISAM. Hiệu quả hạn chế với InnoDB.

✔ Vô hiệu hoá khóa ngoại

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

8.3 Kiểm soát autocommit (tăng tốc)

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

8.4 Cài đặt đề xuất cho tải hàng loạt

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

Sau khi nhập:

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

⚠ Sử dụng cẩn thận trong môi trường sản xuất.

8.5 Tăng thời gian chờ

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

8.6 Chiến lược bảng tạm (hoạt động an toàn)

Thay vì nhập trực tiếp vào bảng sản xuất, hãy sử dụng một bảng xác thực trước.

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

Sau khi xác thực:

INSERT INTO example_table
SELECT * FROM staging;

✔ Mẫu thực tế ổn định nhất

  1. Tải vào bảng tạm
  2. Kiểm tra số lượng hàng
  3. Xác thực các ràng buộc
  4. Áp dụng vào môi trường sản xuất
  5. Lưu nhật ký

✔ Kết luận cho dữ liệu lớn

  • Sử dụng CLI bất cứ khi nào có thể
  • Chia nhập dữ liệu
  • Thực hiện qua bảng tạm
  • Tạm thời vô hiệu hoá các ràng buộc
  • Kiểm tra nhật ký

Điều này sẽ giữ cho việc nhập dữ liệu ổn định ngay cả khi có hàng triệu dòng.

9. Câu hỏi thường gặp (FAQ)

Dưới đây là các câu trả lời nhanh, thực tiễn cho những câu hỏi thường gặp về việc nhập MySQL.

Q1. Tôi có thể nhập chỉ các cột cụ thể từ CSV không?

Có, bạn có thể.

Bạn có thể ánh xạ các cột không cần thiết vào một biến (như @dummy) và bỏ qua chúng.

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

Nếu bạn chỉ muốn một số cột nhất định, hãy chắc chắn định rõ thứ tự cột.

Q2. Làm sao để xử lý các ô trống thành NULL?

Sử dụng 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,'');

Điều này chuyển các chuỗi rỗng (”) thành NULL.

Q3. Làm sao để bỏ qua hàng tiêu đề?

IGNORE 1 LINES

Ví dụ:

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

Q4. Làm sao để xác thực kết quả nhập?

✔ Kiểm tra số lượng hàng

SELECT COUNT(*) FROM example_table;

✔ Kiểm tra cảnh báo/lỗi

Kiểm tra cảnh báo MySQL:

SHOW WARNINGS;

✔ Chiến lược bảng tạm (khuyến nghị)

Tải vào bảng tạm trước, sau đó áp dụng vào môi trường sản xuất.

Q5. Phương pháp nào nhanh nhất?

Kết luận:

  • CSV → LOAD DATA LOCAL INFILE (nhanh nhất)
  • Khôi phục backup → lệnh mysql

GUI tiện lợi, nhưng CLI thắng về tốc độ và độ ổn định.

Q6. Tôi gặp lỗi kết thúc dòng trên Windows

Do kết thúc dòng.

Windows:

LINES TERMINATED BY '\r\n'

Linux / Mac:

LINES TERMINATED BY '\n'

Q7. Tôi gặp lỗi secure_file_priv

Kiểm tra:

SHOW VARIABLES LIKE 'secure_file_priv';

Sửa:

  • Đặt CSV vào thư mục được phép
  • Hoặc sử dụng LOCAL

✔ Tóm tắt FAQ

  • Ánh xạ cột → @dummy
  • Chuyển đổi NULL → NULLIF
  • Bỏ qua tiêu đề → IGNORE 1 LINES
  • Nhập tốc độ cao → LOAD DATA
  • Các điểm “kẹt” hàng đầu → local_infile / secure_file_priv / mã hóa

10. Tóm tắt

Nhập MySQL có thể trông phức tạp lúc đầu, nhưng
một khi tổ chức theo mục tiêu, chúng rất đơn giản.

Hãy ôn lại các đường dẫn thành công ngắn nhất.

✔ Khôi phục file SQL (.sql)

Nhanh nhất và ổn định nhất:

mysql -u user -p dbname < backup.sql
  • Kiểm tra xem DB có tồn tại không
  • Kiểm tra quyền
  • Khuyến nghị utf8mb4 cho mã hóa

✔ Nhập CSV (nhanh)

Dạng cơ bản:

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;

Các điểm chính:

  • Kết thúc dòng Windows → \r\n
  • Chuỗi rỗng → NULLIF()
  • Nếu thất bại, kiểm tra local_infile

✔ Thứ tự kiểm tra khắc phục sự cố

  1. Mã hóa (khuyến nghị utf8mb4)
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. Quyền (SHOW GRANTS)
  5. Kết thúc dòng

Theo thứ tự này, bạn có thể giải quyết hầu hết các vấn đề.

✔ Quy tắc vàng cho tập dữ liệu lớn

  • Sử dụng CLI
  • Chia nhỏ nhập
  • Đi qua bảng tạm
  • Tạm thời vô hiệu hóa khóa ngoại/ràng buộc
  • Kiểm tra logs

✔ Kết luận cuối cùng

  • Khôi phục backup → lệnh mysql
  • Nhập CSV tốc độ cao → LOAD DATA LOCAL INFILE
  • Nhiệm vụ nhỏ một lần → GUI

Nếu bạn không chắc chắn, sử dụng CLI là lựa chọn ổn định nhất.

Với điều này, bạn giờ có bộ kiến thức hoàn chỉnh cho nhập MySQL.

Thử trong môi trường của bạn và xây dựng quy trình hoạt động ổn định.