問題の発生LOAD DATA LOCAL INFILE コマンドを実行して、すぐにデータをインポートしようとした際、MySQL によって次のようなエラーで制約を受けることがあります。
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access
MySQL 8.0 ではセキュリティが強化されました。たとえファイルのパーミッションが完全に許可(777)されていても、デフォルトではこの操作がブロックされます。これは、悪意のあるデータベースサーバーがクライアントを騙して /etc/passwd や SSH キーなどの機密性の高いローカルファイルをアップロードさせる「不正サーバー」攻撃を防ぐための措置です。
根本的な原因:双方向のハンドシェイクローカルマシンからサーバーにファイルを移動するには、接続の両端で転送に同意する必要があります。これは 2 段階の検証プロセスです。
- MySQL サーバー側で、システム変数
local_infileがONに設定されている必要があります。- MySQL クライアント(ターミナル、Python スクリプト、PHP アプリなど)側で、ローカルデータを送信する意思を明示的に示す必要があります。どちらか一方が「拒否」している場合、転送全体が失敗し、エラー 2068 が発生します。
ステップ 1:サーバー側で local_infile を有効にするまず、サーバーの現在のステータスを確認します。MySQL シェルで以下のコマンドを実行してください。
SHOW GLOBAL VARIABLES LIKE 'local_infile';
結果が OFF の場合は、再起動なしで即座に有効化できます。次のコマンドを実行します。
SET GLOBAL local_infile = 1;
設定を永続化する上記のコマンドは、データベースが次に再起動されるまでしか持続しません。設定を永続的に適用するには、設定ファイル(通常は /etc/mysql/my.cnf または /etc/my.cnf)を探し、以下の行を追加します。
[mysqld]
local_infile=1
サービスを再起動して変更を適用します。
sudo systemctl restart mysql
ステップ 2:クライアント側で local_infile を有効にするサーバー側の設定だけでは不十分です。接続方法においても転送を許可する必要があります。
オプション A:コマンドラインインターフェース (CLI)ログイン時に --local-infile フラグを含める必要があります。標準的なログインコマンドは以下のようになります。
mysql --local-infile=1 -u db_user -p -h 127.0.0.1 your_database
オプション B:Python (mysql-connector-python)Python でインポートを自動化している場合、標準的な接続設定だけでは足りません。パラメータとして allow_local_infile=True を渡す必要があります。
import mysql.connector
connection = mysql.connector.connect(
user='admin',
password='あなたのパスワード',
host='127.0.0.1',
database='販売データ',
allow_local_infile=True
)
オプション C:PHP (PDO)PHP アプリケーションの場合は、PDO のインスタンス化中に属性を設定します。これは Laravel やカスタム CMS のセットアップでよく必要とされる要件です。
$options = [
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
];
$db = new PDO("mysql:host=localhost;dbname=app_db", "user", "pass", $options);
ステップ 3:インポートのテストインポートを再度試してください。50,000 行のファイルの場合、以下のような構造化されたコマンドを使用します。
LOAD DATA LOCAL INFILE '/tmp/users_list.csv'
INTO TABLE users
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
Query OK, 50000 rows affected と表示されれば、制限は正式に解除されています。
セキュリティのベストプラクティスマルチテナント環境で local_infile をグローバルに有効にすることはリスクを伴う場合があります。非常に機密性の高いデータを扱う場合は、以下のより安全な代替案を検討してください。
- secure_file_priv アプローチ: CSV ファイルを
SHOW VARIABLES LIKE 'secure_file_priv';で指定されたディレクトリ(多くの場合/var/lib/mysql-files/)に移動します。その後、LOAD DATA INFILE(LOCALキーワードを除いたもの)を使用します。これにより、サーバーが自身のディスクから直接ファイルを読み取れるようになります。- 権限の制限:FILE権限を一般的なアプリケーションユーザーではなく、特定の管理者ユーザーのみに付与します。ほとんどの開発環境では、local_infileを有効にすることが標準的な修正方法ですが、日常的な運用で厳密に必要でない限り、本番環境では常に無効にしておいてください。

