SQLを使っていると、様々なエラーに遭遇することがあります。
MySQL のエラーコード一覧について、基本情報と便利な参照方法を初心者向けにわかりやすく整理しました。
MySQLのエラーコードとは?

エラーコードの基本構造
MySQLエラーメッセージの構成
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
↓ ↓ ↓ ↓
エラー コード SQLSTATE 詳細メッセージ
各要素の説明
- エラーコード(1045):MySQLが定めた数字でのエラー識別子
- SQLSTATE(28000):SQL標準に基づく5文字のエラー状態コード
- 詳細メッセージ:エラーの具体的な内容を説明
エラーコードの分類
コード番号による分類
- 1000番台:サーバー側エラー(データベース操作、システムエラー)
- 2000番台:クライアント側エラー(接続、通信エラー)
- 3000番台以降:特定機能のエラー(レプリケーション、プラグインなど)
エラーの発生場所による分類
- サーバーエラー:MySQL サーバー内で発生
- クライアントエラー:クライアントアプリケーション側で発生
- ネットワークエラー:通信に関連するエラー
なぜエラーコードを理解する必要があるの?
学習・開発での利点
- 問題の原因を素早く特定できる
- 効率的なデバッグができる
- 適切な対処法を選択できる
- エラーログの解読が容易になる
実務での重要性
- システム障害の迅速な解決
- 運用監視での異常検知
- 自動化スクリプトでのエラーハンドリング
- ユーザーへの適切なエラー表示
よく遭遇するエラーコード一覧

認証・権限関連エラー
エラーコード 1045: Access denied
ERROR 1045 (28000): Access denied for user 'username'@'host' (using password: YES)
原因と対処法
- 原因:ユーザー名、パスワード、または接続元ホストが間違っている
- 対処法:
-- ユーザー確認
SELECT User, Host FROM mysql.user;
-- パスワードリセット
ALTER USER 'username'@'host' IDENTIFIED BY 'new_password';
-- 権限確認
SHOW GRANTS FOR 'username'@'host';
エラーコード 1044: Access denied for user to database
ERROR 1044 (42000): Access denied for user 'user'@'host' to database 'dbname'
対処法
-- データベースアクセス権限の付与
GRANT ALL PRIVILEGES ON dbname.* TO 'user'@'host';
FLUSH PRIVILEGES;
SQL構文エラー
エラーコード 1064: Syntax error
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual...
よくある原因
- 予約語の不適切な使用
- クオート(引用符)の間違い
- カンマやセミコロンの抜け
- 存在しない関数やキーワード
対処例
-- ❌ エラーになる例
SELECT order FROM orders; -- 'order'は予約語
-- ✅ 正しい例
SELECT `order` FROM orders; -- バッククォートで囲む
SELECT order_id FROM orders; -- 異なる列名を使用
接続・通信エラー
エラーコード 2002: Can’t connect to server
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'
原因と対処法
- 原因:MySQLサーバーが起動していない
- 対処法:
# サービス状態確認
sudo systemctl status mysql
# サービス起動
sudo systemctl start mysql
# ポート確認
sudo netstat -tlnp | grep 3306
エラーコード 2006: MySQL server has gone away
ERROR 2006 (HY000): MySQL server has gone away
原因と対処法
- 原因1:接続タイムアウト
- 原因2:max_allowed_packet の制限超過
- 対処法:
-- タイムアウト設定確認
SHOW VARIABLES LIKE 'wait_timeout';
-- パケットサイズ確認
SHOW VARIABLES LIKE 'max_allowed_packet';
-- 設定変更(一時的)
SET SESSION wait_timeout = 28800;
SET GLOBAL max_allowed_packet = 64*1024*1024;
データ制約エラー
エラーコード 1062: Duplicate entry
ERROR 1062 (23000): Duplicate entry 'value' for key 'PRIMARY'
対処法
-- 重複データの確認
SELECT column_name, COUNT(*)
FROM table_name
GROUP BY column_name
HAVING COUNT(*) > 1;
-- INSERT IGNORE で重複を無視
INSERT IGNORE INTO table_name VALUES (...);
-- ON DUPLICATE KEY UPDATE で更新
INSERT INTO table_name VALUES (...)
ON DUPLICATE KEY UPDATE column = VALUES(column);
エラーコード 1048: Column cannot be null
ERROR 1048 (23000): Column 'column_name' cannot be null
対処法
-- NULL 制約の確認
DESCRIBE table_name;
-- デフォルト値の設定
ALTER TABLE table_name
ALTER COLUMN column_name SET DEFAULT 'default_value';
-- NOT NULL 制約の削除(必要な場合)
ALTER TABLE table_name
MODIFY column_name VARCHAR(255) NULL;
リソース不足エラー
エラーコード 1040: Too many connections
ERROR 1040 (HY000): Too many connections
対処法
-- 現在の接続数確認
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
-- 接続数上限の変更
SET GLOBAL max_connections = 200;
-- プロセス一覧確認
SHOW PROCESSLIST;
-- 不要な接続を切断
KILL connection_id;
エラーコード 1114: Table is full
ERROR 1114 (HY000): The table 'table_name' is full
対処法
# ディスク容量確認
df -h
# テーブルサイズ確認
SELECT
table_name,
ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size in MB'
FROM information_schema.tables
WHERE table_schema = 'database_name';
# 不要データの削除
DELETE FROM table_name WHERE condition;
# テーブル最適化
OPTIMIZE TABLE table_name;
高度なエラーコード

