MySQL インポート完全ガイド|CSV・SQLの取り込み方法とエラー対処(LOAD DATA対応)

目次

1. この記事でできること

MySQLのデータインポートで検索している多くの方は、

  • 「.sqlファイルを復元したい」
  • 「CSVを取り込みたい」
  • 「エラーで止まった」
  • 「WorkbenchやphpMyAdminでうまくいかない」

といった “今すぐ解決したい状態” にあります。

まずは、目的別の最短成功手順を提示します。

🔹 SQLファイル(.sql)をインポートする最短コマンド

バックアップ復元やサーバー移行の場合は、これが最速です。

mysql -u ユーザー名 -p データベース名 < backup.sql

事前に確認すること

  • インポート先データベースは存在しているか
  • 接続ユーザーに対象DBの権限があるか
  • SQLファイルの文字コード(通常はUTF-8)

データベースが未作成の場合:

CREATE DATABASE example_db;

🔹 CSVファイルをインポートする最短手順(推奨)

大量データを高速に取り込むなら LOAD DATA が最適です。

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

重要ポイント

  • Windowsの改行 → '\r\n'
  • ヘッダ行がある場合 → IGNORE 1 LINES
  • 空文字をNULLに変換 → NULLIF()
  • LOCALが必要な環境が多い(後述)

🔹 GUIでインポートしたい場合

MySQL Workbench

  • Server → Data Import → ファイル選択 → 実行

phpMyAdmin

  • 対象DB選択 → インポート → ファイル指定 → 実行

⚠ ただし、大容量データやエラー対応はCLI(コマンドライン)の方が確実です。

🔹 インポート前に必ず確認すべき3点

1. 文字コード(最重要)

SHOW VARIABLES LIKE 'character_set%';

推奨:utf8mb4

2. INFILE系エラーの原因設定

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

3. 権限確認

SHOW GRANTS FOR 'user'@'localhost';

✔ この後の構成

  • SQLファイルの詳細インポート方法
  • CSVの実践的な取り込みテクニック
  • INFILEで詰まる原因の完全整理
  • エラー別の最短解決法
  • 大容量データの現場テクニック
MySQL data import workflow diagram showing SQL file, CSV file, LOAD DATA LOCAL INFILE, mysql command, and MySQL server process

2. MySQLインポートの種類と使い分け

MySQLのインポート方法は複数ありますが、用途によって最適解は異なります
ここを正しく理解しておくと、無駄なトラブルを避けられます。

2.1 SQLダンプ(.sql)をインポートするケース

主な用途

  • バックアップからの復元
  • サーバー移行
  • 開発環境へのデータ反映
  • mysqldump で出力したデータの再投入

特徴

  • テーブル構造+データを丸ごと復元できる
  • 再現性が高い
  • トランザクションも含められる
  • 基本的に一番安全

代表的な方法

mysql -u user -p dbname < dump.sql

または MySQL内で:

SOURCE /path/to/dump.sql;

向いているケース

  • 既存DBの完全復元
  • 本番環境の再構築
  • CI/CD環境のデータ投入

2.2 CSV / TSVをインポートするケース

主な用途

  • 外部システムからのデータ受け取り
  • Excelデータの取り込み
  • ETL処理
  • 一部テーブルのみ更新

特徴

  • データのみ投入(構造は別途必要)
  • 高速(LOAD DATA は非常に速い)
  • 変換処理を組み込み可能

代表的な方法

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

向いているケース

  • 定期バッチ処理
  • データ連携
  • 大量行の高速取り込み

2.3 GUIツールを使うケース

代表的なツール:

  • MySQL Workbench
  • phpMyAdmin

特徴

  • 操作が直感的
  • 初心者向き
  • 小規模データ向け

注意点

  • アップロード制限(phpMyAdmin)
  • タイムアウト
  • 大容量で不安定
  • エラー解析が難しい

2.4 方法別の比較(実務視点)

方法速度安定性大容量対応エラー解析推奨度
mysqlコマンド★★★★★
LOAD DATA★★★★★
Workbench★★★
phpMyAdmin×★★

