ホームページ > php教程 > php手册 > MySQL を使用するときによくある間違い

MySQL を使用するときによくある間違い

WBOY
リリース: 2016-06-21 09:09:18
オリジナル
871 人が閲覧しました

mysql|エラー

MySQL サーバーが消えたというエラー
このセクションでは、クエリ中にサーバーへの接続が失われたことに関連するエラーについても説明します。

「MySQL サーバーが消えました」エラーの最も一般的な理由は、サーバーがタイムアウトして接続が閉じられたことです。デフォルトでは、何も起こらなければ 8 時間後にサーバーは接続を閉じます。 mysqld の起動時に wait_timeout 変数を設定することで、時間制限を変更できます。

mysqladmin version を実行して稼働時間を確認することで、MySQL が停止していないことを確認できます。

スクリプトをお持ちの場合は、別のクエリを発行してカスタマー サービスに自動再接続を実行させるだけです。

この場合、通常は次のエラー コードが表示されます (表示される内容は OS 関連です):

CR_SERVER_GONE_ERROR クライアントはサーバーに質問を送信できません。
CR_SERVER_LOST サーバーへの書き込み時に、クライアントはエラーを起こしませんでしたが、質問に対する完全な回答 (またはまったく回答) を取得できませんでした。

間違ったクエリまたは大きすぎるクエリをサーバーに送信した場合にも、これらのエラーが発生する可能性があります。 mysqld が大きすぎるパケットまたは異常なパケットを受信すると、クライアントがエラーを起こしたと判断し、接続を閉じます。より大きなクエリが必要な場合 (たとえば、より大きな BLOB カラムを処理している場合)、 -O max_allowed_pa​​cket=# オプション (デフォルトは 1M) を使用して mysqld を起動し、クエリ制限を増やすことができます。過剰なメモリはオンデマンドで割り当てられるため、mysqld は、より大きなクエリを発行する場合、または mysqld がより大きな結果行を返さなければならない場合にのみ、より多くのメモリを使用します。

[ローカル] MySQL サーバーに接続できませんエラー
MySQL クライアントは 2 つの異なる方法で mysqld サーバーに接続できます: Unix ソケット、ファイル システム内のファイル (デフォルトは「/tmp/mysqld.sock」) を使用します。 ); または TCP/IP、ポート番号を介して接続します。 Unix ソケットは TCP/IP より高速ですが、同じコンピュータ上のサーバーに接続する場合にのみ使用できます。ホスト名を指定しない場合、または特別なホスト名 localhost を指定した場合は、Unix ソケットが使用されます。

エラー (2002) に接続できません... は通常、システム上で MySQL サーバーが実行されていないこと、または mysqld サーバーに接続しようとしているときに間違ったソケット ファイルまたは TCP/IP ポートを使用していることを意味します。

まず、サーバー上に mysqld という名前のプロセスがあることを (ps を使用して) 確認します。 mysqld プロセスがない場合は、プロセスを開始する必要があります。 「4.15.2 MySQL サーバーの起動時の問題」を参照してください。

mysqld プロセスが実行されている場合は、次のさまざまな接続を試してサーバーを確認できます (もちろん、ポート番号とソケットのパス名はインストール環境で異なる場合があります):

shell> mysqladmin version
shell> mysqladmin variables
shell> ; mysqladmin -h `hostname` バージョン変数
shell> mysqladmin -h `hostname` --port=3306 version
shell> mysqladmin -h 'hostname' version
shell> sock バージョン

hostname コマンドでは、前方引用符「'」の代わりにバックティック「`」が使用されていることに注意してください。これにより、ホスト名の出力 (つまり、現在のホスト名) が mysqladmin コマンドに置き換えられます。

「ローカル MySQL サーバーに接続できません」エラーの考えられる理由は次のとおりです:

mysqld が実行されていません。
MIT-pthread を使用するシステム上で実行されています。ネイティブ スレッドのないシステムで実行されている場合、mysqld は MIT-pthreads パッケージを使用します。 「4.2 MySQL でサポートされるオペレーティング システム」を参照してください。ただし、MIT-pthreads は Unix ソケットをサポートしていないため、このようなシステムでは、サーバーに接続するときに常にホスト名を明示的に指定する必要があります。次のコマンドを使用してサーバーへの接続を確認してみてください:
shell> mysqladmin -h `hostname` version

