- 1 1. この記事でできること
- 2 2. MySQLインポートの種類と使い分け
- 3 3. SQLファイルのインポート(最短で成功する方法)
- 4 4. CSVインポート(最重要:LOAD DATAで最速)
- 5 5. INFILEで詰まる原因トップ4(ここが最重要)
- 6 6. GUIでインポート(Workbench / phpMyAdmin)
- 7 7. トラブルシューティング(エラー別:原因→最短解決)
- 8 8. 大容量データの現場テク(失敗しない運用)
- 9 9. FAQ(よくある質問)
- 10 10. まとめ
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で詰まる原因の完全整理
- エラー別の最短解決法
- 大容量データの現場テクニック

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.sql3.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 で確認
❌ 途中で止まる/エラー箇所が不明
対処法:
- ファイルの先頭と末尾を確認
head backup.sql
tail backup.sql- エラー直前の行を確認
- 大容量ファイルなら分割して実行
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.csv4.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 INFILE と LOCAL 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系トラブル解決フロー(最短)
LOCALを付けているか?SHOW VARIABLES LIKE 'local_infile';SHOW VARIABLES LIKE 'secure_file_priv';- 権限確認(SHOW GRANTS)
- パス確認(絶対パス)
この順で確認すれば、ほぼ解決します。
6. GUIでインポート(Workbench / phpMyAdmin)
コマンドラインが最も安定しますが、GUIツールを使いたい場面もあります。
ここでは 実務で詰まりやすいポイント中心 に解説します。
6.1 MySQL Workbenchでのインポート
SQLファイルのインポート(バックアップ復元)
- Workbenchを起動
- メニュー → Server → Data Import
- 「Import from Self-Contained File」を選択
.sqlファイルを指定- Target Schema(データベース)を選択
- 「Start Import」
CSVインポート(テーブル単位)
- 対象テーブルを右クリック
- Table Data Import Wizard を選択
- CSVファイル指定
- 区切り文字・ヘッダ有無を設定
- 実行
⚠ Workbenchで詰まる原因
- 大容量ファイル(数百MB以上)
- タイムアウト
- 文字コード不一致
secure_file_priv制限
👉 大容量や本番環境ではCLI推奨です。
6.2 phpMyAdminでのインポート
手順
- 対象データベースを選択
- 「インポート」タブ
- ファイルを選択
- 形式(SQL / CSV)を選択
- 実行
⚠ 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.sql7.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_✔ エラー解決フロー(最短)
- 文字コード確認
local_infile確認secure_file_priv確認- 権限確認
- 改行コード確認(\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;✔ 実務の最安定パターン
- stagingテーブルへ投入
- 件数チェック
- 制約確認
- 本番反映
- ログ保存
✔ 大容量処理の結論
- 可能なら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を確認
✔ 詰まったときの確認順序
- 文字コード(utf8mb4推奨)
SHOW VARIABLES LIKE 'local_infile';SHOW VARIABLES LIKE 'secure_file_priv';- 権限(SHOW GRANTS)
- 改行コード確認
この順で確認すれば、ほぼ解決できます。
✔ 大容量データの鉄則
- CLIを使う
- 分割投入
- stagingテーブル経由
- 外部キー/制約を一時停止
- ログ確認
✔ 最終結論
- バックアップ復元 → mysqlコマンド
- CSV高速投入 → LOAD DATA LOCAL INFILE
- 小規模単発 → GUI
迷ったらCLIを使うのが最も安定です。
これで、MySQLインポートに必要な知識は一通り網羅できました。
実際の環境で試しながら、安定した運用フローを確立してください。


