当社のバグデータベースは公開されているので、すべてのユーザが http://bugs.mysql.com/ で参照および検索することができます。システムにログインすると、新しいレポートを入力することもできます。
適切なバグレポートを作成するには忍耐が必要ですが、最初に正しく作成しておくと、当社にとってもユーザ自身にとっても時間の節約になります。バグの詳細なテストケースを含む適切なバグレポートの場合、次のリリースでバグが修正される可能性が非常に高くなります。このセクションでは、当社にとってあまり、またはまったく役に立たない作業にユーザが時間を費やさなくて済むように、レポートを正しく作成する方法を説明します。
バグレポート(または問題に関するレポート)の生成には
mysqlbug
スクリプトを使用することをお勧めします。mysqlbug
は、scripts
ディレクトリ(ソースディストリビューション)および
MySQL インストールディレクトリ下の
bin
ディレクトリ(バイナリディストリビューション)にあります。mysqlbug
を使用することができない場合でも(Windows
を使用している場合など)、このセクションに記されている必要な情報すべてをレポートに記載する必要があります(最も重要なのは、オペレーティングシステムの説明と
MySQL バージョンです)。
mysqlbug
スクリプトを使用すると、以下の情報のほとんどを自動的に確認することができるので、簡単にレポートを生成することができます。ただし、重要な情報が不足している場合は、その情報をメッセージに追加してください。このセクションをよく読んで、ここに記されているすべての情報をレポートに記載してください。
できれば、MySQL
サーバの最新の製品版または開発版を使用して問題をテストしてから投稿してください。だれもが記載されているテストケースで
mysql test < script
を使用するだけでバグを再現したり、バグレポートに含まれているシェルまたは
Perl
スクリプトを実行したりすることができるようにする必要があります。
バグデータベース(http://bugs.mysql.com/)に投稿されたすべてのバグは、次の MySQL リリースで修正または文書化されます。小規模なコードの変更のみで問題を修正できる場合は、当社でも問題を修正するパッチを投稿します。
バグを報告する場所は通常、http://bugs.mysql.com/ です。
MySQL
で重大なセキュリティバグを見つけた場合は、<security@mysql.com>
に電子メールをお送りください。
再現可能なバグレポートがある場合、バグデータベース(http://bugs.mysql.com/)に報告してください。この場合も、まず
mysqlbug
スクリプトを実行して、システムに関する情報を確認することをお勧めします。再現可能なバグは、次の
MySQL
リリースで修正される可能性が高くなります。
他の問題を報告する場合は、MySQL メーリングリストのいずれかを使用してください。
情報が多すぎるメッセージに対応することはできますが、少なすぎるメッセージに対応することはできません。多くの場合、問題の原因がわかっていると思い、細部を重要でないと考えるため、事実を省略してしまいます。記載するかどうかを迷ったときは、記載することをお勧めします。最初に十分な情報を記載していなかったために再度質問して、回答を待たなければならなくなるよりも、レポートに数行を追加する方が、はるかに時間が節約される上に、煩わしくありません
バグレポートで最もよくある誤りは、(a) 使用している MySQL ディストリビューションのバージョン番号を記載していない、(b) MySQL サーバがインストールされているプラットフォームの説明(プラットフォームの種類およびバージョン番号を含む)が十分でないというものです。これは非常に重要な情報なので、ほとんどの場合、この情報が記載されていないバグレポートは役に立ちません。``この機能が使用できないのはなぜですか?'' という質問を受けることがよくあります。その場合、要求した機能がその MySQL バージョンに実装されていなかったり、レポートに記載されているバグが新しい MySQL バージョンですでに修正されていたりすることがあります。エラーがプラットフォーム依存である場合もあります。そのような場合、オペレーティングシステムやプラットフォームのバージョン番号を知らないで問題を修正することはほとんど不可能です。
また、コンパイラが問題に関連している場合は、コンパイラに関する情報も記載してください。ユーザがコンパイラのバグを見つけると、MySQL 関連の問題であると考えることがよくあります。ほとんどのコンパイラは常に開発中なので、バージョンごとに改良されています。問題がコンパイラに関連するものであるかどうかを判断するには、使用しているコンパイラを知る必要があります。コンパイルに関するすべての問題はバグと見なし、適宜報告してください。
問題に関する適切な説明がバグレポートに記載されていると、最も効果的です。そのため、問題につながったすべての操作の適切な例を挙げ、問題自体を詳細に記述してください。最も効果的なレポートは、バグや問題を再現する方法を示す詳細な例が記載されたものです。 See 項E.1.6. 「テーブルが破損した場合にテストケースを作成する」。
プログラムでエラーメッセージが生成された場合、そのメッセージをレポートに記載することが非常に重要です。プログラムを使用するアーカイブから情報を検索しようとする場合、報告されたエラーメッセージがプログラムで生成されたものと正確に一致している方が効果的です(大文字小文字の違いにも注意してください)。エラーメッセージを覚えるのではなく、メッセージ全体をレポートにコピーして貼り付けてください。
MyODBC に関する問題がある場合、MyODBC トレースファイルを生成し、レポートともに送信してください。 See 項11.2.7. 「MyODBC に関する問題の報告」。
レポートを読むユーザの多くが 80
桁ディスプレイを使用します。したがって、mysql
コマンドラインツールを使用してレポートまたはサンプルを生成する際には、そのようなディスプレイの有効な幅を超える出力については、--vertical
オプション(または \G
ステートメント終端記号)を使用する必要があります(たとえば、EXPLAIN
SELECT
ステートメントの場合。このセクションの後述のサンプルを参照)。
レポートには以下の情報を記載してください。
使用している MySQL
ディストリビューションのバージョン番号(MySQL
バージョン 4.0.12
など)。実行しているバージョンを確認するには、mysqladmin
version
を実行する。mysqladmin
は、MySQL インストールディレクトリ下の
bin
ディレクトリにある。
問題が発生したマシンの製造元とモデル。
オペレーティングシステムの名前とバージョン。ほとんどのオペレーティングシステムでは、この情報を取得するには、Unix
コマンド uname -a
を実行する。Windows
を使用している場合、名前とバージョン番号を取得するには、通常
``マイ コンピュータ''
アイコンをダブルクリックし、``ヘルプ/バージョン情報''
メニューをプルダウンする。
メモリ(実メモリと仮想メモリ)の量が関連することもある。関連していると思われる場合は、これらの値を記載する。
MySQL ソフトウェアのソースディストリビューションを使用している場合、使用しているコンパイラの名前とバージョン番号が必要である。バイナリディストリビューションを使用している場合は、ディストリビューション名が必要である。
コンパイル時に問題が発生した場合、正確なエラーメッセージ、およびエラーが発生したファイル内の問題のあるコード付近の数行のコンテキストを記載する。
mysqld
が停止した場合、mysqld
のクラッシュの原因となったクエリも報告する必要がある。通常、ログを有効にして
mysqld
を実行すると、これを検出することができる。
See 項E.1.5. 「mysqld
におけるエラーの原因をログファイルを使用して特定する」。
データベーステーブルが問題に関連している場合、mysqldump
--no-data db_name tbl_name1 tbl_name2 ...
からの出力を記載する。これを行うのは非常に簡単だが、データベース内のテーブルに関する情報を取得する強力な方法である。この情報は、発生した状況と同じ状況を再現する際に役立つ。
SELECT
ステートメントの速度に関するバグや問題については、必ず
EXPLAIN SELECT ...
の出力と、少なくとも SELECT
ステートメントによって生成されたレコードの数を記載する必要がある。また、関連する各テーブルの
SHOW CREATE TABLE tbl_name
からの出力も記載する。発生した状況を説明する情報が詳細であるほど、的確な回答を得られる可能性が高くなる。次は、非常に適切なバグレポートの例である(当然のことながら、mysqlbug
スクリプトを使用して投稿されたものである)。
mysql
コマンドラインツールを使用して実行したサンプル(出力幅が
80
桁ディスプレイ装置の出力幅を超えるステートメントへの
\G
ステートメント終端記号の使用に注意)
mysql>SHOW VARIABLES;
mysql>SHOW COLUMNS FROM ...\G
<SHOW COLUMNS からの出力> mysql>EXPLAIN SELECT ...\G
<EXPLAIN からの出力> mysql>FLUSH STATUS;
mysql>SELECT ...;
<クエリの実行に要した時間を含む、 SELECT からの簡略な出力> mysql>SHOW STATUS;
<SHOW STATUS からの出力>
mysqld
の実行中にバグまたは問題が発生した場合、その異常を再現する入力スクリプトを提供する。このスクリプトには、必要なソースファイルを含める必要がある。スクリプトによって再現される状況が実際に発生した状況に近いほど、効果的である。再現可能なテストケースを作成できる場合は、優先的に処理されるように
http://bugs.mysql.com/
にそのテストケースを投稿する。
スクリプトを提供できない場合は、少なくとも
mysqladmin variables extended-status
processlist
からの出力をメールに記載して、システムの動作に関する情報を提供する必要がある。
数行ではテストケースを再現できない場合や、テストテーブルが大きすぎてメーリングリストに送信できない場合(10
レコードを超えるテーブル)、mysqldump
を使用してテーブルをダンプし、問題を説明する
README
ファイルを作成する必要がある。
tar
と gzip
または zip
を使用してファイルの圧縮アーカイブを作成し、ftp
を使用してそのアーカイブを
ftp://support.mysql.com/pub/mysql/secret/
に転送する。その後、バグデータベース(http://bugs.mysql.com/)に問題を入力する。
MySQL サーバでクエリによって正しくない結果が生成されたと思う場合、結果だけでなく、正しいと考える結果と、その考えの根拠を示す説明も記載する。
問題のサンプルを提供する際には、新しい名前を使用するよりも、実際の状況で使用している変数名やテーブル名などを使用するのが適切である。問題が、変数やテーブルの名前に関連している可能性があるためである。このようなケースはほとんどないと思われるが、後悔するよりも安全策をとるべきである。結局、実際の状況に基づいたサンプルを提供する方がユーザにとって簡単であると同時に、当社にとっても効率的である。データを他のユーザに公開したくない場合は、ftp
を使用して
ftp://support.mysql.com/pub/mysql/secret/
に転送することができる。データが実際に最高機密であり、当社にも公開したくない場合は、他の名前を使用したサンプルを提供することもできるが、これは最後の選択肢である。
可能な場合、関連するプログラムのすべてのオプションを記載する。たとえば、mysqld
デーモンを開始する際に使用したオプションや
MySQL
クライアントプログラムの実行に使用したオプションを記載する。mysqld
、mysql
のようなプログラムのオプションや
configure
スクリプトのオプションは多くの場合、回答への手がかりとなり、非常に重要である。これらを記載することは、決して無駄ではない。Perl
や PHP
などのモジュールを使用している場合は、それらのバージョン番号も記載する。
質問が特権システムに関連する場合、mysqlaccess
の出力、mysqladmin reload
の出力、および接続しようとした際に表示されたすべてのエラーメッセージを記載する。権限をテストする際には、まず
mysqlaccess
を実行する。その後、mysqladmin reload
version
を実行し、問題が発生したプログラムに接続する。mysqlaccess
は、MySQL インストールディレクトリ下の
bin
ディレクトリにある。
バグのパッチを作成した場合、それを含める。ただし、当社はパッチだけを必要としているわけではない。パッチによって修正されるバグを示すテストケースなどの必要な情報が記載されていない場合、当社はそのパッチを使用しない。当社がパッチに関連する問題を見つける場合もあれば、パッチをまったく理解できない場合もある。そのような場合は、パッチを使用することはできない。
パッチの目的を正確に確認することができない場合、当社はそのパッチを使用しない。この場合、テストケースが役立つことになる。発生する可能性があるすべての状況がパッチによって処理されることを示す必要がある。パッチが機能しないボーダーラインケースが見つかった場合(それがまれなケースでも)、そのパッチは役に立たない可能性がある。
何がバグであるか、そのバグがなぜ発生するのか、そのバグが何に関連するのかを推測することは、通常、間違いである。MySQL チームでさえも、最初にデバッガを使用せずにそのようなことを推測して、バグの実際の原因を特定することはできない。
ユーザ自身で問題を解決しようとしたことを他のユーザがわかるように、リファレンスマニュアルやメールアーカイブを確認したことをバグレポートに記載する。
解析エラー
が発生した場合、構文を詳細に確認する必要がある。構文に問題が見つからなかった場合は、使用している構文が現在のバージョンの
MySQL
サーバでサポートされていない可能性が非常に高い。現在のバージョンを使用している場合、使用している構文が
http://www.mysql.com/doc/
のマニュアルで扱われていなければ、そのクエリは
MySQL
サーバでサポートされていない。その場合は、自分で構文を実装するか、<licensing@mysql.com>
に電子メールを送信して、その構文を実装するように依頼するしかない。
使用している構文がマニュアルで扱われていても、古いバージョンの MySQL サーバを使用している場合は、MySQL の変更履歴で構文が実装された時期を確認する必要がある。この場合は、新しいバージョンの MySQL サーバにアップグレードする方法がある。 See 付録 D. MySQL Change History。
データが壊れている点が問題である場合や、特定のテーブルにアクセスした際にエラーが発生した場合、myisamchk
または CHECK TABLE
と
REPAIR TABLE
を使用して、まずテーブルをチェックしてから、修復を試みる必要がある。
See 章 4. データベース管理。
テーブルが頻繁に壊れる場合、その問題が発生する状況と理由を特定する必要がある。この場合、mysql-data-directory/'hostname'.err
ファイルに、発生した問題に関する情報が格納されていることがある。See
項4.10.1. 「エラーログ」。このファイル内の関連する情報をバグレポートに記載する。通常、更新の途中で
mysqld
が停止されない限り、mysqld
によってテーブルが破壊されることはない。mysqld
が停止した原因が特定されれば、当社はその問題の解決策をはるかに簡単に提供することができる。
See 項A.1. 「問題の原因を突き止める方法」。
可能な場合、最新バージョンの MySQL サーバをダウンロードしてインストールし、これによって問題が解決されるかどうかを確認する。MySQL ソフトウェアのすべてのバージョンが詳細にテストされているため、問題なく動作するはずである。すべてにおいて最大限の下位互換性が確保されているため、MySQL のバージョンを問題なく切り替えることができると当社は確信している。 See 項2.2.4. 「使用すべき MySQL のバージョン」。
サポート契約を結んでいるお客様は、他のユーザが同じ問題に遭遇しているかどうか(また、その問題が解決されているかどうか)を確認するために該当するメーリングリストにバグレポートを投稿するだけでなく、優先的に処理されるように
<mysql-support@mysql.com>
にも投稿してください。
MyODBC
におけるバグの報告については、項11.2.4. 「MyODBC に関する問題を報告する方法」
を参照してください。
一般的な問題に対する解決策については、付録 A. 問題と一般的なエラー を参照してください。
メーリングリストではなく、個人宛てに回答が送信された場合、問題の解決に役立った回答が他のユーザにも役立つように、回答を要約してメーリングリストに送信するのがエチケットであると思います。
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.