mysqld で使用される Unix ソケット (デフォルトは「/tmp/mysqld.sock」) が削除されました。 MySQL ソケットを削除する cron タスク (たとえば、「/tmp」ディレクトリから古いファイルを削除するタスク) がある場合があります。 mysqladmin バージョンをいつでも実行して、mysqladmin が使用しようとしているソケットが実際に存在することを確認できます。この場合、解決策は、「mysqld.sock」を削除せずに cron ジョブを削除するか、次のコマンドを使用して MySQL の構成中に別のソケットの場所を指定することです。 with-unix-socket-path=/path/to/socket

--socket=/path/to/socket オプションを使用して、safe_mysqld を起動し、MySQL クライアントを起動する前に環境変数 MYSQL_UNIX_PORT を設定することもできます。これがソケット パスです。 --socket=/path/to/socket オプションを使用して mysqld サーバーを起動できます。サーバーのソケット パス名を変更する場合は、新しいパスについても MySQL クライアントに通知する必要があります。これは、環境を設定することによって行われます。変数 MYSQL_UNIX_PORT をソケットのパス名に指定するか、次のコマンドでソケットのパス名を指定することができます:

shell> --socket=/path/to/version

Linux を使用していますが、スレッドが停止しています (コア ダンプされています)。この場合、他の mysqld スレッドを強制終了する必要があります (たとえば、新しい MySQL サーバーを起動する前に、mysql_zap スクリプトを使用できます)。 「18.1 MySQL がクラッシュし続ける場合の対処方法」を参照してください。
「some_hostname で MySQL サーバーに接続できません」というエラーが表示された場合は、次の手順を試して問題の内容を確認できます:

telnet your-host-name tcp-ip-port-number を実行して Enter キーを押します。サーバーが正常に動作しているかどうかを数回確認してください。このポートで MySQL サーバーが実行されている場合は、実行中の MySQL サーバーのバージョン番号を含む応答を取得する必要があります。 「telnet: リモート ホストに接続できません: 接続が拒否されました」のようなエラーが表示された場合は、使用中のポートで実行されているサーバーがありません。
ローカルマシン上の mysqld デーモンに接続し、mysqladmin 変数を使用して、mysqld が使用するように構成されている TCP/IP ポート (変数ポート) を確認してみます。
mysqld サーバーが --skip-networking オプションを使用して起動されていないことを確認してください。
ホスト '...' はブロックされていますエラー
次のようなエラーが発生した場合:

多くの接続エラーのため、ホスト 'hostname' がブロックされています。
'mysqladmin flash-hosts' でブロックを解除します

これは、mysqld がホスト「hostname」に対する多数 (max_connect_errors) の接続要求が中断されました。 max_connect_errors 回のリクエストが失敗した後、mysqld は何か問題 (ハッカー攻撃など) が発生したと判断し、誰かが mysqladmin flash-hosts コマンドを実行するまでサイトへのそれ以上の接続をブロックします。

デフォルトでは、mysqld は 10 回の接続エラーが発生するとホストをブロックします。次のようにサーバーを起動することで簡単に調整できます:

shell>safe_mysqld -O max_connect_errors=10000 &

特定のホストでこのエラー メッセージが表示された場合は、まず TCP を確認する必要があることに注意してください。 IP接続で? TCP/IP 接続が機能していない場合、max_connect_errors 変数の値を増やしても問題は解決しません。

接続数が多すぎるエラー
MySQL に接続しようとしたときに「接続数が多すぎます」というエラーが表示された場合は、max_connections 件の顧客が mysqld サーバーに接続したことを意味します。

デフォルト (100) よりも多くの接続が必要な場合は、より大きな max_connections 変数値を使用して mysqld を再起動する必要があります。

mysqld は実際には (max_connections+1) 個のクライアント接続を許可していることに注意してください。最後の接続は、プロセス権限を持つユーザーのために予約されています。この権限を通常のユーザー (必要のないユーザー) に与えないことで、この権限を持つ管理者はログインして SHOW PROCESSLIST を使用して、何が問題になったのかを調べることができます。 「7.21 SHOW 構文(テーブルおよびカラム情報の取得)」を参照してください。

メモリ不足エラー
クエリを発行し、次のようなエラーが発生した場合:

mysql: 行 42、'malloc.c' でメモリ不足です
mysql: 8136 バイト (8k) が必要で、メモリが使用中です: 12481367 バイト (12189k)
エラー 2008: MySQL クライアントがメモリ不足になりました

このエラーは MySQL クライアント mysql を指していることに注意してください。このエラーの理由は単純に、クライアントにすべての結果を保存するのに十分なメモリがないことです。

この問題を解決するには、まずクエリが正しいかどうかを確認してください。これほど多くの行を返すのは合理的でしょうか?その場合は、mysql --quick を使用できます。これは、mysql_use_result() を使用して結果セットを取得します。これにより、クライアントの負担が減ります (サーバーの負担が増えるだけです)。

パケットが大きすぎるエラー
MySQL クライアントまたは mysqld サーバーが max_allowed_pa​​cket バイトより長いパケットを取得すると、パケットが大きすぎるエラーを発行して接続を終了します。

mysql クライアントを使用している場合は、mysql --set-variable=max_allowed_pa​​cket=8M でより大きなバッファを指定することでクライアントを起動できます。

最大パッケージ サイズを指定できない別のクライアント (DBI など) を使用している場合は、サーバーの起動時にパッケージ サイズを設定する必要があります。 mysqld コマンド ライン オプションを使用して、max_allowed_pa​​cket をより大きなサイズに設定できます。たとえば、完全長の BLOB をテーブルに保存する場合は、--set-variable=max_allowed_pa​​cket=24M オプションを使用してサーバーを起動する必要があります。



テーブルがいっぱいですエラー
このエラーは、メモリ内の一時テーブルが tmp_table_size バイトよりも大きくなった場合に発生します。この問題を回避するには、mysqld の -O tmp_table_size=# オプションを使用して一時テーブルのサイズを増やすか、問題のクエリを発行する前に SQL オプション SQL_BIG_TABLES を使用します。 「7.25 SET OPTION 構文」を参照してください。

--big-tables オプションを使用して mysqld を起動することもできます。これは、すべてのクエリに SQL_BIG_TABLES を使用するのとまったく同じです。


クライアントエラーでコマンドが同期していません
コマンドが同期していない場合は、クライアントコードでこのコマンドを実行できません。クライアント関数を間違った順序で呼び出しています。

これは、たとえば、mysql_use_result() を使用していて、mysql_free_result() を呼び出す前に新しいクエリを実行しようとした場合に発生する可能性があります。また、mysql_use_result() または mysql_store_result() の間でデータを返す 2 つのクエリを実行しようとした場合にも発生する可能性があります。

ユーザーエラーを無視します
次のエラーが発生した場合:

ユーザーのパスワードが間違っています: 'some_user@some_host'; ユーザーを無視しています

これは、mysqld が起動したとき、または権限テーブルを再度ロードしたときに、ユーザー テーブルに 1 つのパスワードが見つかったことを意味します。無効なパスワード。その結果、エントリは権限システムによって単純に無視されます。

この問題の考えられる原因と修正:

古いユーザー テーブルを持つ新しいバージョンの mysqld を実行している可能性があります。これを確認するには、mysqlshow mysql user を実行して、パスワード フィールドが 16 文字未満かどうかを確認します。その場合は、scripts/add_long_password スクリプトを実行して状況を修正できます。
ユーザーのパスワードは古い (8 文字長) ですが、--old-protocol オプションを使用して mysqld を起動しませんでした。ユーザー テーブル内のユーザーを新しいパスワードで更新するか、--old-protocol を使用して mysqld を再起動します。
PASSWORD() 関数を使用してユーザーテーブルにパスワードを指定しませんでした。 mysql を使用して、ユーザー テーブル内のユーザーを新しいパスワードで更新します。必ず PASSWORD() 関数を使用してください:
mysql> update user set password=PASSWORD('your password')
Where user='XXX';

Table 'xxx' doesn't own error
エラーが発生した場合テーブル 'xxx' が存在しないか、ファイルが見つかりません: 'xxx' (errno: 2)。これは、現在のデータベースに xxx という名前のテーブルが存在しないことを意味します。

MySQL はデータベースとテーブルの保存にディレクトリとファイルを使用するため、データベース名とテーブル名は大文字と小文字が区別されることに注意してください。 (Win32 では、データベース名とテーブル名は大文字と小文字が区別されませんが、クエリ内のすべてのテーブルへの参照では同じ大文字と小文字を使用する必要があります。)

SHOW TABLES を使用して、現在のデータベースにどのテーブルがあるかを確認できます。



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート