🤖
【技術覚書】MySQL LOADコマンド LOCALオプションの有無による使い方の違いについて
はじめに
データベースに大量のデータをインポートする際、手動で一つ一つのレコードを追加するのは非常に手間がかかります。MySQLでは大量のデータのインポート操作にLOAD DATA
コマンドを用います。LOAD DATA
コマンドはLOCAL
オプションの有無によりインポート操作の手順が異なります。どういう使い分けがあるのかが気になったので、調べた結果を自分用の覚書として記しておきます。
シナリオ
- MySQLのサンプルDBを利用する
-
employees
DBの操作は専用ユーザemployees_user
を利用する -
employees
DBのdepartments
テーブルにdepartments_202412061658.csv
ファイルのデータをLOAD DATA
コマンドを用いてインポートする -
departments_202412061658.csv
ファイルはあらかじめエキスポートして作成しておく
LOAD DATA
コマンドのLOCAL
オプションの有無によるメリットとデメリット
LOCALオプション | 特徴 | 運用、セキュリティ上の注意事項 |
---|---|---|
有り | 実行ユーザーにFILE 権限は不要接続した実行ユーザーのクライアントのローカルのデータをアップロードできる |
実行ユーザーemployees_user のMySQL接続時にオプション--load-infile=1 指定が必要アップロード前後で root ユーザーによるアップロード許可、制限のサーバー側の設定が必要恒常的にアップロードを許可するのはセキュリティ的によくない |
無し | 実行ユーザーにFILE権限が必要 | 変数secure_file_priv が示すディレクトリにファイルコピー操作が必要 |
実際の操作 / LOCALオプションが有る場合
# | 管理者ユーザ root | 実行ユーザ employees_user |
---|---|---|
インポートステップ1 |
local_infile システム変数をON にする |
|
インポートステップ2 |
local_infile=1 でMySQL DBに接続 |
|
インポートステップ3 |
LOAD DATA LOCAL でクライアントのdepartments_202412061658.csv ファイルをインポートする |
|
インポートステップ4 | MySQL DBを切断 | |
インポートステップ5 |
local_infile システム変数をOFF にする |
実際の操作 / LOCALオプションが無い場合
# | 管理者ユーザ root | 実行ユーザ employees_user |
---|---|---|
設定ステップ |
FILE 権限を実行ユーザemployees_user に与える |
|
インポートステップ1 |
departments_202412061658.csv ファイルを変数secure_file_priv が示すディレクトリにコピーする |
|
インポートステップ2 | MySQL DBに接続 | |
インポートステップ3 |
LOAD DATA で変数secure_file_priv が示すディレクトリに格納したCSVをインポートする |
|
インポートステップ4 | MySQL DBを切断 |
まとめ
LOAD DATA
コマンドを使うことで、大量のデータを効率的にインポートすることができます。LOCAL
オプションを指定するかどうかはそれぞれの運用方法に応じてに決まります。それぞれのシステムの運用に合わせたインポートを行いましょう。
Discussion