トランザクション関連
エラーコード 1213: Deadlock found
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
デッドロック対策
-- デッドロック情報の確認
SHOW ENGINE INNODB STATUS;
-- トランザクション分離レベルの確認
SELECT @@tx_isolation;
-- 適切なトランザクション設計
START TRANSACTION;
SELECT ... FOR UPDATE; -- 明示的なロック
-- 処理
COMMIT;
エラーコード 1205: Lock wait timeout
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
対処法
-- ロック待機時間の確認
SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';
-- 実行中のトランザクション確認
SELECT * FROM information_schema.innodb_trx;
-- ブロッキングクエリの確認
SELECT
r.trx_id AS blocking_trx_id,
r.trx_mysql_thread_id AS blocking_thread,
b.trx_id AS blocked_trx_id,
b.trx_mysql_thread_id AS blocked_thread
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.requesting_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.blocking_trx_id;
ストレージエンジン関連
エラーコード 1030: Got error from storage engine
ERROR 1030 (HY000): Got error 28 from storage engine
対処法
# ディスクフル(Error 28)の確認
df -h
# InnoDBステータス確認
mysql -e "SHOW ENGINE INNODB STATUS\G"
# テーブル修復
mysql -e "REPAIR TABLE table_name;"
# テーブルチェック
mysql -e "CHECK TABLE table_name;"
エラーコードの調べ方

