この記事では、RHEL 9系/Ubuntu 24.04 LTSを想定環境として、mysqldumpで取得したdumpファイルをmysqlコマンドでインポートする手順をステップごとに解説します。文字コードの落とし穴や「ERROR 1049」「外部キー制約エラー」など実務でよく遭遇するエラーの対処法まで、まとめて説明します。
この記事のポイント
・mysql DB名 < backup.sql がインポートの基本コマンド形式
・--default-character-set=utf8mb4 の指定で文字化けを防ぐ
・「ERROR 1049」はDB未作成が原因、先にCREATE DATABASEを実行
・外部キーエラーは foreign_key_checks=0 の設定で回避できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
dumpファイルをインポートする前に確認すること
mysqldumpコマンドが生成するdumpファイルは、CREATE TABLE文とINSERT文が並んだSQLのテキストファイルです。インポートとは、そのSQL文をMySQLサーバーに流し込んで実行することを指します。作業を始める前に以下の2点を確認しておくと、後のトラブルを減らせます。1. dumpファイルの先頭を確認する
dumpファイルの先頭数行を見ると、取得時の文字コードやMySQLバージョン情報が記録されています。# dumpファイルの先頭10行を確認する head -10 /tmp/backup.sql
-- MySQL dump 10.13 Distrib 8.0.36, for Linux (x86_64) -- -- Host: localhost Database: myapp_db -- ------------------------------------------------------ -- Server version 8.0.36 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET NAMES utf8mb4 */; /*!50503 SET NAMES utf8mb4 */; /*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
SET NAMES utf8mb4 の記述があれば、このdumpファイルはutf8mb4で取得されています。後の文字コード指定時の参考にしてください。2. インポート先のMySQLバージョンを確認する
取得元と受け入れ先のメジャーバージョンが大きく離れている場合(例: MySQL 5.7から8.0へ)、構文の非互換が出ることがあります。# インポート先サーバーのMySQLバージョンを確認する mysql --version
mysql Ver 8.0.36 Distrib 8.0.36, for Linux (x86_64) using EditLine wrapper
mysqlコマンドでdumpファイルをインポートする基本手順
1. インポート先データベースを作成する
dumpファイルにCREATE DATABASE文が含まれている場合は省略できますが、多くの場合は含まれていないため、事前にデータベースを作成しておきます。# MySQLに接続してデータベースを作成する mysql -u root -p # MySQLプロンプト内で実行する CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; SHOW DATABASES; EXIT;
2. mysqlコマンドでインポートを実行する
dumpファイルのインポートは、mysqlコマンドにリダイレクト(<)でdumpファイルを渡すだけです。# 基本のインポートコマンド mysql -u root -p myapp_db < /tmp/backup.sql # 文字コードを明示してインポートする(推奨) mysql -u root -p --default-character-set=utf8mb4 myapp_db < /tmp/backup.sql
・-p:パスワード入力を求めるプロンプトを表示
・--default-character-set:クライアント側の文字コードを指定
・myapp_db:インポート先のデータベース名
・< /tmp/backup.sql:読み込むdumpファイルのパス
コマンドを実行するとパスワード入力を求めるプロンプトが出ます。成功時は特にメッセージは表示されず、プロンプトに戻ります。
3. インポート完了を確認する
インポート後、データベースとテーブルが正しく作成されているか確認します。# MySQLに接続して確認する mysql -u root -p # データベースを選択してテーブル一覧を確認する USE myapp_db; SHOW TABLES; # テーブルの行数を確認する(例: usersテーブル) SELECT COUNT(*) FROM users; EXIT;
+--------------------+ | Tables_in_myapp_db | +--------------------+ | orders | | products | | users | +--------------------+ 3 rows in set (0.00 sec)
文字化けを防ぐ文字コード指定の方法
インポート後に日本語が「?????」や「縺ゅ≧縺・」のように化けてしまうケースは非常に多く、ほぼすべての原因は文字コードの不一致です。1. dumpファイルの文字コードを調べる
# dumpファイル内のSET NAMESを確認する grep 'SET NAMES' /tmp/backup.sql
/*!40101 SET NAMES utf8mb4 */;
2. --default-character-set オプションを指定する
dumpファイルの文字コードに合わせて--default-character-set を指定するのが基本です。# utf8mb4のdumpをインポートする場合 mysql -u root -p --default-character-set=utf8mb4 myapp_db < /tmp/backup.sql # 古いシステムからのdumpでutf8の場合 mysql -u root -p --default-character-set=utf8 myapp_db < /tmp/backup.sql
utf8 は実際にはutf8mb3(3バイト制限)として扱われます。絵文字を含むデータがある場合は utf8mb4 を指定してください。3. MySQLサーバー側の文字コード設定を確認する
インポート先サーバーの文字コード設定がdumpと合っていないと、オプションを正しく指定しても化けることがあります。# MySQLサーバーの文字コード設定を確認する mysql -u root -p -e "SHOW VARIABLES LIKE 'character%';"
+--------------------------+---------+ | Variable_name | Value | +--------------------------+---------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | utf8mb4 | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | +--------------------------+---------+
character_set_server が latin1 になっている場合は、/etc/my.cnf(RHEL系)または /etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu系)の [mysqld] セクションに以下を追加してMySQLを再起動してください。[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci
よくあるエラーと対処法
「ERROR 1049 (42000): Unknown database」が出た時
インポート先のデータベースが存在しない場合に発生します。ERROR 1049 (42000): Unknown database 'myapp_db'
# データベースを作成してからインポートする mysql -u root -p -e "CREATE DATABASE myapp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;" mysql -u root -p --default-character-set=utf8mb4 myapp_db < /tmp/backup.sql
「ERROR 1366 (HY000): Incorrect string value」が出た時
テーブルに定義されている文字コードに収まらない文字(絵文字など4バイトのUnicode文字)を挿入しようとすると発生します。ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x8A...' for column 'comment' at row 1
# テーブルの文字コードをutf8mb4に変換する mysql -u root -p myapp_db -e "ALTER TABLE テーブル名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
--default-character-set=utf8mb4 を付けて取り直すのが根本解決です。「ERROR 1215 (HY000): Cannot add foreign key constraint」が出た時
外部キー制約を持つテーブルを含むdumpでは、テーブルの作成・データ投入の順序によってこのエラーが発生することがあります。ERROR 1215 (HY000): Cannot add foreign key constraint
SET foreign_key_checks=0 が既に含まれていますが、含まれていない場合は以下の方法でセッション単位で無効にしてインポートします。# foreign_key_checksを一時無効にしてインポートする mysql -u root -p myapp_db << 'SQL' SET foreign_key_checks=0; SOURCE /tmp/backup.sql; SET foreign_key_checks=1; SQL
大容量dumpファイルで途中停止する場合
数GBに及ぶdumpファイルをインポートすると、MySQLのパケットサイズ制限やタイムアウトで途中停止することがあります。# max_allowed_packetを拡張してインポートする mysql -u root -p --max_allowed_packet=1G --default-character-set=utf8mb4 myapp_db < /tmp/backup_large.sql
/etc/my.cnf の [mysqld] セクションに以下を追加してMySQLを再起動してください。[mysqld] max_allowed_packet=1G net_read_timeout=600 net_write_timeout=600
本記事のまとめ
mysqldumpで取得したdumpファイルをインポートするための主要なコマンドと対処法をまとめます。| やりたいこと | コマンド |
|---|---|
| 基本のインポート | mysql -u root -p DB名 < backup.sql |
| 文字コードを指定してインポート | mysql -u root -p --default-character-set=utf8mb4 DB名 < backup.sql |
| インポート先DBを作成する | mysql -u root -p -e "CREATE DATABASE DB名 CHARACTER SET utf8mb4;" |
| サーバーの文字コード確認 | mysql -u root -p -e "SHOW VARIABLES LIKE 'character%';" |
| dumpの文字コード確認 | grep 'SET NAMES' backup.sql |
| 大容量ファイルのインポート | mysql -u root -p --max_allowed_packet=1G DB名 < backup.sql |
--default-character-set でdumpと文字コードを合わせること、外部キーエラーは foreign_key_checks の設定で回避できることを知っておけば、ほとんどのケースに対応できます。
>> Linux Master Pro Seminar の詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MariaDB upgradeで既存データを守る移行設計|binlogとGTIDの引き継ぎ手順
- この記事の属するカテゴリ:データーベース管理へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます