MySQL ERROR 2068 (HY000): LOAD DATA LOCAL INFILE の拒否を解決する方法

中級🗄️ 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#データベース管理#sqlエラー#データインポート

問題の発生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_infileON に設定されている必要があります。- 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 INFILELOCAL キーワードを除いたもの)を使用します。これにより、サーバーが自身のディスクから直接ファイルを読み取れるようになります。- 権限の制限: FILE 権限を一般的なアプリケーションユーザーではなく、特定の管理者ユーザーのみに付与します。ほとんどの開発環境では、local_infile を有効にすることが標準的な修正方法ですが、日常的な運用で厳密に必要でない限り、本番環境では常に無効にしておいてください。

Related Error Notes