✔ 実務でのおすすめ選択

  • バックアップ復元 → mysqlコマンド
  • CSV高速投入 → LOAD DATA LOCAL INFILE
  • 小規模・単発 → GUI

迷ったら CLI(コマンドライン)を選ぶのが最も安定 します。

3. SQLファイルのインポート(最短で成功する方法)

.sql ファイルのインポートは、バックアップ復元やサーバー移行で最も使用される方法です。
ここでは「最短で成功させる」ことを目的に、実務で使う手順だけを整理します。

3.1 1行で復元する(最も使われる方法)

最も確実で高速な方法です。

mysql -u ユーザー名 -p データベース名 < backup.sql

実行後、パスワードを求められます。

✔ 事前チェック(失敗を防ぐ)

① データベースが存在するか
SHOW DATABASES;

存在しない場合:

CREATE DATABASE example_db;
② ユーザーに権限があるか
SHOW GRANTS FOR 'user'@'localhost';

不足している場合:

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
③ ファイルの文字コード

通常はUTF-8です。
文字化けが出る場合は、明示指定します。

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

3.2 MySQL内部から実行する(SOURCEコマンド)

MySQLにログイン後に実行する方法です。

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

使いどころ

  • 部分的にSQLを実行したい場合
  • エラー箇所を特定したい場合
  • 実行ログを目視確認したい場合

3.3 よくある失敗と対処法

❌ ERROR 1049: Unknown database

→ DBが存在しない
CREATE DATABASE を実行

❌ ERROR 1045: Access denied

→ 権限不足
SHOW GRANTS で確認

❌ 途中で止まる/エラー箇所が不明

対処法:

  1. ファイルの先頭と末尾を確認
head backup.sql
tail backup.sql
  1. エラー直前の行を確認
  2. 大容量ファイルなら分割して実行
split -l 10000 backup.sql part_

3.4 大容量SQLを安定させるコツ

① トランザクション設定確認

SET autocommit=0; が含まれているか

② 外部キー制約が原因の場合

SET FOREIGN_KEY_CHECKS=0;
-- インポート
SET FOREIGN_KEY_CHECKS=1;

③ SQLモード確認

SELECT @@sql_mode;

厳格モードが影響している場合があります。

✔ 実務での推奨

  • 本番復元 → mysqlコマンド
  • デバッグ用途 → SOURCE
  • 大容量 → CLI + 分割検討

4. CSVインポート(最重要:LOAD DATAで最速)

CSVデータを取り込む場合、最も高速かつ実務向きなのが LOAD DATA です。
大量データでは INSERT 文よりも圧倒的に高速になります。

ここでは、コピペで動く正しい形と、失敗しやすいポイントを整理します。

4.1 まず確認:CSVの前提条件

インポート前に、必ず以下を確認してください。

✔ 区切り文字(デリミタ)

  • カンマ ,
  • タブ \t
  • セミコロン ;(海外データで多い)

✔ 囲み文字

  • "value" のようにダブルクォートで囲まれているか

✔ 改行コード

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

✔ 文字コード

  • 推奨:utf8mb4
  • Windows作成CSVはShift-JISの可能性あり
  • BOM付きUTF-8はエラー原因になることあり

確認例:

file -i example.csv

4.2 コピペで動く基本形(ヘッダありCSV)

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

各オプションの意味

  • LOCAL
    クライアント側のファイルを読み込む(多くの環境で必要)
  • IGNORE 1 LINES
    ヘッダ行をスキップ
  • @age
    一旦変数に格納して加工するための仮変数
  • NULLIF()
    空文字をNULLに変換

4.3 必要な列だけ取り込む方法

CSVに不要な列がある場合:

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

不要な列を @dummy に割り当てます。

4.4 日付・型変換を同時に行う

例:MM/DD/YYYY → 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 タブ区切り(TSV)の場合

FIELDS TERMINATED BY '\t'

4.6 パフォーマンスをさらに上げる(大容量向け)

インデックス一時無効化

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

