11.

MySQL でよくあるエラーとトラブル対処完全ガイド

編集
この記事の要点
  • MySQL の代表的なエラー番号と対処を一覧化(1045 / 1062 / 1064 / 1146 / 1452 / 2002 / 1366 / 1093 / 1170 / 1318 ほか)
  • ERROR 1045 (28000) Access denied はユーザー/ホスト/パスワード不一致 → SELECT user, host FROM mysql.user
  • ERROR 1062 Duplicate entry はユニーク制約違反 → INSERT ... ON DUPLICATE KEY UPDATE
  • ERROR 2002 Can't connect to local MySQL server はソケット or サービス停止 → systemctl status mysqld
  • ERROR 1452 Cannot add or update a child row は外部キー違反 → 親テーブル先行投入 or FK 一時無効化

MySQL エラー番号一覧(よく出会うもの)

エラー番号SQLSTATE意味主な原因
104528000Access denied for userパスワード / ホスト / ユーザー不一致
104942000Unknown databaseDB 未作成 / typo
106223000Duplicate entryPRIMARY / UNIQUE 重複
106442000SQL syntax error構文エラー / 予約語
1093HY000You can't specify target table for update in FROM clauseUPDATE 対象を直接サブクエリで参照
114642S02Table doesn't existテーブル未作成 / DB 違い / 大小文字
117042000BLOB/TEXT used in key without prefix lengthTEXT 列を INDEX 指定(prefix 必須)
131842000Incorrect number of arguments for PROCEDURE引数の数違い
1366HY000Incorrect integer valuestrict mode で空文字を int 列に投入
145123000Cannot delete or update a parent row子レコードが残っていて FK 違反
145223000Cannot add or update a child rowFK 先の親が存在しない
2002HY000Can't connect to local MySQL serverサービス停止 / ソケットパス違い
2003HY000Can't connect to MySQL server on hostFW / port / bind-address
2006HY000MySQL server has gone awaywait_timeout / max_allowed_packet 超過
2013HY000Lost connection during query長時間クエリ / ネットワーク切断

ERROR 1045: Access denied for user

ERROR 1045 (28000): Access denied for user 'app'@'192.168.1.5' (using password: YES)

典型的なチェック:

-- ユーザー / ホスト一覧
SELECT user, host FROM mysql.user;

-- 'app'@'%' があり 'app'@'192.168.1.5' が無い場合は % が優先されないことに注意
-- パスワード再設定
ALTER USER 'app'@'%' IDENTIFIED BY 'NewPass!';
FLUSH PRIVILEGES;

-- 権限確認
SHOW GRANTS FOR 'app'@'%';

ERROR 1062: Duplicate entry

ERROR 1062 (23000): Duplicate entry 'taro@example.com' for key 'users.users_email_unique'
-- どのインデックスで衝突したか確認
SHOW INDEX FROM users WHERE Key_name = 'users_email_unique';

-- UPSERT で回避
INSERT INTO users (email, name) VALUES ('taro@example.com', 'Taro')
ON DUPLICATE KEY UPDATE name = VALUES(name), updated_at = NOW();

-- 既存重複データを集計
SELECT email, COUNT(*) FROM users GROUP BY email HAVING COUNT(*) > 1;

ERROR 1064: SQL syntax

大半は予約語の未エスケープ・カンマ忘れ・クォート不一致です:

-- ❌ order は予約語
CREATE TABLE order (id INT);

-- ✅ バッククォートで囲む
CREATE TABLE `order` (id INT);

-- ❌ クォートが閉じていない
SELECT * FROM users WHERE name = 'taro;

-- ✅
SELECT * FROM users WHERE name = 'taro';

ERROR 2002: Can't connect to local MySQL server

# サービス確認
systemctl status mysqld          # rpm 系
systemctl status mysql           # deb 系
systemctl status mariadb         # MariaDB

# ソケットパス確認
mysql_config --socket
# /var/lib/mysql/mysql.sock

# 起動
sudo systemctl start mysqld

# tcp 経由に切替(ローカルソケットが見つからない場合)
mysql -h 127.0.0.1 -P 3306 -u root -p

ERROR 1452 / 1451: 外部キー違反

-- 1452: 子に親未存在
-- 1451: 親に紐づく子が残っている

-- 一時的に FK チェックを無効化(一括 import 等)
SET FOREIGN_KEY_CHECKS = 0;
-- ... 大量 INSERT ...
SET FOREIGN_KEY_CHECKS = 1;

-- 親レコードを先に投入
INSERT INTO categories (id, name) VALUES (1, 'IT');
INSERT INTO articles (id, category_id, title) VALUES (1, 1, 'MySQL Guide');

-- 削除時は ON DELETE CASCADE / SET NULL を検討
ALTER TABLE articles
ADD CONSTRAINT fk_cat FOREIGN KEY (category_id) REFERENCES categories(id)
ON DELETE CASCADE;

ERROR 1366: Incorrect integer value

strict mode で空文字や文字列を INT 列に入れようとすると出ます。

-- strict mode 確認
SHOW VARIABLES LIKE 'sql_mode';

