MySQL エラーコード一覧と対処法|初心者向け完全ガイド

データベース・SQL

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
  • オンラインで最新情報を確認可能

検索方法

  1. エラーコード番号で検索
  2. エラーメッセージの一部で検索
  3. 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

トラブルシューティングの手順

段階的な問題解決

  1. エラーコードとメッセージの確認
    • 正確なエラーコード番号を記録
    • SQLSTATE も併せて確認
  2. 基本情報の収集
-- システム状態の確認
SHOW STATUS;
SHOW VARIABLES;
SHOW PROCESSLIST;
  1. ログの確認
# エラーログの確認
sudo tail -f /var/log/mysql/error.log

# スロークエリログの確認
sudo tail -f /var/log/mysql/slow.log
  1. 具体的な対処法の実行
    • エラーコード別の対処法を実行
    • 設定変更後はサービス再起動
  2. 再発防止策の実装
    • 根本原因の解決
    • 監視設定の追加

監視とアラート設定

重要なエラーの監視

監視すべきエラーコード

  • 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★★☆アプリケーション設計改善

コメント

タイトルとURLをコピーしました