外部キー一時無効化

SET FOREIGN_KEY_CHECKS=0;
-- LOAD DATA 実行
SET FOREIGN_KEY_CHECKS=1;

LOCALが必要な理由

  • LOAD DATA INFILE → サーバー側のファイルを読む
  • LOAD DATA LOCAL INFILE → クライアント側のファイルを読む

多くの環境では LOCALを使う方が成功率が高い です。

✔ 実務での推奨形

基本的には:

LOAD DATA LOCAL INFILE
+ 明示的な区切り指定
+ 明示的な改行指定
+ IGNORE 1 LINES
+ 型変換処理

これが最も安定します。

5. INFILEで詰まる原因トップ4(ここが最重要)

LOAD DATA INFILE が失敗する原因のほとんどは、設定・権限・読み込み元の誤解です。
ここを理解すれば、エラーの大半は即解決できます。

5.1 INFILELOCAL INFILE の違い

まず押さえるべき基本です。

コマンド読み込む場所典型的な用途
LOAD DATA INFILEサーバー上のファイルサーバー内の固定パス
LOAD DATA LOCAL INFILEクライアント側のファイル手元PCのCSV

よくある誤解

  • ローカルPCのファイルを INFILE で読もうとして失敗
  • サーバー側にファイルがない

✔ 判断基準

  • 自分のPCのCSV → LOCAL
  • サーバー内に置いたCSV → INFILE

迷ったら LOCALを使うのが安全 です。

5.2 local_infile が無効(ERROR 1148の原因)

エラー例:

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

原因:

local_infile が OFF

✔ 現在の設定確認

SHOW VARIABLES LIKE 'local_infile';

✔ クライアント接続時に有効化

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

✔ 永続的に有効化(設定ファイル)

my.cnf または my.ini に追加:

[mysqld]
local_infile=1

サーバー再起動が必要です。

5.3 secure_file_priv の制限

LOAD DATA INFILE(LOCALなし)を使う場合に発生します。

確認:

SHOW VARIABLES LIKE 'secure_file_priv';

出力例

/var/lib/mysql-files/

→ このディレクトリ内のファイルしか読み込めません。

✔ 対処方法

  • 指定ディレクトリにCSVを移動する
  • または LOCAL を使う

5.4 権限不足(FILE権限・OS権限)

エラー例:

ERROR 1045: Access denied

確認:

SHOW GRANTS FOR 'user'@'localhost';

✔ 必要権限

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

※ セキュリティ上、最小権限で運用してください。

5.5 パスの指定ミス

  • 相対パスではなく絶対パスを使う
  • Windowsは C:/path/file.csv 形式推奨
  • バックスラッシュよりスラッシュが安全

✔ INFILE系トラブル解決フロー(最短)

  1. LOCAL を付けているか?
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. 権限確認(SHOW GRANTS)
  5. パス確認(絶対パス)

この順で確認すれば、ほぼ解決します。

6. GUIでインポート(Workbench / phpMyAdmin)

コマンドラインが最も安定しますが、GUIツールを使いたい場面もあります。
ここでは 実務で詰まりやすいポイント中心 に解説します。

6.1 MySQL Workbenchでのインポート

SQLファイルのインポート(バックアップ復元)

  1. Workbenchを起動
  2. メニュー → Server → Data Import
  3. 「Import from Self-Contained File」を選択
  4. .sql ファイルを指定
  5. Target Schema(データベース)を選択
  6. 「Start Import」

CSVインポート(テーブル単位)

  1. 対象テーブルを右クリック
  2. Table Data Import Wizard を選択
  3. CSVファイル指定
  4. 区切り文字・ヘッダ有無を設定
  5. 実行

⚠ Workbenchで詰まる原因

  • 大容量ファイル(数百MB以上)
  • タイムアウト
  • 文字コード不一致
  • secure_file_priv 制限

👉 大容量や本番環境ではCLI推奨です。

6.2 phpMyAdminでのインポート

