サーバー移転、バックアップからの復元、開発環境から本番環境への移行…
データベースをエクスポート(書き出し)してインポート(読み込み)する作業は、意外と失敗しやすいんです。
特に、こんなSQL文が含まれているファイルをインポートしようとすると、エラーが出ることがあります。
CREATE DATABASE IF NOT EXISTS `xxx`
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
「権限が足りません」「文字コードが対応していません」「データベースが既に存在します」…
エラーメッセージを見ても、何をすれば良いのか分からず困りますよね。
この記事では、データベースのインポート・エクスポートでよくあるエラーと、その解決方法を初心者にもわかりやすく解説します。
まず理解しよう:そのSQL文の意味
エラーの前に、このSQL文が何をしているのか理解しましょう。
CREATE DATABASE文の解説
CREATE DATABASE IF NOT EXISTS `xxx`
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
日本語に訳すと:
「xxx
という名前のデータベースがまだ存在していなければ作成してください。文字コードはUTF-8を使い、並び順のルールはutf8_general_ci
にしてください」
それぞれの意味:
- CREATE DATABASE → データベースを作る命令
- IF NOT EXISTS → すでに存在していたら作らない(エラーを防ぐ)
xxx
→ データベースの名前(バッククォートで囲む)- CHARACTER SET utf8 → 文字コードの指定
- COLLATE utf8_general_ci → 文字の比較ルール(大文字小文字を区別しない)
なぜこの文がエクスポートファイルに含まれるのか
データベース全体をエクスポートすると、データだけでなく「データベースの作り方」も一緒に保存されます。
これにより、別のサーバーでも同じ環境を再現できるわけです。
よくあるエラー1:権限不足でデータベースを作成できない
最も多いエラーがこれです。
エラーメッセージの例
ERROR 1044 (42000): Access denied for user 'username'@'localhost' to database 'xxx'
または
#1044 - Access denied for user 'username'@'%' to database 'xxx'
意味:
「あなたのユーザーには、データベースを作成する権限がありません」
原因
MySQLやMariaDBでは、ユーザーごとに「できること」が決まっています。
一般的なユーザーには、以下の権限しかありません:
- テーブルの作成・削除
- データの追加・編集・削除
- データの検索
しかし、データベース自体を作る権限は、管理者ユーザー(rootなど)にしかないことが多いんです。
解決策1:CREATE DATABASE文を削除する
最も簡単な方法は、この行を削除することです。
手順:
- エクスポートしたSQLファイルをテキストエディタ(メモ帳、Visual Studio Codeなど)で開く
- 先頭付近にある以下の行を探す
CREATE DATABASE IF NOT EXISTS `xxx`
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
- この行を削除する
- ファイルを保存
- 改めてインポートを実行
注意:
事前に、インポート先のデータベースを手動で作成しておく必要があります。
解決策2:管理者ユーザーでインポートする
権限のあるユーザー(通常はroot)でログインしてインポートします。
phpMyAdminの場合:
- rootまたは管理者ユーザーでログイン
- インポート機能を使用
コマンドラインの場合:
mysql -u root -p < backup.sql
rootのパスワードを入力すれば、データベースの作成も含めてインポートできます。
解決策3:ユーザーに権限を付与する
管理者権限がある場合、特定のユーザーに権限を与えることもできます。
権限付与のSQL:
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
注意:
これはすべてのデータベースに対する全権限を与えるため、セキュリティリスクがあります。本番環境では推奨しません。
よくあるエラー2:文字コードが非推奨または非対応
utf8という文字コードが古いため、エラーや警告が出ることがあります。
エラーメッセージの例
Warning: #3719 'utf8' is currently an alias for the character set UTF8MB3
または
Specified key was too long; max key length is 767 bytes
原因
MySQLには、実は2種類のUTF-8があります。
- utf8(またはutf8mb3) → 古い方式、1文字最大3バイト(絵文字が使えない)
- utf8mb4 → 新しい方式、1文字最大4バイト(絵文字も使える)
現在のMySQLでは、utf8mb4
が推奨されています。
解決策1:utf8mb4に変更する
SQLファイルを編集して、文字コードを新しいものに変更します。
変更前:
CREATE DATABASE IF NOT EXISTS `xxx`
DEFAULT CHARACTER SET utf8
COLLATE utf8_general_ci;
変更後:
CREATE DATABASE IF NOT EXISTS `xxx`
DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
注意する箇所:
ファイル全体を検索して、以下も変更してください:
CHARSET=utf8
→CHARSET=utf8mb4
COLLATE utf8_general_ci
→COLLATE utf8mb4_general_ci
解決策2:テキストエディタの一括置換を使う
大きなファイルの場合、手作業は大変です。一括置換を使いましょう。
Visual Studio Codeの場合:
- Ctrl + H(Mac は Command + H)で置換画面を開く
- 検索:
utf8
- 置換:
utf8mb4
- 「すべて置換」をクリック
ただし、utf8mb4
まで置換されてしまわないよう、注意が必要です。
安全な置換方法:
まず「utf8_」を「utf8mb4_」に置換
次に「utf8 」を「utf8mb4 」に置換(スペース付き)
解決策3:エクスポート時に指定する
最初から正しい文字コードでエクスポートすれば、この問題は起きません。
phpMyAdminでのエクスポート設定:
- エクスポートタブを開く
- 「詳細」を選択
- 「データベースシステムまたは古いMySQLサーバーとの互換性」で「なし」を選択
- 実行
よくあるエラー3:データベースが既に存在している
同じ名前のデータベースが既にある場合のエラーです。
エラーメッセージの例
ERROR 1007 (HY000): Can't create database 'xxx'; database exists
意味:
「xxx
という名前のデータベースは既に存在しています」
原因
IF NOT EXISTS
が付いていれば本来はエラーにならないはずですが、以下の場合にエラーが出ます:
- 文字コードや照合順序が異なる
- DROP DATABASE文が含まれている
- MySQLのバージョンによる挙動の違い
解決策1:既存のデータベースを削除してからインポート
phpMyAdminの場合:
- 左側のデータベース一覧から対象のデータベースをクリック
- 「操作」タブを開く
- 「データベースを削除」をクリック
- 改めてインポート
コマンドラインの場合:
DROP DATABASE IF EXISTS xxx;
その後、インポートを実行します。
注意:
既存のデータがすべて削除されます。必ずバックアップを取ってから実行してください。
解決策2:CREATE DATABASE文を削除して既存DBにインポート
データベースは既にあるので、CREATE DATABASE文を削除します。
手順:
- SQLファイルを開く
- CREATE DATABASE文の行を削除
- 既存のデータベースを選択した状態でインポート
これで、既存のデータベースにテーブルやデータだけが追加されます。
解決策3:USE文を確認する
エクスポートファイルにUSE データベース名;
という行があるか確認します。
あるべき形:
CREATE DATABASE IF NOT EXISTS `xxx` ...;
USE `xxx`;
-- ここからテーブル作成やデータ挿入
USE文がないと、別のデータベースにインポートされてしまう可能性があります。
よくあるエラー4:バッククォートの扱い
データベース名やテーブル名を囲む記号でエラーが出ることがあります。
エラーの原因
SQLには、名前を囲む記号が3種類あります:
- バッククォート(`) → MySQL/MariaDB で使用
- ダブルクォート(”) → PostgreSQL、Oracle で使用
- 角括弧([]) → Microsoft SQL Server で使用
異なるデータベースシステム間で移行すると、この違いでエラーになります。
解決策:使用するデータベースに合わせる
MySQL/MariaDBの場合:
CREATE DATABASE IF NOT EXISTS `xxx`;
バッククォートを使います。
PostgreSQLの場合:
CREATE DATABASE "xxx";
ダブルクォートに変更が必要です。
一般的な対処:
記号を完全に削除しても、予約語を使っていなければ問題ありません。
CREATE DATABASE IF NOT EXISTS xxx;
よくあるエラー5:ファイルサイズが大きすぎる
巨大なSQLファイルのインポートで失敗することがあります。
エラーメッセージの例
Script timeout passed
または
Error: Request Entity Too Large
意味:
「ファイルが大きすぎて処理できません」
原因
phpMyAdminやレンタルサーバーには、アップロードできるファイルサイズに制限があります。
一般的な制限:
- 共用サーバー:2〜50MB
- VPS:設定次第だが、デフォルトで2〜8MB
解決策1:ファイルを分割する
SQLファイルを複数の小さなファイルに分けます。
手作業での分割:
- テキストエディタでファイルを開く
- 適当な位置で分割(CREATE TABLE文の区切りなど)
- 複数のファイルとして保存
- 順番にインポート
注意:
SQL文の途中で切らないよう、セミコロン(;)の位置で区切りましょう。
解決策2:コマンドラインからインポート
SSHでサーバーに接続できる場合、コマンドラインならファイルサイズの制限がありません。
手順:
mysql -u ユーザー名 -p データベース名 < ファイル名.sql
パスワードを入力すれば、インポートが開始されます。
解決策3:php.iniの設定を変更
サーバーの設定を変更できる場合(VPSや専用サーバー)、制限を緩和できます。
php.iniの編集:
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 300
memory_limit = 256M
注意:
共用サーバーでは変更できないことが多いです。
よくあるエラー6:文字化けが発生する
インポート後、日本語が「???」や「æ–‡å—」のように文字化けすることがあります。
原因
エクスポート時とインポート時の文字コード設定が一致していません。
よくあるパターン:
- エクスポート:UTF-8
- インポート:Latin1(デフォルト設定)
解決策1:インポート時に文字コードを指定
phpMyAdminの場合:
- インポート画面の下部「ファイルの文字セット」を確認
- 「utf8」または「utf8mb4」を選択
- インポート実行
コマンドラインの場合:
mysql -u ユーザー名 -p --default-character-set=utf8mb4 データベース名 < ファイル名.sql
解決策2:データベースの文字コードを確認
既存のデータベースの設定が間違っている可能性があります。
確認SQL:
SHOW CREATE DATABASE xxx;
結果にCHARACTER SET
とCOLLATE
が表示されます。
もし間違っていたら、変更:
ALTER DATABASE xxx
CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
解決策3:エクスポートファイルにBOMを付けない
UTF-8のファイルには「BOM(バイトオーダーマーク)」という目印が付くことがあります。
これがあると文字化けすることがあるので、削除します。
Visual Studio Codeの場合:
- 右下の「UTF-8」をクリック
- 「エンコード付きで保存」を選択
- 「UTF-8」(BOMなし)を選択
トラブルを防ぐ:正しいエクスポート方法
そもそもエラーが出ないよう、エクスポート時に注意しましょう。
phpMyAdminでのエクスポート推奨設定
エクスポート手順:
- 対象のデータベースを選択
- 「エクスポート」タブをクリック
- 「詳細 – 可能なオプションをすべて表示」を選択
推奨設定:
- エクスポート方法: 詳細
- フォーマット: SQL
- データベース:
- 「CREATE DATABASE / USE 文を追加する」→ インポート先で新規作成するなら✓、既存DBに入れるなら外す
- テーブル:
- 「DROP TABLE / VIEW / PROCEDURE / FUNCTION / EVENT / TRIGGER 文を追加する」→ ✓(上書きする場合)
- 「IF NOT EXISTS を追加する」→ ✓
- データ:
- 「完全な INSERT 文を作成する」→ ✓
- 「列名を挿入するコマンドに含める」→ ✓
コマンドラインでのエクスポート推奨方法
mysqldump -u ユーザー名 -p --default-character-set=utf8mb4 --single-transaction --routines --triggers データベース名 > backup.sql
オプションの意味:
--default-character-set=utf8mb4
→ 文字コード指定--single-transaction
→ データの整合性を保つ--routines
→ ストアドプロシージャも含める--triggers
→ トリガーも含める
インポート前の確認チェックリスト
エラーを防ぐため、インポート前にこれをチェックしましょう。
ファイルの確認
- [ ] ファイルサイズは制限内か(50MB以下が安全)
- [ ] 文字コードはUTF-8か
- [ ] BOMは付いていないか
- [ ] SQLの構文エラーはないか
環境の確認
- [ ] MySQLのバージョンは互換性があるか
- [ ] インポート先のデータベースは空か
- [ ] ユーザーに十分な権限があるか
- [ ] 接続タイムアウトの設定は十分か
バックアップの確認
- [ ] インポート先のデータベースのバックアップは取ったか
- [ ] エクスポート元のデータは残っているか
- [ ] 失敗した時の復旧手順は確認したか
エラーが解決しない時の最終手段
どうしてもインポートできない場合の対処法です。
方法1:テーブルごとに分けてインポート
データベース全体ではなく、テーブル単位でエクスポート・インポートします。
手順:
- phpMyAdminで各テーブルを選択
- 個別にエクスポート
- 一つずつインポート
手間はかかりますが、確実です。
方法2:CSVでエクスポート・インポート
SQL形式ではなく、CSV形式を使う方法です。
メリット:
- ファイルサイズが小さい
- 文字コードの問題が少ない
- Excelでも開ける
デメリット:
- テーブル構造は別途作成が必要
- 大量のテーブルがある場合は手間
方法3:専用ツールを使う
phpMyAdminではなく、専用のツールを使うと成功率が上がります。
おすすめツール:
- MySQL Workbench → 公式の無料ツール
- HeidiSQL → Windows用の無料ツール
- Sequel Pro / TablePlus → Mac用のツール
これらは大きなファイルの処理が得意です。
まとめ:エラーに慌てず、一つずつ対処しよう
データベースのインポート・エクスポートエラーは、原因を特定すれば必ず解決できます。
この記事の重要ポイント:
- 権限エラー → CREATE DATABASE文を削除、または管理者ユーザーを使用
- 文字コードエラー → utf8をutf8mb4に変更
- データベース存在エラー → 既存DBを削除、またはCREATE文を削除
- ファイルサイズエラー → ファイル分割、またはコマンドライン使用
- 文字化け → 文字コードを統一
トラブル対処の基本手順:
- エラーメッセージを正確に読む
- 原因を特定する
- バックアップを取る
- 対処法を一つずつ試す
- それでもダメなら別の方法を試す
予防が最善:
- エクスポート時に正しい設定を使う
- 定期的にテストインポートを実行
- バックアップは複数の方法で取る
データベースの移行作業は慎重に、でも恐れずに挑戦しましょう。
この記事の方法で、ほとんどのエラーは解決できるはずです!
コメント