公式ドキュメントの活用
MySQL公式リファレンス
- MySQL 8.0 Server Error Message Reference
- MySQL 8.0 Client Error Message Reference
- オンラインで最新情報を確認可能
検索方法
- エラーコード番号で検索
- エラーメッセージの一部で検索
- SQLSTATEコードで検索
コマンドラインでの確認
perrorコマンドの使用
# エラーコードの意味を確認
perror 1045
perror 2006
# 複数のエラーコードを一度に確認
perror 1045 2006 1064
MySQLクライアントでの確認
-- 最後のエラー情報を表示
SHOW ERRORS;
-- 警告情報も含めて表示
SHOW WARNINGS;
-- エラーの詳細情報
SELECT @@error_count, @@warning_count;
プログラムでのエラーハンドリング
PHPでの例
<?php
try {
$pdo = new PDO($dsn, $username, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// SQL実行
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");
$stmt->execute([$user_id]);
} catch (PDOException $e) {
// エラーコードとメッセージを取得
$error_code = $e->getCode();
$error_message = $e->getMessage();
switch ($error_code) {
case 1045:
error_log("認証エラー: " . $error_message);
break;
case 2002:
error_log("接続エラー: " . $error_message);
break;
default:
error_log("未知のエラー ($error_code): " . $error_message);
}
}
?>
Pythonでの例
import mysql.connector
from mysql.connector import Error
try:
connection = mysql.connector.connect(
host='localhost',
database='test_db',
user='username',
password='password'
)
cursor = connection.cursor()
cursor.execute("SELECT * FROM users")
except Error as e:
error_code = e.errno
error_message = str(e)
if error_code == 1045:
print("認証エラー:", error_message)
elif error_code == 2003:
print("接続エラー:", error_message)
else:
print(f"エラー {error_code}: {error_message}")
finally:
if connection.is_connected():
cursor.close()
connection.close()
エラー対応のベストプラクティス

予防策
事前チェック項目
-- 接続前の確認
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
-- リソース確認
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW STATUS LIKE 'Innodb_buffer_pool_%';
-- 権限確認
SHOW GRANTS;
SELECT USER(), CURRENT_USER();
設定の最適化
# my.cnf での予防設定
[mysqld]
max_connections = 200
wait_timeout = 28800
interactive_timeout = 28800
max_allowed_packet = 64M
innodb_lock_wait_timeout = 120
トラブルシューティングの手順
段階的な問題解決
- エラーコードとメッセージの確認
- 正確なエラーコード番号を記録
- SQLSTATE も併せて確認
- 基本情報の収集
-- システム状態の確認
SHOW STATUS;
SHOW VARIABLES;
SHOW PROCESSLIST;
- ログの確認
# エラーログの確認
sudo tail -f /var/log/mysql/error.log
# スロークエリログの確認
sudo tail -f /var/log/mysql/slow.log
- 具体的な対処法の実行
- エラーコード別の対処法を実行
- 設定変更後はサービス再起動
- 再発防止策の実装
- 根本原因の解決
- 監視設定の追加
監視とアラート設定
重要なエラーの監視
監視すべきエラーコード
- 1040(接続数上限)
- 1114(テーブルフル)
- 1213(デッドロック)
- 2006(サーバー切断)
監視スクリプトの例
#!/bin/bash
# MySQL エラー監視スクリプト
ERROR_LOG="/var/log/mysql/error.log"
ALERT_EMAIL="admin@example.com"
# 最近のエラーをチェック
recent_errors=$(tail -n 100 $ERROR_LOG | grep -E "ERROR|FATAL" | wc -l)
if [ $recent_errors -gt 10 ]; then
echo "MySQL エラーが多発しています: $recent_errors 件" | mail -s "MySQL Alert" $ALERT_EMAIL
fi
# 特定エラーの監視
if tail -n 100 $ERROR_LOG | grep -q "Too many connections"; then
echo "MySQL接続数上限エラーが発生しました" | mail -s "MySQL Connection Alert" $ALERT_EMAIL
fi
まとめ
MySQLのエラーコードを理解することで、効率的なトラブルシューティングと安定したシステム運用が可能になります。
エラー分類 | 代表的なコード | 対処の重要度 | 主な対策 |
---|---|---|---|
認証・権限 | 1045, 1044 | ★★★ | ユーザー権限の見直し |
SQL構文 | 1064 | ★★☆ | SQL文の構文チェック |
接続・通信 | 2002, 2006 | ★★★ | サーバー状態・設定確認 |
データ制約 | 1062, 1048 | ★★☆ | データ設計の見直し |
リソース不足 | 1040, 1114 | ★★★ | システムリソースの拡張 |
トランザクション | 1213, 1205 | ★★☆ | アプリケーション設計改善 |
コメント