手順

  1. 対象データベースを選択
  2. 「インポート」タブ
  3. ファイルを選択
  4. 形式(SQL / CSV)を選択
  5. 実行

⚠ phpMyAdminの制限

① アップロード上限

upload_max_filesize
post_max_size

大容量では失敗します。

② タイムアウト

max_execution_time

長時間処理で途中停止することがあります。

③ メモリ不足

memory_limit

6.3 GUIを使うべきケース

  • 数MB程度の小規模データ
  • 開発環境
  • 一時的な作業

6.4 CLIを使うべきケース(推奨)

  • 本番環境
  • 数十MB以上
  • 大量CSV
  • エラー解析が必要な場合
  • サーバー間移行

✔ 実務の結論

GUIは「簡単」ですが、
安定性・再現性・大容量対応はCLIが圧倒的に有利です。

トラブル対応を考えると、最終的にはCLI操作を覚えることが推奨されます。

7. トラブルシューティング(エラー別:原因→最短解決)

MySQLインポートで発生するエラーは、ほぼパターン化されています
ここでは「原因 → まずやること → 確認コマンド」の順で整理します。

7.1 ERROR 1148 (42000)

The used command is not allowed with this MySQL version

🔎 原因

  • LOAD DATA LOCAL INFILE が無効
  • local_infile が OFF

✅ 最短解決

① 現在の設定確認

SHOW VARIABLES LIKE 'local_infile';

② クライアント接続時に有効化

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

③ 永続的に有効化(必要な場合)

[mysqld]
local_infile=1

→ MySQL再起動

7.2 ERROR 1366

Incorrect string value

🔎 原因

  • 文字コード不一致
  • utf8 と utf8mb4 の不整合
  • Shift-JIS混在

✅ 最短解決

① 現在の文字コード確認

SHOW VARIABLES LIKE 'character_set%';

② テーブルをutf8mb4へ統一

ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;

③ インポート時に明示指定

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

7.3 ERROR 1062

Duplicate entry

🔎 原因

  • 主キー重複
  • UNIQUE制約違反

✅ 対処方法

方法1:重複を無視
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE example_table
IGNORE;
方法2:重複時に更新
INSERT INTO example_table (id, name)
VALUES (1,'John')
ON DUPLICATE KEY UPDATE name=VALUES(name);
方法3:一時テーブル経由
CREATE TEMPORARY TABLE temp LIKE example_table;
-- 先にtempへLOAD
INSERT INTO example_table
SELECT * FROM temp;

7.4 ERROR 1045

Access denied for user

🔎 原因

  • DB権限不足
  • FILE権限不足
  • パスのOS権限不足

✅ 確認

SHOW GRANTS FOR 'user'@'localhost';

✅ 必要権限例

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

※ FILE権限は慎重に付与してください。

7.5 大容量で途中停止する

🔎 原因

  • タイムアウト
  • メモリ不足
  • PHP制限(phpMyAdmin)

✅ 最短対処

タイムアウト延長
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
ファイル分割
split -l 100000 large.csv part_

✔ エラー解決フロー(最短)

  1. 文字コード確認
  2. local_infile 確認
  3. secure_file_priv 確認
  4. 権限確認
  5. 改行コード確認(\n / \r\n)

この順で確認すれば、ほぼ解決します。

8. 大容量データの現場テク(失敗しない運用)

数十万〜数百万行のデータをインポートする場合、
通常の方法では遅い・止まる・壊れることがあります。

ここでは実務で使われる安定テクニックを整理します。

8.1 ファイル分割して段階投入する

巨大なCSVやSQLを一度に流すと、メモリやタイムアウトの問題が発生します。

✔ Linux / Mac

split -l 100000 large.csv part_

→ 10万行ごとに分割

✔ Windows(PowerShell例)

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

✔ 分割投入のメリット

  • 途中失敗してもやり直しやすい
  • エラー箇所特定が容易
  • サーバー負荷が安定

8.2 インデックスと外部キーを一時停止

インポート中はインデックス更新がボトルネックになります。

✔ インデックス一時停止

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