-- 一時的に外す(推奨しない)
SET SESSION sql_mode = REPLACE(@@sql_mode, 'STRICT_TRANS_TABLES', '');

-- 正しい修正: アプリ側で空→NULL 変換
INSERT INTO users (age) VALUES (NULL);  -- ✅
INSERT INTO users (age) VALUES ('');     -- ❌ 1366

ERROR 1093: target table for update in FROM clause

-- ❌
DELETE FROM users WHERE id IN (SELECT MIN(id) FROM users GROUP BY email);

-- ✅ サブクエリを別名でラップ
DELETE FROM users WHERE id IN (
    SELECT id FROM (
        SELECT MIN(id) AS id FROM users GROUP BY email
    ) AS t
);

ERROR 1170: BLOB/TEXT used in key without prefix length

-- ❌ TEXT 列をそのまま INDEX
CREATE TABLE posts (body TEXT, INDEX (body));

-- ✅ prefix length 指定
CREATE TABLE posts (body TEXT, INDEX (body(255)));

-- 全文検索したいなら FULLTEXT
CREATE TABLE posts (body TEXT, FULLTEXT (body));

ERROR 2006 / 2013: gone away / Lost connection

原因確認 / 対処
wait_timeout 経過で切断SHOW VARIABLES LIKE 'wait_timeout'; / アプリで再接続
max_allowed_packet 超過SET GLOBAL max_allowed_packet = 64*1024*1024;
OOM Killer に殺されたdmesg | grep -i mysql / メモリ増設・innodb_buffer_pool 調整
ロードバランサのアイドルタイムアウトTCP keepalive / コネクションプール調整

調査用スニペット

-- 直近のエラー / 警告
SHOW WARNINGS;
SHOW ERRORS;

-- ステータス
SHOW GLOBAL STATUS LIKE 'Aborted%';
SHOW GLOBAL STATUS LIKE 'Connections';

-- 実行中スレッド
SHOW FULL PROCESSLIST;

-- ロック状況
SELECT * FROM performance_schema.data_locks\G
SHOW ENGINE INNODB STATUS\G

-- スロークエリ ON
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

FAQ

Q: アプリのエラーログにはエラー番号が無い
A: ドライバ層で握りつぶされていることが多い。PDOException::getCode() / mysqli_errno() で取得を。Laravel なら QueryException::errorInfo

Q: ステージングでは出ないのに本番でだけ 1366 が出る
A: sql_mode がサーバごとに違う。my.cnfsql_mode を揃え、strict 前提で開発を。

編集
Post Share
子ページ
  1. 1071 Specified key was too long; max key length is 767 bytes
  2. ERROR 1063 (42000): Incorrect column specifier for column '~'
  3. mysqld: Can't change dir to '...\MySQL\MySQL Server X.X\data\' (OS errno 2 - No such file or directory)
  4. Install/Remove of the Service Denied!
  5. Datetime 型が NULL に見える
  6. Warning: World-writable config file '/etc/mysql/my.cnf' is ignored
  7. ERROR 1698 (28000): Access denied for user 'root'@'localhost'
  8. Exception: Wrong MySQL configuration
  9. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
  10. ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
  11. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  12. Incorrect column specifier for column 'カラム名'
  13. BLOB/TEXT column 'description' used in key specification without a key length
  14. ERROR: /bin/sh: mysql_config: コマンドが見つかりません
  15. Host '...' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
  16. CSVエクスポート時に「ERROR 1045 (28000): Access denied for user 'username'@'localhost'」エラーが表示される
  17. Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT
  18. 1
  19. 1
  20. 1)
  21. 1
  22. 1
  23. 1
  24. 1
  25. 1
  26. 1
  27. 1
  28. 1
  29. 1
  30. 1
  31. 1
  32. 1
  33. 1"'`--
  34. 1
  35. 1
  36. 1
  37. 1
  38. 1
  39. 1
  40. 1
  41. 1
  42. 1
  43. 1)
  44. 1
  45. 1
  46. 1
  47. 1
  48. 1
  49. 1
  50. 1
  51. 1
  52. 1
  53. 1"'`--
  54. 1
  55. 1
  56. SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: ~
同階層のページ
  1. ダウンロード&インストール方法(Windows)
  2. インストール方法(Linux)
  3. コマンド一覧
  4. SQL
  5. データ型
  6. 関数
  7. 管理ツール
  8. 設定
  9. パフォーマンスチューニング関連
  10. エクスポートおよびインポート
  11. エラー&トラブル
  12. 文字コードの確認
  13. 実行中の SQL の状態確認およびプロセスキルの方法
  14. パスワードの無効化設定
  15. root ユーザーの初期パスワード確認方法
  16. rootユーザーのパスワード変更方法
  17. LIMIT, OFFSET の始まりと挙動
  18. mysqlのバージョン確認方法
  19. 実行計画の表示方法
  20. レプリケーションのステータス確認方法
  21. 中央値の導き方(バージョン8未満)
  22. 階層SQL(バージョン8未満)
  23. パーセンタイルの導き方
  24. 特定スキーマの全テーブルの全カラム情報を取得する方法
  25. MySQLで文字列の置換をする方法