前回記事:MySQLをミラーリングする、レプリケーションの設定方法では、MySQLにおけるレプリケーションの設定方法ついてご紹介しました。
今回はMySQLでよく見かけるエラーとその対処法について、詳しくご紹介したいと思います。
1. MySQLのエラー確認方法
1.1 コマンドラインに表示される
コマンドライン上から操作している場合、エラーメッセージは通常コマンドライン上に表示されます。
1.2 ログファイルに出力される
コマンドライン上以外から操作している(システムから呼び出して使用しているなどの)場合は、エラーコードを引数で受け取るほか、MySQLのエラーログ(Error log)にも出力されています。
以下は、各OS版でのログファイルのデフォルトの場所です。
■UNIX/Linux版のエラーログの場所
/var/lib/mysql
■Windows版のエラーログの場所
C:\ProgramData\MySQL\MySQL Server 5.7\Data
なおこのログファイルの場所はバージョンや個人的な設定によって異なっていますので、正確な場所は設定ファイル中の「datadir」以降に設定されているパスを確認して下さい。
■UNIX/Linux版の設定ファイルの場所
/etc/my.cnf
■Windows版の設定ファイルの場所
C:\Program Files\MySQL\MySQL Server 5.7\my.ini
2. よく見かけるエラーコードとエラーメッセージ12種
2.1 エラー 1044(42000)の原因と対処法
■エラーコード:1044
■SQLSTATE:42000
■エラーメッセージ例:
Access denied for user 'ユーザ名'@'ホスト名' to database 'データベース名'
■エラーの原因:
直前に実行した命令に対する権限がない。
■エラーへの対処法:
使用するユーザに権限を設定する。
2.2 エラー 1045(28000)の原因と対処法
■エラーコード:1045
■SQLSTATE:28000
■エラーメッセージ例:
Access denied for user 'ユーザ名'@'ホスト名' (using password: [YES/NO])
■エラーの原因:
(YESの場合)権限などのユーザ設定が間違えている。
(NOの場合)ログイン時にパスワードを入力していない、または、入力したパスワードが間違えている。
■エラーへの対処法:
(YESの場合)権限の設定が問題ないか確認する。それでもできない場合は、ユーザを一度削除して再度作成してみる。
(NOの場合)ログイン時にオプション「-p」を付け、パスワードを入力する。その上でエラーになる場合、パスワードが間違えていないか確認する。
2.3 エラー 1046(3D000)の原因と対処法
■エラーコード:1046
■SQLSTATE:3D000
■エラーメッセージ例:
No database selected
■エラーの原因:
データベースのインポート時などに、対象のデータベースが選択されていない。
■エラーへの対処法:
テーブル名の指定時に「データベース名.テーブル名」とするか、先に「use [データベース名];」を実行しておく。
2.4 エラー 1054(42S22)の原因と対処法
■エラーコード:1054
■SQLSTATE:42S22
■エラーメッセージ例:
Unknown column 'カラム名' in 'field list'
■エラーの原因:
指定したカラムが見つからない。SQL文が間違えているなど。
■エラーへの対処法:
SQL文を見直す。クォーテーションのつけ方など、区切り文字に注意する。
2.5 エラー 1062(23000)の原因と対処法
■エラーコード:1062
■SQLSTATE:23000
■エラーメッセージ例:
Duplicate entry '値' for key '主キー'
■エラーの原因:
主キーが重複するデータを登録しようとしている。
■エラーへの対処法:
主キーの重複を回避する。
レプリケーション時に発生する場合は、不要なレコードをスキップするよう設定する。
2.6 エラー 1064(42000)の原因と対処法
■エラーコード:1064
■SQLSTATE:42000
■エラーメッセージ例:
You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near [入力したSQL文の一部].
■エラーの原因:
SQLの文法に誤りがある。
■エラーへの対処法:
MySQLのバージョンとマニュアルを確認し、SQL文を見直す。
こちらもクォーテーションなど区切り文字には注意が必要。
2.7 エラー 1067(―)の原因と対処法
■エラーコード:1067
■SQLSTATE:なし
■エラーメッセージ例:
Fatal error: Can't open and lock privilege tables:Table 'mysql.user' doesn't exist
■エラーの原因:
MySQL Serverをインストール後初回起動時に、設定ファイル(my.ini)を上手く読み込めないなどが原因でサービスが起動できない。
■エラーへの対処法:
このエラーはMySQL Serverをデフォルトでない場所にインストールした場合や、設定ファイルを手動で作成した場合に発生することが多い。古いMySQLの設定ファイルがアンインストール後も残っている場合があるので、あれば削除する。WINDIR環境変数を調べて、設定ファイルをWINDIR直下に置いてみる。設定ファイルを手動で作成した場合は、コマンドとバージョンが一致しているかを見直す。それらの対処法でも解決できない場合、再インストールで解決する場合がある。
2.8 エラー 1146(42S02)の原因と対処法
■エラーコード:1146
■SQLSTATE:42S02
■エラーメッセージ例:
Table 'データベース名.テーブル名' doesn't exist
■エラーの原因:
指定したテーブル名が解決できない。
■エラーへの対処法:
テーブル名や区切り文字の見直しを行う。「mysql.servers」などシステム関連のテーブルが対象となっている場合は、テーブルを作成する。インストーラを使用した場合は、再インストールを行うと解決する場合がある。
2.9 エラー 1918(―)の原因と対処法
■エラーコード:1918
■SQLSTATE:なし
■エラーメッセージ例:
Error installing ODBC driver MySQL ODBC [ODBCのバージョン] Driver, ODBC error [エラー内容]
■エラーの原因:
MySQL Connector(ODBCドライバ)のインストールに失敗している。DLLが足りないなどの原因が考えられる。
■エラーへの対処法:
該当するDLLを先にインストールする。Microsoft Visual C++ Redistributable Packageが事前にインストールされていない場合は、インストールすることで解決できる場合がある。
2.10 エラー 2002(―)の原因と対処法
■エラーコード:2002
■SQLSTATE:なし
■エラーメッセージ例:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(Linuxの場合)
■エラーの原因:
ソケットファイルがないため、ソケットエラーが発生している。
■エラーへの対処法:
MySQL Sererを再起動してもソケットファイルが(mysql.sock)が該当のパスに自動生成されず、かつどこにも存在しない場合は、手動で作成する。異なるパスに存在する場合は、次のようにソケットファイルの場所を指定するオプションを付けて起動する。
mysql --socket=指定するパス/mysql.sock -u 'ユーザ名'@'ホスト名' -p
2.11 エラー 2003(―)の原因と対処法
■エラーコード:2003
■SQLSTATE:なし
■エラーメッセージ例:
Can't connect to MySQL server on 'ホスト名'
■エラーの原因:
指定したホストに接続できない。
■エラーへの対処法:
指定したサーバがそのホストで稼働しているかを確認する。
「--skip-networking」を使用しないようにする。(このオプションを使用する場合、TCP/IPを使用して接続することができない)
2.12 エラー 2006(―)の原因と対処法
■エラーコード:2006
■SQLSTATE:なし
■エラーメッセージ例:
MySQL server has gone away
■エラーの原因:
サーバがタイムアウトして、接続がクローズしている。設定を超える大きさのクエリを実行しようとしている。など
■エラーへの対処法:
タイムアウトの場合は、タイムアウトまでの時間を変更する。(デフォルト:8時間)
設定ファイルの[mysqld]配下に次の一行を追加する。
wait_timeout = [タイムアウトまでの時間(単位:秒)]
クエリのサイズが大きすぎる場合は、最大サイズの設定を変更する。(デフォルト:1MB)
設定ファイルの[mysqld]配下に次の一行を追加する。
max_allowed_packet = [最大サイズ(入力例:8MB)] ※最大16MBまで設定可能
3.まとめ
次回はMySQL上で動作するストアドプロシージャの作成方法について、ご紹介したいと思います。
よければ合わせてご覧下さい。
当サイトプロエンジニアのコンサルタントが厳選したおすすめのフリーランス案件特集はこちら
特集ページから案件への応募も可能です!
実際にフリーランスエンジニアとして活躍されている方のインタビューはこちら