Sửa lỗi MySQL ERROR 2068 (HY000): LOAD DATA LOCAL INFILE bị từ chối

intermediate🗄️ MySQL2026-07-23| MySQL 8.0+, MariaDB, Ubuntu/Debian/CentOS, Windows, macOS

Error Message

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access
#mysql#quan-tri-co-so-du-lieu#loi-sql#nhap-du-lieu

Vấn đềBạn nhấn 'Enter' cho lệnh LOAD DATA LOCAL INFILE, mong đợi dữ liệu được nhập nhanh chóng. Thay vào đó, MySQL chặn đứng bạn với lỗi này:

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access

MySQL 8.0 đã thắt chặt các quy tắc bảo mật. Ngay cả khi quyền truy cập file của bạn được mở hoàn toàn (777), MySQL vẫn chặn thao tác này theo mặc định. Điều này ngăn chặn lỗ hổng 'rogue server', nơi một máy chủ cơ sở dữ liệu độc hại có thể đánh lừa client tải lên các file cục bộ nhạy cảm như /etc/passwd hoặc SSH keys.

Nguyên nhân gốc rễ: Cái bắt tay hai chiềuĐể di chuyển một file từ máy cục bộ sang server, cả hai đầu kết nối phải đồng ý với việc truyền tải. Đây là một quy trình xác minh hai bước:

  • MySQL Server phải có biến hệ thống local_infile được đặt thành ON.- MySQL Client (terminal, script Python, hoặc ứng dụng PHP của bạn) phải thông báo rõ ràng rằng nó muốn gửi dữ liệu cục bộ.Nếu một trong hai bên từ chối, toàn bộ quá trình truyền tải sẽ thất bại với lỗi 2068.

Bước 1: Bật local_infile trên ServerBắt đầu bằng cách kiểm tra trạng thái hiện tại của server. Chạy lệnh này trong MySQL shell:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Nếu kết quả là OFF, bạn có thể bật nó ngay lập tức mà không cần khởi động lại. Chạy lệnh này:

SET GLOBAL local_infile = 1;

Cấu hình thay đổi vĩnh viễnLệnh trên chỉ có tác dụng cho đến lần khởi động lại cơ sở dữ liệu tiếp theo. Để thay đổi có hiệu lực vĩnh viễn, hãy tìm file cấu hình của bạn—thường là /etc/mysql/my.cnf hoặc /etc/my.cnf—và thêm các dòng sau:

[mysqld]
local_infile=1

Áp dụng các thay đổi bằng cách khởi động lại dịch vụ:

sudo systemctl restart mysql

Bước 2: Bật local_infile phía ClientCấu hình phía server mới chỉ là một nửa chặng đường. Phương thức kết nối của bạn cũng phải cho phép việc truyền tải.

Tùy chọn A: Giao diện dòng lệnh (CLI)Khi bạn đăng nhập, bạn phải bao gồm cờ --local-infile. Một lệnh đăng nhập tiêu chuẩn sẽ như sau:

mysql --local-infile=1 -u db_user -p -h 127.0.0.1 your_database

Tùy chọn B: Python (mysql-connector-python)Nếu bạn đang tự động hóa việc nhập dữ liệu bằng Python, từ điển kết nối tiêu chuẩn là không đủ. Bạn phải truyền allow_local_infile=True làm tham số:

import mysql.connector

connection = mysql.connector.connect(
    user='admin',
    password='mat_khau_cua_ban',
    host='127.0.0.1',
    database='du_lieu_ban_hang',
    allow_local_infile=True
)

Tùy chọn C: PHP (PDO)Đối với các ứng dụng PHP, hãy thiết lập thuộc tính trong quá trình khởi tạo PDO. Đây là yêu cầu phổ biến cho Laravel hoặc các thiết lập CMS tùy chỉnh:

$options = [
    PDO::MYSQL_ATTR_LOCAL_INFILE => true,
];
$db = new PDO("mysql:host=localhost;dbname=db_ung_dung", "nguoi_dung", "mat_khau", $options);

Bước 3: Kiểm tra việc nhập dữ liệuThử chạy lại lệnh nhập dữ liệu của bạn. Đối với một file có 50.000 dòng, hãy sử dụng một lệnh có cấu trúc như sau:

LOAD DATA LOCAL INFILE '/tmp/users_list.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

Nếu bạn thấy Query OK, 50000 rows affected, rào cản đã chính thức được gỡ bỏ.

Các phương pháp bảo mật tốt nhấtViệc bật local_infile trên toàn cầu có thể rủi ro trong môi trường đa người dùng (multi-tenant). Nếu bạn đang làm việc với dữ liệu cực kỳ nhạy cảm, hãy xem xét các giải pháp thay thế an toàn hơn sau:

  • Cách tiếp cận secure_file_priv: Di chuyển file CSV của bạn vào thư mục được chỉ định bởi SHOW VARIABLES LIKE 'secure_file_priv'; (thường là /var/lib/mysql-files/). Sau đó, sử dụng LOAD DATA INFILE (bỏ qua từ khóa LOCAL). Điều này cho phép server đọc file trực tiếp từ đĩa cứng của chính nó.- Hạn chế đặc quyền: Chỉ cấp đặc quyền FILE cho những người dùng quản trị cụ thể thay vì người dùng ứng dụng chung.Trong hầu hết các môi trường phát triển, việc bật local_infile là cách khắc phục tiêu chuẩn, nhưng hãy luôn tắt nó trong môi trường production nếu bạn không thực sự cần nó cho các hoạt động hàng ngày.

Related Error Notes