※ MyISAM中心。InnoDBでは効果限定的。

✔ 外部キー停止

SET FOREIGN_KEY_CHECKS=0;
-- インポート
SET FOREIGN_KEY_CHECKS=1;

8.3 autocommit制御(高速化)

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

8.4 バルク投入時の推奨設定

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

インポート後:

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

⚠ 本番環境では慎重に使用してください。

8.5 タイムアウト延長

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

8.6 一時テーブル戦略(安全運用)

本番テーブルへ直接投入せず、検証用テーブルを使います。

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

検証後:

INSERT INTO example_table
SELECT * FROM staging;

✔ 実務の最安定パターン

  1. stagingテーブルへ投入
  2. 件数チェック
  3. 制約確認
  4. 本番反映
  5. ログ保存

✔ 大容量処理の結論

  • 可能ならCLI使用
  • 分割投入
  • staging経由
  • 制約一時停止
  • ログ確認

これで数百万行規模でも安定します。

9. FAQ(よくある質問)

ここでは、MySQLインポートで実際によく検索される疑問に、すぐ使える形で回答します。

Q1. CSVの特定の列だけをインポートできますか?

はい、可能です。

不要な列は変数(@dummy など)に受けて無視できます。

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

特定列のみ取り込みたい場合は、読み込み列の順序を明示してください。

Q2. 空白セルをNULLとして扱うには?

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

空文字(”)をNULLに変換できます。

Q3. ヘッダ行をスキップするには?

IGNORE 1 LINES

例:

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

Q4. インポート結果を検証する方法は?

✔ 件数確認

SELECT COUNT(*) FROM example_table;

✔ エラー有無確認

MySQLエラーログを確認:

SHOW WARNINGS;

✔ stagingテーブル戦略(推奨)

一時テーブルに入れてから本番へ反映します。

Q5. どの方法が一番速いですか?

結論:

  • CSV → LOAD DATA LOCAL INFILE(最速)
  • バックアップ復元 → mysqlコマンド

GUIは便利ですが、速度と安定性はCLIが上です。

Q6. Windowsで改行エラーが出ます

改行コードが原因です。

Windows:

LINES TERMINATED BY '\r\n'

Linux / Mac:

LINES TERMINATED BY '\n'

Q7. secure_file_priv エラーが出ます

確認:

SHOW VARIABLES LIKE 'secure_file_priv';

対処:

  • 指定ディレクトリにCSVを置く
  • もしくは LOCAL を使う

✔ FAQのまとめ

  • 列指定 → @dummy
  • NULL変換 → NULLIF
  • ヘッダ除外 → IGNORE 1 LINES
  • 高速処理 → LOAD DATA
  • 詰まりポイント → local_infile / secure_file_priv / 文字コード

10. まとめ

MySQLのインポートは一見複雑に見えますが、
目的別に整理すれば非常にシンプルです。

ここで、最短成功ルートをもう一度まとめます。

✔ SQLファイル(.sql)の復元

最速かつ安定:

mysql -u user -p dbname < backup.sql
  • DBが存在するか確認
  • 権限確認
  • 文字コードは utf8mb4 推奨

✔ CSVインポート(高速)

基本形:

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;

ポイント:

  • Windows改行 → \r\n
  • 空文字 → NULLIF()
  • 詰まったら local_infile を確認

✔ 詰まったときの確認順序

  1. 文字コード(utf8mb4推奨)
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. 権限(SHOW GRANTS)
  5. 改行コード確認

この順で確認すれば、ほぼ解決できます。

✔ 大容量データの鉄則

  • CLIを使う
  • 分割投入
  • stagingテーブル経由
  • 外部キー/制約を一時停止
  • ログ確認

✔ 最終結論

  • バックアップ復元 → mysqlコマンド
  • CSV高速投入 → LOAD DATA LOCAL INFILE
  • 小規模単発 → GUI

迷ったらCLIを使うのが最も安定です。

これで、MySQLインポートに必要な知識は一通り網羅できました。

実際の環境で試しながら、安定した運用フローを確立してください。