| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
4.1.1 mysqld コマンドラインオプション | ||
| 4.1.2 `my.cnf' オプション設定ファイル |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld コマンドラインオプション
通常、mysqld オプションはオプション設定ファイルから管理してください。
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
mysqld と mysqld.server は mysqld グループと server グループからオプションを読み込みます。
mysqld_safe は mysqld、server、mysqld_safe、safe_mysqld の各グループからオプションを読み込みます。
組み込み MySQL サーバは通常、server、embedded、および xxxxx_SERVER からオプションを読み込みます。ここで、xxxxx はアプリケーションの名前です。
mysqld には、多くのコマンドラインオプションがあります。以下、一般的なコマンドラインオプションについて説明します。
完全なオプション一覧を参照するには、mysqld --help を実行してください。
レプリケーション用のオプションについては、別のセクションで説明します。 「4.11.6 レプリケーションスタートアップオプション」 を参照してください。
--ansi
-b, --basedir=path
--big-tables
--bind-address=IP
--console
--log-error が指定されている場合でも、stderr/stdout にエラーログメッセージを書き込む。このオプションを使用した場合、Windows では mysqld によりコンソール画面が開かれたままになる。
--character-sets-dir=path
--chroot=path
mysqld デーモンを配置する。MySQL 4.0 以降の推奨セキュリティ設定(MySQL 3.23 では、完全に閉じた chroot ジェイルを提供できない)。
ただし、LOAD DATA INFILE と SELECT ... INTO OUTFILE に制約が加わる。
--core-file
mysqld が異常終了した場合に、コアファイルを作成する。システムによっては、mysqld_safe に --core-file-size を指定することも必要になる。
「4.8.2 mysqld_safe(mysqld のラッパ)」 節 参照 。
注意: --user オプションも使用している場合、Solaris などシステムではコアファイルを作成できない。
-h, --datadir=path
--debug[...]=
--with-debug でコンフィギャしている場合、このオプションを使用して mysqld の動作を示すトレースファイルを取得できる。
「E.1.2 トレースファイルの作成」 節 参照 。
--default-character-set=charset
--default-table-type=type
--delay-key-write[= OFF | ON | ALL]
DELAYED KEYS をどのように使用するか指定する。 「5.5.2 サーバパラメータのチューニング」 節 参照 。
--delay-key-write-for-all-tables(MySQL 4.0.3 では、--delay-key-write=ALL を使用)
MyISAM テーブルにおいて、書き込み間のキーバッファをフラッシュしない。
「5.5.2 サーバパラメータのチューニング」 節 参照 。
--des-key-file=filename
DES_ENCRYPT() および DES_DECRYPT() が使用するデフォルトキーをこのファイルから読み取る。
--enable-external-locking(以前は --enable-locking)
lockd が完全には機能しないシステム(Linux など)でこのオプションを使用すると、mysqld がデッドロックになる可能性が高くなる。
--enable-named-pipe
-T, --exit-info
mysqld サーバのデバッグに使用できる、複数の異なるフラグのビットマスク。完全に理解していない限り、このオプションは使用しないこと。
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=file]
--log-bin=[file]
--log-bin-index[=file]
--log-error[=file]
--log-isam[=file]
--log-long-format
--log-slow-queries と --log-long-format を使用している場合、インデックスを使用しないクエリも、スロークエリログに記録される。
注意: --log-long-format は MySQL バージョン 4.1 で廃止され、--log-short-format が導入されている(long log format がバージョン 4.1 以降のデフォルト設定になった)。また、MySQL 4.1 から、インデックスを使用しないクエリをスロークエリログに記録するための --log-queries-not-using-indexes オプションが利用可能になっている。
--log-queries-not-using-indexes
--log-slow-queries と一緒に使用すると、インデックスを使用しないクエリも、スロークエリログに記録される。このオプションは MySQL 4.1 で導入された。 「4.10.5 スロークエリログ」 節 参照 。
--log-short-format
--log-slow-queries[=file]
long_query_time 秒を超えたクエリをすべてログファイルに記録する。
注意: 記録されるデフォルトの情報量は MySQL 4.1 で変更された。詳細については、--log-long-format オプションおよび --log-long-format オプションの説明を参照のこと。 「4.10.5 スロークエリログ」 節 参照 。
--log-update[=file]
file.# に記録する。# は一意の番号。 「4.10.3 更新ログ」 節 参照 。
更新ログは MySQL 5.0 で廃止されるので、代わりにバイナリログ(--log-bin)を使用すること。 「4.10.4 バイナリログ」 節 参照 。
バージョン 5.0 からは、--log-update を使用すると単にバイナリログが有効になる。
--low-priority-updates
INSERT、DELETE、UPDATE)の優先順位が選択よりも低くなる。{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... を使用して 1 つのクエリだけ優先順位を低くしたり、SET LOW_PRIORITY_UPDATES=1 を使用して 1 つのスレッド内での優先順位を変更することもできる。 「5.3.2 テーブルロック関連の問題」 節 参照 。
--memlock
mysqld プロセスをロックする。これは、使用しているシステムが mlockall() システムコールをサポートしている場合(Solaris など)のみで使用可能。オペレーティングシステムが原因で mysqld のスワップが発生するという問題がある場合、その解決に役立つ。
注意: このオプションを使用するには、サーバを root として起動することが必要になるが、これはセキュリティ上好ましくない。
--myisam-recover [=option[,option...]]
DEFAULT、BACKUP、FORCE、および QUICK の任意の組み合わせ。このオプションを無効にするには、これを明示的に "" に設定する。このオプションを使用すると、mysqld はテーブルを開くときに、テーブルにクラッシュのマークが付いていないか、つまりテーブルが正しく閉じられているかどうかをチェックする
(最後のオプションは、--skip-external-locking を使用している場合だけ有効)。テーブルにクラッシュマークが付いていた場合、mysqld はテーブルをチェックする。テーブルが破損していた場合、mysqld は修復を試みる。
以下のオプションにより、修復方法が決定される。
| オプション | 説明 |
| DEFAULT | --myisam-recover でどのオプションも指定しないのと同じ。 |
| BACKUP | 修復時にデータテーブルが変更された場合、`table_name.MYD' データファイルのバックアップを `table_name-datetime.BAK' として保存する。 |
| FORCE | .MYD ファイルから複数のレコードが失われる場合でも修復を実行する。 |
| QUICK | 削除ブロックがない場合、テーブル内のレコードをチェックしない。 |
テーブルを自動的に修復する前に、MySQL はそのことをエラーログに追加する。ユーザの介入なしにほとんどすべての問題をリカバリできるようにするには、オプション BACKUP,FORCE を使用する。これにより、いくつかのレコードが削除される場合でもテーブルの修復が行われるが、古いデータファイルがバックアップとして残るので後で調べることができる。
--new
--new オプションを使用すると、特定の局面でサーバを 4.1 のように動作させることができ、簡単に 4.0 から 4.1 にアップグレードできる。
TIMESTAMP が、'YYYY-MM-DD HH:MM:SS' 形式の文字列として返る。
「6.2 カラム型」 節 参照 。
--pid-file=path
mysqld_safe によって使用される PID ファイルのパス。
-P, --port=...
-o, --old-protocol
--one-thread
--open-files-limit=
mysqld で使用可能なファイル記述子の数を変更できる。
これが設定されていないか、または 0 に設定されている場合、mysqld は、setrlimit() で使用する値を使用してファイル記述子を予約する。この値が 0 の場合、mysqld は max_connections*5 または max_connections + table_cache*2 のいずれか大きい値をファイル数として予約する。mysqld で ' Too many open files ' のエラーが出る場合、この値を大きくする。
-O, --set-variable=name=value
--help により変数一覧を表示できる。すべての変数の詳細については、このマニュアルの SHOW VARIABLES セクションを参照のこと。 「4.6.8.4 SHOW VARIABLES」 節 参照 。
これら変数を最適化する方法については、「サーバパラメータのチューニング」セクションを参照のこと。
注意: --set-variable=変数名=値 および -O 変数名=値 構文は、MySQL 4.0 で廃止。代わりに --変数名=値 を使用すること。
「5.5.2 サーバパラメータのチューニング」 節 参照 。
MySQL 4.0.2 では変数を --変数名=値 で直接設定できるので、set-variable は必要なくなった。
SET で設定可能なスタートアップオプションの最大値を制限するには、--maximum-variable-name コマンドラインオプションを使用して定義する。 「5.5.6 SET 構文」 節 参照 。
注意: 変数に値を設定すると、その値が設定可能範囲に収まるように、また使用アルゴリズムに合うように自動的に変数値が修正される。
--safe-mode
--safe-show-database
SHOW DATABASES コマンドを実行すると、そのユーザが何らかの権限を持っているデータベースのみが戻り値として返る。
バージョン 4.0.2 からすべてのユーザが SHOW DATABASES 権限を持つようになったので、このオプションは廃止され、何もしない(このオプションはデフォルトで有効)。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
--safe-user-create
mysql.user テーブルあるいはそのテーブル内のカラムへの INSERT 権限がなければ、そのユーザは GRANT コマンドを使用して新規ユーザを作成できない。
--skip-bdb
--skip-concurrent-insert
MyISAM テーブルで SELECT と INSERT を同時に実行できなくする(これは、この機能にバグがあると思われる場合だけ使用すること)。
--skip-delay-key-write
--delay-key-write=OFF を使用する。
すべてのテーブルの DELAY_KEY_WRITE オプションを無視する。
「5.5.2 サーバパラメータのチューニング」 節 参照 。
--skip-grant-tables
mysqladmin flush-privileges または mysqladmin reload を実行する)。
--skip-host-cache
--skip-innodb
--skip-external-locking(以前は --skip-locking)
isamchk または myisamchk を使用するには、サーバをシャットダウンする必要がある。 「1.2.3 MySQL の安定性」 節 参照 。
注意: MySQL バージョン 3.23 では、REPAIR および CHECK を使用して MyISAM テーブルを修復したりチェックすることができる。
--skip-name-resolve
Host カラムの値がすべて IP アドレスまたは localhost であることが必要である。 「5.5.5 MySQL の DNS の使用」 節 参照 。
--skip-networking
mysqld とのやり取りはすべて、名前付きパイプまたは Unix ソケットを介して行う必要がある。ローカルからの接続要求のみが許可されているシステムにおいて、特にこのオプションが推奨される。 「5.5.5 MySQL の DNS の使用」 節 参照 。
--skip-new
--skip-symlink
--skip-symbolic-links を使用すること。
--symbolic-links, --skip-symbolic-links
Windows でシンボリックリンクを有効にすると、実際のディレクトリへのパスが含まれる directory.sym ファイルの作成により、データベースディレクトリへのシンボリックリンクを作成できるようになる。
「5.6.1.3 Windows 上のデータベースに対するシンボリックリンクの使用」 節 参照 。
Unix でシンボリックリンクを有効にすると、CREATE TABLE ステートメントの INDEX DIRECTORY オプションまたは DATA DIRECTORY オプションで MyISAM のインデックスファイルまたはデータファイルを別ディレクトリにリンクできるようになる。テーブルを削除したり名前を変更すると、そのシンボリックリンクがポイントするファイルも削除または名前変更される。
--skip-safemalloc
--with-debug=full でコンフィギャしていれば、すべてのプログラムが、メモリの割り当て時と解放時に必ずメモリのオーバーランをチェックする。このチェックには時間がかかるため、このチェックを行わないで済むサーバに対しては、--skip-safemalloc オプションによりチェックをスキップできる。
--skip-show-database
SHOW DATABASES 権限を持っていない場合に、SHOW DATABASES コマンドを無効にする。
--skip-stack-trace
mysqld を実行するときに役立つ。システムによっては、コアファイルを取得するためにこのオプションの使用が必要な場合もある。 「E.1 MySQL サーバのデバッグ」 節 参照 。
--skip-thread-priority
--socket=path
MySQL)。
--sql-mode=value[,value[,value...]]
REAL_AS_FLOAT、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、ONLY_FULL_GROUP_BY、NO_UNSIGNED_SUBTRACTION、NO_AUTO_VALUE_ON_ZERO、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、NO_DIR_IN_CREATE、MYSQL323、MYSQL40、DB2、MAXDB、MSSQL、ORACLE、POSTGRESQL、および ANSI。
リセットするには、値を空白にする(--sql-mode="")。
NO_AUTO_VALUE_ON_ZERO は、AUTO_INCREMENT カラムの処理に影響を与える。通常、NULL または 0 のいずれかをカラムに挿入することにより、カラムの次のシーケンス番号を生成する。
NO_AUTO_VALUE_ON_ZERO を指定すると、0 のこの働きが抑制されるため、NULL だけが次のシーケンス番号を生成することになる。このモードは、0 がテーブルの AUTO_INCREMENT カラムに保存されている場合に役に立つ(これは推奨されている方法ではないが)。たとえば、mysqldump でテーブルをダンプしてから再読み込みした場合、MySQL は通常、0 値に遭遇したときに新規シーケンス番号を生成するため、ダンプされたテーブルと再読み込みしたテーブルの内容が異なる結果になる。この場合、ダンプしたファイルを再読み込みする前に NO_AUTO_VALUE_ON_ZERO を有効にするとこの問題が解決する(このオプションが使用可能になった MySQL 4.1.1 以降、mysqldump によるダンプ出力には、自動的に NO_AUTO_VALUE_ON_ZERO を有効にするためのステートメントが含まれている)。
他のサーバとの互換性のために使用するオプション値もある。
これらを指定することにより、SHOW CREATE TABLE の実行結果から、以前のバージョンの MySQL または他のデータベースサーバが理解できない出力が除外される。
これらのオプション値を使用すると、CREATE TABLE ステートメントの他のサーバへの移植性が高まる。
NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_DIR_IN_CREATE、および NO_KEY_OPTIONS を使用すると、テーブルオプションや、カラムまたはインデックス定義に関するオプションが除外される。
MYSQL323 と MYSQL40 は、MySQL 3.23 と MySQL 4.0 との互換用。
DB2、MAXDB、MSSQL、ORACLE、および POSTGRESQL。
mysqldump は SHOW CREATE TABLE を使用して、ダンプ出力に含むテーブル作成ステートメントを取得するため、これらのオプションは mysqldump の出力にも影響する。
オプション値のいくつかは、値のセットまたはグループの略称なので、影響は複雑になる。
たとえば、--sql-mode=ANSI(または --ansi)オプションを使用して、サーバに ANSI モードで実行するように命令できる。これは以下のコマンドラインオプションを両方指定するのと同じ。
--sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY --transaction-isolation=SERIALIZABLE |
注意: この方法で ANSI モードを指定すると、トランザクション分離レベルを設定することにもなる。 ANSI モードでのサーバの実行については、 「1.8.2 ANSI モードでの MySQL の実行」 を参照のこと。
他の "グループ" 値は、DB2、MAXDB、MSSQL、ORACLE、および POSTGRESQL。
これらのいずれの値を指定しても、PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、および NO_KEY_OPTIONS 値が有効になる。
--sql-mode オプションは MySQL 3.23.41 で追加された。
NO_UNSIGNED_SUBTRACTION 値は 4.0.0 で追加された。
NO_DIR_IN_CREATE は 4.0.15 で追加された。
NO_AUTO_VALUE_ON_ZERO、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_KEY_OPTIONS、MYSQL323、MYSQL40、DB2、MAXDB、MSSQL、ORACLE、POSTGRESQL、および ANSI は 4.1.1 で追加された。
--temp-pool
--transaction-isolation={ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
SET TRANSACTION 構文」 節 参照 。
-t, --tmpdir=path
/tmp ディレクトリがある場合、このオプションが役に立つ。
MySQL 4.1 以降、複数のパスの指定が可能になっている。これらのパスはラウンドロビン方式で使用される。Unix ではコロン(`:')を、Windows ではセミコロン(`;')を使用してパスを区切る。
メモリベースのファイルシステムを指すように tmpdir を設定することは可能。ただし、MySQL サーバがスレーブの場合はできない。スレーブの場合、マシンがリブートしてもテンポラリテーブルのレプリケーションまたは LOAD DATA INFILE のレプリケーション処理を続行するためのテンポラリファイルが必要となる。そのため、マシンのリブートで消去されるメモリベースの tmpdir は適しない。ディスクベースの tmpdir が必要。
-u, --user={user_name | user_id}
mysqld サーバを、ユーザ名 user_name またはユーザ ID user_id を持つユーザとして実行する
(ここでの "ユーザ" は、権限テーブルにリストされた MySQL ユーザではなく、システムログインアカウントを指す)。
このオプションは、mysqld を root アカウントで起動する場合、必須である。
起動シーケンス中にサーバがそのユーザ ID を変更し、root ではなく、その特定のユーザとして実行する。
「4.3.2 MySQL のクラッカー対策」 節 参照 。
MySQL 3.23.56 および 4.0.12 以降では、
ユーザが --user=root オプションを `my.cnf' ファイルに追加するという(結果、サーバは root として稼動)セキュリティホールを回避するため、mysqld は指定された最初の --user オプションだけを使用し、複数の --user オプションがあった場合は警告を出力する。`/etc/my.cnf' および `datadir/my.cnf' 内のオプションは、コマンドラインオプションの前に処理されるため、--user オプションを `/etc/my.cnf' に含めて root 以外の値を指定することを推奨する。`/etc/my.cnf' 内のオプションは他の --user オプションより先に検出され、サーバは確実に root 以外のユーザとして実行され、他の --user オプションが検出されると警告が出力される。
-V, --version
-W, --log-warnings
Aborted connection... などの警告を `.err' ファイルに出力する。レプリケーションを使用する場合は、このオプションを有効にすることを推奨する(ネットワークエラーや再接続に関するメッセージなど、現在何が起こっているかについての情報をより多く取得できる)。 「A.2.10 通信エラー/Aborted connection」 節 参照 。
このオプションは以前の --warnings。
実行中のサーバに対して、ほとんどの値を SET コマンドで変更できます。 「5.5.6 SET 構文」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL ではバージョン 3.22 以降、サーバとクライアントのデフォルトスタートアップオプションをオプション設定ファイルから読み取ることができるようになっています。
Windows では、MySQL はデフォルトオプションを以下のファイルから読み取ります。
| ファイル名 | 用途 |
windows-directory\my.ini | グローバルオプション |
C:\my.cnf | グローバルオプション |
windows-directory は Windows ディレクトリの保存場所です。
Unix では、MySQL はデフォルトオプションを以下のファイルから読み取ります。
| ファイル名 | 用途 |
/etc/my.cnf | グローバルオプション |
DATADIR/my.cnf | サーバ固有オプション |
defaults-extra-file | --defaults-extra-file=path で指定されたファイル |
~/.my.cnf | ユーザ固有オプション |
DATADIR は MySQL データディレクトリです(通常、バイナリインストールの場合は `/usr/local/mysql/data'、ソースインストールの場合は `/usr/local/var')。
注意: これは、コンフィギャ時に指定されたディレクトリです。mysqld 起動時に --datadir で指定したディレクトリではありません。サーバはコマンドラインの引数を処理する前にオプション設定ファイルを探すため、--datadir による指定は、サーバがオプション設定ファイルを探す場所に影響しません。
注意: Windows では、オプション設定ファイル内のすべてのパスを `\' ではなく、`/' で指定してください。`\' は MySQL の エスケープ文字であるため、`\' を使用する場合は 2 回指定する必要があります。
MySQL は、オプション設定ファイルを上記の順序で読み取ろうとします。複数のオプション設定ファイルが存在する場合、後で読み取られたファイルに指定されているオプションの方が、先に読み取られたファイル内の同一オプションより優先されます。コマンドラインで指定されたオプションは、オプション設定ファイルで指定されたオプションよりも優先されます。オプションによっては、環境変数を使用して指定できるものもあります。 コマンドラインまたはオプション設定ファイルで指定されたオプションの方が、環境変数値よりも優先されます。 「F. 環境変数」 節 参照 。
オプション設定ファイルをサポートするプログラムは、mysql、mysqladmin、mysqld、mysqld_safe、mysql.server、mysqldump、mysqlimport、mysqlshow、mysqlcheck、myisamchk、および myisampack です。
バージョン 4.0.2 より、loose プリフィックスをコマンドラインオプション(または my.cnf のオプション)に使用できます。オプションの前に loose を付けると、オプションが未知の場合でも、それを読み取ったプログラムはエラー終了せず、以下の警告を出力します。
shell> mysql --loose-no-such-option |
MySQL プログラム実行時にコマンドラインで指定できる長いオプションは、オプション設定ファイルで指定できます(ダッシュ2つを前に付けない)。使用可能なオプションの一覧を表示するには、--help オプション付きでそのプログラムを実行してください。
オプション設定ファイルには、以下の形式の行を含めることができます。
#comment
[group]
group は、オプションを設定するプログラムまたはグループの名前。グループ行の後の option行または set-variable 行はすべてそのグループに適用される。これは、オプション設定ファイルの最後、または他のグループ行が指定されるまで有効。
option
--option と同等。
option=value
--option=value と同等。注意: オプションの引数にコメント文字が含まれる場合、引数を二重引用符で囲む必要がある。
set-variable = name=value
--set-variable=name=value と同等。
注意: --set-variable は MySQL 4.0 で廃止された。MySQL 4.0 では、プログラム変数名をオプション名として使用できる。コマンドラインでは、--name=value を使用する。オプション設定ファイルでは、name=value を使用する。
[client] グループにより、すべての MySQL クライアント(mysqld ではなく)に適用されるオプションを指定できます。これは、サーバに接続する際に使用するパスワードを指定するための理想的なグループです(ただし、管理者以外のユーザがオプション設定ファイルを読み書きできないようにしてください)。
特定のバージョンの mysqld サーバだけが読み取れるオプションを作成するには、[mysqld-4.0]、[mysqld-4.1] などを使用します。
[mysqld-4.0] new |
上記の new オプションは、MySQL サーババージョン 4.0.x でのみ使用されます。
注意: オプションおよび値に対して、その前後にある空白は自動的に削除されます。エスケープシーケンス `\b'、`\t'、`\n'、`\r'、`\\'、および `\s' を値文字列に使用することができます(`\s' == blank)。
次に、一般的なグローバルオプション設定ファイルの例を示します。
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick |
次に、一般的なユーザオプション設定ファイルの例を示します。
[client] # 以下のパスワードは、標準の MySQL クライアント全てに使用されます password="my_password" [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout |
ソースディストリビューションがあれば、`my-xxxx.cnf' という名前の設定ファイルのサンプルが `support-files' ディレクトリに含まれています。
バイナリディストリビューションの場合は、`DIR/support-files' ディレクトリにあります。ここで、DIR は MySQL インストールディレクトリのパスです(通常、`C:\mysql' または `/usr/local/mysql')。現在、小、中、大、および特大システム用のサンプル設定ファイルが用意されています。`my-xxxx.cnf' を自分のホームディレクトリにコピーして、名前を `.my.cnf' に変更し、このファイルを使用してみてください。
オプション設定ファイルをサポートする MySQL プログラムはすべて、以下のオプションをサポートします。
| オプション | 説明 |
--no-defaults | オプション設定ファイルを一切読み取らない。 |
--print-defaults | プログラム名と、取得するすべてのオプションを出力する。 |
--defaults-file=full-path-to-default-file | 指定された設定ファイルだけを使用する。 |
--defaults-extra-file=full-path-to-default-file | グローバル設定ファイルを読み取った後、ユーザ設定ファイルの前にこの設定ファイルを読み取る。 |
注意: これらのオプションは、コマンド行の最初に置く必要があります。ただし、--print-defaults だけは、--defaults-file または --defaults-extra-file の直後に置くことができます。
開発者向け注意: オプション設定ファイルの処理としては、コマンドライン引数を処理する前に、オプション設定ファイル内のすべての合致するオプション(該当グループのオプション)が処理されるようになっています。複数回指定されているオプションの最後のインスタンスを使用するプログラムにとっては、この処理で問題ありません。複数回指定されているオプションを処理するが、オプション設定ファイルは読み取らない旧式のプログラムについては、2 行追加するだけでその機能を装備できます。 その方法については、標準 MySQL クライアントのいずれかのソースコードを確認してください。
シェルスクリプトで、my_print_defaults コマンドを使用してオプション設定ファイルを解析することができます。以下の例は、[client] グループと [mysql] グループに属すオプションの表示要求があった場合に、my_print_defaults が生成する可能性のある出力です。
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| 4.2.1 Windows 上で複数のサーバを実行する | ||
| 4.2.2 Unix 上で複数のサーバを実行する | ||
| 4.2.3 複数サーバ環境でクライアントプログラムを使用する |
場合によっては、同じマシン上で複数の mysqld サーバを実行することが必要になります。たとえば、既存の稼働環境のままにして、新しい MySQL リリースをテストしたい場合が考えられます。
また、ユーザごとに異なる mysqld サーバへのアクセス権を与える場合などもあります(たとえば、顧客ごとに独立した MySQL インストールを提供するインターネットサービスプロバイダなど)。
単一のマシン上で複数のサーバを実行するには、いくつかのパラメータでサーバ固有の値を設定する必要があります。これらはコマンドラインまたはオプション設定ファイルで設定できます。
「4.1.1 mysqld コマンドラインオプション」 および 「4.1.2 `my.cnf' オプション設定ファイル」 を参照してください。
少なくとも以下のオプションはサーバごとに異なります。
--port=port_num
--socket=path
--shared-memory-base-name=name(Windows のみ、MySQL 4.1 で導入)
--pid-file=path(Unix のみ)
--port は、TCP/IP 接続のポート番号を制御します。
--socket は、Unix ではソケットファイルパスを、Windows では名前付きパイプの名前を制御します(名前付きパイプ接続をサポートしているサーバに対してのみ、Windows 上で一意のパイプ名を指定する必要があります)。
--shared-memory-base-name は、Windows サーバが使用する共有メモリ名を指定します。これにより、クライアントはその共有メモリを介して接続できるようになります。
--pid-file は、Unix サーバがプロセス ID を書き込むファイルの名前を示します。
以下のオプションを使用する場合、サーバごとに異なる値を設定する必要があります。
--log=path
--log-bin=path
--log-update=path
--log-error=path
--log-isam=path
--bdb-logdir=path
パフォーマンスを高めるには、以下のオプションをサーバごとに個別に設定し、負荷を複数のディスクに分散します。
--tmpdir=path
--bdb-tmpdir=path
複数のテンポラリディレクトリを上記のように設定し、どの MySQL サーバにどのテンポラリファイルが属するのかわかりやすくしておくことを推奨します。
一般的に、データディレクトリについても、各サーバが異なるディレクトリを使用するようにします。これは --datadir=path オプションで指定します。
警告: 2 つのサーバから同じデータベースのデータを更新しないようにしてください。使用しているオペレーティングシステムが障害からの保護をおこなうようなシステムロックをサポートしていない場合、予期しない事態が発生する可能性があります。また、複数のサーバが同じデータディレクトリを使用し、ログが有効になっている場合、適切なオプションを使用して各サーバに異なるログファイル名を指定する必要があります。そうしないと、サーバは同じファイルにログしてしまいます。
サーバ間でのデータディレクトリ共有に関するこの警告は、NFS 環境にも当てはまります。NFS 環境で複数の MySQL サーバに同じデータディレクトリへのアクセスを認めることは避けてください。
lockd デーモンによって処理されるが、現在のところ、どのような状況でも 100% の信頼性でロックを実行できるプラットフォームは存在しない。
簡単な方法を選択してください。NFS で複数のサーバにデータディレクトリを共有させるアイデアは良いアイデアではありません。 また、複数の CPU を持つ 1 台のコンピュータを用意し、スレッドを効率的に処理するオペレーティングシステムを使用することを推奨します。
複数の MySQL インストールを異なるロケーションで行う場合、--basedir=path オプションを使用して各サーバに対してベースディレクトリを指定し、各サーバがそれぞれ別のデータディレクトリ、ログファイル、および PID ファイルを使用するようにできます(これらの値のデフォルトは、ベースディレクトリに相対して決定されます)。その場合、他に指定する必要があるオプションは --socket と --port だけです。たとえば、`.tar' ファイルバイナリディストリビューションを使用して MySQL の複数のバージョンをインストールするとします。これらは別々のロケーションにインストールされるので、対応するベースディレクトリ以下で ./bin/mysqld_safe コマンドを使用して、各インストールのサーバを起動することができます。
mysqld_safe が、mysqld に渡す適切な --basedir オプションを特定するので、--socket オプションと --port オプションを mysqld_safe に設定するだけで済みます。
以下のセクションで説明するように、環境変数の設定または適切なコマンドラインオプションの指定により、追加サーバを起動することが可能です。ただし、より永続的に複数のサーバを実行する必要がある場合には、オプション設定ファイルを使用して各サーバ固有のオプション値を指定する方法が便利です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
適切なパラメータを使用し、コマンドラインからサーバを手動で起動することにより、Windows 上で複数のサーバを実行することができます。Windows NT ベースのシステムでは、複数のサーバを Windows サービスとしてインストールし、Windows サービスとして実行する方法もあります。コマンドラインから、またはサービスとして MySQL サーバを実行する方法についての一般的な説明は、 「2.6.1 Windows の注意事項」 に記載されています。このセクションでは、データディレクトリなど、サーバ固有であることが必要なスタートアップオプション値をサーバごとに設定してサーバを起動する方法について説明します(これらのオプションについては、 「4.2 同じマシン上で複数の MySQL サーバを実行する」 を参照してください)。
| 4.2.1.1 コマンドラインから複数の Windows サーバを起動する | ||
| 4.2.1.2 複数の Windows サーバをサービスとして起動する |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
コマンドラインから手動で複数のサーバを起動するには、コマンドラインまたはオプション設定ファイルで必要なオプションを指定します。オプション設定ファイルでオプションを設定する方が便利ですが、各サーバに独自のオプションセットを確実に設定する必要があります。これを行うには各サーバ用のオプション設定ファイルを作成し、サーバ起動時に --defaults-file を使用してそのサーバにファイル名を指定します。
たとえば、mysqld を、データディレクトリ `C:\mydata1' を使用してポート 3307 で実行し、mysqld-max を、データディレクトリ `C:\mydata2' を使用してポート 3308 で実行するとします。このためには、2 つのオプション設定ファイルを作成します。たとえば、以下のような `C:\my-opts1.cnf' ファイルを作成します。
[mysqld] datadir = C:/mydata1 port = 3307 |
次に、以下のような 2 つ目のファイル `C:\my-opts2.cnf' を作成します。
[mysqld] datadir = C:/mydata2 port = 3308 |
そして、それぞれのオプション設定ファイルを使って各サーバを起動します。
shell> mysqld --defaults-file=C:\my-opts1.cnf shell> mysqld-max --defaults-file=C:\my-opts2.cnf |
Windows NT では、サーバがフォアグラウンドで起動するため、2 つのコマンドを別々のコンソールウィンドウで実行する必要があります。
サーバをシャットダウンするには、該当するポート番号に接続する必要があります。
shell> mysqladmin --port=3307 shutdown shell> mysqladmin --port=3308 shutdown |
この例のように設定されているサーバは、クライアントに対して TCP/IP 接続を許可します。名前付きパイプ接続も可能にするには、mysqld-nt サーバまたは mysqld-max-nt サーバを使用し、名前付きパイプを有効にするオプションを指定し、その名前を指定します(名前付きパイプ接続をサポートするサーバは、それぞれ固有のパイプ名を使用することが必要です)。たとえば、`C:\my-opts1.cnf' ファイルを以下のように修正します。
[mysqld] datadir = C:/mydata1 port = 3307 enable-named-pipe socket = mypipe1 |
そして、サーバを次のように起動します。
shell> mysqld-nt --defaults-file=C:\my-opts1.cnf |
2 つ目のサーバで使用する `C:\my-opts2.cnf' も同様に修正します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
Windows NT ベースのシステムでは、MySQL サーバを Windows サービスとして実行できます。単一の MySQL サービスのインストール、制御、および削除の手順については、 「2.1.1.7 Windows NT、2000、または XP での MySQL の起動」 を参照してください。
MySQL 4.0.2 より、複数のサーバをサービスとしてインストールできるようになっています。 その場合、各サーバが異なるサービス名を使用することが必要です。また、サーバごとに一意であることが必要なその他のパラメータにも注意が必要です。
以下の手順は、`C:\mysql-4.0.8' および `C:\mysql-4.0.17' にインストールされた 2 つの異なる MySQL バージョンから mysqld-nt サーバを実行する場合を想定しています(たとえば、本稼働サーバとして 4.0.8 を実行しているときに、アップグレード前に 4.0.17 をテストする場合など)。
--install オプションで MySQL サービスをインストールする場合、以下の原則が当てはまります。
MySQL のデフォルトサービス名を使用し、標準オプション設定ファイルの [mysqld] グループからオプションを読み取る。
--install オプションの後でサービス名を指定すると、サーバは [mysqld] オプショングループを無視し、サービスと同じ名前のグループからオプションを読み取る。サーバは、標準オプション設定ファイルからオプションを読み取る。
--defaults-file オプションを指定すると、サーバは標準オプション設定ファイルを無視し、指定ファイルの [mysqld] グループからのみオプションを読み取る。
これらの原則は、--install-manual オプションを使用してサーバをインストールした場合にも当てはまります。
以上の情報に基づいて、複数のサービスをセットアップする方法はいくつかあります。 次に、いくつかの例を示します。いずれを試す場合でも、最初に既存の MySQL サービスをシャットダウンして削除しておくことが必要です。
mysqld-nt を mysqld1 のサービス名で実行し、4.0.17 mysqld-nt を mysqld2 のサービス名で実行する場合、
4.0.8 には [mysqld1] グループを、4.0.17 には [mysqld2] グループを使用できる。
たとえば、以下のように `C:\my.cnf' をセットアップできる。
# options for mysqld1 service [mysqld1] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 # options for mysqld2 service [mysqld2] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2 |
Windows が各サービス用の正しい実行可能プログラムを登録できるように、サーバのフルパス名を指定して、以下のようにサービスをインストールする。
shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1 shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2 |
サービスを開始するには、サービスマネージャを使用するか、適切なサービス名で NET START を使用する。
shell> NET START mysqld1 shell> NET START mysqld2 |
サービスを停止するには、サービスマネージャを使用するか、適切なサービス名で NET STOP を使用する。
shell> NET STOP mysqld1 shell> NET STOP mysqld2 |
注意: MySQL 4.0.17 より前のバージョンでは、デフォルトサービス名(MySQL)を使用してインストールされたサーバか、mysqld のサービス名で明示的にインストールされたサーバだけが、標準オプション設定ファイルの [mysqld] グループを読み取ります。4.0.17 以降では、他のサービス名を使用してインストールされたサーバでも、標準オプション設定ファイルを読み取るサーバであればすべて、[mysqld] グループを読み取ります。これにより、すべての MySQL サービスに適用するオプション用に [mysqld] グループを使用し、各サービスの名前が付けられたオプショングループを、そのサービス名でインストールされたサーバ用に使用できます。
--defaults-file を使用して、各サーバにどのファイルを使用するか指定する。このとき、各ファイルに [mysqld] グループを使用してオプションをリストアップすることが必要。
この方法で 4.0.8 mysqld-nt のオプションを指定するには、以下のような `C:\my-opts1.cnf' ファイルを作成する。
[mysqld] basedir = C:/mysql-4.0.8 port = 3307 enable-named-pipe socket = mypipe1 |
4.0.17 mysqld-nt に対しては、以下のような `C:\my-opts2.cnf' ファイルを作成する。
[mysqld] basedir = C:/mysql-4.0.17 port = 3308 enable-named-pipe socket = mypipe2 |
以下のようにサービスをインストールする(各コマンドは 1 行で入力)。
shell> C:\mysql-4.0.8\bin\mysqld-nt --install mysqld1
--defaults-file=C:\my-opts1.cnf
shell> C:\mysql-4.0.17\bin\mysqld-nt --install mysqld2
--defaults-file=C:\my-opts2.cnf
|
MySQL サーバをサービスとしてインストールする際に --defaults-file オプションを使用するには、オプションの前にサービス名を付ける必要がある。
サービスのインストール後、起動と停止は前の例と同じように行う。
複数のサービスを削除するには、mysqld --remove を使用して 1 つずつ削除します。削除するサービスがデフォルト名でない場合は、--remove オプションの後にサービス名を指定します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
複数のサーバを Unix 上で実行する最も簡単な方法は、異なる TCP/IP ポートとソケットファイルを使用するようにしてサーバをコンパイルし、それぞれが別のネットワークインタフェースで接続するようにすることです。また、各インストールを別々のベースディレクトリでコンパイルすることにより、データディレクトリ、ログファイル、および PID ファイルの場所をサーバ別にすることができます。
既存サーバがデフォルトのポート番号とソケットファイルでコンフィギャされているとします。新しいサーバを別のパラメータでコンフィギャするには、以下のように configure コマンドを使用します。
shell> ./configure --with-tcp-port=port_number \
--with-unix-socket-path=file_name \
--prefix=/usr/local/mysql-4.0.17
|
ここで、port_number と file_name に、デフォルト以外のポート番号とソケットファイルのパス名を指定します。および、--prefix の値も、既存の MySQL インストールの場所とは別のインストールディレクトリを指定します。
MySQL サーバが特定のポート番号をリッスンしている場合、以下のコマンドを使用して、ベースディレクトリやソケット名など、重要な変数の値を確認できます。
shell> mysqladmin --host=host_name --port=port_number variables |
このコマンドで表示される情報により、追加サーバを設定するときにどのオプション値を使用してはいけないかがわかります。
注意: "localhost" をホスト名として指定すると、mysqladmin は TCP/IP ではなく、Unix ソケット接続をデフォルト使用します。
MySQL 4.1 では、--protocol={TCP | SOCKET | PIPE | MEMORY} オプションを使用して、使用する接続プロトコルを明示的に指定できます。
別のソケットファイルおよび TCP/IP ポート番号で起動するために、新たに MySQL サーバをコンパイルする必要はありません。実行時に値を指定することも可能です。これを行う 1 つの方法として、コマンドラインオプションの使用があります。
shell> /path/to/mysqld_safe --socket=file_name --port=port_number |
2 番目のサーバに別のデータベースディレクトリを使用するため、--datadir=path オプションを mysqld_safe に渡します。
同様の効果を得る別の方法として、環境変数を使用してソケット名とポート番号を設定することもできます。
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/mysqld_safe & |
この方法を使用すると、テスト用に 2 つ目のサーバをすばやく起動できます。この方法の長所は、上記のシェルから呼び出したどのクライアントプログラムにもこの環境変数が適用される点です。そのため、これらのクライアントの接続は自動的に 2 つ目のサーバにダイレクトされます。
「F. 環境変数」 に、mysqld を制御する他の環境変数の一覧が記載されています。
自動サーバ実行では、ブート時に実行されるスタートアップスクリプトにより、サーバごとに以下のコマンドが 1 回ずつ実行される必要があります。その際、各コマンドに対して適切なオプション設定ファイルのパスを設定します。
mysqld_safe --defaults-file=path-to-option-file |
各オプション設定ファイルには、特定のサーバに固有のオプション値が含まれていることが必要です。
Unix では、mysqld_multi スクリプトを使用して複数のサーバを開始することもできます。
「4.8.3 mysqld_multi(複数の MySQL サーバを管理するプログラム)」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
クライアントにコンパイルされたネットワークインタフェース以外のネットワークインタフェースをリッスンしている MySQL サーバにそのクライアントから接続するには、以下のいずれかの方法を実行します。
--host=host_name --port=port_number でクライアントを開始する。Unix ソケットまたは Windows の名前付きパイプを使用してローカルホストに接続する場合は --host=localhost --socket=file_name でクライアントを開始する。
--protocol=tcp を、Unix ソケットを使用する場合は --protocol=socket を、名前付きパイプを使用する場合は --protocol=pipe を、共有メモリを使用する場合には --protocol=memory を指定してクライアントを開始する。TCP/IP 接続では、--host オプションと --port オプションを指定することが必要な場合もある。他の接続タイプでは、場合によっては、--socket オプションでソケットまたは名前付きパイプ名を指定したり、--shared-memory-base-name オプションで共有メモリ名を指定することが必要になる。
MYSQL_UNIX_PORT 環境変数と MYSQL_TCP_PORT 環境変数を設定して Unix ソケットおよび TCP/IP ポート番号を指定する。
特定のソケットまたはポートを永続的に使用する場合、これらの環境変数を設定するコマンドを `.login' ファイルに置いて、ログインのたびにこれらの環境変数が適用されるようにできる。
「F. 環境変数」 節 参照 。
[client] グループにデフォルトソケットと TCP/IP ポートを指定する。たとえば、Windows では `C:\my.cnf' を、Unix ではホームディレクトリの `.my.cnf' ファイルを使用できる。
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
mysql_real_connect() の呼び出しで指定できる。また、mysql_options() を呼び出して、プログラムにオプション設定ファイルを読み取らせることもできる。
「11.1.3 C API 関数の説明」 節 参照 。
DBD::mysql モジュールを使用している場合、MySQL オプション設定ファイルからオプションを読み取ることができる。次に例を示す。
$dsn = "DBI:mysql:test;mysql_read_default_group=client;"
. "mysql_read_default_file=/usr/local/mysql/data/my.cnf";
$dbh = DBI->connect($dsn, $user, $password);
|
「11.5.2 DBI インタフェース」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL には、非標準ですが、上級のセキュリティおよび権限システムがあります。このセクションでは、その機能について説明します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
インターネットに接続されたコンピュータで MySQL を使用するユーザはすべて、このセクションを読んで、頻発しているセキュリティ侵害を回避するようにしてください。
盗聴傍受、改ざん、再生、サービス妨害など、あらゆるタイプの攻撃に対して、MySQL サーバだけでなく、サーバホスト全体を、最大限の努力をもって保護することが必要です。ここでは、可用性および耐障害性のすべてについてはカバーしていません。
MySQL では、すべての接続、クエリなど、ユーザが実行する可能性のある操作に対して、そのセキュリティを、アクセス制御リスト(ACL)をベースにして保護しています。MySQL クライアントとサーバ間の SSL 暗号化接続もサポートしています。ここで説明する概念の多くは、MySQL 固有ではありません。ほとんどすべてのアプリケーションに当てはまります。
MySQL を実行する際には、可能な限り以下のガイドラインに従ってください。
root ユーザ以外のだれにも mysql データベースの user テーブルへのアクセス権を与えないこと。これは非常に重要である。
MySQL では、暗号化されたパスワードが実際のパスワードである。
user テーブル内のリストに含まれているパスワードを知り得、そのアカウントのリストに含まれているホストに対するアクセス権を持つ者はだれでも、簡単にそのユーザとしてログインできる。
GRANT コマンドと REVOKE コマンドを使用する。必要以上の権限をユーザに設定しないこと。すべてのホストに対する権限は決して与えないこと。
チェックリスト
mysql -u root を試す。パスワードなしでサーバに正常に接続できるようだと問題がある。この場合、すべての権限を持つ root ユーザとして、MySQL サーバに接続できるということである。
特に root パスワードの設定に関する項目に注意して、MySQL インストール手順を見直すこと。
SHOW GRANTS コマンドを使用して、だれが何にアクセスできるかをチェックする。REVOKE コマンドを使用して不要な権限を削除する。
MD5()、SHA1()、または別の一方向ハッシング関数を使用する。
チェックリスト
nmap などのツールを使用して、インターネットから自分のポートをスキャンしてみる。MySQL はデフォルトでポート 3306 を使用する。このポートは、信頼されていないホストからアクセスできてはいけない。他にも、MySQL ポートが開いているかどうか確かめる簡単な方法として、リモートコンピュータから以下のコマンドを実行するという方法がある。ここで、server_host は MySQL サーバのホスト名である。
shell> telnet server_host 3306 |
接続できて意味不明な文字が返ればポートが開いている。開いておく正当な理由がない限り、ファイアウォールまたはルータで閉じておく。telnet がハングするか、接続が拒否されれば正常である。つまり、ポートは閉じている。
; DROP DATABASE mysql;" などのような入力をしても、アプリケーションが安全に保たれるようにしなければならない。これは極端な例であるが予防策を講じておかないと、クラッカーによる同様の手段によって、重大なセキュリティリークやデータの紛失が発生する可能性がある。
また、数値データもチェックすること。文字列だけを保護するのは、よくあるミスである。公開されているデータのみのデータベースは保護する必要がないという考えもよくある考えだが、これも間違っている。そのようなデータベースにも、サービス妨害タイプの攻撃が可能である。このタイプの攻撃を防ぐ最もシンプルな方法は、数値定数をアポストロフィで囲むこと。SELECT * FROM table WHERE ID=234 ではなく、SELECT * FROM table WHERE ID='234' のようにする。
MySQL は自動的のこの文字列を数値に変換し、非数値記号を削除する。
チェックリスト
%22(`"')、%23(`#')、および %27(`'')を追加して動的 URL の修正を試みる。
addslashes() 関数をチェックする。
PHP 4.0.3 より、mysql_escape_string() 関数が利用可能になっている。これは、MySQL C API の同じ名前の関数をベースにしている。
mysql_real_escape_string() API 呼び出しをチェックする。
escape および quote の修飾子をチェックする。
quote() メソッドをチェックするか、プレースホルダを使用する。
PreparedStatement オブジェクトおよびプレースホルダを使用する。
tcpdump ユーティリティおよび strings ユーティリティの使用法を理解すること。ほとんどの場合、以下のようなコマンドで、MySQL データストリームが暗号化されているかどうかをチェックできる。
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings |
これは、Linux システムで有効。他のシステムでも、少し修正するだけで使用できる。 警告: データを見ることができなくても、必ずしも実際に暗号化されているとは限らない。高度なセキュリティが必要な場合は、専門家に相談すること。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL サーバに接続するとき、通常はパスワードを使用します。パスワードはテキスト形式で送信されるわけではありませんが、暗号化アルゴリズムはそれほど強力なものではありません。クライアントとサーバ間のトラフィックを盗聴できれば、クラッカーは少しの努力でパスワードを探り当てることができます。クライアントとサーバ間の接続が信頼されていないネットワークを通る場合には、SSH トンネルを使用して通信を暗号化してください。
その他の情報はすべてテキストとして転送されるので、その接続を見ることができる人はだれでもそれらの情報を読むことができます。これに不安を感じる場合は、圧縮プロトコル(MySQL バージョン 3.22 以降)を使用してトラフィックの解読をより困難にすることができます。セキュリティをさらに高めるには、ssh を使用してください。オープンソース の ssh クライアントは http://www.openssh.org/ に、商用 ssh クライアントは http://www.ssh.com/ にあります。これを使用すると、MySQL サーバと MySQL クライアント間で暗号化 TCP/IP 接続を利用できます。
MySQL 4.0 を使用している場合、内部 OpenSSL サポートも利用できます。 「4.4.10 安全な接続の使用」 節 参照 。
MySQL システムのセキュリティを確保するためには、以下の事項を強く推奨します。
other_user にパスワードが設定されていなければ、だれでも mysql -u other_user db_name として簡単に他人になりすましてログインできる。クライアント/サーバ型のアプリケーションでは、クライアント側で任意のユーザ名を指定できるのが一般的。mysql_install_db スクリプトを実行前に編集することにより、すべてのユーザのパスワードを変更できる。また、MySQL root ユーザのパスワードのみ変更するには、以下のように行う。
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
-> WHERE user='root';
mysql> FLUSH PRIVILEGES;
|
root アカウントで実行しないこと。このことは、FILE 権限のあるユーザであればだれでも root(たとえば ~root/.bashrc)としてファイルを作成できてしまうので、非常に危険である。これを防ぐため、--user=root オプションを使用して直接指定された場合を除き、mysqld は root として実行することを拒否するようになっている。
mysqld は、普通の権限なしユーザとして実行できる。
新しい Unix アカウント mysql を作成してさらにセキュリティを高めることもできる。別の Unix アカウントで mysqld を実行する場合、user テーブル内の root ユーザ名を変更する必要はない。MySQL ユーザ名と Unix アカウント名はお互い関係ない。別の Unix アカウントで mysqld を開始するには、サーバのデータディレクトリにある `my.cnf' または `/etc/my.cnf' のオプション設定ファイルの [mysqld] グループに、アカウント名を指定する user 行を追加する。次に例を示す。
[mysqld] user=mysql |
これで、サーバを手動で起動した場合も、mysqld_safe または mysql.server を使用して起動した場合でも、指定のアカウントでサーバが起動する。
詳細については、 「A.3.2 一般ユーザで MySQL を実行する方法」 を参照のこと。
--skip-symlink オプションで無効にできる)。このことは、root で mysqld を実行する場合、mysqld データディレクトリへの書き込み権限があるすべてのユーザが、システムのすべてのファイルを削除できることになるので、特に重要である。
「5.6.1.2 Unix 上のテーブルに対するシンボリックリンクの使用」 節 参照 。
mysqld を実行する Unix アカウントだけに、データベースディレクトリの読み取り権限と書き込み権限があることを確認する。
PROCESS 権限をすべてのユーザには与えない。mysqladmin processlist の出力には、現在実行中のクエリのテキストが表示される。そのため、このコマンドを実行できるユーザは、UPDATE user SET password=PASSWORD('not_secure') クエリを実行する他のユーザを特定できる可能性がある。
mysqld は、PROCESS 権限を持つユーザ用に特別接続枠を予約しているので、すべての通常接続が使用中の場合でも、MySQL root ユーザはログインしてサーバの状態をチェックできる。
FILE 権限をすべてのユーザには与えない。この権限を持つユーザは、mysqld デーモンの権限でファイルシステムのどの場所にでもファイルを書き込める。安全対策として、SELECT ... INTO OUTFILE で生成されるファイルについてはだれでも書き込み可能だが、既存のファイルには書き込めないようになっている。
FILE 権限は、サーバを実行している Unix ユーザがアクセスできるすべての読み取り可能ファイルを読む場合にも使用される。また、ユーザが何らかの権限を持っているカレントデータベースに任意のファイルを読み込むことができる。
これは、不正使用される可能性がある。たとえば、LOAD DATA を使用して `/etc/passwd' をテーブルにロードし、SELECT で読むことができる。
mysqld で max_user_connections 変数を設定する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld スタートアップオプション
セキュリティに影響する mysqld オプションは以下のとおりです。
--local-infile[=(0|1)]
--local-infile=0 を使用すると、LOAD DATA LOCAL INFILE を使用できなくなる。
--safe-show-database
SHOW DATABASES コマンドで、そのユーザが何らかの権限を持っているデータベースのみが返される。
現在は、SHOW DATABASES 権限が存在するため、バージョン 4.0.2 以降、このオプションは廃止されており、何もしない(デフォルトで有効になっている)。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
--safe-user-create
mysql.user テーブルへの INSERT 権限がなければ、そのユーザは GRANT コマンドを使用して新規ユーザを作成できない。ユーザが事前設定された権限で新規ユーザを作成できるようにするには、そのユーザに以下の権限を設定することが必要である。
mysql> GRANT INSERT(user) ON mysql.user TO 'user'@'hostname'; |
これで、ユーザは権限カラムを直接変更できないが、GRANT コマンドを使用して他のユーザに権限を与えることができるようになる。
--skip-grant-tables
mysqladmin flush-privileges 、 mysqladmin reload または FLUSH PRIVILEGES; を実行すればよい。
--skip-name-resolve
Host カラム値はすべて IP アドレスか localhost でなければならない。
--skip-networking
mysqld への接続をすべて Unix ソケットで行う。
このオプションは、3.23.27 より前の MySQL バージョンで MIT-pthreads パッケージを利用しているものには適さない。その当時、Unix ソケットは MIT-pthreads によってサポートされていなかったからである。
--skip-show-database
SHOW DATABASES 権限のないユーザに SHOW DATABASES コマンドの使用を認めない。バージョン 4.0.2 から、このオプションは必要なくなった。現在では、SHOW DATABASES 権限が割り当てられることでコマンドを使用できるようになっている。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
LOAD DATA LOCAL のセキュリティ関連事項
MySQL 3.23.49 および MySQL 4.0.2(Windows では 4.0.13)で、LOAD DATA LOCAL に関するセキュリティ対策としていくつかの新しいオプションが追加されました。
このコマンドには次のような潜在的な問題が 2 つあります。
ファイルの読み取りがサーバ側から開始されるため、理論的には、改悪した MySQL サーバを作成しておけば、クライアントがテーブルに対してクエリを実行した時に、そのクライアントコンピュータ上に存在する全てのファイル(カレントユーザが読み取り権を持つ)を、改悪した MySQL サーバが読み取れるということになります。
クライアントが Web サーバから接続する Web 環境では、ユーザは LOAD DATA LOCAL を使用して、Web サーバプロセスが読み取りアクセス権を持つどのファイルでも読み取ることができます(ユーザが SQL サーバに対してすべてのコマンドを実行できる場合)。
これには 2 つの解決方法があります。
MySQL を --enable-local-infile でコンフィギャしていなければ、mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0) を呼び出さないクライアントは LOAD DATA LOCAL を使用できません。
「11.1.3.40 mysql_options()」 節 参照 。
mysql コマンドラインクライアントに対しては、--local-infile[=1] オプションで LOAD DATA LOCAL を有効にでき、--local-infile=0 オプションで無効にできます。
デフォルトでは、すべての MySQL クライアントとライブラリが --enable-local-infile でコンパイルされ、MySQL 3.23.48 以前との互換性が保たれるようになっています。
MySQL サーバですべての LOAD DATA LOCAL コマンドを無効にするには、mysqld を --local-infile=0 で開始します。
LOAD DATA LOCAL INFILE がサーバまたはクライアントで無効になっている場合、次のエラーメッセージ(1148)が表示されます。
The used command is not allowed with this MySQL version |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL 権限システムは、主に、任意のホストから接続したユーザを認証し、そのユーザを、データベース上に登録されている権限(SELECT、INSERT、UPDATE、DELETE)と関連付けます。
さらに、匿名ユーザを作成し、LOAD DATA INFILE や管理操作機能など MySQL 固有の機能を実行するための権限を設定します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL 権限システムは、すべてのユーザがそれぞれ許可された操作だけを実行できるようにします。MySQL サーバに接続すると、ユーザの ID は接続元のホストおよび指定したユーザ名によって特定されます。権限システムは、ユーザ ID と行いたい操作に応じて権限を設定します。
MySQL では、ホスト名とユーザ名を使用してユーザを認証します。1 つのユーザ名がインターネット上のどこででも同じユーザを示しているという保証がないためです。たとえば、office.com から接続したユーザ joe は、elsewhere.com から接続した joe と同一人物とは限りません。
MySQL では、同じユーザ名でも異なるホストから接続するユーザ間で区別することにより、このことを処理しています。joe に対して、office.com から接続した場合の権限セットと、elsewhere.com から接続した場合の権限セットを別々に設定できます。
MySQL のアクセス制御には 2 段階があります。
SELECT 権限があるかどうか、あるいはデータベースの DROP 権限があるかどうかをサーバがチェックする。
注意: 接続中に権限が変更された場合(ユーザ自身または第三者によって)、必ずしもその変更は次のクエリに反映されません。詳細については、 「4.4.3 権限の変更はいつ反映されるか」 を参照してください。
サーバはアクセス制御の両方の段階で、mysql データベースの user、db、host の各テーブルを使用します。これらの権限テーブルのフィールドを以下に示します。
| テーブル名 | user | db | host |
| スコープフィールド | Host | Host | Host
|
User | Db | Db |
|
Password | User | ||
| 権限フィールド | Select_priv | Select_priv | Select_priv
|
Insert_priv | Insert_priv | Insert_priv |
|
Update_priv | Update_priv | Update_priv |
|
Delete_priv | Delete_priv | Delete_priv |
|
Index_priv | Index_priv | Index_priv |
|
Alter_priv | Alter_priv | Alter_priv |
|
Create_priv | Create_priv | Create_priv |
|
Drop_priv | Drop_priv | Drop_priv |
|
Grant_priv | Grant_priv | Grant_priv |
|
References_priv | References_priv | References_priv |
|
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv | |||
Show_db_priv | |||
Super_priv | |||
Create_tmp_table_priv | Create_tmp_table_priv | Create_tmp_table_priv |
|
Lock_tables_priv | Lock_tables_priv | Lock_tables_priv |
|
Execute_priv | |||
Repl_slave_priv | |||
Repl_client_priv | |||
ssl_type | |||
ssl_cypher | |||
x509_issuer | |||
x509_cubject | |||
max_questions | |||
max_updates | |||
max_connections |
アクセス制御の 2 段階目(要求確認)で、要求がテーブルに関連するものである場合、サーバがさらに tables_priv テーブルおよび columns_priv テーブルを参照することがあります。これらのテーブルのフィールドを以下に示します。
| テーブル名 | tables_priv | columns_priv |
| スコープフィールド | Host | Host |
Db | Db |
|
User | User |
|
Table_name | Table_name |
|
Column_name |
||
| 権限フィールド | Table_priv | Column_priv |
Column_priv | ||
| その他のフィールド | Timestamp | Timestamp |
Grantor |
各権限テーブルには、スコープフィールドと権限フィールドがあります。
スコープフィールドは、テーブルの各登録の範囲を特定します。たとえば、Host と User の値が 'thomas.loc.gov' および 'bob' である user テーブルエントリは、thomas.loc.gov ホストからサーバに接続しようとする bob を認証します。同様に、Host、User、Db の各フィールドの値が 'thomas.loc.gov'、'bob'、および 'reports' である db テーブルエントリは、thomas.loc.gov ホストから reports データベースに接続しようとする bob を認証します。tables_priv テーブルおよび columns_priv テーブルには、各エントリに許可されているテーブルまたはテーブルとカラムの組み合わせを示すスコープフィールドが含まれています。
アクセスをチェックする目的において、Host 値は大文字と小文字の区別がありません。User、Password、Db、および Table_name の値については大文字と小文字が区別されます。
Column_name 値は、MySQL バージョン 3.22.12 以降では大文字と小文字が区別されなくなっています。
権限フィールドは、テーブル内のエントリごとに設定されている権限、つまり何の操作を実行できるかを示します。サーバはさまざまな権限テーブルの情報を組み合わせて、ユーザの権限についての完全な記述を生成します。 この動作に適用されるルールについては、 「4.3.10 アクセス制御の段階 2: 要求確認」 を参照してください。
スコープフィールドは文字列です。ここで示されているように、それぞれのデフォルト値は空の文字列です。
| フィールド名 | 型 | 注意 |
Host | CHAR(60) | |
User | CHAR(16) | |
Password | CHAR(16) | |
Db | CHAR(64) | (tables_priv テーブルおよび columns_priv テーブルでは CHAR(60)) |
Table_name | CHAR(60) | |
Column_name | CHAR(60) |
user、db、host の各テーブルでは、すべての権限フィールドが ENUM('N','Y') として宣言されます。それぞれの値は 'N' または 'Y' で、デフォルト値は 'N' です。
tables_priv テーブルおよび columns_priv テーブルでは、権限フィールドは SET フィールドとして宣言されます。
| テーブル名 | フィールド名 | 設定可能な要素 |
tables_priv |
Table_priv
| 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
|
tables_priv |
Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
columns_priv |
Column_priv
| 'Select', 'Insert', 'Update', 'References'
|
以下、サーバが権限テーブルをどのように使用するか簡潔に説明します。
user テーブルのスコープフィールドにより、着信した接続を許可するか拒否するか決定する。許可された接続について、user テーブルに設定されている権限はいずれも、そのユーザのグローバル(スーパーユーザ)権限になる。
これらの権限は、サーバのすべてのデータベースに適用される。
db テーブルと host テーブルは一緒に使用される。
db テーブルのスコープフィールドにより、どのユーザがどのホストからどのデータベースにアクセスできるかを決定する。権限フィールドから、何の操作が許可されているか判断する。
host テーブルは、任意の db テーブルエントリをいくつかのホストに適用する場合、db テーブルを補完するものとして使用される。たとえば、1 人のユーザにネットワーク内のいくつかのホストからデータベースへアクセスすることを許可する場合、ユーザの db テーブルエントリの Host 値を空白のままにしておき、それらのホストの各エントリを host テーブルに入力する。このメカニズムの詳細については、 「4.3.10 アクセス制御の段階 2: 要求確認」 を参照のこと。
tables_priv テーブルおよび columns_priv テーブルは db テーブルに似ているが、より詳細な設定が可能。データベースレベルではなく、テーブルおよびカラムレベルで適用される。
注意: 管理者権限(RELOAD、SHUTDOWN など)は、user テーブルでのみ指定します。管理操作はデータベース固有ではなく、サーバそのもので行う操作なので、この権限を他の権限テーブルで設定する必要はありません。実際、管理操作を実行できるかどうか決定する際には、user テーブルを参照するだけで済みます。
FILE 権限も user テーブルだけで指定します。
これは管理者権限ではありませんが、サーバホスト上でのファイルの読み書きは、アクセスしているデータベースに依存しません。
mysqld サーバは権限テーブルの内容を、起動時に 1 回読み取ります。権限テーブルへの変更の反映については、 「4.4.3 権限の変更はいつ反映されるか」 を参照してください。
権限テーブルの内容を変更する場合、その変更によって、目的の権限が適切に設定されていることを確認してください。問題診断のヘルプについては、 「4.3.12 Access denied エラーの原因」 を参照してください。セキュリティに関するアドバイスについては、 「4.3.2 MySQL のクラッカー対策」 を参照してください。
便利な診断ツールとして、mysqlaccess スクリプトがあります。これは、Yves Carlier が MySQL ディストリビューション用に提供したものです。このツールの動作を確認したい場合には、mysqlaccess を --help オプションで起動してください。
注意: mysqlaccess は user、db、および host テーブルだけを使用してアクセスをチェックします。テーブルまたはカラムレベルの権限はチェックしません。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ユーザ権限に関する情報は、mysql データベース(mysql という名前のデータベース)の user、db、host、tables_priv、columns_priv の各テーブルに保存されています。MySQL サーバは起動時と、 「4.4.3 権限の変更はいつ反映されるか」 で説明されている状況下において、これらのテーブルを読み取ります。
以下、このマニュアルで使用されている MySQL バージョン 4.0.2 提供の権限名を、それに関連付けられているテーブルカラム名およびその適用範囲とともに示します。各権限の意味については、 「4.4.1 GRANT および REVOKE の構文」 を参照してください。
| 権限 | カラム | 適用範囲 |
ALTER | Alter_priv | テーブル |
DELETE | Delete_priv | テーブル |
INDEX | Index_priv | テーブル |
INSERT | Insert_priv | テーブル |
SELECT | Select_priv | テーブル |
UPDATE | Update_priv | テーブル |
CREATE | Create_priv | データベース、テーブル、またはインデックス |
DROP | Drop_priv | データベースまたはテーブル |
GRANT | Grant_priv | データベースまたはテーブル |
REFERENCES | References_priv | データベースまたはテーブル |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | サーバ管理 |
EXECUTE | Execute_priv | サーバ管理 |
FILE | File_priv | サーバ上のファイルアクセス |
LOCK TABLES | Lock_tables_priv | サーバ管理 |
PROCESS | Process_priv | サーバ管理 |
RELOAD | Reload_priv | サーバ管理 |
REPLICATION CLIENT | Repl_client_priv | サーバ管理 |
REPLICATION SLAVE | Repl_slave_priv | サーバ管理 |
SHOW DATABASES | Show_db_priv | サーバ管理 |
SHUTDOWN | Shutdown_priv | サーバ管理 |
SUPER | Super_priv | サーバ管理 |
SELECT、INSERT、UPDATE、DELETE の各権限は、データベース上の既存テーブルのレコードに対する各操作を許可するものです。
SELECT ステートメントは、テーブルからレコードを実際に取り出す場合のみ、SELECT 権限が必要となります。サーバのデータベースへのアクセス権がなくても実行できる SELECT ステートメントもあります。たとえば、mysql クライアントをシンプルな計算機として使用するような場合です。
mysql> SELECT 1+1; mysql> SELECT PI()*2; |
INDEX 権限では、インデックスを作成または破棄(削除)できます。
ALTER 権限では、ALTER TABLE を使用できます。
CREATE および DROP 権限では、新規データベースおよびテーブルの作成、既存データベースおよびテーブルの破棄(削除)を行えます。
注意: ユーザに mysql データベースに対する DROP 権限を与えると、そのユーザは MySQL アクセス権限が保存されているデータベースを破棄できるということになるので注意が必要です。
GRANT 権限では、ユーザが所有している権限を他のユーザに与えることができます。
FILE 権限では、LOAD DATA INFILE および SELECT ... INTO OUTFILE ステートメントを使用してサーバ上でファイルの読み書きを行えます。この権限を与えられたユーザはだれでも、MySQL サーバによってアクセス可能な読み取り可能ファイルをすべて読むことができ、また MySQL サーバによって書き込めるどのディレクトリにも新規読み取り可能ファイルを作成できます。
このユーザはまた、カレントデータベースディレクトリ内のすべてのファイルを読むことができます。
ただし、既存ファイルの変更はできません。
これら以外の権限は、mysqladmin プログラムを使用して実行される管理操作用に使用されます。以下の表で、どの管理権限でどの mysqladmin コマンドを実行できるかを示します。
| 権限 | 実行可能なコマンド |
RELOAD | reload、refresh、flush-privileges、flush-hosts、flush-logs、flush-tables |
SHUTDOWN | shutdown |
PROCESS | processlist |
SUPER | kill |
reload コマンドは、権限テーブルを再読み込みするようにサーバに命令します。refresh コマンドは、すべてのテーブルをフラッシュし、ログファイルを開いて閉じます。flush-privileges は reload のシノニムです。他の flush-* コマンドも refresh と同様の機能を果たしますが、範囲が限られており、状況によって使い分けてください。たとえば、ログファイルだけをフラッシュするには、refresh の代わりに flush-logs を使用します。
shutdown コマンドはサーバをシャットダウンします。
processlist コマンドは、サーバで実行中のスレッドに関する情報を表示します。kill コマンドはサーバスレッドを強制終了します。ユーザはいつでも自分のスレッドを表示および強制終了することができますが、他のユーザによって開始されたスレッドを表示するには PROCESS 権限が、強制終了するには SUPER 権限が必要です。 「4.6.7 KILL 構文」 節 参照 。
一般的な指針として、ユーザにはそのユーザが必要とする権限だけを与えてください。また、以下の権限を与える際には注意が必要です。
GRANT 権限は、ユーザが自分の権限を他のユーザに与えることができる。2 人のユーザが異なる権限を持ち、両方とも GRANT 権限がある場合、お互いの権限を組み合わせることができる。
ALTER 権限は、テーブルの名前を変更することにより、権限システムを崩壊させることができる。
FILE 権限を悪用すれば、サーバの読み取り可能ファイルまたはカレントデータベースディレクトリのファイルをデータベーステーブルに読み込んで、SELECT を使用してその内容にアクセスできる。
SHUTDOWN 権限を悪用すれば、サーバを終了して、他のユーザへのサービス妨害を行うことができる。
PROCESS 権限は、パスワードの設定や変更を行うクエリなども含め、現在実行中のクエリのプレーンテキストを表示することができる。
mysql データベースの権限があれば、パスワードおよびその他のアクセス権限情報を変更することができる(パスワードは暗号化されて保存されているため、悪意のあるユーザが単に読み取ってもテキスト形式のパスワードを知ることはできない)。mysql.user パスワードカラムにアクセスできれば、それを使用して特定ユーザの MySQL サーバにログインできる(必要とされる権限を持っていれば、そのユーザはパスワードを書き換えることもできる)。
MySQL 権限システムでは達成できないこともいくつかあります。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL クライアントでは通常、MySQL サーバにアクセスする際、接続先のホスト、ユーザ名、パスワードといった接続パラメータを指定する必要があります。たとえば、mysql クライアントは以下のように開始することができます(オプション引数は `[' と `]' で囲んであります)。
shell> mysql [-h host_name] [-u user_name] [-pyour_pass] |
-h、-u、および -p オプションの別の形として、--host=host_name、--user=user_name、および --password=your_pass があります。注意: -p または --password= とそれに続くパスワードの間にスペースは入りません。
注意: コマンドラインでパスワードを指定するのは安全ではありません。
同じシステム内のどのユーザでも、ps auxww のようなコマンドを使用してパスワードを知ることができてしまいます。 「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
mysql は、コマンドラインで指定されなかった接続パラメータに以下のデフォルト値を使用します。
localhost。
-p が指定されなければ、パスワードは無しになる。
したがって、Unix ユーザ joe では、以下のコマンドがいずれも同じ意味になります。
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql |
他の MySQL クライアントでも同様です。
Unix システムでは、接続時に別のデフォルト値を使用するように設定することができます。これにより、クライアントプログラムを起動するたびにコマンドラインで指定する必要がなくなります。設定方法は 2 つあります。
[client] セクションで接続パラメータを指定する。このセクションは以下のようになる。
[client] host=host_name user=user_name password=your_pass |
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
mysql のホストは、MYSQL_HOST を使用して指定できる。MySQL ユーザ名は、USER を使用して指定できる(Windows のみ)。パスワードは、MYSQL_PWD を使用して指定できる(ただし、これは安全ではない。次のセクションを参照のこと)。 「F. 環境変数」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ユーザが MySQL サーバに接続しようとした場合、そのユーザ ID、およびそれを正しいパスワードで裏付けできるかどうかによって、サーバは接続の許可または拒否を行います。パスワードが正しくない場合、サーバはアクセスを完全に拒否します。正しければ、サーバは接続を許可し、段階 2 に進んで要求を待ちます。
ユーザ ID は、2 つの情報に基づきます。
ID チェックには、user テーブルの 3 つのスコープフィールド(Host、User、Password)が使用されます。user テーブルエントリが、指定されたホスト名とユーザ名に一致し、入力したパスワードが正しかった場合のみ、接続が許可されます。
user テーブルのスコープフィールドには次の方法で値を指定できます。
Host 値にはホスト名または IP アドレスを使用できる。ローカルホストを指定する場合は 'localhost' を使用する。
Host フィールドに使用できる。
Host 値としての '%' は、すべてのホスト名を意味する。
Host 値は、該当するホスト名に一致する host テーブルによって決定することを意味する。
詳細については、次の章を参照のこと。
Host 値に、ネットワークアドレスを示すためのネットマスクを使用できるようになっている。次に例を示す。
mysql> GRANT ALL PRIVILEGES ON db.*
-> TO david@'192.58.197.0/255.255.255.0';
|
これにより、以下の条件に当てはまる IP からだれでも接続できるようになる。
user_ip & netmask = host_ip. |
上の例では、192.58.197.0 〜 192.58.197.255 間の IP すべてが MySQL サーバに接続できる。
User フィールドにワイルドカード文字は使用できないが、空白の値は使用でき、これは任意のユーザ名と一致する。 user テーブルエントリに空白のユーザ名があり、接続が空白ユーザーにマッチした場合、そのユーザはクライアントが実際に指定した名前のユーザではなく、匿名ユーザ(名前なしのユーザ)と見なされる。この場合、接続中(段階 2 の間)に行われる後続のアクセスチェックはすべて、空白のユーザ名で行われる。
Password フィールドは空白にできる。これはどのパスワードにも一致するという意味ではなく、そのユーザがパスワード指定せずに接続する必要があるという意味である。
空白ではない Password 値は、暗号化パスワードを表します。
MySQL では、パスワードを平文テキストでは保存しません。接続しようとするユーザが入力したパスワードは、暗号化されます(PASSWORD() 関数を使用)。クライアントおよびサーバがパスワードの確認を行う際、その暗号化されたパスワードが使用されます(このとき、その接続を使って、暗号化されたパスワードが転送されることはありません)。注意: MySQL から見ると暗号化されたパスワードが実際のパスワードなので、暗号化パスワードにだれにもアクセスできないようにしてください。特に、一般のユーザに mysql データベース内のテーブルの読み取りアクセス権を与えないでください。
バージョン 4.1 より、MySQL は従来とは異なるパスワードおよびログインメカニズムを採用しており、TCP/IP パケットが盗み見されたり、mysql データベースがキャプチャされた場合でも安全になっています。
以下の例は、user テーブルエントリの Host 値および User 値のさまざまな組み合わせがどのように着信の接続に適用されるかを示したものです。
Host 値 | User 値 | エントリによって許可される接続 |
'thomas.loc.gov' | 'fred' | thomas.loc.gov から接続する fred |
'thomas.loc.gov' | " | thomas.loc.gov から接続するすべてのユーザ |
'%' | 'fred' | 任意のホストから接続する fred |
'%' | " | 任意のホストから接続するすべてのユーザ |
'%.loc.gov' | 'fred' | loc.gov ドメイン内の任意のホストから接続する fred |
'x.y.%' | 'fred' | x.y.net、x.y.com、x.y.edu などから接続する fred(これは実用的ではない) |
'144.155.166.177' | 'fred' | IP アドレス 144.155.166.177 のホストから接続する fred |
'144.155.166.%' | 'fred' | 144.155.166 クラス C サブネットの任意のホストから接続する fred |
'144.155.166.0/255.255.255.0' | 'fred' | 1 つ上の例と同じ |
Host フィールドでは IP のワイルドカード値を使用できるので(たとえば、'144.155.166.%' で、サブネットのすべてのホストに一致)、ホストを 144.155.166.somewhere.com などと名付けてこの機能が悪用される可能性があります。これを防ぐため、MySQL は数値やドットで始まるホスト名を認めません。したがって、1.2.foo.com などのホスト名は、権限テーブルの Host カラムと決して一致しません。IP アドレスのみ IP ワイルドカード値との突き合わせが可能です。
ある接続が、user テーブルの複数のエントリと一致することがあります。たとえば、thomas.loc.gov からの fred による接続は、上記の表のいくつかのエントリと一致します。複数のエントリが一致した場合、サーバは次のようにエントリを選択します。起動時に user テーブルを読み込んだ後、それをソートします。ユーザが接続しようとしたとき、そのソート順でエントリとの突き合わせを行います。そして最初に一致したエントリを使用します。
user テーブルのソートは以下のように行われます。user テーブルが以下の内容であるとします。
+-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+- |
サーバがテーブルを読み込むと、最も具体的な Host 値を最初にもってきます(Host カラムの '%' は "任意のホスト" を意味し、具体性が低いとなります)。同じ Host 値のエントリ間で、最も具体的な User 値を最初にもってきます(空白の User 値は "任意のユーザ" を意味し、具体性が低いとなります)。ソートされた user テーブルは以下のようになります。
+-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+- |
接続が試みられると、サーバはソートされたエントリで突き合わせを行い、最初に一致したものを使用します。localhost からの jeffrey による接続に対しては、Host カラムが 'localhost' のエントリが最初に一致します。これらのうち、空白ユーザ名のエントリが接続ホスト名とユーザ名の両方で一致します('%'/'jeffrey' エントリも一致しますが、これはテーブル内での最初の突き合わせにはなりません)。
もう 1 つ例を示します。user テーブルが以下の内容であるとします。
+----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+- |
ソートされたテーブルは以下のようになります。
+----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+- |
thomas.loc.gov からの jeffrey による接続は最初のエントリと一致し、whitehouse.gov からの jeffrey による接続は 2 番目のエントリと一致します。
サーバが接続の突き合わせを行うとき、指定されたユーザ名を明示的に示すすべてのエントリが最初に使用されると誤解しがちです。これは間違っています。上記の例でもわかるように、thomas.loc.gov からの jeffrey による接続は、'jeffrey' が User フィールド値であるエントリではなく、ユーザ名なしのエントリと最初に一致します。
サーバへの接続がうまくいかない場合、user テーブルを出力して、最初の突き合わせがどれか確認してください。
正常に接続が行われても、権限が予期したものと違う場合、CURRENT_USER() 関数(バージョン 4.0.6 で導入)を使用して、その接続に実際に一致しているユーザとホストの組み合わせを確認できます。 「6.3.6.2 その他の各種関数」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
接続が確立すると、サーバは段階 2 に移行します。その接続での要求ごとに、サーバはユーザにそれを実行できる権限があるかどうかを、操作タイプに基づいてチェックします。ここで、権限テーブルの権限フィールドが関係してきます。権限は、user、db、host、tables_priv、columns_priv のテーブルで設定できます。権限テーブルの設定は、GRANT コマンドと REVOKE コマンドで行います。
「4.4.1 GRANT および REVOKE の構文」 節 参照 。 各権限テーブルのフィールドのリストについては、 「4.3.6 権限システムはどのように機能するか」 を参照してください。
user テーブルは、カレントデータベースに関係なく、ユーザに対してグローバルに権限を設定します。たとえば、user テーブルで DELETE 権限が設定されたユーザは、そのサーバホストのどのデータベースのレコードでも削除できます。つまり、user テーブルで許可された権限はスーパーユーザ権限です。user テーブルで権限を設定する対象は、サーバ管理者やデータベース管理者などのスーパーユーザだけにしておくのが賢明です。他のユーザについては、user テーブルの権限を 'N' に設定しておき、db テーブルおよび host テーブルを使用してデータベース依存で権限を設定してください。
db テーブルおよび host テーブルは、データベース依存の権限を設定します。
スコープフィールドには次の方法で値を指定できます。
Host フィールドと Db フィールドで使用できる。たとえば、`_' 文字をデータベース名の一部として使用するには、GRANT コマンドで `\_' として指定する。
db テーブルの '%' Host 値は、"任意のホスト" を意味する。db テーブルの空白の Host 値は、"host テーブルを参照すること" を意味する。
host テーブルの '%' または空白の Host 値は、"任意のホスト" を意味する。
'%' または空白の Db 値は、"任意のデータベース" を意味する。
User 値は、匿名ユーザを意味する。
db テーブルおよび host テーブルは、サーバ起動時に読み取られてソートされます(user テーブル読み込みと同時)。db テーブルは Host、Db、および User のスコープフィールドでソートされ、host テーブルは Host と Db のスコープフィールドでソートされます。user テーブルでは、最も具体的な値が最初に、最も抽象的な値が最後にソートされ、サーバによるエントリの突き合わせでは、最初に一致したエントリが使用されます。
tables_priv テーブルと columns_priv テーブルはそれぞれ、テーブル依存およびカラム依存の権限を設定します。スコープフィールドには次の方法で値を指定できます。
Host フィールドで使用できる。
'%' または空白の Host 値は、"任意のホスト" を意味する。
Db、Table_name、Column_name の各フィールドで、ワイルドカードおよび空白を使用できない。
tables_priv テーブルおよび columns_priv テーブルは、Host、Db、および User のフィールドでソートされます。これは db テーブルのソートと同様ですが、ワイルドカードの使用が Host フィールドだけに限定されるので、よりシンプルです。
以下、要求確認プロセスについて説明します。アクセスチェックのソースコードを知っている読者は、ここでの説明とコードで使用されるアルゴリズムに少し違いがあることに気付かれるでしょうが、説明はコードが実際に行うことと同じで、違いは説明をシンプルにするためのものです。
管理要求(SHUTDOWN、RELOAD など)に対して、サーバは user テーブルエントリだけをチェックします。管理権限を指定するのはこのテーブルのみであるためです。そのエントリが要求された操作を許可している場合はアクセスが認められ、そうでない場合は拒否されます。たとえば、mysqladmin shutdown を実行しようとしても、user テーブルエントリで SHUTDOWN 権限が設定されていなければ、db テーブルや host テーブルをチェックすることなくアクセスは拒否されます(これらのテーブルには Shutdown_priv カラムがなく、チェックの必要性がありません)。
データベース関連の要求(INSERT、UPDATE など)に対しては、サーバは最初に、user テーブルエントリでユーザのグローバル(スーパーユーザ)権限をチェックします。ここで、要求されている操作が許可されていれば、アクセスが認められます。user テーブルのグローバル権限では十分でない場合、サーバはユーザのデータベースに関する権限を db テーブルおよび host テーブルでチェックします。
db テーブルの Host、Db、User の各フィールドをチェックする。Host フィールドと User フィールドでは、接続ユーザのホスト名と MySQL ユーザ名がチェックされる。Db フィールドでは、ユーザがアクセスしようとしているデータベースがチェックされる。Host および User に該当するエントリがない場合、アクセスは拒否される。
db テーブルに、マッチするエントリがあり、その Host フィールドが空白でなければ、そのエントリが、ユーザのデータベースに対する権限を定義する。
db テーブルにある、マッチするエントリの Host フィールドが空白の場合、これは host テーブルが、データベースにアクセスできるホストを指定することを意味する。この場合、host テーブルの Host フィールドと Db フィールドがチェックされる。
host テーブル内にマッチするエントリがなければ、アクセスは拒否される。マッチするエントリがあれば、ユーザのデータベースに対する権限が、db および host テーブルエントリの(和集合ではなく)共通集合として計算される。これは、両方のエントリで 'Y' に設定されている権限を指す。このように、db テーブルエントリで全般的な権限を設定し、host テーブルエントリでホストごとに権限を制限することができる。
サーバは、db および host テーブルエントリからデータベースに対する権限を特定したら、それらの権限を user テーブルで設定されているグローバル権限に足し合わせます。その結果、要求されている操作が許可されていれば、アクセスが認められます。そうでない場合、サーバは tables_priv テーブルと columns_priv テーブルでユーザのテーブル権限とカラム権限をチェックし、これらをユーザの権限に追加します。その結果に基づき、アクセスが許可または拒否されます。
ブール値で表すと、上記のユーザ権限算出法は以下のようにまとめることができます。
グローバル権限 OR (database アクセス権 AND host アクセス権) OR table アクセス権 OR column アクセス権 |
user 内のグローバル権限が十分ではない場合に、サーバがその不十分なグローバル権限を、データベース、テーブル、およびカラム権限と足し合わせる理由はわかりにくいかもしてません。
その理由は、要求に複数の権限が必要な場合があるからです。たとえば、INSERT ... SELECT ステートメントを実行するには、INSERT 権限および SELECT 権限の両方が必要です。
そのうち 1 つの権限が user テーブル内のエントリにあり、もう 1 つの権限が db テーブル内のエントリにある場合があります。その場合、要求を実行するのに必要な権限をユーザは持っていますが、サーバはどちらか一方のテーブルだけでは判断できません。この場合、両テーブルのエントリにある権限を組み合わせる必要があります。
host テーブルを使用して、セキュリティで保護されたサーバのリストを管理することができます。
TcX DataKonsult AB では、host テーブルに、ローカルネットワーク上のすべてのコンピュータの一覧を入れています。これらにすべての権限を設定しています。
host テーブルを使用して、セキュリティで保護されていないホストを示すこともできます。
セキュリティで保護されていない公開エリア内に、コンピュータ public.your.domain があるとします。以下のように、host テーブルのエントリを使用して、ネットワーク内のそのコンピュータ以外の全ホストにアクセスを許可することができます。
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (全権限を 'N' にセット) | %.your.domain | % | ... (全権限を 'Y' にセット) +--------------------+----+- |
当然、権限テーブルは常にテストして(mysqlaccess などを使用)、アクセス権限が目的どおりに設定されていることを確認してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL ユーザアカウントは、mysql データベースの user テーブルにリストアップされています。各 MySQL アカウントにはパスワードが割り当てられますが、user テーブルの Password カラムに保存されるのは平文テキストのパスワードではなく、パスワードから計算されたハッシュ値です。パスワードハッシュ値は、PASSWORD() 関数によって計算されます。
MySQL は、クライアントとサーバ間通信の 2 つのフェーズでパスワードを使用します。
GRANT または SET PASSWORD ステートメントを使用する。
つまり、クライアントが最初に接続しようとする際、サーバが認証するのにハッシュ値を使用します。接続したクライアントが PASSWORD() 関数を実行したり、GRANT または SET PASSWORD ステートメントを使用してパスワードの設定または変更を行うと、サーバがハッシュ値を生成します。
パスワードハッシュメカニズムは MySQL 4.1 で更新され、セキュリティが向上し、パスワード盗難の危険性が少なくなっています。
ただし、この新しいメカニズムは 4.1 サーバと 4.1 クライアントしか理解できないため、互換性の問題があります。
4.1 クライアントはパスワードハッシュの新旧メカニズムの両方を理解できるので、4.1 より前のサーバにでも接続できます。しかし、4.1 より前のクライアントが 4.1 サーバに接続しようとすると、問題が発生する可能性があります。たとえば、4.0 mysql クライアントが 4.1 サーバに接続しようとすると、以下のエラーメッセージが表示される可能性があります。
shell> mysql Client does not support authentication protocol requested by server; consider upgrading MySQL client |
以下、以前のパスワードメカニズムと新しいパスワードメカニズムとの違い、およびサーバを 4.1 にアップグレードしたときに 4.1 より前のクライアントと互換性を保つ方法について説明します。
注意: ここでの説明は 4.1 とそれ以前の動作を対比するものですが、ここで説明する 4.1 の動作は実際には 4.1.1 からのものです。MySQL 4.1.0 の動作は、4.1.1 以降で導入されたメカニズムと少し異なります。4.1.0 とそれ以降のバージョンとの違いについては、後で説明します。
MySQL 4.1 より前は、PASSWORD() 関数によって計算されるパスワードハッシュは 16 バイト長でした。次に例を示します。
mysql> SELECT PASSWORD('mypass');
+--------------------+
| PASSWORD('mypass') |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
|
MySQL 4.1 より前は、user テーブルの Password カラム(ハッシュが保存される場所)も 16 バイト長でした。
MySQL 4.1 から、PASSWORD() 関数が、より長い 41 バイトのハッシュ値を生成するようになっています。
mysql> SELECT PASSWORD('mypass');
+-----------------------------------------------+
| PASSWORD('mypass') |
+-----------------------------------------------+
| *43c8aa34cdc98eddd3de1fe9a9c2c2a9f92bb2098d75 |
+-----------------------------------------------+
|
したがって、この長さの値を保存するため、user テーブルの Password カラムも 41 バイト長であることが必要です。
Password カラムは自動的に 41 バイト長になる。
mysql_fix_privilege_tables スクリプトを実行して Password カラムを 16 バイト長から 41 バイト長に変更する必要がある。このスクリプトは既存のパスワード値を変更しない。既存のものは 16 バイト長のままである。
拡張された Password カラムは、新旧どちらの形式のパスワードハッシュも保存できます。与えられたパスワードハッシュ値の形式は次の 2 つの違いにより判断されます。
長いパスワードハッシュ形式の方が暗号化の面で優れており、クライアント認証において旧形式の短いハッシュよりもセキュリティが高いと言えます。
パスワードハッシュの長短の違いは、認証時にサーバがパスワードを使用する方法と、パスワードを変更する接続クライアントに対してサーバがパスワードハッシュを生成する方法に関係してきます。
認証時にサーバがパスワードを使用する方法は、Password カラムの幅により次のような影響を受けます。
短いハッシュのアカウントでも、4.1 クライアントの方が旧クライアントよりも認証プロセスのセキュリティが少し向上しています。認証のセキュリティは以下の順で高くなります。
接続クライアントに対してサーバがパスワードハッシュを生成する方法は、Password カラムの幅と --old-passwords オプションにより影響を受けます。4.1 サーバは、次の条件が満たされた場合だけ、長いハッシュを生成します。
Password カラムが長いハッシュ値を保存できる長さであること、および --old-passwords オプションが指定されていないことが必要です。
これらの条件は以下のように適用されます。
Password カラムが長いハッシュを保存できる長さ(41 バイト)であること。
カラムが更新されておらず、4.1 より前の長さ(16 バイト)のままだと、クライアントが PASSWORD()、GRANT、または SET PASSWORD を使用してパスワード変更操作を行ったとき、長いハッシュが収まらないことをサーバが認識し、短いハッシュを生成する
(4.1 にアップグレードしたが、mysql_fix_privilege_tables スクリプトを実行せず、Password カラムが長くなっていない場合にこのようになる)。
Password カラムが長ければ、長短どちらのパスワードハッシュも保存できる。この場合、サーバが --old-passwords オプションで起動されていなければ、PASSWORD()、GRANT、および SET PASSWORD により長いハッシュが生成される。 このオプションが指定されていると、強制的に短いパスワードハッシュが生成される。
--old-passwords オプションの目的は、サーバが長いパスワードハッシュを生成する環境において、4.1 より前のクライアントと下位互換性を保てるようにすることです。これは認証には影響しませんが(4.1 クライアントは長いパスワードハッシュのアカウントを使用できる)、パスワード変更操作の結果として user テーブルで長いパスワードハッシュが生成されることを防ぎます。長いパスワードハッシュが生成されると、そのアカウントは 4.1 より前のクライアントでは使用できなくなります。--old-passwords オプションを指定しない場合、以下のシナリオが想定されます。
--old-passwords が指定されていない場合、アカウントに対して長いパスワードハッシュが生成される。
user テーブルでアカウントに対して長いパスワードハッシュが生成された場合、4.1 クライアントのみそれを認証できる。4.1 より前のクライアントでは長いハッシュを理解できない。
このシナリオでは、4.1 より前の旧クライアントをサポートする必要がある場合、--old-passwords オプションを使用せずに 4.1 サーバを起動するのは危険であることを示しています。--old-passwords を指定してサーバを起動することにより、パスワード変更操作を行っても長いパスワードハッシュは生成されません。したがって、旧クライアントがアカウントにアクセスできなくなることがありません(旧クライアントが、パスワード変更時、偶発的に長いパスワードハッシュを生成して自らをロックアウトすることはありません)。
--old-passwords オプションの欠点は、4.1 クライアントでも、パスワード作成または変更時に短いハッシュを使用するということです。そのため、長いパスワードハッシュによる高いセキュリティを活用できません。4.1 クライアント用などに長いハッシュのアカウントを作成したい場合には、--old-passwords なしでサーバを実行する必要があります。
4.1 サーバの実行には以下のシナリオが想定されます。
シナリオ 1. user テーブルの短い Password カラム
Password カラムには短いハッシュのみ保存できる。
PASSWORD()、GRANT、または SET PASSWORD を使用するパスワードハッシュ生成操作で短いハッシュだけを使用する。アカウントのパスワードを変更すると、必ず短いパスワードハッシュになる。
--old-passwords オプションは使用できるが、意味がない。短い Password カラムでは、サーバは短いパスワードハッシュしか生成しない。
シナリオ 2. 長い Password カラム、サーバを --old-passwords オプションなしで起動
Password カラムには長短いずれのハッシュも保存できる。
PASSWORD()、GRANT、または SET PASSWORD を使用するパスワードハッシュ生成操作で長いハッシュだけを使用する。アカウントのパスワードを変更すると、必ず長いパスワードハッシュになる。
OLD_PASSWORD() を使用して、明示的に短いハッシュを生成するようにできる。たとえば、アカウントに短いパスワードを割り当てるには、以下のように UPDATE を使用する。
mysql> UPDATE user SET Password = OLD_PASSWORD('mypass')
-> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;
|
上述したように、このシナリオでは、短いパスワードハッシュのアカウントに、4.1 より前のクライアントがアクセスできなくなる危険性があります。GRANT、SET PASSWORD、または PASSWORD() を使用してアカウントのパスワードを変更すると、新規パスワードハッシュが長くなるため、4.1 より前のクライアントは、4.1 にアップグレードしないとそのアカウントを認証できなくなります。
シナリオ 3. 長い Password カラム、サーバを --old-passwords オプションで起動
Password カラムには長短いずれのハッシュも保存できる。
--old-passwords なしで起動したときだけ可能)。
PASSWORD()、GRANT、または SET PASSWORD を使用するパスワードハッシュ生成操作で短いハッシュだけを使用する。アカウントのパスワードを変更すると、必ず短いパスワードハッシュになる。
このシナリオでは、--old-passwords によって長いハッシュが生成されないため、長いパスワードハッシュのアカウントを作成できません。また、--old-passwords オプションを使用する前に長いハッシュのアカウントを作成した場合でも、--old-passwords の有効時にアカウントのパスワードを変更すると短いパスワードになってしまうので、長いハッシュが持つセキュリティ上の利点が失われます。
これらのシナリオの欠点はそれぞれ以下のように要約できます。
シナリオ 1. セキュリティの高い認証を提供する長いハッシュを活用できない。
シナリオ 2. OLD_PASSWORD() を使用せずにパスワードを変更すると、短いハッシュのアカウントに 4.1 より前のクライアントがアクセスできなくなる。
シナリオ 3. --old-passwords によって、短いハッシュのアカウントがアクセス不能になることは防がれるが、長いハッシュをパスワード変更すると短いハッシュになってしまい、--old-passwords が有効な間はそれを元の長さに戻せない。
MySQL 4.1 にアップグレードすると、独自の目的で PASSWORD() を使用してパスワードを生成するアプリケーションとの互換性に問題が生じます。本来、PASSWORD() は MySQL ユーザのパスワード管理専用なので、アプリケーションでこれを実行すべきではありません。しかし現状では、いくつかのアプリケーションが独自の目的で PASSWORD() を使用しています。4.1 にアップグレードし、長いパスワードハッシュが生成される状態でサーバを実行すると、独自の目的で PASSWORD() を使用するアプリケーションは壊れます。推奨される対処法は、アプリケーションを修正して SHA1() または MD5() など、別の関数を使用してハッシュ値を生成するように設定することです。
それが可能でなければ、OLD_PASSWORD() 関数を使用することができます。これは、旧形式の短いハッシュを生成するためのものです(注意: ただし、OLD_PASSWORD() は将来サポートされなくなる可能性があります)。
短いハッシュを生成する状態でサーバが実行中の場合、OLD_PASSWORD() は利用可能ですが、PASSWORD() と同じになります。
MySQL 4.1.0 のパスワードハッシュは 4.1.1 以降のパスワードハッシュと異なります。 4.1.0 の違いは以下のとおりです。
PASSWORD() 関数は繰り返し不可。つまり、特定の引数 X で、連続して PASSWORD(X) を呼び出すと異なる結果が生成される。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
Access denied エラーの原因
MySQL サーバに接続しようとして Access denied エラーが発生した場合の対処法を、以下に示します。
mysql_install_db スクリプトを実行して権限テーブルを初期設定していなければ、これを行う。
「4.4.4 MySQL 権限の初期設定」 節 参照 。 以下のコマンドを実行して初期権限をテストする。
shell> mysql -u root test |
エラーが発生することなく接続できるはずである。また、MySQL データベースディレクトリに `user.MYD' ファイルがあることを確認する。
通常、これは `PATH/var/mysql/user.MYD' である。ここで PATH は、MySQL インストール先ディレクトリのパス名である。
shell> mysql -u root mysql |
MySQL root ユーザには、最初パスワードがないため、問題なく接続できるはずである。これはセキュリティ上のリスクでもあるため、他の MySQL ユーザをセットアップするとき、同時に root パスワードも設定すべきである。
root として接続しようとして以下のエラーが表示された場合
Access denied for user: '@unknown' to database mysql |
これは、user テーブルの User カラムに 'root' 値がなく、mysqld がクライアントのホスト名を解決できないことを意味する。この場合、--skip-grant-tables オプションでサーバを再起動し、`/etc/hosts' ファイルまたは `\windows\hosts' ファイルを編集してホストのエントリを追加する必要がある。
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES) |
入力したパスワードが正しくないことを意味する。 「4.4.8 パスワードの設定」 節 参照 。
root のパスワードを忘れた場合、--skip-grant-tables オプションで mysqld を再起動してパスワードを変更できる。
「A.4.2 忘れたルートパスワードをリセットする方法」 節 参照 。
パスワードを指定していないにもかかわらず上記のエラーが発生する場合、何らかの my.cnf ファイルに正しくないパスワードが存在していることを意味する。 「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。 以下のように --no-defaults オプションを使用すると、オプション設定ファイルの使用を避けることができる。
shell> mysqladmin --no-defaults -u root ver |
mysql_fix_privilege_tables スクリプトを実行していなければ、これを実行する。GRANT ステートメントが導入された MySQL バージョン 3.22.11 では、権限テーブルの構造が変更されている。
「2.5.6 権限テーブルのアップグレード」 節 参照 。
INSERT、UPDATE、または SET PASSWORD ステートメントを使用してパスワードを設定する際には PASSWORD() 関数を使用することが必要である。GRANT ... IDENTIFIED BY ステートメントまたは mysqladmin password コマンドを使用してパスワードを指定する場合には、PASSWORD() 関数は不要である。
「4.4.8 パスワードの設定」 節 参照 。
localhost は、ユーザのローカルホスト名のシノニムである。また、ホストを明示的に指定せずにクライアントが接続しようとした場合のデフォルトホストでもある。ただし、MIT-pthread を使用するバージョン 3.23.27 より前の MySQL を使用している場合、localhost への接続は行われない(localhost 接続は Unix ソケットを使用して行われるが、これは当時の MIT-pthread にはサポートされていなかった)。このようなシステムでこの問題を回避するには、--host オプションを使用してサーバホストを明示的に指定する。これにより、mysqld サーバへの TCP/IP 接続が行われる。この場合、サーバホストの user テーブルエントリに実際のホスト名があることが必要である(これは、サーバと同じホスト上でクライアントプログラムを実行している場合も同様である)。
mysql -u user_name db_name でデータベースに接続しようとして Access denied エラーが発生する場合、user テーブルに問題がある可能性がある。mysql -u root mysql を実行し、以下の SQL ステートメントを実行して、これをチェックする。
mysql> SELECT * FROM user; |
この結果に、使用コンピュータのホスト名および MySQL ユーザ名とマッチする Host カラムおよび User カラムのエントリが含まれていなければならない。
Access denied エラーメッセージには、ログインしようとしているユーザ名、接続元のホスト、およびパスワードを使用したかどうかが示される。通常、エラーメッセージで表示されたホスト名とユーザ名に完全にマッチするエントリが 1 つ、user テーブルに存在していなければならない。Using password: NO を含むエラーメッセージが表示された場合、パスワードなしでログインしようとしたことを意味する。
user テーブルにないということである。
Host ... is not allowed to connect to this MySQL server |
これを解決するには、コマンドラインツール mysql をサーバホスト上で使用して、user、db、または host テーブルに、接続しようとしているユーザとホスト名の組み合わせのレコードを追加し、mysqladmin flush-privileges を実行する。
実行している MySQL がバージョン 3.22 ではなく、接続しようとしているコンピュータの IP アドレスまたはホスト名がわからない場合、user テーブルの Host カラムに '%' を設定し、サーバマシン上で --log オプションを使用して mysqld を再起動する。クライアントマシンから接続を試行すると、MySQL ログの情報により、実際の接続がどのように行われたかわかる。次に、user テーブルエントリの '%' の値を、ログで表示された実際のホスト名に置き換える。そうしないと、システムのセキュリティを保てない。
Linux 上でこの問題が発生した場合、考えられる他の原因としては、使用している glibc とは違うバージョンの glibc でコンパイルされたバイナリ MySQL バージョンを使用していることが挙げられる。この場合、OS/glibc をアップグレードするか、ソース MySQL バージョンをダウンロードして自分でコンパイルする。ソース RPM は通常、コンパイルおよびインストールが簡単なので、これは大きな問題ではない。
shell> mysqladmin -u root -pxxxx -h some-hostname ver Access denied for user: 'root@' (Using password: YES) |
これは、IP からホスト名に逆引きしようとしたときに MySQL でエラーが発生したことを意味する。この場合、mysqladmin flush-hosts を実行して内部 DNS キャッシュをリセットすることができる。 「5.5.5 MySQL の DNS の使用」 節 参照 。
恒久的な解決方法
--skip-name-resolve オプションで mysqld を開始する。
--skip-host-cache オプションで mysqld を開始する。
localhost に接続する。
/etc/hosts にクライアントマシン名を記入する。
mysql -u root test は正常終了するのに mysql -h your_hostname -u root test では Access denied となる場合、user テーブルに正しいホスト名がない可能性がある。
通常、このような場合、user テーブルエントリの Host 値が完全修飾されていないホスト名を指定し、システムの名前解決ルーチンが完全修飾されたドメイン名を返している(またはその逆)。
たとえば、user テーブルにホスト 'tcx' のエントリがあるが、DNS に MySQL にホスト名として 'tcx.subnet.se' を指示した場合、これは機能しない。この場合、Host カラム値としてホストの IP アドレスを持つ user テーブルエントリを追加してみる。または、Host 値として 'tcx.%' などのワイルドカードを含む user テーブルエントリを追加することもできる。ただし、`%' で終わるホスト名の使用は、安全ではないので、推奨できない。
mysql -u user_name test は正常終了するのに、mysql -u user_name other_db_name ではエラーが発生する場合、db テーブルに other_db_name のエントリがない。
mysql -u user_name db_name が動作するのに、別のクライアントマシンでは mysql -h host_name -u user_name db_name が動作しない場合、user テーブルまたは db テーブルにクライアントマシンが登録されていない。
Access denied の原因がわからない場合は、user テーブルから Host 値にワイルドカードが含まれているエントリ(`%' または `_' を含むエントリ)をすべて削除する。
よくある間違いは、Host='%' および User='some user' の新規エントリを挿入し、これで、同一マシンから接続する際には localhost を指定できると考えていることである。これがうまくいかない理由は、デフォルト権限として、Host='localhost' および User=" のエントリが含まれているためである。Host 値が 'localhost' の場合、'%' よりも具体的なため、localhost からの接続時に新しいエントリよりもデフォルト権限が優先される。正しい指定の方法は、Host='localhost' および User='some_user' の 2 つ目のエントリを挿入するか、Host='localhost' および User=" のエントリを削除することである。
db テーブルまたは host テーブルに問題がある可能性がある。
Access to database denied |
db テーブルの Host カラムに空白値がある場合、その db テーブルエントリに対してホストを指定するエントリが 1 つ以上、host テーブルに存在していることを確認する。
SQL コマンド SELECT ...INTO OUTFILE または LOAD DATA INFILE 使用時にエラーが発生する場合、user テーブルの該当エントリで FILE 権限が有効化されていないと考えられる。
Access denied が発生する場合、オプション設定ファイルに古いパスワードが指定されていないか確認する。
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
INSERT または UPDATE ステートメントを使用して)直接変更した場合、その変更は無視されたように見えることがある。サーバに権限テーブルを再読み込みさせるには、FLUSH PRIVILEGES ステートメントを発行するか mysqladmin flush-privileges コマンドを実行する必要がある。このことを行わない場合、変更は次回のサーバ再起動時まで有効とならない。UPDATE コマンドで root パスワードを設定しても、権限をフラッシュするまでは、パスワードが変更されたことをサーバがまだ認識しないため、そのパスワードを指定する必要はない。
mysql -u user_name db_name または mysql -u user_name -pyour_pass db_name を使用して接続してみる。mysql クライアントを使用して接続できる場合、問題はプログラムにあり、アクセス権限にはない。
注意: -p とパスワードの間にスペースは入れない。また、--password=your_pass 構文を使用してパスワードを指定することもできる。-p オプションだけを使用した場合、パスワードが要求される。
--skip-grant-tables オプションで mysqld デーモンを開始する。次に MySQL 権限テーブルを変更し、変更によって意図した結果が得られているかどうか mysqlaccess スクリプトを使用してチェックできる。変更が意図したとおりであれば、mysqladmin flush-privileges を実行し、新しい権限テーブルを使用して起動するように mysqld サーバに指示する。注意: 権限テーブルを再読み込みすると、--skip-grant-tables オプションが無効になる。これにより、サーバをシャットダウンして再起動することなく、権限テーブルの使用を始めることができる。
--debug=d,general,query など)で mysqld デーモンを開始する。試された接続に関するホスト情報、ユーザ情報、および発行された各コマンドに関する情報が出力される。 「E.1.2 トレースファイルの作成」 節 参照 。
mysqldump mysql コマンドを使用すれば権限テーブルをダンプできる。問題を投稿するときは、必ず mysqlbug スクリプトを使用すること。 「1.7.1.3 バグまたは問題を報告する方法」 節 参照 。 mysqldump を実行する際、--skip-grant-tables で mysqld を再起動することが必要な場合もある。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
GRANT および REVOKE の構文
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY [PASSWORD] 'password']
[, user_name [IDENTIFIED BY [PASSWORD] 'password'] ...]
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER cipher [AND]]
[ISSUER issuer [AND]]
[SUBJECT subject]]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
MAX_UPDATES_PER_HOUR # |
MAX_CONNECTIONS_PER_HOUR #]]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]
ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name ...]
|
GRANT は、MySQL バージョン 3.22.11 以降で実装されています。それより前の MySQL バージョンでは、GRANT ステートメントは何もしません。
システム管理者は、GRANT コマンドと REVOKE コマンドを使用して、ユーザを作成し、MySQL ユーザに対して次の 4 つのレベルの権限を与えたり取り消すことができます。
mysql.user テーブルに保存される。
GRANT ALL ON *.* および REVOKE ALL ON *.* は、グローバル権限の付与および取り消しのみを行う。
mysql.db テーブルおよび mysql.host テーブルに保存される。
GRANT ALL ON db.* および REVOKE ALL ON db.* は、データベース権限の付与および取り消しのみを行う。
mysql.tables_priv テーブルに保存される。
GRANT ALL ON db.table および REVOKE ALL ON db.table は、テーブル権限の付与および取り消しのみを行う。
mysql.columns_priv テーブルに保存される。
REVOKE を使用する際は、対象となるカラムを指定することが必要である。
GRANT および REVOKE ステートメントの priv_type には以下のいずれかを指定できます。
ALL [PRIVILEGES] | WITH GRANT OPTION 以外のすべての権限を設定 |
ALTER | ALTER TABLE の使用を許可 |
CREATE | CREATE TABLE の使用を許可 |
CREATE TEMPORARY TABLES | CREATE TEMPORARY TABLE の使用を許可 |
DELETE | DELETE の使用を許可 |
DROP | DROP TABLE の使用を許可 |
EXECUTE | ストアドプロシージャの使用を許可(MySQL 5.0) |
FILE | SELECT ... INTO OUTFILE および LOAD DATA INFILE の使用を許可 |
INDEX | CREATE INDEX および DROP INDEX の使用を許可 |
INSERT | INSERT の使用を許可 |
LOCK TABLES | SELECT 権限を持つテーブルで LOCK TABLES の使用を許可 |
PROCESS | SHOW FULL PROCESSLIST の使用を許可 |
REFERENCES | 将来のために予約 |
RELOAD | FLUSH の使用を許可 |
REPLICATION CLIENT | スレーブおよびマスタのサーバーを知る権利を付与 |
REPLICATION SLAVE | レプリケーションのスレーブに必要(マスタからバイナリログを読み取るため) |
SELECT | SELECT の使用を許可 |
SHOW DATABASES | SHOW DATABASES によりすべてのデータベースが表示される |
SHUTDOWN | mysqladmin shutdown の使用を許可 |
SUPER | 最大接続数に達していても接続を 1 つだけ許可し、コマンド CHANGE MASTER、KILL thread、mysqladmin debug、PURGE MASTER LOGS、および SET GLOBAL の実行を許可 |
UPDATE | UPDATE の使用を許可 |
USAGE | "権限なし" のシノニム |
GRANT OPTION | WITH GRANT OPTION のシノニム |
USAGE を使用すると、権限なしのユーザを作成できます。
CREATE TEMPORARY TABLES、EXECUTE、LOCK TABLES、REPLICATION ...、SHOW DATABASES、および SUPER は、バージョン 4.0.2 で新しく導入された権限です。4.0.2 にアップグレードした後でこれらの権限を使用するには、mysql_fix_privilege_tables スクリプトを実行する必要があります。
「2.5.6 権限テーブルのアップグレード」 節 参照 。
古い MySQL バージョンでは、PROCESS 権限が新しい SUPER 権限と同じ働きをします。
ユーザの GRANT 権限を取り消すには、次のように priv_type 値として GRANT OPTION を使用します。
mysql> REVOKE GRANT OPTION ON ... FROM ...; |
テーブルに対して指定できる priv_type 値は、SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT OPTION、INDEX、および ALTER だけです。
カラムに対して指定できる(つまり、column_list 節を使用する場合の)priv_type 値は、SELECT、INSERT、および UPDATE だけです。
MySQL では、データベースが存在しない場合でもデータベースレベルの権限を作成でき、データベース使用の準備を行えます。 ただし現在のところ、テーブルが存在しない場合にはテーブルレベルの権限は作成できません。テーブルやデータベースを破棄した場合でも、MySQL が自動的に権限を取り消すことはありません。
グローバル権限は ON *.* 構文を使用して設定できます。データベース権限は ON db_name.* 構文を使用して設定できます。ON * を指定したときにカレントデータベースがあれば、そのデータベースの権限が設定されます。警告: ON * を指定したときにカレントデータベースがなければ、グローバル権限に影響します。
注意: GRANT コマンドでデータベース名を指定する際、`_' および `%' ワイルドカードを使用できます。データベース名の一部として、たとえば `_' 文字を使用したい場合、GRANT コマンドでは GRANT ... ON `foo\_bar`.* TO ... などのように、`\_' として指定するようしてください。そうしないと、ワイルドカードパターンに一致する別のデータベースにもユーザがアクセスできるようになります。
MySQL では、任意のホストのユーザに権限を付与できるように、user_name 値を user@host 形式で指定できるようになっています。特殊文字(`-' など)を含む user 文字列を指定したり、特殊文字またはワイルドカード文字(`%' など)を含む host 文字列を指定したい場合、ユーザ名またはホスト名を引用符で囲むことができます(たとえば、'test-user'@'test-hostname')。
ホスト名にワイルドカードを使用できます。たとえば、user@'%.loc.gov' は loc.gov ドメインのどのホストの user にも当てはまり、user@'144.155.166.%' は 144.155.166 クラス C のどのホストの user にも当てはまります。
シンプルな形式 user は user@"%" のシノニムです。
MySQL では、ユーザ名でのワイルドカード使用をサポートしていません。匿名ユーザの定義には、User=" のエントリを mysql.user テーブルに挿入するか、GRANT コマンドで空白名のユーザを作成します。
注意: 匿名ユーザが MySQL サーバに接続できるようにする場合、すべてのローカルユーザに対して、user@localhost として権限を設定する必要があります。そうしないと、ユーザがローカルマシンから MySQL サーバにログインしようとしたときに、mysql.user テーブルのローカルホストの匿名ユーザエントリが使用されるからです。
これを確認するには、以下のクエリを実行します。
mysql> SELECT Host,User FROM mysql.user WHERE User=''; |
現在のところ、GRANT ではホスト、テーブル、データベース、およびカラムの名前に最大 60 文字まで使用できます。ユーザ名は最大 16 文字までです。
テーブルまたはカラムに対する権限は、4 つのレベルの権限の論理和(OR)で形成されます。たとえば、mysql.user テーブルでユーザにグローバル SELECT 権限が設定されている場合、これがデータベース、テーブル、またはカラムレベルのエントリで拒否されることはありません。
カラムに対する権限は以下のように計算されます。
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges |
多くの場合、ユーザへの権限設定には権限レベルを 1 つだけしか使用しないので、上述のように複雑にはなりません。権限チェックプロシージャの詳細については、 「4.3 一般的なセキュリティ関連事項と MySQL アクセス制御システム」 を参照してください。
mysql.user テーブルに存在しないユーザとホスト名の組み合わせに権限を付与すると、そのエントリはテーブルに追加され、DELETE コマンドで削除されるまでそこに残ります。つまり、GRANT で user テーブルエントリを作成できますが、REVOKE ではそのエントリを削除できません。削除するには明示的に DELETE を使用する必要があります。
MySQL バージョン 3.22.12 以降では、新規ユーザが作成された場合、またはグローバル権限を付与する場合、IDENTIFIED BY 節でパスワードが指定されていれば、それがそのユーザのパスワードになります。すでにユーザにパスワードがある場合は、新しいパスワードに置き換えられます。
テキスト形式でパスワードを送信するのが望ましくなければ、PASSWORD オプションを使用して、SQL 関数 PASSWORD() または C API 関数 make_scrambled_password(char *to, const char *password) で生成した暗号化パスワードを設定できます。
警告: 新規ユーザを作成した際、IDENTIFIED BY 節を指定しなければそのユーザはパスワードなしになります。つまり、危険です。
パスワードの設定には、SET PASSWORD コマンドを使用することもできます。
「5.5.6 SET 構文」 節 参照 。
データベースに対する権限を設定する場合、必要に応じて mysql.db テーブルにエントリが作成されます。REVOKE でそのデータベースのすべての権限が削除されると、このエントリも削除されます。
ユーザがテーブルに何の権限も持っていない場合、SHOW TABLES ステートメントなどでテーブルのリストを要求しても、テーブルは表示されません。SHOW DATABASES でも同様です。
WITH GRANT OPTION 節を使用すると、ユーザは自分が所有する権限を他のユーザに与えることができます。
GRANT 権限をユーザに設定する際は注意が必要です。2 人のユーザがお互いの権限を組み合わせることが可能になるからです。
MAX_QUERIES_PER_HOUR #、MAX_UPDATES_PER_HOUR #、および MAX_CONNECTIONS_PER_HOUR # は MySQL バージョン 4.0.2 で新しく導入されました。
これらのオプションは、1 時間でユーザが実行できるクエリ、更新、およびログインの回数を制限します。# が 0(デフォルト)の場合、そのユーザに制限はないということです。 「4.4.7 ユーザリソースの制限」 節 参照 。
注意: 既存ユーザに追加権限を設定することなくこれらのオプションを指定するには、GRANT USAGE ON *.* ... WITH MAX_... を使用します。
自分自身が持っていない権限を他のユーザに与えることはできません。GRANT 権限では、自分が所有する権限だけを他のユーザに与えることができます。
あるレベルの GRANT 権限をユーザに設定すると、そのユーザがそのレベルで所有する(および将来所有する)すべての権限を、そのユーザは他のユーザに設定できるということに注意してください。
あるユーザにデータベースに対する INSERT 権限を付与したと仮定します。次にデータベースの SELECT 権限を付与する際 WITH GRANT OPTION を指定した場合、そのユーザは SELECT 権限だけでなく INSERT 権限も他のユーザに与えることができます。さらにデータベースの UPDATE 権限をそのユーザに与えると、そのユーザは INSERT、SELECT、および UPDATE 権限を他のユーザに与えることができるようになります。
ALTER 権限は一般ユーザには付与しないでください。設定すると、そのユーザはテーブルの名前を変更して、権限システムを破ることができるようになります。
注意: 1 人のユーザだけにテーブル権限またはカラム権限を設定した場合でも、サーバはすべてのユーザのテーブル権限とカラム権限を調べるため、MySQL の処理速度は少し低下します。
mysqld の起動時、すべての権限がメモリに読み込まれます。
データベース権限、テーブル権限、およびカラム権限はすぐに反映されますが、ユーザレベルの権限はユーザが次回接続したときに有効となります。
GRANT または REVOKE によって行われた権限テーブルへの変更については、サーバは即座に認識します。
INSERT、UPDATE などを使って手動で権限テーブルを変更した場合、FLUSH PRIVILEGES ステートメントまたは mysqladmin flush-privileges を実行してサーバに権限テーブルを再読み込みさせる必要があります。
「4.4.3 権限の変更はいつ反映されるか」 節 参照 。
GRANT の標準 SQL のバージョンと MySQL バージョンでの最大の違いは以下のとおりです。
TRIGGER 権限と UNDER 権限をサポートしない。
INSERT 権限が設定されている場合、そのテーブルに対して INSERT ステートメントを実行できる。この場合、INSERT 権限のないカラムにはデフォルト値が設定される。SQL-99 では、すべてのカラムで INSERT 権限が必要となる。
REVOKE コマンドを使用するか MySQL 権限テーブルを操作することが必要である。
REQUIRE の使用法については、 「4.4.10 安全な接続の使用」 を参照してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL でのユーザ名およびパスワードの使用法と、Unix および Windows での使用法にはいくつかの相違点があります。
-u オプションまたは --user オプションにより別の名前を指定することが可能である。これは、すべての MySQL ユーザ名にパスワードを設定しないと、データベースを安全に保てないことを意味する。パスワードを設定しなければ、だれでも任意の名前でサーバへの接続を試みることができ、パスワードのない名前を指定すれば接続に成功してしまう。
PASSWORD() 関数および ENCRYPT() 関数の詳細については、 「6.3.6.2 その他の各種関数」 を参照のこと。注意: パスワードが '暗号化' されて格納されていても、その '暗号化' されたパスワードを知るだけで MySQL サーバに接続できる。
バージョン 4.1 より、MySQL は従来とは異なるパスワードとログインメカニズムを採用しており、TCP/IP パケットがスニフされたり、mysql データベースがキャプチャされた場合でもセキュリティを保持できるようになっている。
MySQL ユーザおよびその権限は通常、GRANT コマンドで作成します。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
MySQL サーバにコマンドラインクライアントでログインする場合は、--password=your-password でパスワードを指定してください。
「4.3.8 MySQL サーバへの接続」 節 参照 。
mysql --user=monty --password=guess database_name |
クライアントにパスワードを要求させたい場合には、引数なしで --password を使用します。
mysql --user=monty --password database_name |
または次の短い形式
mysql -u monty -p database_name |
注意: 上記の例で、パスワードが 'database_name' なわけではありません。
-p オプションを使用してパスワードを指定するには、以下のように行います。
mysql -u monty -pguess database_name |
システムによっては、MySQL がパスワードを要求する際のライブラリコールにより、自動的にパスワードが 8 文字に切り詰められます。MySQL の内部では、パスワード長に制限はありません。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld の起動時、すべての権限テーブルがメモリに読み込まれ、この時点で有効となります。
GRANT、REVOKE、または SET PASSWORD を使用して行った権限テーブルの変更は、すぐにサーバに認識されます。
INSERT、UPDATE などを使用して手動で権限テーブルを変更した場合、FLUSH PRIVILEGES ステートメント、mysqladmin flush-privileges、または mysqladmin reload を実行してサーバに権限テーブルを再読み込みさせる必要があります。そうしなければ、サーバを再起動するまで、変更は反映されません。権限テーブルを手動で変更した後、権限の再読み込みを忘れると、当然変更は反映されません。
サーバが権限テーブルの変更を認識すると、既存のクライアント接続は以下のような影響を受けます。
USE db_name コマンドから反映される。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL のインストール後、scripts/mysql_install_db を実行してアクセス権限を初期設定します。
「2.3.1 クイックインストールの概要」 節 参照 。
mysql_install_db スクリプトは mysqld サーバを起動し、以下の権限を含むように権限テーブルを初期化します。
root ユーザが、すべての操作を実行できるスーパーユーザとして作成される。接続は、ローカルホストから行う必要がある。
注意: 初期状態では、root パスワードは空白のため、だれでも root ユーザとしてパスワードなしで接続でき、すべての権限を得られる。
'test' という名前のデータベース、または 'test_' で始まる名前のデータベースにおいてすべての操作を実行できる匿名ユーザが作成される。接続は、ローカルホストから行う必要がある。どのローカルユーザでもパスワードなしで接続でき、その場合、匿名ユーザとして扱われることを意味する。
mysqladmin shutdown や mysqladmin processlist を使用できない。
注意: Windows のデフォルト権限とは異なります。 「2.1.1.8 Windows での MySQL の実行」 節 参照 。
初期インストール時はアクセスが開放されている状態なので、インストール後はまず、MySQL root ユーザにパスワードを設定してください。これは以下のように行います(注意: PASSWORD() 関数を使用してパスワードを指定します)。
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root@localhost=PASSWORD('new_password');
|
'new_password' に、使用するパスワードを指定します。
方法を理解していれば、権限テーブルを直接操作することもできます。
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
-> WHERE user='root';
mysql> FLUSH PRIVILEGES;
|
mysqladmin コマンドを使用しても、パスワードを設定できます。
shell> mysqladmin -u root password new_password |
mysql データベースの書き込み権限および更新権限のあるユーザだけが、他のユーザのパスワードを変更できます。すべての一般ユーザ(匿名ユーザ以外)は、上記のコマンドまたは SET PASSWORD=PASSWORD('new_password') を使用して自分のパスワードだけを変更できます。
注意: UPDATE を使用して user テーブルで直接パスワードを更新する場合、FLUSH PRIVILEGES を使用してサーバに権限テーブルを再読み込みさせる必要があります。そうしないと変更が認識されません。
root パスワードをいったん設定するとそれ以降、root としてサーバに接続する際は常にそのパスワードを入力する必要があります。
追加設定やテストを行っている最中にパスワードを入力しないで済むように、root パスワードを空白のままにしたい場合もあるでしょう。しかし、実稼動で使用する前には必ずパスワードを設定してください。
デフォルト権限の設定については、scripts/mysql_install_db スクリプトを参照してください。このスクリプトは、他のユーザを追加する際にその基本として使用できます。
上記の初期権限とは違う初期権限を設定したい場合には、mysql_install_db を編集してから実行してください。
権限テーブルを完全に再生成するには、mysql データベースが含まれるディレクトリ内の `.frm'、`.MYI'、および `.MYD' ファイルをすべて削除します(このディレクトリは、データディレクトリの下にある `mysql' という名前のディレクトリです。データディレクトリは mysqld --help を実行すると表示されます)。そして、必要に応じて権限を編集してから、mysql_install_db スクリプトを実行します。
注意: MySQL バージョン 3.22.10 より前では、`.frm' ファイルを削除しないでください。うっかり削除してしまった場合は、mysql_install_db を実行する前に、MySQL ディストリビューションからコピーし直してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ユーザの追加には、2 つの方法があります。GRANT ステートメントを使用する方法と、MySQL 権限テーブルを直接操作する方法です。正確でエラーが発生しにくい GRANT ステートメントの使用を推奨します。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
ユーザの作成および管理に使用できるコントリビューションプログラムもいくつかあります(phpMyAdmin など)。
以下の例では、mysql クライアントを使用して新規ユーザを設定する方法を示します。この例では、前のセクションで説明したデフォルト設定に従って権限がセットアップされていることを前提にしています。そのため変更を行うには、mysqld を実行しているマシンにログインしていること、MySQL root ユーザとして接続していること、root ユーザに mysql データベースに対する INSERT 権限と RELOAD 管理者権限があることが必要条件となります。また、root ユーザパスワードを変更している場合、ここで、mysql コマンドを使用してそのパスワードを指定する必要があります。
まず、mysql プログラムを使用してサーバに MySQL root ユーザとして接続します。
shell> mysql --user=root mysql |
次に、GRANT ステートメントを実行して新規ユーザを追加できます。
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@'%'
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
|
これらの GRANT ステートメントでは、以下の 3 人の新規ユーザが追加されます。
monty
'some_pass' の使用が必要。注意: GRANT ステートメントを monty@localhost と monty@"%" の両方に対して発行することが必要である。localhost のエントリを追加しないと、ローカルホストから接続したとき、mysql_install_db によって作成された localhost のエントリの方が、Host フィールド値がより具体的であり、user テーブルのソート順序で上位になるため優先されることになる。
admin
localhost からパスワードなしで接続でき、RELOAD および PROCESS の管理権限のあるユーザ。このユーザは、mysqladmin reload、mysqladmin refresh、mysqladmin flush-* の各コマンド、および mysqladmin processlist を実行できる。データベースレベルの権限は設定されていない(GRANT ステートメントを実行して後で追加できる)。
dummy
USAGE 権限タイプにより、このような権限なしのユーザを作成できる。これは、すべてのグローバル権限を 'N' に設定するのと同じことである。これは、後でこのアカウントに固有の権限を設定することを想定している。
INSERT ステートメントを発行してサーバに権限テーブルを再度読み込ませることにより、同じユーザアクセス情報を直接追加することもできます。
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
-> Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
|
MySQL バージョンによっては、上記 'Y' 値の数が違う場合があります(3.22.11 より前のバージョンでは権限カラムが少なく、4.0.2 以降では多くなります)。admin ユーザに対しては、バージョン 3.22.11 以降で利用可能になった SET を使用する拡張 INSERT 構文が使用されています。
注意: スーパーユーザを設定する場合は、権限フィールドを 'Y' に設定した user テーブルエントリを作成するだけで済みます。db テーブルや host テーブルのエントリは必要ありません。
最後の INSERT ステートメント(dummy ユーザ)では、user テーブルレコードの Host、User、および Password カラムだけが値を割り当てられています。権限カラムはどれも明示的に設定されていないため、MySQL はこれらすべてにデフォルト値の 'N' を設定します。これは、GRANT USAGE と同じ機能です。
以下の例では、ユーザ custom を追加します。このユーザは bankaccount データベースにはローカルホストからのみ、expenses データベースにはホスト whitehouse.gov からのみ、customer データベースにはホスト server.domain からのみアクセスできるとします。3 つのホストすべてでパスワード obscure を使用します。
GRANT ステートメントを使用してこのユーザの権限を設定するには、以下のコマンドを実行します。
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON bankaccount.*
-> TO custom@localhost
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON expenses.*
-> TO custom@'whitehouse.gov'
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON customer.*
-> TO custom@'server.domain'
-> IDENTIFIED BY 'obscure';
|
権限テーブルを直接変更してユーザの権限を設定するには、以下のコマンドを実行します(注意: 最後の FLUSH PRIVILEGES に注目)。
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('server.domain','custom',PASSWORD('obscure'));
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES
-> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
-> Create_priv,Drop_priv)
-> VALUES('server.domain','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
|
INSERT ステートメントを使用した前の例と同様、MySQL のバージョンによっては 'Y' の値の数が異なります。
最初の 3 つの INSERT ステートメントは user テーブルエントリを追加し、ユーザ custom がさまざまなホストから指定のパスワードで接続できるようにしますが、権限については何も設定していません(権限はすべて、デフォルト値の 'N' に設定されています)。次の 3 つの INSERT ステートメントは、db テーブルエントリを追加し、custom に bankaccount、expenses、customer の各データベースに対する権限を設定します。これらの権限は、適切なホストからアクセスしたときにだけ適用されるものです。権限テーブルを直接変更した場合、FLUSH PRIVILEGES を使用してサーバに権限テーブルを再度読み込ませ、権限の変更を反映させる必要があります。
特定のユーザに、あるドメイン(たとえば mydomain.com)のすべてのマシンからのアクセスを許可するには、以下のような GRANT ステートメントを実行します。
mysql> GRANT ...
-> ON *.*
-> TO myusername@'%.mydomain.com'
-> IDENTIFIED BY 'mypassword';
|
権限テーブルを直接変更して同じことを行うには、以下を実行します。
mysql> INSERT INTO user VALUES ('%.mydomain.com', 'myusername',
-> PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
|
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
DROP USER user_name |
このコマンドは MySQL 4.1.1 で追加されたコマンドです。
このコマンドにより、権限を持たないユーザが削除されます。
MySQL からユーザを削除するには、以下の手順に従います。
SHOW PRIVILEGES を使用してユーザの権限を確認する。
「4.6.8.11 SHOW PRIVILEGES」 節 参照 。
REVOKE を使用してユーザから権限をすべて削除する。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
DROP USER を使用してユーザを削除する。
古い MySQL バージョンを使用している場合は、まず権限を取り消してからユーザを削除します。
mysql> DELETE FROM mysql.user WHERE user='username' and host='hostname'; mysql> FLUSH PRIVILEGES; |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL 4.0.2 以降、特定のリソースをユーザごとに制限できるようになりました。
今までは、MySQL サーバリソースの使用を制限するには、スタートアップ変数の max_user_connections をゼロ以外の値に設定するしかありませんでした。しかしこの方法はグローバルに適用されるため、インターネットサービスプロバイダが関心のある個別ユーザの管理には使用できませんでした。
そのため、個別ユーザレベルで 3 つのリソースを管理する方法が導入されました。
上記コンテキストの 1 ユーザとは user テーブルの 1 エントリです。このエントリは user カラムと host カラムによって識別されます。
制限を設定しない限り、すべてのユーザはデフォルトで、上記リソースを制限なく使用できます。これらの制限は、以下の構文を使用してグローバルな GRANT (*.*) でのみ設定できます。
GRANT ... WITH MAX_QUERIES_PER_HOUR N1
MAX_UPDATES_PER_HOUR N2
MAX_CONNECTIONS_PER_HOUR N3;
|
上記のリソースはどのような組み合わせでも指定可能です。
N1、N2、および N3 は整数で、時間単位のカウント数を表します。
ユーザが時間単位の接続数に達すると、その 1 時間が経過するまで、以降の接続は拒否されます。同様に、ユーザがクエリまたは更新の制限回数に達すると、その 1 時間が経過するまで、以降のクエリまたは更新は拒否されます。いずれの場合も、適切なエラーメッセージが表示されます。
特定ユーザの現在の使用値をフラッシュ(ゼロに設定)するには、上記の任意の節の GRANT ステートメントを発行します。その際 GRANT ステートメントの値を現在の値にします。
また、すべてのユーザの現在の値をフラッシュするには、権限を再読み込みするか(サーバ内部で行うか、mysqladmin reload を使用)、FLUSH USER_RESOURCES コマンドを実行します。
リソース制限機能は、単一ユーザにリソースを制限する GRANT 節が設定されるとすぐに有効になります。
この機能を有効化する前提条件として、`scripts' サブディレクトリにあるテーブル作成スクリプト mysql_install_db および mysql_install_db.sh で定義されている追加カラムが、mysql データベースの user テーブルに含まれていることが必要です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ほとんどの場合において、ユーザとパスワードの設定には GRANT を使用します。以下の方法は上級ユーザ対象です。 「4.4.1 GRANT および REVOKE の構文」 節 参照 。
前のセクションでは、例を用いて重要な原則を示しました。INSERT または UPDATE ステートメントを使用して空白でないパスワードを保存する際には、PASSWORD() 関数を使用して暗号化しなければならないということです。これは、user テーブルがパスワードを平文テキストではなく、暗号化された形式で保存するためです。たとえば、この原則を忘れて、以下のようにパスワードを設定してしまったとします。
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
|
この場合、平文テキストの 'biscuit' が、パスワードとして user テーブルに保存されます。ユーザ jeffrey がこのパスワードを使用してサーバに接続しようとすると、mysql クライアントは PASSWORD() でそれを暗号化し、暗号化されたパスワードと、サーバから取得したランダム番号に基づいて認証ベクトルを生成し、それをサーバに送信します。
サーバは user テーブルの password 値(この場合、暗号化されていない 'biscuit')を使用して同じ計算を実行し、結果を比較します。
比較は失敗し、サーバは接続を拒否します。
shell> mysql -u jeffrey -pbiscuit test Access denied |
user テーブルにパスワードを挿入するとき、パスワードは暗号化しておく必要があります。したがって、INSERT ステートメントを以下のように指定します。
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey',PASSWORD('biscuit'));
|
SET PASSWORD ステートメントを使用するときも、PASSWORD() 関数を使用する必要があります。
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
|
GRANT ... IDENTIFIED BY ステートメントまたは mysqladmin password コマンドを使用してパスワードを設定する場合、PASSWORD() 関数は必要ありません。両方ともパスワードを暗号化するので、以下のようにパスワードを 'biscuit' と指定します。
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit'; |
または
shell> mysqladmin -u jeffrey password biscuit |
注意: PASSWORD() は、Unix のパスワード暗号化とは異なります。
「4.4.2 MySQL のユーザ名とパスワード」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
自分のパスワードを他のユーザがわかるような方法で指定することは危険です。 クライアントプログラムを実行する際、パスワードの指定に使用できる方法を以下に示します。それぞれの危険度についても示します。
mysql.user テーブルへのアクセス権を与えてはいけない。暗号化されているパスワードがわかっただけで、そのユーザとしてログインすることが可能になる。パスワードの暗号化は、本当のパスワードを他人に見られないようにするためだけのものである(他のアプリケーションで似たパスワードを使用する場合に備えて)。
-pyour_pass オプションまたは --password=your_pass オプションをコマンドラインで使用する。これは便利だが安全ではない。他のユーザがコマンドラインを表示するため起動する ps などのシステムステータスプログラムにはパスワードが見えてしまう(MySQL クライアントは通常、初期化シーケンスにおいてコマンドライン引数をゼロで上書きするが、短いインターバルがあってその間は見えてしまう)。
-p オプションまたは --password オプションを使用する(your_pass 値を指定しない)。この場合、クライアントプログラムは端末からのパスワード入力を求める。
shell> mysql -u user_name -p Enter password: ******** |
`*' 文字はパスワードを表す。
この方法だと他のユーザには見えないため、コマンドラインでパスワードを指定するよりも安全である。ただし、このパスワード入力方法は、対話式で実行するプログラムにのみ適している。非対話式で実行するスクリプトからクライアントを起動する場合、端末からパスワードを入力する機会がない。システムによっては、スクリプトの最初の行を間違ってパスワードと解釈してしまうものもある。
[client] セクションにパスワードを記入できる。
[client] password=your_pass |
パスワードを `.my.cnf' に保存する場合、だれもそのファイルを読み書きできないようにしておくことが必要である。ファイルのアクセスモードは 400 または 600 にしておくこと。
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
MYSQL_PWD 環境変数にパスワードを保存できる。しかしこの方法は非常に危険なので、使用すべきではない。
ps のバージョンによっては、実行中のプロセス環境を表示するオプションがある。MYSQL_PWD を設定していればだれにでもパスワードを見られてしまう。そのようなバージョンの ps がないシステムでも、プロセス環境を表示する他の方法がないと想定するのは危険である。 「F. 環境変数」 節 参照 。
以上のことを総括すると、最も安全な方法は、クライアントプログラムにパスワードを要求させるか、適切に保護された `.my.cnf' ファイルにパスワードを指定することです。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| 4.4.10.1 基本概念 | ||
| 4.4.10.2 必要条件 | ||
| 4.4.10.3 MySQL での SSL 証明書の設定 | ||
4.4.10.4 SSL GRANT オプション | ||
| 4.4.10.5 SSL コマンドラインオプション |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
バージョン 4.0.0 より、MySQL は SSL 暗号化接続をサポートしています。MySQL がどのように SSL を使用するか理解するには、SSL と X509 の基本概念が欠かせません。基本概念を理解している読者は、このセクションを読み飛ばしてください。
デフォルトでは、MySQL はクライアントとサーバ間で暗号化されていない接続を使用します。つまり、他人がすべてのトラフィックおよび送受信データを盗み見ることが可能な接続です。また、クライアントとサーバ間で転送中のデータを改ざんすることも可能です。公開ネットワークでの情報のやり取りでも安全性が求められる場合があります。そのような場合、暗号化されていない接続は適しません。
SSL とは、複数の異なる暗号化アルゴリズムを使用して、公開ネットワークで受信するデータの信頼性を保証するためのプロトコルです。データの変更、消失、および再生を検知するメカニズムがあります。SSL にはまた、X509 規格を使用する ID 認証を認識および提供するためのアルゴリズムも組み込まれています。
暗号化とは、データを読み取り不可能にする技術です。実際、今日の社会では、暗号化アルゴリズムによるさらなるセキュリティが求められています。暗号化メッセージの順番を変更したり同じデータを 2 回再生するなど、さまざまな種類の攻撃に対する耐性が必要となっています。
X509 とは、インターネット上で ID 認証を可能にする規格です。これは、電子商取引アプリケーションで最も一般的に使用されています。基本的には、"認証局" と呼ばれる会社が電子証明書を必要とする者に割り当てるという方法を取ります。証明書は、2 つの暗号化キー(公開キーと秘密キー)がある非対称暗号化アルゴリズムを使用しています。証明書の所有者は、他者に証明書を提示して自分の ID を証明します。証明書には、所有者の公開キーが含まれています。この公開キーで暗号化されたデータはすべて、対応する秘密キーがなければ解読できません。秘密キーは証明書の所有者が保持しています。
MySQL はデフォルトでは暗号化接続を使用しません。使用すると、クライアントとサーバのプロトコルがかなり遅くなるからです。どのような機能を追加した場合でもコンピュータには負荷がかかります。データの暗号化も例外ではなく、CPU を大幅に消費して時間がかかり、MySQL の主要タスクを遅らせる原因となります。そのためデフォルトでは、MySQL は速度が優先されています。
SSL、X509、および暗号化についてさらに詳細を知るには、インターネット検索エンジンを利用して必要な情報を検索してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
安全な接続を MySQL で使用するには、以下を実行する必要があります。
--with-vio --with-openssl でコンフィギャする。
mysql.user テーブルに新しい SSL 関連カラムを追加する必要がある。
この処理は、権限テーブルが MySQL 4.0.0 より前のバージョンの場合に必要となる。手順については 「2.5.6 権限テーブルのアップグレード」 を参照のこと。
mysqld サーバが OpenSSL をサポートしているかチェックするには、SHOW VARIABLES LIKE 'have_openssl' が YES を返すかどうかを確認する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
以下、MySQL での SSL 証明書の設定例です。
DIR=`pwd`/openssl
PRIV=$DIR/private
mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf
# Create necessary files: $database, $serial and $new_certs_dir
# directory (optional)
touch $DIR/index.txt
echo "01" > $DIR/serial
#
# Generation of Certificate Authority(CA)
#
openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \
-config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:
#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out \
$DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
#
# Remove the passphrase from the key (optional)
#
openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem
#
# Sign server cert
#
openssl ca -policy policy_anything -out $DIR/server-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/server-req.pem
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
#
# Create client request and key
#
openssl req -new -keyout $DIR/client-key.pem -out \
$DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................++++++
# .............................................++++++
# writing new private key to '/home/monty/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be incorporated
# into your certificate request.
# What you are about to enter is what is called a Distinguished Name or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:
#
# Remove a passphrase from the key (optional)
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem
#
# Sign client cert
#
openssl ca -policy policy_anything -out $DIR/client-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/client-req.pem
# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated
#
# Create a my.cnf file that you can use to test the certificates
#
cnf=""
cnf="$cnf [client]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/client-cert.pem"
cnf="$cnf ssl-key=$DIR/client-key.pem"
cnf="$cnf [mysqld]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/server-cert.pem"
cnf="$cnf ssl-key=$DIR/server-key.pem"
echo $cnf | replace " " '
' > $DIR/my.cnf
#
# To test MySQL
mysqld --defaults-file=$DIR/my.cnf &
mysql --defaults-file=$DIR/my.cnf
|
mysql-source-dist/SSL ディレクトリにあるデモ証明書を参照するように上記の `my.cnf' ファイルを修正することによっても、設定をテストできます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
GRANT オプション MySQL は、通常のユーザ名とパスワードのスキームに加え、X509 証明書属性をチェックすることができます。通常のオプションもすべて必要です(ユーザ名、パスワード、IP アドレスマスク、データベース/テーブル名)。
接続の制限にはいくつかのシナリオがあります。
REQUIRE SSL オプションは、サーバが SSL 暗号化接続のみを許可するように制限する。
注意: 非 SSL 接続を許可する ACL レコードがある場合、このオプションは除外できる。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
|
REQUIRE X509 は、クライアントに有効な証明書が必要なことを意味するが、どの証明書、発行者、およびサブジェクトでなければいけないという指定はない。
CA 証明書の署名を確認できれば、それで十分である。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret' REQUIRE X509;
|
REQUIRE ISSUER 'issuer' は、接続試行に制限を加える。
クライアントは、CA 'issuer' によって発行された有効な X509 証明書を提示する必要がある。
X509 証明書を使用することは、暗号化の使用を意味しており、SSL オプションは不要である。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE ISSUER 'C=FI, ST=Some-State, L=Helsinki,
'> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com';
|
REQUIRE SUBJECT 'subject' では、サブジェクト 'subject' が有効な X509 証明書がクライアントに必要となる。クライアントが有効な証明書を提示しても、'subject' が異なる場合、接続は拒否される。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn,
'> O=MySQL demo client certificate,
'> CN=Tonu Samuel/Email=tonu@mysql.com';
|
REQUIRE CIPHER 'cipher' は、強力な暗号とキー長の使用を義務付ける。短い暗号化キーの古いアルゴリズムを使用した場合、SSL 自体も強力ではなくなる。このオプションを使用することにより、接続許可の条件として特定の暗号化を指定できる。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
|
SUBJECT、ISSUER、および CIPHER のオプションは、以下のように REQUIRE 節で組み合わせることができる。
mysql> GRANT ALL PRIVILEGES ON test.* TO root@localhost
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT 'C=EE, ST=Some-State, L=Tallinn,
'> O=MySQL demo client certificate,
'> CN=Tonu Samuel/Email=tonu@mysql.com'
-> AND ISSUER 'C=FI, ST=Some-State, L=Helsinki,
'> O=MySQL Finland AB, CN=Tonu Samuel/Email=tonu@mysql.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
|
MySQL 4.0.4 以降、REQUIRE オプション間の AND キーワードは任意になっている。
オプションはどんな順序でも指定できるが、同じオプションを 2 回指定することはできない。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
以下の表は、SSL、証明書ファイル、およびキーファイルの使用を指定するためのオプションをまとめたものです。 これらのオプションは MySQL 4.0 から導入されたものです。これらのオプションは、コマンドラインでもオプション設定ファイルでも使用できます。
--ssl
--ssl-ca、--ssl-cert、および --ssl-key オプションも指定する必要がある。
注意: このオプションでは、SSL 接続が必須とならない。 たとえば、サーバまたはクライアントが SSL サポートなしでコンパイルされている場合、通常の暗号化されていない接続が使用される。
SSL 接続だけの使用を確実に保証するには、まず、GRANT ステートメントで REQUIRE SSL 節を含むアカウントをサーバに作成することが必要。
そしてこのアカウントを使用してサーバに接続する。このとき、サーバとクライアントの両方で SSL サポートが有効になっていることが必要である。
このオプションを使用して、接続に SSL を使用しないように指定することができる。
この場合、オプションを --skip-ssl または --ssl=0 として指定する。
--ssl-ca=file_name
--ssl-capath=directory_name
--ssl-cert=file_name
--ssl-cipher=cipher_list
cipher_list は、openssl ciphers コマンドと同じ形式である。
例: --ssl-cipher=ALL:-AES:-EXP
--ssl-key=file_name
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| 4.5.1 データベースのバックアップ | ||
4.5.2 BACKUP TABLE 構文 | ||
4.5.3 RESTORE TABLE 構文 | ||
4.5.4 CHECK TABLE 構文 | ||
4.5.5 REPAIR TABLE 構文 | ||
4.5.6 myisamchk を使用したテーブルの保守とクラッシュのリカバリ | ||
| 4.5.7 テーブル保守計画 | ||
| 4.5.8 テーブル情報の取得 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL テーブルはファイルとして保存されるため、バックアップが簡単です。一貫したバックアップを行うには、そのテーブルに対して LOCK TABLES を実行してから、FLUSH TABLES を実行します。
「6.7.5 LOCK TABLES および UNLOCK TABLES 構文」 節 参照 。
「4.6.4 FLUSH 構文」 節 参照 。
読み取りロックだけが必要なので、データベースディレクトリのファイルをコピーしている間も、他のスレッドはテーブルに対してクエリを続行できます。FLUSH TABLE は、バックアップを開始する前に、キャッシュされているページをすべてディスクに書き込むために必要です。
3.23.56 から 4.0.12 では、セキュリティ上のリスクがあるため、BACKUP TABLE で既存ファイルの上書きはできないようになっています。
テーブルを SQL レベルでバックアップするには、SELECT INTO OUTFILE または BACKUP TABLE を使用します。 「6.4.1 SELECT 構文」 節 参照 。
「4.5.2 BACKUP TABLE 構文」 節 参照 。
データベースのバックアップには、mysqldump プログラムまたは mysqlhotcopy script を使用することもできます。 「4.9.7 mysqldump(テーブル構造とデータのダンプ)」 節 参照 。
「4.9.8 mysqlhotcopy(MySQL のデータベースとテーブルのコピー)」 節 参照 。
shell> mysqldump --tab=/path/to/some/dir --opt db_name または shell> mysqlhotcopy db_name /path/to/some/dir |
サーバが何かを更新中でなければ、すべてのファイル(`*.frm'、`*.MYD'、および `*.MYI')を単にコピーすることもできる。
スクリプト mysqlhotcopy はこの方法を使用している。
注意: データベースに InnoDB テーブルが含まれている場合、InnoDB はテーブルコンテンツをデータベースディレクトリに保存しないため、この方法は使用できない。mysqlhotcopy は MyISAM テーブルと ISAM テーブルにのみ有効。
mysqld が実行中であればいったん停止し、--log-bin[=file_name] オプションで再起動する。 「4.10.4 バイナリログ」 節 参照 。 mysqldump 実行後に行われたデータの変更をレプリケートするための情報が、バイナリログファイルにより提供される。
MySQL サーバがスレーブの場合、どのバックアップ方法を選択しても、スレーブのデータをバックアップするとき、`master.info' ファイルと `relay-log.info' ファイルもバックアップしてください。これらのファイルは、スレーブのデータをリストア後、レプリケーションを再開するときに必要です。スレーブが、レプリケーションを行う LOAD DATA INFILE コマンドの対象となっていた場合、`SQL_LOAD-*' ファイルもバックアップしてください。このファイルは、--slave-load-tmpdir オプションによって指定されているディレクトリにあります(このファイルの場所が指定されていない場合、デフォルトで、この場所は tmpdir 変数の値になります)。中断されていた LOAD DATA INFILE 処理のレプリケーションを再開するためにスレーブはこれらのファイルを必要とします。
何かをリストアする必要がある場合、最初に REPAIR TABLE または myisamchk -r を使用してテーブルのリカバリを試みてください。ほとんどの場合、これで成功するはずです。myisamchk でリカバリできなかった場合、以下を実行します。これは、--log-bin で MySQL を起動している場合にのみ可能な方法です。 「4.10.4 バイナリログ」 を参照してください。
mysqldump バックアップ、またはバイナリバックアップをリストアする。
shell> mysqlbinlog hostname-bin.[0-9]* | mysql |
場合に応じて、特定の位置から後のバイナリログだけを再実行する(通常は、リストアしたバックアップの日付以降の、不正なクエリ以外のすべてのバイナリログを再実行する)。
mysqlbinlog ユーティリティおよびその使用法の詳細については、 「4.9.5 mysqlbinlog(バイナリログからクエリを実行する)」 を参照のこと。
更新ログ(MySQL 5.0 で廃止)を使用している場合、更新ログの内容を以下のように実行できる。
shell> ls -1 -t -r hostname.[0-9]* | xargs cat | mysql |
ls は、すべての更新ログファイルを正しい順序で取得するために使用します。
SELECT * INTO OUTFILE 'file_name' FROM tbl_name で選択的バックアップを行い、LOAD DATA INFILE 'file_name' REPLACE ... でリストアすることもできます。重複テーブルを避けるため、テーブルに PRIMARY KEY または UNIQUE キーが必要です。REPLACE キーワードを使用すると、ユニークキーが新規レコードと旧レコードで重複していた場合に、旧レコードが新規レコードで置き換えられます。
バックアップに伴いパフォーマンス上の問題が発生する場合、レプリケーションをセットアップして、マスタではなくスレーブ上でバックアップを実行することによりこの問題を解決できる。 「4.11.1 はじめに」 節 参照 。
Veritas ファイルシステムを使用している場合、以下を実行できます。
FLUSH TABLES WITH READ LOCK を実行する。
mount vxfs snapshot を実行する。
UNLOCK TABLES を実行する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
BACKUP TABLE 構文
BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory' |
ディスクにバッファされている変更をフラッシュした後で、テーブルをリストアするのに最低限必要な数のテーブルファイルをバックアップディレクトリにコピーします。現在のところ、このコマンドは MyISAM テーブルにのみ有効です。
MyISAM テーブルに対して、`.frm' 定義ファイルと `.MYD' データファイルをコピーします。これら 2 つのファイルからインデックスファイルを再度ビルドできます。
このコマンドを使用する前に、 「4.5.1 データベースのバックアップ」 を参照してください。
バックアップ中、各テーブルが処理されている間そのテーブルにのみ読み取りロックがかかります。複数のテーブルを 1 回のスナップショットでバックアップする場合は、まず LOCK TABLES を実行して、そのグループ内の各テーブルに対して読み取りロックをかけておく必要があります。
このコマンドは、以下のカラムで構成されるテーブルを返します。
| カラム | 値 |
| Table | テーブル名 |
| Op | 常に backup |
| Msg_type | status、error、info、warning のいずれか |
| Msg_text | メッセージ |
注意: BACKUP TABLE は、MySQL バージョン 3.23.25 以降でのみ使用できます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
RESTORE TABLE 構文
RESTORE TABLE tbl_name[,tbl_name...] FROM '/path/to/backup/directory' |
BACKUP TABLE で作成されたバックアップから、1 つまたは複数のテーブルをリストアします。既存テーブルには上書きされません。既存テーブルの上にリストアしようとすると、エラーになります。インデックスを再度ビルドする必要があるため、リストアはバックアップよりも時間がかかります。キーが多ければ多いほど、時間がかかります。BACKUP TABLE と同じく、RESTORE TABLE は現在のところ、MyISAM テーブルにのみ有効です。
このコマンドは、以下のカラムで構成されるテーブルを返します。
| カラム | 値 |
| Table | テーブル名 |
| Op | 常に restore |
| Msg_type | status、error、info、warning のいずれか |
| Msg_text | メッセージ |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
CHECK TABLE 構文
CHECK TABLE tbl_name[,tbl_name...] [option [option...]] option = QUICK | FAST | MEDIUM | EXTENDED | CHANGED |
CHECK TABLE は、MyISAM テーブルと InnoDB テーブルにのみ有効です。MyISAM テーブルの場合、このテーブルで myisamchk --medium-check table_name を実行するのと同じです。
オプションを何も指定しなければ、MEDIUM が使用されます。
1 つまたは複数のテーブルのエラーをチェックします。MyISAM テーブルでは、キー統計が更新されます。このコマンドは、以下のカラムで構成されるテーブルを返します。
| カラム | 値 |
| Table | テーブル名 |
| Op | 常に check |
| Msg_type | status、error、info、warning のいずれか |
| Msg_text | メッセージ |
注意: このステートメントは、チェックした各テーブルに関する多くの情報レコードを生成します。
正常な場合、Msg_type は status で、Msg_text は通常 OK になります。
OK または Table is already up to date が得られなければ、テーブルの修復が必要と考えられます。 「4.5.6 myisamchk を使用したテーブルの保守とクラッシュのリカバリ」 節 参照 。 Table is already up to date は、テーブルのストレージマネージャが、そのテーブルにチェックが必要ないと判断したことを意味します。
以下のチェックタイプがあります。
| タイプ | 意味 |
QUICK | 不正リンクをチェックするためのレコードスキャンを実行しない。 |
FAST | 正しく閉じられなかったテーブルだけをチェックする。 |
CHANGED | 前回のチェック後に変更されたテーブルと、正しく閉じられなかったテーブルだけをチェックする。 |
MEDIUM | レコードをスキャンして、削除されたリンクが問題なかったことを確認する。また、レコードのキーチェックサムを計算し、キーの計算されたチェックサムを使って確認する。 |
EXTENDED | 各レコードですべてのキーの完全キールックアップを実行する。テーブルの整合性が 100% 保証されるが、時間がかかる。 |
動的サイズの MyISAM テーブルでは、チェックが開始された場合、常に MEDIUM チェックが実行されます。静的サイズのレコードは破損していることが非常にまれなので、QUICK および FAST でレコードスキャンをスキップします。
チェックオプションは以下のように組み合わせることができます。以下の例では、テーブルが正しく閉じられたかどうかを確認するクイックチェックを行います。
CHECK TABLE test_table FAST QUICK; |
注意: 場合によっては CHECK TABLE はテーブルを変更します。これは、テーブルに 'corrupted' または 'not closed properly' というマークがあるのに、CHECK TABLE がテーブル内に問題を発見しなかった場合に発生します。この場合、CHECK TABLE はテーブルを OK とマークします。
テーブルが破損している場合、データ部分よりもインデックスに問題のある方が可能性が高いです。上記のチェックタイプはいずれも、インデックスを完全にチェックするのでほとんどのエラーは発見できます。
問題がないと思われるテーブルをチェックする場合、チェックオプションを使用しないか、または QUICK オプションを使用します。QUICK は、急いでいるとき、およびデータファイルのエラーが見逃されるかもしれないという非常に小さな危険性を無視できる場合に使用します。ほとんどの場合、MySQL は通常どおりに使用していれば、データファイルのエラーを発見します。発見した場合、そのテーブルには 'corrupted' のマークが付き、修復するまでそのテーブルは使用できません。
FAST および CHANGED は、テーブルをときどきチェックしたい場合に、スクリプトから(たとえば cron から)実行されることを想定しています。通常は、CHANGED よりも FAST の方を使用してください(これが当てはまらないのは、MyISAM コード内にバグが疑われる場合のみです)。
EXTENDED は、通常のチェック後に、MySQL がレコードを更新したりキーでレコードを検索しようとした際に、不自然なエラーが発生する場合にのみ使用します(通常のチェックが正常に終了した後でエラーが発生するのは非常にまれなことです)。
CHECK TABLE で報告される問題の中には、自動的に修正されないものがあります。
Found row where the auto_increment column has the value 0。
これは、AUTO_INCREMENT インデックスカラムの値が 0 になっているレコードがテーブルにあることを意味する(UPDATE ステートメントで明示的に AUTO_INCREMENT カラム値を 0 に設定すれば、このカラムが 0 のレコードを作成することは可能である)。
これ自体はエラーではないが、テーブルをダンプしてリストアしようとしたり、テーブルで ALTER TABLE を実行しようとすると問題が発生する。この場合、AUTO_INCREMENT カラムは AUTO_INCREMENT カラムのルールに基づいて値を変更するため、重複キーエラーなどの原因となる。
警告を消すには、UPDATE ステートメントを実行してこのカラム値を 0 以外の値に設定する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
REPAIR TABLE 構文
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] [QUICK] [EXTENDED] [USE_FRM] |
REPAIR TABLE は MyISAM テーブルにのみ有効であり、このテーブルで myisamchk -r table_name を実行するのと同じです。
通常であれば、このコマンドを使用することはありませんが、障害が発生した場合、REPAIR TABLE を使用すれば、ほとんどの場合、MyISAM テーブルのすべてのデータを取り戻せます。テーブルが頻繁に破損するようであれば、その原因を突き止めて、REPAIR TABLE を使用する必要がなくなるようにしてください。
「A.4.1 MySQL が何度もクラッシュする場合に行うこと」 節 参照 。 「7.1.3 MyISAM テーブルの問題」 節 参照 。
REPAIR TABLE は、破損した可能性のあるテーブルを修復します。このコマンドは、以下のカラムで構成されるテーブルを返します。
| カラム | 値 |
| Table | テーブル名 |
| Op | 常に repair |
| Msg_type | status、error、info、warning のいずれか |
| Msg_text | メッセージ |
注意: このステートメントは、修復した各テーブルに関する多くの情報レコードを生成します。
正常な場合、Msg_type は status で、Msg_text は通常 OK になります。OK を得られない場合は、myisamchk --safe-recover でテーブルの修復を試みてください。REPAIR TABLE ではまだ myisamchk のすべてのオプションをカバーしていません。将来は、このコマンドをより柔軟性の高いものにする予定です。
QUICK を指定した場合、REPAIR TABLE はインデックスツリーだけを修復しようとします。
EXTENDED を使用すると、MySQL はソートごとにインデックスを生成するのではなく、レコードごとにインデックスを生成します。確実に圧縮される長い CHAR キーを使用している場合など、固定長キーをソートするよりこの方法の方が適しています。このタイプの修復は、myisamchk --safe-recover で実行される修復とほぼ同じです。
MySQL 4.0.2 から、REPAIR に USE_FRM モードが導入されています。
`.MYI' ファイルがない、またはそのヘッダが破損している場合にこのモードを使用します。
このモードでは、`.frm' ファイルの情報を使用してテーブルが再度作成されます。このような修復は、myisamchk ではできません。
警告: REPAIR TABLE を実行中に mysqld が終了してしまった場合、他のコマンドを実行する前にもう 1 回 REPAIR を必ず実行してください(もちろん、常にバックアップから開始することを推奨します)。最悪の場合、データファイルに関する情報がない新規のクリーンなインデックスファイルができることがあり、次のコマンドでデータファイルが上書きされてしまう可能性があります。これはあまりないことではありますが、可能性としてはあり得るので、注意が必要です。
MySQL 4.1.1 より前では、REPAIR コマンドはバイナリログに書き込まれません。MySQL 4.1.1 以降、任意の NO_WRITE_TO_BINLOG キーワード(またはそのエイリアスの LOCAL)を使用しない限り、このコマンドはバイナリログに書き込まれます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk を使用したテーブルの保守とクラッシュのリカバリ
MySQL バージョン 3.23.13 以降、CHECK TABLE コマンドを使用して MyISAM テーブルをチェックできるようになりました。 「4.5.4 CHECK TABLE 構文」 節 参照 。 テーブルの修復には REPAIR TABLE コマンドを使用できます。 「4.5.5 REPAIR TABLE 構文」 節 参照 。
MyISAM テーブル(`.MYI' および `.MYD')のチェックおよび修復には myisamchk ユーティリティを使用してください。ISAM テーブル(`.ISM' および `.ISD')のチェックおよび修復には isamchk ユーティリティを使用します。 「7. MySQL のテーブル型」 節 参照 。
以下の説明は myisamchk についてですが、旧 isamchk にもすべて当てはまります。
myisamchk ユーティリティを使用して、データベーステーブルの情報を取得したり、テーブルのチェック、修復、および最適化を実行できます。以下のセクションでは、myisamchk の起動方法(オプションの説明も含む)、テーブル保守のスケジュール、およびさまざまな myisamchk 機能について説明します。
多くの場合、OPTIMIZE TABLES コマンドを使用してテーブルの最適化と修復を行うこともできますが、myisamchk に比べると時間がかかり、重大エラーの場合は信頼性も高くありません。その反面、OPTIMIZE TABLE は使用が簡単で、テーブルのフラッシュを心配する必要がありません。
「4.6.1 OPTIMIZE TABLE 構文」 節 参照 。
myisamchk による修復は信頼性に優れていますが、修復を実行する(つまりテーブルに多くの変更を加える)前に、バックアップを作成しておくことが必要です。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk 起動構文
myisamchk は以下のように起動します。
shell> myisamchk [options] tbl_name |
options は、myisamchk が実行することを指定します。それらについてはここで説明します(myisamchk --help を実行すると、オプションの一覧を取得できます)。オプションを指定しなければ、myisamchk はテーブルのチェックだけを行います。詳細情報を取得したり、myisamchk に修正を実行させるには、ここで説明するオプションを指定することが必要です。
tbl_name は、チェックおよび修復対象となるデータベーステーブル名です。データベースディレクトリ以外の場所で myisamchk を実行する場合、myisamchk に対してファイルのパスを指定する必要があります。実際、myisamchk は処理対象のファイルがデータベースディレクトリにあるかどうかを問題にしません。データベーステーブルのファイルを他の場所にコピーし、そこでリカバリ操作を実行することもできます。
myisamchk コマンドラインに複数のテーブル名を指定することもできます。また、インデックスファイル名(`.MYI' サフィックス付き)を指定することもできます。`*.MYI' パターンを使用すれば 1 つのディレクトリ内のすべてのテーブルを指定することができます。
たとえば、カレントディレクトリがデータベースディレクトリである場合、以下のようにすればディレクトリ内の全テーブルをチェックできます。
shell> myisamchk *.MYI |
カレントディレクトリがデータベースディレクトリでない場合、以下のようにディレクトリのパスを指定することにより、その全テーブルをチェックできます。
shell> myisamchk /path/to/database_dir/*.MYI |
MySQL データディレクトリのパスにワイルドカードを使用することにより、全データベースのすべてのテーブルをチェックすることもできます。
shell> myisamchk /path/to/datadir/*/*.MYI |
すべてのテーブルに対して簡単にチェックを行う場合、以下の方法を推奨します。
myisamchk --silent --fast /path/to/datadir/*/*.MYI isamchk --silent /path/to/datadir/*/*.ISM |
すべてのテーブルをチェックし、破損していたテーブルをすべて修復するには、以下を実行します。
myisamchk --silent --force --fast --update-state -O key_buffer=64M \
-O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M \
/path/to/datadir/*/*.MYI
isamchk --silent --force -O key_buffer=64M -O sort_buffer=64M \
-O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.ISM
|
この例では、64 メガバイト以上の空き容量があることを前提にしています。
注意: 以下のエラーが発生する場合があります。
myisamchk: warning: 1 clients is using or hasn't closed the table properly |
これは、他のプログラム(mysqld サーバなど)によって更新されてまだ閉じられていないファイル、または正しく閉じられていないファイルのテーブルをチェックしようとしているということです。
mysqld を実行中であれば、FLUSH TABLES ですべてのテーブルの同期とクローズを強制的に実行し、myisamchk を実行する間は他のだれにもテーブルを使用させないようにしてください。MySQL バージョン 3.23 で、この問題を回避する最も簡単な方法は、myisamchk の代わりに CHECK TABLE を使用してテーブルをチェックすることです。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk の一般的なオプション
myisamchk は、以下のオプションをサポートします。
-# または --debug=debug_options
debug_options 文字列には、'd:t:o,filename' がよく使用される。
-? または --help
-O name=value, --set-variable=name=value
--set-variable=name=value および -O name=value 構文は MySQL 4.0 で廃止。代わりに --name=value を使用すること。
myisamchk で使用できる変数とそのデフォルト値は、myisamchk --help で確認できる。
| 変数 | 値 |
| key_buffer_size | 523264 |
| read_buffer_size | 262136 |
| write_buffer_size | 262136 |
| sort_buffer_size | 2097144 |
| sort_key_blocks | 16 |
| decode_bits | 9 |
sort_buffer_size は、キーのソートによってキーが修復された場合に使用する。これは、--recover を使用すると通常発生する状態。
key_buffer_size は、--extended-check を使用してテーブルをチェックしている場合や、通常の挿入と同様、キーをテーブルのレコードごとに挿入することによりキーが修復される場合に使用する。以下の場合に、キーバッファによる修復が使用される。
--safe-recover を使用する場合。
CHAR キー、VARCHAR キー、または TEXT キーのサイズが大きい場合にこのケースが発生する。テンポラリ領域が豊富にあり、ソートによる修復を myisamchk に実行させることができる場合は、--sort-recover オプションを使用できる。
キーバッファによる修復は、ソートによる修復よりディスク領域は少なくて済むが、処理速度は遅くなる。
速い修復を望む場合は、上記の変数を利用可能メモリの 1/4 に設定する。上記バッファは 1 度に 1 つだけ使用されるため、両方の変数を大きな値に設定できる。
-s または --silent
-s を 2 回指定すると(-ss)、myisamchk はさらに出力が少なくなる。
-v または --verbose
-d および -e と併用できる。-v を複数回指定すると(-vv、-vvv など)、より冗長になる。
-V または --version
myisamchk のバージョン情報を出力して終了する。
-w または --wait
--skip-external-locking オプション付きの mysqld が実行している場合、そのテーブルは別の myisamchk コマンドによってのみロックされる。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk のチェックオプション
-c または --check
myisamchk に対して明示的にこのオプションを上書きするオプションを指定しなければ、これがデフォルト処理になる。
-e または --extend-check
myisamchk または myisamchk --medium-check でテーブルのエラーを検出できる。
--extended-check を使用し、メモリが豊富にある場合、key_buffer_size の値を大きく設定すべきである。
-F または --fast
-C または --check-only-changed
-f または --force
myisamchk でテーブルにエラーが検出された場合、myisamchk を -r(修復)で再起動する。
-i または --information
-m または --medium-check
-U または --update-state
--check-only-changed オプションを最大限有効に活用するために使用する。ただし、mysqld サーバがそのテーブルを使用しており、mysqld を --skip-external-locking で実行している場合は、このオプションを使用してはいけない。
-T または --read-only
mysqld --skip-external-locking などのような、ロックを使用しない他のアプリケーションによって使用されているテーブルを、myisamchk を使用してチェックする場合、このオプションが便利である。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
以下のオプションは、myisamchk を -r または -o で起動した場合に使用できます。
-B または --backup
--correct-checksum
-D # または --data-file-length=#
-e または --extend-check
-f または --force
-k # または --keys-used=#
ISAM を使用している場合、ISAM ストレージエンジンが最初の # インデックスだけを更新するように指定する。MyISAM を使用している場合は、各バイナリビットが 1 つのキーに対応しているので、どのキーを使用するかはビット計算をして指定する。
このオプションを使用して、挿入を高速化できる。無効化されたインデックスを再び有効にするには、myisamchk -r を使用する。
-l または --no-symlinks
myisamchk はシンボリックリンクが指すテーブルを修復する。このオプションは MySQL 4.0 にはない。MySQL 4.0 では修復中にシンボリックリンクが削除されないためである。
-p または --parallel-recover
-r および -n と同じテクニックを使用するが、すべてのキーを複数のスレッドで並列処理する。
このオプションは MySQL 4.0.2 で導入。
これは、アルファコードである。使用にはリスクが伴う。
-r または --recover
ISAM テーブルまたは MyISAM テーブルでは非常に珍しいエラーである)。
テーブルをリカバリする場合は、まずこのオプションを試す。-r ではテーブルをリカバリできないと myisamchk により報告された場合のみ、-o を実行する。注意: めったにないことではあるが -r が失敗した場合でも、データファイルは損傷を受けない。
メモリが豊富にある場合は、sort_buffer_size のサイズを大きくすべきである。
-o または --safe-recover
-r よりもかなり遅いが、-r で処理できない場合にも対応する。このリカバリ方式は、-r よりもディスク容量の使用が少なくて済む。通常は最初に -r で修復を試みて、それに失敗した場合のみ -o を使用する。
メモリが豊富にある場合は、key_buffer_size のサイズを大きくすべきである。
-n または --sort-recover
myisamchk にソートを強制する。
--character-sets-dir=...
--set-character-set=name
-t または --tmpdir=path
myisamchk はこれに環境変数 TMPDIR を使用する。
MySQL 4.1 以降、tmpdir で、複数のパスをコロン : で区切って設定できるようになっている(Windows ではセミコロン ;)。これは、ラウンドロビン方式で使用される。
-q または --quick
-q を 2 回指定すると、重複キーの場合に、myisamchk にオリジナルのデータファイルの修正を強制する。
-u または --unpack
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk のその他のオプション
以下は、myisamchk で実行できる、テーブルの修復およびチェック以外の操作です。
-a または --analyze
myisamchk --describe --verbose table_name' または MySQL で SHOW KEYS を使用することにより、キーの分布を確認できる。
-d または --description
-A または --set-auto-increment[=value]
AUTO_INCREMENT を開始する。ここで値を指定しなければ、次の AUTO_INCREMENT 値は、オートキーに使用された最高値に 1 を加えた値になる。
-S または --sort-index
-R または --sort-records=#
SELECT や ORDER BY の処理速度が速くなる(最初のソートは非常に遅くなる)。
テーブルのインデックス番号を調べるには SHOW INDEX を使用する。テーブルのインデックスが myisamchk が検出する順序で表示される。インデックス番号は 1 から始まる。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk のメモリ使用
myisamchk を実行する場合、メモリの配分が重要な問題になります。
myisamchk は、-O オプションで指定したサイズ以上のメモリは使用しません。非常に大きなファイルに対して myisamchk を使用する場合、メモリの使用量を最初に決めておいてください。修復処理に使用するメモリのデフォルト値は約 3 メガバイトです。大きな値を使用すれば、myisamchk の処理を高速化できます。たとえば、32 メガバイト以上の RAM がある場合、以下のようにオプションを指定できます(必要に応じて他のオプションも追加します)。
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ... |
ほとんどの場合、-O sort=16M で十分です。
myisamchk は、TMPDIR のテンポラリファイルを使用することに注意してください。TMPDIR がメモリファイルシステムをポイントしていれば、すぐにメモリ不足エラーになります。このエラーが発生する場合には、TMPDIR を、容量の大きいディレクトリを指すように設定し、myisamchk を再起動します。
修復時も、myisamchk は大きなディスク容量を必要とします。
--quick で修復を実行する場合、インデックスファイルだけが再生成されるため、この容量は不要である。オリジナルのレコードファイルと同じディスク上にこの容量が必要である。
--recover または --sort-recover を使用する場合(--safe-recover を使用する場合は含まれない)、ソートバッファ用の容量として (largest_key + row_pointer_length)*number_of_rows * 2 が必要である。
キーの長さおよびレコードポインタの長さを確認するには、myisamchk -dv table を使用する。
この容量は、テンポラリディスクに割り当てられる(TMPDIR または --tmpdir=# で指定)。
修復中にディスク容量に関する問題が発生した場合は、--recover の代わりに --safe-recover を使用できます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisamchk を使用したクラッシュのリカバリ
mysqld を --skip-external-locking で実行している場合(Linux などのシステムではデフォルト)、mysqld が使用している同じテーブルを myisamchk でチェックしても信頼できません。myisamchk の実行中、mysqld からテーブルにアクセスするユーザが確実にない場合のみ、mysqladmin flush-tables を実行してからテーブルをチェックします。テーブルにアクセスするユーザがいるかどうか確信できない場合には、テーブルをチェックする間、mysqld を停止する必要があります。mysqld がテーブルを更新しているときに myisamchk を実行すると、テーブルが破損していない場合でも破損の警告が出る可能性があります。
--skip-external-locking を使用していなければ、いつでも myisamchk を使用してテーブルをチェックできます。この間、テーブルを更新しようとするクライアントはすべて、myisamchk の準備が整うのを待ってから実行します。
myisamchk を使用してテーブルを修復または最適化する場合、必ず、mysqld サーバがそのテーブルを使用していないことを確認してください(--skip-external-locking を使用している場合も同様です)。
mysqld を停止しない場合は、少なくとも mysqladmin flush-tables を myisamchk の前に実行してください。
サーバと myisamchk が同時にテーブルにアクセスすると、テーブルが破損するおそれがあります。
この章では、MySQL データベースのデータ破損のチェック方法およびその対処方法について説明します。テーブルが頻繁に破損する場合は、原因を突き止める必要があります。 「A.4.1 MySQL が何度もクラッシュする場合に行うこと」 節 参照 。
MyISAM テーブルのセクションで、テーブルが破損する原因を示しています。 「7.1.3 MyISAM テーブルの問題」 節 参照 。
クラッシュをリカバリする際には、データベース内のテーブル tbl_name のそれぞれがデータベースディレクトリ内の次の 3 つのファイルに対応していることを理解しておく必要があります。
| ファイル | 用途 |
| `tbl_name.frm' | テーブル定義ファイル |
| `tbl_name.MYD' | データファイル |
| `tbl_name.MYI' | インデックスファイル |
これら 3 つのファイルタイプはいずれもさまざまな形で破損する可能性がありますが、特にデータファイルとインデックスファイルに問題がよく発生します。
myisamchk は、`.MYD'(データ)ファイルのコピーをレコードごとに生成します。修復の最終段階で古い `.MYD' ファイルを削除し、新規ファイルをオリジナルの名前に変更します。--quick を使用している場合、myisamchk はテンポラリ `.MYD' ファイルを生成しませんが、代わりに `.MYD' ファイルが正常であるとみなし、`.MYD' ファイルに手を加えずに新規インデックスファイルだけを生成します。`.MYD' ファイルに問題があった場合は myisamchk が自動的に検知して修復を中止するため、この方法も安全です。2 つの --quick オプションを myisamchk に設定することもできます。この場合、myisamchk はいくつかのエラー(重複キーなど)でも中止せず、`.MYD' ファイルを修正して解決しようとします。通常の修復処理にディスクの空き容量では足りない場合にのみ、2 つの --quick オプション指定が役立ちます。この場合、少なくとも myisamchk を実行する前にバックアップを作成しておいてください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MyISAM テーブルをチェックするには、以下のコマンドを使用します。
myisamchk tbl_name
myisamchk をオプションなしか、-s または --silent のオプションで実行する。
myisamchk -m tbl_name
myisamchk -e tbl_name
-e は "extended check" のこと)。各レコードのすべてのキーが読み取られ、チェックされ、正しいレコードが指されているか確認される。この操作は、多くのキーがある大きなテーブルでは時間がかかる。myisamchk は通常、最初のエラーが見つかった時点で停止する。詳細情報を得るには、--verbose(-v)オプションを追加する。これにより、myisamchk は最大 20 のエラーが検出されるまで処理を続行する。
通常は、テーブル名以外の引数を指定しない myisamchk だけで十分である。
myisamchk -e -i tbl_name
-i オプションによって myisamchk が統計情報も出力する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
このセクションでは、MyISAM テーブル(`.MYI' および `.MYD' の拡張子)に対して myisamchk を使用する方法について説明します。ISAM テーブル(`.ISM' および `.ISD' の拡張子)に対しては、isamchk を使用してください。
MySQL バージョン 3.23.14 以降、REPAIR TABLE コマンドで MyISAM テーブルを修復できるようになっています。 「4.5.5 REPAIR TABLE 構文」 節 参照 。
テーブル破損の症状としては、クエリが予期せず中断したり、以下のようなエラーが発生します。
perror ### を実行すると、エラーの詳細情報を取得できる。以下は、テーブルに問題があることを示す一般的なエラーである。
shell> perror 126 127 132 134 135 136 141 144 145 126 = Index file is crashed / Wrong file format 127 = Record-file is crashed 132 = Old database file 134 = Record was already deleted (or record file crashed) 135 = No more room in record file 136 = No more room in index file 141 = Duplicate unique key or constraint on write or update 144 = Table is crashed and last repair failed 145 = Table was marked as crashed and should be repaired |
注意: エラー 135(no more room in record file)は、単純な修復で直せるエラーではない。この場合、以下のコマンドを実行することが必要。
mysql> ALTER TABLE table MAX_ROWS=xxx AVG_ROW_LENGTH=yyy; |
この手法は、エラー 136(no more room in index file)に対しても使用できる。
他の場合についてはテーブルを修復する必要があります。通常は、myisamchk でほとんどのエラーを検出して修復できます。
修復プロセスは、以下説明するように 4 段階で構成されます。開始する前に、データベースディレクトリに移動(cd)してテーブルファイルのアクセス権を確認してください。mysqld を実行する Unix ユーザに読み取り権限があることを確認します(この確認を行うユーザにもこれらのファイルへのアクセス権が必要)。ファイルを修正する必要がある場合は、書き込み権限も必要です。
MySQL バージョン 3.23.16 以降を使用している場合は、CHECK コマンドと REPAIR コマンドを使用して MyISAM テーブルのチェックおよび修復を実行できます(できるだけ、これらのコマンドを使用してください)。 「4.5.4 CHECK TABLE 構文」 節 参照 。 「4.5.5 REPAIR TABLE 構文」 節 参照 。
テーブル保守に関するセクションで、isamchk および myisamchk のオプションを説明しています。 「4.5.6 myisamchk を使用したテーブルの保守とクラッシュのリカバリ」 節 参照 。
これらのコマンドで失敗した場合、または isamchk および myisamchk の拡張機能を使用する場合につき、以下の説明を参考にして修復作業を行ってください。
コマンドラインを使用してテーブルを修復する場合、まず、mysqld サーバをシャットダウンする必要があります。注意: mysqladmin shutdown をリモートサーバから実行した場合、mysqladmin が戻ってもしばらくの間、mysqld サーバはシャットダウンしません。すべてのクエリが停止してすべてのキーがディスクにフラッシュされた時点でシャットダウンします。
段階 1: テーブルのチェック
myisamchk *.MYI または時間に余裕があれば myisamchk -e *.MYI を実行します。-s(サイレント)オプションを使用すると、不要な情報は出力されません。
mysqld サーバが終了している場合、--update オプションを使用して myisamchk がテーブルに 'checked' のマークを付けるようにします。
myisamchk がエラーを返したテーブルだけ、修復する必要があります。そのようなテーブルについては、段階 2 へ進みます。
チェック時に複雑なエラー(out of memory エラーなど)が発生した場合、あるいは myisamchk がクラッシュした場合は段階 3 に進みます。
段階 2: 簡単で安全な修復
注意: 修復を速く行うには、-O sort_buffer=# -O key_buffer=#(# は利用可能メモリの約 4 分の 1)をすべての isamchk/myisamchk コマンドに追加します。
最初に myisamchk -r -q tbl_name(-r -q は "クイックリカバリモード" の意)を実行します。これにより、データファイルを変更せずにインデックスファイルの修復だけが行われます。データファイルにあるべきものがすべてあり、削除リンクがデータファイル内の正しい場所を指していれば、テーブルは正常に修復されます。成功したら、次のテーブルの修復を開始します。失敗した場合は以下の手順を実行します。
myisamchk -r tbl_name(-r は "リカバリモード" の意)を使用する。これにより、不正なレコードと削除されたレコードがデータファイルから削除され、インデックスファイルが再構築される。
myisamchk --safe-recover tbl_name を使用する。
セーフリカバリモードにより、古いリカバリ形式が使用され、通常のリカバリモードでは処理できない修復が行われる。ただし、時間がかかる。
修復時に複雑なエラー(out of memory エラーなど)が発生した場合、あるいは myisamchk がクラッシュした場合は段階 3 に進みます。
段階 3:困難な修復
インデックスファイルの最初の 16K ブロックが破損または不正な情報を含む場合、あるいはインデックスファイルがない場合だけ、この段階に進みます。この段階では、新しいインデックスファイルを作成する必要があります。以下を実行してください。
shell> mysql db_name mysql> SET AUTOCOMMIT=1; mysql> TRUNCATE TABLE table_name; mysql> quit |
使用している SQL バージョンに TRUNCATE TABLE がない場合は、代わりに DELETE FROM table_name を使用する。
段階 2 に戻ります。これで、myisamchk -r -q が機能するはずです(無限ループにならないはずです)。
MySQL 4.0.2 より、この手順全体を自動で実行する REPAIR ... USE_FRM も使用できるようになりました。
段階 4: 非常に困難な修復
記述ファイルもクラッシュしている場合にのみこの段階に進みます。ただし、テーブル作成後に記述ファイルが変更されることはないので、通常は発生しない状況です。
myisamchk -r を実行する。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
断片化したレコードを結合したり、レコードの削除または更新によって発生した無駄なスペースを除去するには、myisamchk をリカバリモードで実行します。
shell> myisamchk -r tbl_name |
同様に、SQL の OPTIMIZE TABLE ステートメントを使用して、テーブルを最適化することもできます。OPTIMIZE TABLE はテーブルの修復とキー分析を行い、さらにインデックスツリーをソートして、キー走査の処理速度を上げます。
また、OPTIMIZE TABLE を使用した場合、サーバ側ですべての処理が行われるため、ユーティリティとサーバ間で不要なやり取りが発生しません。 「4.6.1 OPTIMIZE TABLE 構文」 節 参照 。
myisamchk には、テーブルのパフォーマンスを向上させるためのオプションが数多く用意されています。
-S, --sort-index
-R index_num, --sort-records=index_num
-a, --analyze
オプションの詳細な説明については、 「4.5.6.1 myisamchk 起動構文」 節 参照 を参照してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
MySQL バージョン 3.23.13 以降、CHECK TABLE コマンドを使用して MyISAM テーブルをチェックできるようになりました。 「4.5.4 CHECK TABLE 構文」 節 参照 。 テーブルの修復は REPAIR TABLE コマンドで行えます。 「4.5.5 REPAIR TABLE 構文」 節 参照 。
問題が発生するのを待つより、定期的にテーブルチェックを行うことを推奨します。保守目的では、myisamchk -s を使用してテーブルをチェックできます。-s オプション(--silent の短縮形)を使用すると、サイレントモードで myisamchk が実行され、エラー発生時のみメッセージが出力されます。
また、サーバが起動するたびにテーブルをチェックするという方法もあります。
たとえば、更新の途中でマシンがリブートされた場合、影響を受けた可能性のあるテーブルをすべてチェックする必要があります(つまり、"破損の可能性があるテーブル" をチェックします)。リブート後に古い `.pid'(プロセス ID)ファイルが残っていた場合、mysqld_safe にテストを追加して、直前の 24 時間以内に変更されたテーブルのチェックを myisamchk で実行することができます。`.pid' ファイルは mysqld 起動時に作成され、正常終了時に削除されます。システム起動時に `.pid' ファイルが存在していれば、mysqld が異常終了したことになります。
より完全なテストを行うには、`.pid' ファイルの作成後に変更されたすべてのテーブルをチェックするという方法もあります。
通常のシステム運用中にも定期的にテーブルをチェックしてください。MySQL AB では、週に一度 cron ジョブを実行して重要なテーブルをチェックしています。`crontab' ファイルは以下のようになります。
35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI |
これで、クラッシュしたテーブルに関する情報が出力されるので、必要に応じて検査および修復を行えます。
ここ数年、予想外のテーブル破損(ハードウェアトラブル以外による破損)は発生していないので、当社では週に一度のチェックで十分としています。
最初のうちは、myisamchk -s を毎晩実行して、直前の 24 時間以内に更新されたすべてのテーブルをチェックするようにします。しばらくすると、MySQL の信頼性の高さを実感できるはずです。
通常、MySQL テーブルの保守はそれほど頻繁に行う必要はありません。動的サイズのレコード(VARCHAR カラム、BLOB カラム、または TEXT カラム)があるテーブルを変更したり、多くのレコードが削除されたテーブルがある場合には、月に一度程度、最適化を行ってテーブルの領域を解放することを推奨します。
これを行うには、目的のテーブルで OPTIMIZE TABLE を実行するか、mysqld サーバを停止して以下を実行します。
isamchk -r --silent --sort-index -O sort_buffer_size=16M */*.ISM myisamchk -r --silent --sort-index -O sort_buffer_size=16M */*.MYI |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
テーブルに関する情報またはその統計を取得するには、以下のコマンドを実行します。これらの情報については後で詳しく説明します。
myisamchk を "describe モード" で実行し、テーブル情報を生成する。--skip-external-locking オプションを使用して MySQL サーバを起動した場合、myisamchk は、実行中に更新されたテーブルに対してエラーを報告する場合がある。しかし、myisamchk は describe モードではテーブルを変更しないため、データ破壊の危険性はない。
myisamchk の実行中の処理に関する詳細な情報を取得するには、-v を追加して冗長モードで実行する。
-eis とほぼ同じであるが、このオプションを使用すると、進行中の処理も表示される。
MyISAM file: company.MYI
Record format: Fixed length
Data records: 1403698 Deleted blocks: 0
Recordlength: 226
table description:
Key Start Len Index Type
1 2 8 unique double
2 15 10 multip. text packed stripped
3 219 8 multip. double
4 63 10 multip. text packed stripped
5 167 2 multip. unsigned short
6 177 4 multip. unsigned long
7 155 4 multip. text
8 138 4 multip. unsigned long
9 177 4 multip. unsigned long
193 1 text
|
myisamchk -d -v による出力例
MyISAM file: company
Record format: Fixed length
File-version: 1
Creation time: 1999-10-30 12:12:51
Recover time: 1999-10-31 19:13:01
Status: checked
Data records: 1403698 Deleted blocks: 0
Datafile parts: 1403698 Deleted data: 0
Datafilepointer (bytes): 3 Keyfile pointer (bytes): 3
Max datafile length: 3791650815 Max keyfile length: 4294967294
Recordlength: 226
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 8 unique double 1 15845376 1024
2 15 10 multip. text packed stripped 2 25062400 1024
3 219 8 multip. double 73 40907776 1024
4 63 10 multip. text packed stripped 5 48097280 1024
5 167 2 multip. unsigned short 4840 55200768 1024
6 177 4 multip. unsigned long 1346 65145856 1024
7 155 4 multip. text 4995 75090944 1024
8 138 4 multip. unsigned long 87 85036032 1024
9 177 4 multip. unsigned long 178 96481280 1024
193 1 text
|
myisamchk -eis による出力例
Checking MyISAM file: company Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 98% Packed: 17% Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1626.51, System time 232.36 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 627, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 639, Involuntary context switches 28966 |
myisamchk -eiv による出力例
Checking MyISAM file: company Data records: 1403698 Deleted blocks: 0 - check file-size - check delete-chain block_size 1024: index 1: index 2: index 3: index 4: index 5: index 6: index 7: index 8: index 9: No recordlinks - check index reference - check data record references index: 1 Key: 1: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 2 Key: 2: Keyblocks used: 98% Packed: 50% Max levels: 4 - check data record references index: 3 Key: 3: Keyblocks used: 97% Packed: 0% Max levels: 4 - check data record references index: 4 Key: 4: Keyblocks used: 99% Packed: 60% Max levels: 3 - check data record references index: 5 Key: 5: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 6 Key: 6: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 7 Key: 7: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 8 Key: 8: Keyblocks used: 99% Packed: 0% Max levels: 3 - check data record references index: 9 Key: 9: Keyblocks used: 98% Packed: 0% Max levels: 4 Total: Keyblocks used: 9% Packed: 17% - check records and index references [LOTS OF ROW NUMBERS DELETED] Records: 1403698 M.recordlength: 226 Packed: 0% Recordspace used: 100% Empty space: 0% Blocks/Record: 1.00 Record blocks: 1403698 Delete blocks: 0 Recorddata: 317235748 Deleted data: 0 Lost space: 0 Linkdata: 0 User time 1639.63, System time 251.61 Maximum resident set size 0, Integral resident set size 0 Non physical pagefaults 0, Physical pagefaults 10580, Swaps 0 Blocks in 4 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 10604, Involuntary context switches 122798 |
上記の例で使用されたテーブルのデータファイルおよびインデックスファイルのサイズは以下のとおりです。
-rw-rw-r-- 1 monty tcx 317235748 Jan 12 17:30 company.MYD -rw-rw-r-- 1 davida tcx 96482304 Jan 12 18:35 company.MYI |
以下、myisamchk が生成する情報のタイプについて説明します。"キーファイル" とはインデックスファイルのことです。"レコード" と "ロー" はシノニムです。
Data records と同じ。
Fixed length を使用。
他に、Compressed および Packed がある。
unique または multip.(複数)。このインデックスに値の重複が認められているかどうかを示す。
packed、stripped、または empty のいずれかの ISAM データ型。
myisamchk -a でテーブルがロード(または大きく変更)されると更新される。まったく更新されない場合は、デフォルト値の 30 となる。
myisamchk で再構成されたばかりなので、値は非常に高い(理論的な最大値に非常に近い)。
CHAR、VARCHAR、DECIMAL の各キーにのみ使用できる。名前のような長い文字列では、パックにより使用領域を大きく減らすことができる。上の 3 番目の例では、4 番目のキーが 10 文字長で、領域が 60 パーセント減少している。
Packed 値は、これによって節約されたパーセントを示す。
myisamchk で再編成できる。
「4.5.6.10 テーブルの最適化」 節 参照 。
Linkdata は、そのようなポインタすべてに使用されているストレージ量の合計を示す。
テーブルが myisampack で圧縮されている場合、myisamchk -d を実行すると、各テーブルカラムに関する追加情報が出力されます。これらの情報およびその意味については、 「4.8.4 myisampack(MySQL 圧縮読み取り専用テーブルジェネレータ)」 を参照してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
4.6.1 OPTIMIZE TABLE 構文 | ||
4.6.2 ANALYZE TABLE 構文 | ||
4.6.3 CHECKSUM TABLE 構文 | ||
4.6.4 FLUSH 構文 | ||
4.6.5 RESET 構文 | ||
4.6.6 PURGE MASTER LOGS 構文 | ||
4.6.7 KILL 構文 | ||
4.6.8 SHOW 構文 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
OPTIMIZE TABLE 構文
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name]... |
OPTIMIZE TABLE は、テーブルの大部分を削除したり、可変長レコードを持つテーブル(VARCHAR カラム、BLOB カラム、または TEXT カラムを持つテーブル)に多くの変更を加えた場合に使用します。
削除されたレコードはリンクされたリストに保持され、元のレコード位置は、後続の INSERT 操作により再利用されます。OPTIMIZE TABLE を使用して未使用領域を解放し、データファイルを最適化することができます。
ほとんどの場合、OPTIMIZE TABLE を実行する必要はありません。可変長レコードに更新を多く行う場合でも、週または月に一度、特定のテーブルだけに実行するだけで十分です。
現在のところ、OPTIMIZE TABLE は MyISAM テーブルと BDB テーブルにのみ有効です。BDB テーブルでは、OPTIMIZE TABLE は現在 ANALYZE TABLE にマップされます。
「4.6.2 ANALYZE TABLE 構文」 節 参照 。
mysqld を --skip-new または --safe-mode で起動することにより、OPTIMIZE TABLE を他のテーブルタイプにでも使用できるようになります。しかしこの場合、OPTIMIZE TABLE は ALTER TABLE にマップされます。
OPTIMIZE TABLE は以下のように動作します。
注意: OPTIMIZE TABLE の実行中、テーブルはロックされます。
MySQL 4.1.1 より前のバージョンを使用している場合、OPTIMIZE コマンドはバイナリログに記録されません。MySQL 4.1.1 以降を使用している場合は、オプションの NO_WRITE_TO_BINLOG キーワード(またはそのエイリアスの LOCAL)を使用していない限り、バイナリログに記録されます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ANALYZE TABLE 構文
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[,tbl_name...] |
テーブルのキー分布を分析して保存します。分析中、テーブルは読み取りロックされます。このコマンドは、MyISAM テーブルと BDB テーブルに対して使用できます。
これは、テーブルに対して myisamchk -a を実行するのと同じです。
定数を条件としない結合を実行する場合、MySQL は保存されたキー分布を使用して、テーブルの結合順序を決定します。
このコマンドは、以下のカラムで構成されるテーブルを返します。
| カラム | 値 |
| Table | テーブル名 |
| Op | 常に analyze |
| Msg_type | status、error、info、warning のいずれか |
| Msg_text | メッセージ |
保存されたキー分布をチェックするには、SHOW INDEX コマンドを使用します。
「4.6.8.1 データベース、テーブル、カラム、およびインデックスに関する情報の取得」 節 参照 。
前回の ANALYZE TABLE コマンドを実行した後でテーブルが変更されていない場合、テーブルに対して再度分析は実行されません。
MySQL 4.1.1 より前のバージョンを使用している場合、ANALYZE コマンドはバイナリログに記録されません。MySQL 4.1.1 以降を使用している場合は、オプションの NO_WRITE_TO_BINLOG キーワード(またはそのエイリアスの LOCAL)を使用していない限り、バイナリログに記録されます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
CHECKSUM TABLE 構文
CHECKSUM TABLE tbl_name[,tbl_name ...] [ QUICK | EXTENDED ] |
テーブルのチェックサムを報告します。QUICK を指定した場合、現時点のテーブルのチェックサムが報告されます。または、テーブルがチェックサムをサポートしていない場合は NULL が返されます。この処理時間は非常に短くて済みます。EXTENDED モードでは、テーブル全体がレコードごとに読み取られ、チェックサムが計算されます。大きなテーブルの場合は時間がかかります。デフォルトでは(QUICK でも EXTENDED でもない場合)、テーブルがチェックサムをサポートしていれば、現時点のチェックサムが返され、サポートしていなければ、テーブルがスキャンされます。
このコマンドは、MySQL 4.1.1 で導入されました。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
FLUSH 構文
FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [,flush_option] ... |
MySQL が使用している内部キャッシュを消去するには、FLUSH コマンドを使用します。FLUSH を実行するには、RELOAD 権限が必要です。
flush_option には、以下のいずれかを指定できます。
| オプション | 説明 |
HOSTS | ホストキャッシュテーブルを空にする。ホストが IP アドレスを変更した場合や、エラーメッセージ Host ... is blocked が表示される場合には、ホストテーブルをフラッシュすることが必要である。MySQL サーバとの接続中に、特定のホストの 1 つのレコードで max_connect_errors を超えるエラーが発生した場合、MySQL は問題があると判断し、以後、ホストからの接続要求をブロックする。 |
ホストテーブルをフラッシュすると、ホストが再び接続可能になる。 「A.2.5
DES_KEY_FILE | サーバ起動時に --des-key-file オプションで指定されたファイルから、DES キーを再度読み込む。 |
LOGS | すべてのログファイルを閉じて、再び開く。 | 更新ログファイルまたはバイナリログファイルを拡張子なしで指定している場合、ログファイルの拡張子番号は前のファイルに 1 を加算した数になる。ファイル名に拡張子を使用している場合、MySQL は更新ログファイルを閉じて、再び開く。 「4.10.3 更新ログ」 節 参照 。 これは、
PRIVILEGES | mysql データベースの権限テーブルから権限を再読み込みする。 |
QUERY CACHE | クエリキャッシュを最適化し、メモリの使用効率を高める。このコマンドは RESET QUERY CACHE とは異なり、キャッシュからクエリを削除しない。 |
TABLES | 開いているテーブルをすべて閉じる。使用中のテーブルも強制的に閉じる。これにより、クエリキャッシュもフラッシュされる。 |
[TABLE | TABLES] tbl_name [,tbl_name...] | 指定したテーブルだけをフラッシュする。 |
TABLES WITH READ LOCK | 開いているテーブルをすべて閉じ、すべてのデータベースの全テーブルを読み取りロックする。このロックは UNLOCK TABLES を実行するまで解除されない。適宜スナップショットを取ることができる Veritas などのファイルシステムを使用している場合には、このコマンドがバックアップの作成に非常に便利である。 |
STATUS | ほとんどのステータス変数を 0 にリセットする。これは、クエリをデバッグするときにのみ使用する。 |
USER_RESOURCES | すべてのユーザリソースを 0 にリセットする。これにより、ブロックされていたユーザも再度ログイン可能になる。 「4.4.7 ユーザリソースの制限」 節 参照 。 |
MySQL 4.1.1 より前のバージョンを使用している場合、FLUSH コマンドはバイナリログに記録されません。MySQL 4.1.1 以降のバージョンを使用している場合には、オプションの NO_WRITE_TO_BINLOG キーワード(またはそのエイリアスの LOCAL)を使用していない限り、バイナリログに記録されます。また、このコマンドに LOGS、MASTER、SLAVE、TABLES WITH READ LOCK のいずれかの引数が含まれる場合も、バイナリログに記録されません。これらの引数はスレーブにレプリケートされると問題が発生する可能性があります。
上記コマンドのうちのいくつかには、mysqladmin ユーティリティで flush-hosts、flush-logs、flush-privileges、 flush-status、flush-tables の各コマンドを使用してアクセスすることもできます。
レプリケーションで使用する RESET コマンドも参照してください。
「4.6.5 RESET 構文」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
RESET 構文
RESET reset_option [,reset_option] ... |
RESET コマンドは設定をリセットします。FLUSH コマンドのより強力なバージョンとしても機能します。 「4.6.4 FLUSH 構文」 節 参照 。
RESET を実行するには、RELOAD 権限が必要です。
| オプション | 説明 |
MASTER | インデックスファイル内のすべてのバイナリログを削除し、バイナリログインデックスファイルを空白にリセットする。これは、以前の FLUSH MASTER。 |
「4.11.7 マスタサーバを制御する SQL ステートメント」 節 参照 。
SLAVE | スレーブから、マスタバイナリログ内の自分のレプリケーション位置を消去する。これは、以前の FLUSH SLAVE。 「4.11.8 スレーブサーバを制御する SQL ステートメント」 節 参照 。 |
QUERY CACHE | クエリキャッシュからすべてのクエリ結果を削除する。 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
PURGE MASTER LOGS 構文
PURGE {MASTER|BINARY} LOGS TO binlog_name
PURGE {MASTER|BINARY} LOGS BEFORE date
|
このコマンドは、指定したバイナリログまたは指定日より前のバイナリログをすべて削除する場合に使用します。 「4.11.7 マスタサーバを制御する SQL ステートメント」 節 参照 。
PURGE MASTER LOGS のシノニムとして PURGE BINARY LOGS が MySQL 4.1.1 から利用可能になっています。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
KILL 構文
KILL thread_id |
mysqld の各接続はスレッドごとに行われます。SHOW PROCESSLIST コマンドで、どのスレッドが使用されているか知ることができます。また、KILL thread_id コマンドで、スレッドを強制終了できます。
PROCESS 権限があれば、すべてのスレッドを照会することができます。
SUPER 権限があれば、すべてのスレッドを強制終了できます。
上記の権限がない場合は、自分のスレッドだけ照会および強制終了できます。
mysqladmin processlist コマンドおよび mysqladmin kill コマンドでも、スレッドを確認および強制終了できます。
注意: 現在のところ、組み込み MySQL サーバライブラリでは KILL を使用できません。組み込みサーバは、ホストアプリケーションのスレッド内部で実行するだけで、独自の接続スレッドは作成しません。
KILL を実行すると、スレッド固有の kill flag がスレッドに設定されます。
キルフラグは一定間隔でチェックされるため、多くの場合、スレッドが終了するまでにしばらく時間がかかります。
SELECT、ORDER BY、GROUP BY の各ループでは、レコードのブロックが 1 つ読み取られるたびにフラグがチェックされます。キルフラグが設定されていれば、ステートメントは停止します。
ALTER TABLE を実行した場合、オリジナルのテーブルからレコードの各ブロックが読み取られる前に、キルフラグがチェックされます。キルフラグが設定されていればコマンドは停止し、テンポラリテーブルは削除されます。
UPDATE または DELETE を実行した場合、各ブロックが読み取られた後、および更新レコードまたは削除レコードの後で、キルフラグがチェックされます。キルフラグが設定されていれば、ステートメントは停止します。注意: トランザクションを使用していない場合、変更はロールバックされません。
GET_LOCK() は NULL で停止します。
INSERT DELAYED スレッドは、そのメモリにあるすべてのレコードをすばやくフラッシュし、終了します。
Locked 状態)、テーブルロックがすばやく解除されます。
write コールで空きディスク容量を待っている場合、disk full のエラーメッセージで書き込みが停止します。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW 構文
SHOW DATABASES [LIKE wild] か SHOW [OPEN] TABLES [FROM db_name] [LIKE wild] か SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] か SHOW INDEX FROM tbl_name [FROM db_name] か SHOW TABLE STATUS [FROM db_name] [LIKE wild] か SHOW STATUS [LIKE wild] か SHOW VARIABLES [LIKE wild] か SHOW [BDB] LOGS か SHOW [FULL] PROCESSLIST か SHOW GRANTS FOR user か SHOW CREATE TABLE table_name か SHOW MASTER STATUS か SHOW MASTER LOGS か SHOW SLAVE STATUS か SHOW WARNINGS [LIMIT row_count] か SHOW ERRORS [LIMIT row_count] か SHOW TABLE TYPES |
SHOW を実行すると、データベース情報、テーブル情報、カラム情報、またはサーバのステータス情報が提供されます。LIKE wild を使用した場合、wild 文字列内に SQL の `%' および `_' のワイルドカード文字を使用できます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
tbl_name FROM db_name 構文の代わりに db_name.tbl_name を使用することもできます。以下の 2 つのステートメントは同じです。
mysql> SHOW INDEX FROM mytable FROM mydb; mysql> SHOW INDEX FROM mydb.mytable; |
SHOW DATABASES は、MySQL サーバホスト上のデータベースを一覧表示します。
mysqlshow コマンドラインツールを使用しても、この一覧を取得できます。
バージョン 4.0.2 では、ユーザにグローバル SHOW DATABASES 権限がない場合、そのユーザが何らかの権限を持つデータベースのみ表示されます。
SHOW TABLES は、指定したデータベースのテーブルを一覧表示します。mysqlshow db_name コマンドを使用しても、この一覧を取得できます。
注意: ユーザにテーブルに対する権限が何もない場合、SHOW TABLES および mysqlshow db_name の出力にそのテーブルは含まれません。
SHOW OPEN TABLES は、テーブルキャッシュで現在開いているテーブルを一覧表示します。 「5.4.7 MySQL でのテーブルのオープンとクローズの方法」 節 参照 。 Comment フィールドは、テーブルが何回キャッシャされ、使用されたかを示します。
SHOW COLUMNS は、指定したテーブルのカラムを一覧表示します。FULL オプションを指定した場合、ユーザが各カラムに持つ権限も表示されます。カラム情報で示されるカラムの型は、CREATE TABLE ステートメントで指定したものと異なっている場合があります。これは、カラムの型が MySQL によって自動的に変更されることがあるためです。 「6.5.3.1 カラムの暗黙的な変更」 節 参照 。
MySQL 4.1 から、FULL キーワードにより、カラム別コメントも表示されるようになりました。
DESCRIBE ステートメントでも SHOW COLUMNS と同様の情報が出力されます。
「6.6.2 DESCRIBE 構文(カラムに関する情報の取得)」 節 参照 。
SHOW FIELDS は SHOW COLUMNS のシノニムで、SHOW KEYS は SHOW INDEX のシノニムです。mysqlshow db_name tbl_name および mysqlshow -k db_name tbl_name でも、テーブルのカラムまたはインデックスを一覧表示できます。
SHOW INDEX は、ODBC での SQLStatistics 呼び出しとよく似た形式でインデックス情報を返します。以下のカラムが返されます。
| カラム | 意味 |
Table | テーブル名。 |
Non_unique | インデックスに重複が許されない場合は 0、許される場合には 1。 |
Key_name | インデックス名。 |
Seq_in_index | インデックスのカラムシーケンス番号。1 から始まる。 |
Column_name | カラム名。 |
Collation | インデックスでのカラムのソート方法。 | MySQL ではこれは `A'(昇順)または
Cardinality | インデックス内のユニークな値の数。 | これは、
Sub_part | カラムが部分的にインデックスになっている場合は、インデックスになっている文字数。 | キー全体がインデックスになっている場合は
Null | カラムに NULL を含めることができれば 'YES'。 |
Index_type | 使用されるインデックス方式。 |
Comment | さまざまなコメント。現在のところ、MySQL 4.0.2 より前のバージョンでは、インデックスが FULLTEXT か否かを表示。 |
注意: Cardinality は整数で保存された統計情報に基づいてカウントされるため、小さなテーブルについては正確であると限りません。
Null カラムおよび Index_type カラムは MySQL 4.0.2 で追加されました。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW TABLE STATUS
SHOW TABLE STATUS [FROM db_name] [LIKE wild] |
SHOW TABLE STATUS(バージョン 3.23 で導入)は SHOW STATUS と似た働きをしますが、各テーブルに関する多くの情報を提供します。mysqlshow --status db_name コマンドを使用しても、この一覧を取得することができます。
以下のカラムが返されます。
| カラム | 意味 |
Name | テーブル名。 |
Type | テーブル型。 「7. MySQL のテーブル型」 節 参照 。 |
Row_format | レコードの保存形式(Fixed、Dynamic、または Compressed)。 |
Rows | レコードの数。 |
Avg_row_length | レコードの平均長。 |
Data_length | データファイルの長さ。 |
Max_data_length | データファイルの最大長。 | 固定レコード形式では、テーブルのレコードの最大数になる。 動的レコード形式では、テーブルに保存できるデータバイト数の合計(データポインタサイズの使用が前提)。
Index_length | インデックスファイルの大きさ。 |
Data_free | 割り当てられているが未使用のバイト数。 |
Auto_increment | 次の自動インクリメント値。 |
Create_time | テーブル作成時刻。 |
Update_time | 前回のデータファイル更新時刻。 |
Check_time | 前回のテーブルチェック時刻。 |
Collation | テーブルのキャラクタセットと照合順序(4.1.1 で導入)。 |
Checksum | チェックサム値(ある場合)(4.1.1 で導入)。 |
Create_options | CREATE TABLE で使用される拡張オプション。 |
Comment | テーブル作成時のコメント(または MySQL がテーブル情報にアクセスできない理由)。 |
InnoDB テーブルでは、テーブルコメントにテーブルの空き領域が報告されます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW STATUS
SHOW STATUS は、サーバのステータス情報を提供します(mysqladmin extended-status と同様)。出力は以下のようになります(形式と数値は場合によって異なります)。
+--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | Aborted_clients | 0 | | Aborted_connects | 0 | | Bytes_received | 155372598 | | Bytes_sent | 1176560426 | | Connections | 30023 | | Created_tmp_disk_tables | 0 | | Created_tmp_tables | 8340 | | Created_tmp_files | 60 | | Delayed_insert_threads | 0 | | Delayed_writes | 0 | | Delayed_errors | 0 | | Flush_commands | 1 | | Handler_delete | 462604 | | Handler_read_first | 105881 | | Handler_read_key | 27820558 | | Handler_read_next | 390681754 | | Handler_read_prev | 6022500 | | Handler_read_rnd | 30546748 | | Handler_read_rnd_next | 246216530 | | Handler_update | 16945404 | | Handler_write | 60356676 | | Key_blocks_used | 14955 | | Key_read_requests | 96854827 | | Key_reads | 162040 | | Key_write_requests | 7589728 | | Key_writes | 3813196 | | Max_used_connections | 0 | | Not_flushed_key_blocks | 0 | | Not_flushed_delayed_rows | 0 | | Open_tables | 1 | | Open_files | 2 | | Open_streams | 0 | | Opened_tables | 44600 | | Questions | 2026873 | | Select_full_join | 0 | | Select_full_range_join | 0 | | Select_range | 99646 | | Select_range_check | 0 | | Select_scan | 30802 | | Slave_running | OFF | | Slave_open_temp_tables | 0 | | Slow_launch_threads | 0 | | Slow_queries | 0 | | Sort_merge_passes | 30 | | Sort_range | 500 | | Sort_rows | 30296250 | | Sort_scan | 4650 | | Table_locks_immediate | 1920382 | | Table_locks_waited | 0 | | Threads_cached | 0 | | Threads_created | 30022 | | Threads_connected | 1 | | Threads_running | 1 | | Uptime | 80380 | +--------------------------+------------+ |
上記のステータス変数にはそれぞれ以下のような意味があります。
| 変数 | 意味 |
Aborted_clients | 接続を閉じる前にクライアントが終了してしまったために中断された接続数。 「A.2.10 通信エラー/Aborted connection」 節 参照 。 |
Aborted_connects | MySQL サーバへの接続試行失敗回数。 「A.2.10 通信エラー/Aborted connection」 節 参照 。 |
Bytes_received | すべてのクライアントから受信したバイト数。 |
Bytes_sent | すべてのクライアントに送信されたバイト数。 |
Com_xxx | 各 xxx コマンドの実行回数。 |
Connections | MySQL サーバへの接続試行回数。 |
Created_tmp_disk_tables | ステートメント実行中に、ディスク上に作成された暗黙的テンポラリテーブルの数。 |
Created_tmp_tables | ステートメント実行中に、メモリ上に作成された暗黙的テンポラリテーブルの数。 |
Created_tmp_files | mysqld が作成したテンポラリファイルの数。 |
Delayed_insert_threads | INSERT DELAYED ハンドラスレッドの数。 |
Delayed_writes | INSERT DELAYED で書き込まれたレコードの数。 |
Delayed_errors | エラー発生(重複キーの可能性が高い)により、INSERT DELAYED で書き込まれたレコードの数。 |
Flush_commands | FLUSH コマンドの実行回数。 |
Handler_commit | 内部 COMMIT コマンド数。 |
Handler_delete | テーブルからレコードが削除された回数。 |
Handler_read_first | 最初のエントリがインデックスから読み取られた回数。 | この値が大きい場合、サーバが何回もフルインデックススキャンを実行していると考えられる。たとえば、
Handler_read_key | キーに基づくレコード読み取り要求の回数。この値が大きい場合、クエリおよびテーブルが適切にインデックス化されていると考えられる。 |
Handler_read_next | キー順序での次のレコードの読み取り要求の回数。範囲指定をしてインデックスカラムに対してクエリを実行すると、これがインクリメントされる。インデックススキャンを実行してもインクリメントされる。 |
Handler_read_prev | キー順序での前のレコードの読み取り要求の回数。これは主に、ORDER BY ... DESC を最適化するのに使用される。 |
Handler_read_rnd | 固定位置に基づくレコード読み取り要求の回数。 | 結果のソートを必要とするクエリを多く実行すると、この値が大きくなる。
Handler_read_rnd_next | データファイルでの次のレコードの読み取り要求の回数。 | テーブルスキャンが多く実行されると、この値が大きくなる。この場合、一般的に、テーブルが適切にインデックス化されていないか、クエリがインデックスを有効に利用していないかを意味する。
Handler_rollback | 内部 ROLLBACK コマンド数。 |
Handler_update | テーブル内のレコードの更新要求回数。 |
Handler_write | テーブルへのレコードの挿入要求回数。 |
Key_blocks_used | キーキャッシュの使用ブロック数。 |
Key_read_requests | キャッシュからのキーブロック読み取り要求回数。 |
Key_reads | ディスクからのキーブロックの物理的読み取り回数。 |
Key_write_requests | キャッシュへのキーブロックの書き込み要求回数。 |
Key_writes | ディスクへのキーブロックの物理的書き込み回数。 |
Max_used_connections | 同時使用可能な最大接続数。 |
Not_flushed_key_blocks | 変更されたが、ディスクへのフラッシュはまだされていないキーキャッシュのキーブロック。 |
Not_flushed_delayed_rows | INSERT DELAY キューで書き込みを待っているレコードの数。 |
Open_tables | 開いているテーブルの数。 |
Open_files | 開いているファイルの数。 |
Open_streams | 開いているストリームの数(主にログ用に使用)。 |
Opened_tables | 開かれたテーブルの数。 |
Rpl_status | フェールセーフなレプリケーションのステータス(まだ使用されていない)。 |
Select_full_join | キーを使用しない結合の数(この値が 0 でない場合、テーブルのインデックスをチェックする必要がある)。 |
Select_full_range_join | 参照テーブルで範囲指定の検索を使用した結合の数。 |
Select_range | 最初のテーブルの範囲指定された部分のみを使用した結合の数(通常、この値が大きくても問題にはならない)。 |
Select_scan | 最初のテーブルでフルスキャンを行った結合の数。 |
Select_range_check | 各レコードの後でキー使用をチェックする、キーを使用しない結合の数(この値が 0 でない場合、テーブルのインデックスをチェックする必要がある)。 |
Questions | サーバに送信されたクエリの数。 |
Slave_open_temp_tables | スレーブスレッドによって現在開かれているテンポラリテーブルの数。 |
Slave_running | マスタに接続されているスレーブの場合は ON。 |
Slow_launch_threads | 生成に slow_launch_time より時間がかかったスレッドの数。 |
Slow_queries | long_query_time 秒より時間がかかったクエリの数。 「4.10.5 スロークエリログ」 節 参照 。 |
Sort_merge_passes | ソートアルゴリズムで必要だったマージパスの回数。この値が大きければ、sort_buffer の値を大きくすることを考慮すべきである。 |
Sort_range | 範囲指定で行われたソートの回数。 |
Sort_rows | ソートされたレコードの数。 |
Sort_scan | テーブルのスキャンによって実行されたソートの回数。 |
ssl_xxx | SSL によって使用される変数(まだ導入されていない)。 |
Table_locks_immediate | テーブルロックがすぐに実行された回数。3.23.33 で導入。 |
Table_locks_waited | テーブルロックがすぐには実行されず、待機が必要だった回数。この値が大きい場合、パフォーマンス上の問題がある。まずクエリを最適化し、次にテーブルを分割するかレプリケーションを使用すべきである。3.23.33 で導入。 |
Threads_cached | スレッドキャッシュ内のスレッド数。 |
Threads_connected | 現在開いている接続の数。 |
Threads_created | 接続を処理するために作成されたスレッドの数。 |
Threads_running | スリープ状態になっていないスレッドの数。 |
Uptime | サーバの稼動秒数。 |
補足コメント
Opened_tables 値が大きい場合、table_cache 変数が小さすぎると考えられる。
Key_reads 値が大きい場合、key_buffer_size 変数が小さすぎると考えられる。キャッシュミスレートは、Key_reads/Key_read_requests で計算される。
Handler_read_rnd 値が大きい場合、MySQL がテーブル全体をスキャンする必要のあるクエリが多すぎるか、キーを適切に使用しない結合があると考えられる。
Threads_created 値が大きい場合、thread_cache_size 変数を大きくすることを考慮すべきである。キャッシュヒットレートは、Threads_created/Connections で計算される。
Created_tmp_disk_tables 値が大きい場合、tmp_table_size 変数を大きくして、ディスクベースではなくメモリベースでテンポラリテーブルを取得できるようにする。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW VARIABLES
SHOW [GLOBAL | SESSION] VARIABLES [LIKE wild] |
SHOW VARIABLES は、MySQL システム変数の値を表示します。
GLOBAL オプションおよび SESSION オプションは MySQL 4.0.3 で追加されました。
GLOBAL では、MySQL の新規接続に使用される変数を得ることができます。SESSION では、現在の接続に有効な値を得ることができます。オプションを特に指定しなければ、SESSION が使用されます。
デフォルト値が適当ではない場合には、mysqld 起動時にコマンドラインオプションを使用して、これらの変数のほとんどを変更できます。
「4.1.1 mysqld コマンドラインオプション」 節 参照 。 SET ステートメントからでも、ほとんどの変数を変更できます。
「5.5.6 SET 構文」 節 参照 。
SHOW VARIABLES の出力は以下のようになります(形式と数値は場合によって異なります)。
mysqladmin variables コマンドを使用しても同じ情報を取得できます。
+---------------------------------+------------------------------+ | Variable_name | Value | +---------------------------------+------------------------------| | back_log | 50 | | basedir | /usr/local/mysql | | bdb_cache_size | 8388572 | | bdb_log_buffer_size | 32768 | | bdb_home | /usr/local/mysql | | bdb_max_lock | 10000 | | bdb_logdir | | | bdb_shared_data | OFF | | bdb_tmpdir | /tmp/ | | bdb_version | Sleepycat Software: ... | | binlog_cache_size | 32768 | | bulk_insert_buffer_size | 8388608 | | character_set | latin1 | | character_sets | latin1 big5 czech euc_kr | | concurrent_insert | ON | | connect_timeout | 5 | | convert_character_set | | | datadir | /usr/local/mysql/data/ | | delay_key_write | ON | | delayed_insert_limit | 100 | | delayed_insert_timeout | 300 | | delayed_queue_size | 1000 | | flush | OFF | | flush_time | 0 | | ft_boolean_syntax | + -><()~*:""&| | | ft_min_word_len | 4 | | ft_max_word_len | 84 | | ft_query_expansion_limit | 20 | | ft_stopword_file | (built-in) | | have_bdb | YES | | have_innodb | YES | | have_isam | YES | | have_raid | NO | | have_symlink | DISABLED | | have_openssl | YES | | have_query_cache | YES | | init_file | | | innodb_additional_mem_pool_size | 1048576 | | innodb_buffer_pool_size | 8388608 | | innodb_data_file_path | ibdata1:10M:autoextend | | innodb_data_home_dir | | | innodb_file_io_threads | 4 | | innodb_force_recovery | 0 | | innodb_thread_concurrency | 8 | | innodb_flush_log_at_trx_commit | 1 | | innodb_fast_shutdown | ON | | innodb_flush_method | | | innodb_lock_wait_timeout | 50 | | innodb_log_arch_dir | | | innodb_log_archive | OFF | | innodb_log_buffer_size | 1048576 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | ./ | | innodb_mirrored_log_groups | 1 | | interactive_timeout | 28800 | | join_buffer_size | 131072 | | key_buffer_size | 16773120 | | language | /usr/local/mysql/share/... | | large_files_support | ON | | local_infile | ON | | locked_in_memory | OFF | | log | OFF | | log_update | OFF | | log_bin | OFF | | log_slave_updates | OFF | | log_slow_queries | OFF | | log_warnings | OFF | | long_query_time | 10 | | low_priority_updates | OFF | | lower_case_table_names | OFF | | max_allowed_packet | 1047552 | | max_binlog_cache_size | 4294967295 | | max_binlog_size | 1073741824 | | max_connections | 100 | | max_connect_errors | 10 | | max_delayed_threads | 20 | | max_heap_table_size | 16777216 | | max_join_size | 4294967295 | | max_relay_log_size | 0 | | max_sort_length | 1024 | | max_user_connections | 0 | | max_tmp_tables | 32 | | max_write_lock_count | 4294967295 | | myisam_max_extra_sort_file_size | 268435456 | | myisam_repair_threads | 1 | | myisam_max_sort_file_size | 2147483647 | | myisam_recover_options | force | | myisam_sort_buffer_size | 8388608 | | net_buffer_length | 16384 | | net_read_timeout | 30 | | net_retry_count | 10 | | net_write_timeout | 60 | | open_files_limit | 1024 | | pid_file | /usr/local/mysql/name.pid | | port | 3306 | | protocol_version | 10 | | query_cache_limit | 1048576 | | query_cache_size | 0 | | query_cache_type | ON | | read_buffer_size | 131072 | | read_rnd_buffer_size | 262144 | | rpl_recovery_rank | 0 | | safe_show_database | OFF | | server_id | 0 | | slave_net_timeout | 3600 | | skip_external_locking | ON | | skip_networking | OFF | | skip_show_database | OFF | | slow_launch_time | 2 | | socket | /tmp/mysql.sock | | sort_buffer_size | 2097116 | | sql_mode | | | table_cache | 64 | | table_type | MYISAM | | thread_cache_size | 3 | | thread_stack | 131072 | | tx_isolation | READ-COMMITTED | | timezone | EEST | | tmp_table_size | 33554432 | | tmpdir | /tmp/:/mnt/hd2/tmp/ | | version | 4.0.4-beta | | wait_timeout | 28800 | +---------------------------------+------------------------------+ |
以下、各オプションについて説明します。
バッファサイズ、長さ、およびスタックサイズの値はバイト単位です。
`K' または `M' のサフィックスを値に付けると、それぞれキロバイト、メガバイトを示します。たとえば、16M は 16 メガバイトです。サフィックスの大文字と小文字は区別されません。16M と 16m は同じです。
ansi_mode。
mysqld が --ansi オプションで起動している場合は ON。
「1.8.2 ANSI モードでの MySQL の実行」 節 参照 。
back_log
MySQL で保持できる未解決の接続要求数。これは、非常に短い間にメインの MySQL スレッドに非常に多くの接続要求が集中したときに機能する。それから、メインスレッドが接続をチェックし、新規スレッドを開始するのにいくらかの時間(ほんのわずかであるが)がかかる。back_log 値は、MySQL が瞬間的に新規要求への回答を停止するまでのこの短時間に、スタック可能な要求の数を示す。短時間に多くの接続要求が予想される場合だけ、この値を大きくする必要がある。
言い換えると、この値は、TCP/IP 接続のリッスンキューのサイズである。使用しているオペレーティングシステムそのものにも、このキューサイズの制限がある。詳細については、Unix listen(2) システムコールのマニュアルページを参照のこと。この変数の最大値について、OS のドキュメントを参照することが必要である。back_log をオペレーティングシステムの制限値より大きくしても、効果はない。
basedir
--basedir オプションの値。
bdb_cache_size
BDB テーブルのインデックスとレコードをキャッシュするために割り当てられたバッファ。BDB テーブルを使用しない場合、mysqld を --skip-bdb オプションで起動して、このキャッシュにメモリを使用しないようにする。
bdb_log_buffer_size
BDB テーブルのインデックスとレコードをキャッシュするために割り当てられたバッファ。BDB テーブルを使用しない場合、この値を 0 に設定するか、mysqld を --skip-bdb オプションで起動して、このキャッシュにメモリを使用しないようにする。
bdb_home
--bdb-home オプションの値。
bdb_max_lock
BDB テーブルで有効にできるロックの最大数(デフォルトでは 10,000)。長いトランザクションを実行しているときや、mysqld が大量のレコードを使ってクエリを実行しているときに、bdb: Lock table is out of available locks または Got error 12 from ... というエラーが発生する場合には、この数値を大きくする必要がある。
bdb_logdir
--bdb-logdir オプションの値。
bdb_shared_data
--bdb-shared-data を使用している場合は ON。
bdb_tmpdir
--bdb-tmpdir オプションの値。
binlog_cache_size。
トランザクション中にバイナリログに対する SQL ステートメントを保持するキャッシュのサイズ。大きなマルチステートメントトランザクションを頻繁に使用する場合、この値を大きくすることによりパフォーマンスを向上できる。 「6.7.1 START TRANSACTION、COMMIT、ROLLBACK の各構文」 節 参照 。
bulk_insert_buffer_size(以前は myisam_bulk_insert_tree_size)
MyISAM は特殊なツリー状のキャッシュを使用して、バルク INSERT(INSERT ... SELECT、INSERT ... VALUES (...), (...), ...、LOAD DATA INFILE)を高速化する。この変数により、スレッドごとのキャッシュツリーのサイズが制限される(バイト単位)。この値を 0 に設定すると、最適化は無効になる。注意: このキャッシュは、空白でないテーブルに値を追加する場合にのみ使用される。デフォルト値は 8 メガバイトである。
character_set
デフォルトのキャラクタセット。
character_sets
サポートされるキャラクタセット。
concurrent_inserts
ONの場合(デフォルト)、SELECT クエリを MyISAM テーブルで実行するとき、同時に INSERT も実行できる。このオプションをオフにするには、mysqld を --safe または --skip-new で起動する。
connect_timeout
mysqld サーバが、Bad handshake を返すまでに接続パケットを待つ秒数。
datadir
--datadir オプションの値。
delay_key_write
MyISAM テーブルのオプション。以下のいずれかの値を指定できる。
| OFF | CREATE TABLE ... DELAYED_KEY_WRITE はすべて無視される。 |
| ON | (デフォルト)CREATE TABLE の DELAY_KEY_WRITE オプションが採用される。 |
| ALL | 新しく開かれるすべてのテーブルを、DELAY_KEY_WRITE オプションで作成されたように扱う。 |
DELAY_KEY_WRITE が有効の場合、このオプションのテーブルのキーバッファは、インデックスの更新ごとにはフラッシュされず、テーブルを閉じるときだけフラッシュされる。これにより、キーの書き込みはかなり速くなるが、これを使用する場合には、myisamchk --fast --force によりすべてのテーブルを自動的にチェックすべきである。
delayed_insert_limit
delayed_insert_limit レコードを挿入後、INSERT DELAYED ハンドラは、保留中の SELECT ステートメントがないかチェックする。ある場合、ハンドラは処理を続行する前に保留中のステートメントの実行を許可する。
delayed_insert_timeout
INSERT DELAYED スレッドが INSERT ステートメントを待機する時間。
delayed_queue_size
INSERT DELAYED を処理するために割り当てられるキューのサイズ(レコード単位)。キューがいっぱいになると、INSERT DELAYED を実行するすべてのクライアントは、キューに空きができるまで待機する。
flush
MySQL を --flush オプションで起動した場合は ON。
flush_time
これを 0 以外の値に設定すると、flush_time 秒ごとにすべてのテーブルが閉じられる(リソースの解放と未フラッシュデータのディスクへの同期のため)。Windows 9x/Me、その他リソースが非常に少ないシステムの場合だけ、このオプションを推奨。
ft_boolean_syntax
MATCH ... AGAINST(... IN BOOLEAN MODE) でサポートされている演算子の一覧。
「6.8 MySQL 全文検索」 節 参照 。
ft_min_word_len
FULLTEXT インデックス内の単語の最短長。
注意: この変数を変更後、FULLTEXT インデックスを再ビルドする必要がある。このオプションは MySQL 4.0 で導入された。
ft_max_word_len
FULLTEXT インデックス内の単語の最大長。
注意: この変数を変更後、FULLTEXT インデックスを再ビルドする必要がある。このオプションは MySQL 4.0 で導入された。
ft_query_expansion_limit
クエリ拡張(MATCH ... AGAINST (... WITH QUERY EXPANSION))で使用される最上位マッチ数。このオプションは MySQL 4.1.1 で導入された。
ft_stopword_file
全文検索のストップワードリストが含まれているファイル。ファイル内のすべてのストップワードが使用される。コメントは使用されない。デフォルトでは、ストップワードの組み込みリストが使用される(`myisam/ft_static.c' で定義されているリスト)。このパラメータを空白の文字列("")に設定すると、ストップワードのフィルタリングが無効になる。注意: この変数を変更後、FULLTEXT インデックスを再ビルドする必要がある。このオプションは MySQL 4.0.10 で導入された。
have_innodb
mysqld が InnoDB テーブルをサポートする場合は YES。--skip-innodb が使用されている場合は DISABLED。
have_bdb
mysqld が Berkeley DB テーブルをサポートする場合は YES。--skip-bdb が使用されている場合は DISABLED。
have_raid
mysqld が RAID オプションをサポートする場合は YES。
have_openssl
mysqld がクライアントとサーバ間のプロトコルに SSL(暗号化)をサポートする場合は、YES。
init_file
サーバの起動時に --init-file オプションで指定されたファイルの名前。これは、サーバの起動時に、サーバが実行する SQL ステートメントのファイルである。
interactive_timeout
対話式接続を終了する前に、サーバがアクティビティを待機する秒数。対話型クライアントは、mysql_real_connect() で CLIENT_INTERACTIVE オプションを使用するクライアントとして定義される。wait_timeout も参照のこと。
join_buffer_size
完全結合(インデックスを使用しない結合)に使用されるバッファのサイズ。2 つのテーブル間の完全結合ごとにバッファが割り当てられる。インデックスを追加できない場合に、完全結合を速くする目的でこの値を大きくする(通常、結合を速くする最良の方法はインデックスの追加である)。
key_buffer_size
インデックスブロックはバッファされ、すべてのスレッドによって共有される。key_buffer_size は、インデックスブロック用に使用されるバッファのサイズである。
インデックス処理(すべての読み取りと複数書き込み)のパフォーマンスを向上させるため、この値は可能な限り大きくする。主に MySQL を実行する 256M マシンでは、64M が一般的である。ただし、これを大きくしすぎると(たとえば、メモリ合計の 50% 以上など)、システムがページングを開始し、処理速度が非常に遅くなる可能性がある。MySQL ではデータ読み取りをキャッシュしないため、OS ファイルシステムのキャッシュ用に領域を確保しておくことが必要である。
キーバッファのパフォーマンスを確認するには、SHOW STATUS を実行し、Key_read_requests、Key_reads、Key_write_requests、Key_writes の各変数を調べる。Key_reads/Key_read_request の比率は通常、0.01 より小さい。Key_write/Key_write_requests の比率は、操作がほとんど更新と削除だけの場合、通常は約 1 になる。しかし、同時に多くの影響がある更新を頻繁に行う場合や、DELAY_KEY_WRITE を使用する場合はかなり小さくなることもある。 「4.6.8 SHOW 構文」 節 参照 。
多くのレコードを同時に書き込む場合にさらに速度を上げるには、LOCK TABLES を使用する。 「6.7.5 LOCK TABLES および UNLOCK TABLES 構文」 節 参照 。
language
エラーメッセージに使用する言語。
large_file_support
mysqld が、大きなファイルをサポートするオプションでコンパイルされている場合。
locked_in_memory
mysqld が、--memlock でメモリにロックされている場合。
log
すべてのクエリのログを有効にしている場合。
log_update
更新ログを有効にしている場合。
log_bin
バイナリログを有効にしている場合。
log_slave_updates
スレーブからの更新をログに記録する場合。
long_query_time
クエリがこの値(秒単位)より時間がかかると、Slow_queriesカウンタがインクリメントされる。--log-slow-queries を使用している場合、クエリはスロークエリログファイルに記録される。この値は実際の時間であり、CPU 時間ではない。したがって、負荷の軽いシステムではしきい値より下のクエリも、負荷の重いシステムではしきい値より上になる場合がある。
「4.10.5 スロークエリログ」 節 参照 。
lower_case_table_names
1 に設定すると、テーブル名が小文字でディスクに格納され、テーブル名の比較で大文字と小文字が区別されなくなる。バージョン 4.0.2 以降、このオプションはデータベース名にも適用されるようになった。4.1.1 からは、テーブルエイリアスにも適用されるようになった。
「6.1.3 名前におけるケース依存」 節 参照 。
max_allowed_packet
1 パケットの最大サイズ。メッセージバッファは net_buffer_length バイトに初期化されるが、必要に応じて max_allowed_packet バイトまで大きくできる。このデフォルト値は、大きな(おそらく不正)パケットを受けるには小さすぎる。大きな BLOB カラムを使用している場合には、この値を大きくする必要がある。使用する最大の BLOB と同じ大きさにすべきである。max_allowed_packet のプロトコル制限は MySQL 3.23 で 16MB、MySQL 4.0 で 1GB である。
max_binlog_cache_size
トランザクションでこれより多くのメモリが必要になると、"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage" エラーが発生する。
max_binlog_size
3.23.33 で導入された。バイナリ(レプリケーション)ログファイルへの書き込みが、この値を超える場合、ログをローテートする。設定可能値は、4096 バイト(MySQL バージョン 4.0.14 より前は 1024)から 1 ギガバイト。デフォルトは 1GB。注意: トランザクションを使用している場合、トランザクションは 1 つのまとまりでバイナリログに書き込まれるため、複数のバイナリログに分割されることはない。したがって、大きなトランザクションがある場合、バイナリログが max_binlog_size より大きくなる可能性がある。max_relay_log_size(MySQL 4.0.14 で導入)が 0 の場合、max_binlog_size がリレーログにも適用される。
max_connections
認められる同時クライアントの数。この値を大きくすると、mysqld が必要とするファイル記述子の数が多くなる。ファイル記述子の制限については、以下を参照のこと。 「A.2.6 Too many connections エラー」 節 参照 。
max_connect_errors
ホストからの接続中断回数がこの値より大きくなった場合、それ以降、そのホストからの接続はブロックされる。ホストのブロックを解除するには、FLUSH HOSTS コマンドを使用する。
max_delayed_threads
INSERT DELAYED ステートメント処理に、この数より多くのスレッドを開始しない。すべての INSERT DELAYED スレッドが使用された後にデータを新規テーブルに挿入しようとすると、そのレコードは DELAYED 属性が指定されていないものとして挿入される。これを 0 に設定すると、max_delayed スレッドは生成されない。
max_heap_table_size
この変数は、それ以降、新しく生成される HEAP テーブルの最大サイズを設定する。この変数の値を使用して、HEAP テーブルの MAX_ROWS 値が計算される。この変数の設定は、既存の HEAP テーブルには影響しない。ただし、CREATE TABLE、TRUNCATE TABLE などのステートメントで再生成したり、ALTER TABLE で変更した場合は適用される。
max_join_size
max_join_size を超えるレコードを読み取る結合ではエラーを出力する。WHERE 節なしで時間がかかる何百万ものレコードを返す結合を実行するユーザがいる場合に、この値を設定する。
max_relay_log_size
4.0.14 で導入。リレーログ(レプリケーションスレーブによって使用されるログ。 「4.11.3 レプリケーションの実装の詳細」 節 参照 )への書き込みが指定値を超える場合、リレーログをローテートする。この変数により、リレーログとバイナリログに異なるサイズの制約を加えることができる。ただし、この変数を 0 に設定すると、max_binlog_size がバイナリログとリレーログの両方に適用される。max_relay_log_size には 0、または 4097 以上 1GB 未満の値を設定できる。デフォルト値は 0。
max_seeks_for_key
キーによるレコード検索の最大回数を制限する。MySQL オプティマイザは、キースキャンでテーブルからレコードを検索するときに、キーの基数には関係なく、キー検索の回数をこの指定値までと想定する。この値を低く(100 くらいに)設定することにより、MySQL はテーブルスキャンではなくキースキャンを優先的に行うようになる。
max_sort_length
BLOB 値または TEXT 値をソートするときに使用するバイト数(各値の最初の max_sort_length バイトのみが使用され、残りは無視される)。
max_user_connections
単一ユーザのアクティブ接続の最大数(0 = 制限なし)。
max_tmp_tables
このオプションはまだ利用不可。1 つのクライアントが同時に開いておけるテンポラリテーブルの最大数。
max_write_lock_count
この回数の書き込みロック後、間に読み取りロックを認める。
myisam_recover_options
--myisam-recover オプションの値。
myisam_sort_buffer_size
REPAIR を実行するとき、あるいは CREATE INDEXまたは ALTER TABLE を使用してインデックスを作成するときに、インデックスのソートに割り当てられるバッファ。
myisam_max_extra_sort_file_size。
インデックスの高速作成で使用されるテンポラリファイルが、キーキャッシュを使用する場合より、指定されているサイズ分大きい場合、キーキャッシュ方式が使用される。これは主に、大きなテーブルの長い文字キーに、処理速度が遅いキーキャッシュ方式を用いてインデックスを作成させる場合に使用する。注意: このパラメータの値は、4.0.3 より前のバージョンではメガバイト単位、このバージョンからはバイト単位。
myisam_repair_threads。
この値が 1 より大きい場合、Repair by sorting プロセス中、MyISAM テーブルインデックスが、それぞれ独自のスレッドで平行して作成される。注意: マルチスレッド修復は、現在まだ alpha 段階。
myisam_max_sort_file_size
REPAIR、ALTER TABLE、または LOAD DATA INFILE を使用したインデックスの再生成時、MySQL が使用できるテンポラリファイルの最大サイズ。ファイルサイズがこれより大きい場合、インデックスはキーキャッシュによって作成される(時間がかかる)。注意: このパラメータの値は、4.0.3 より前のバージョンではメガバイト単位、このバージョンからはバイト単位。
net_buffer_length
クエリとクエリの間、通信バッファはこのサイズにリセットされる。通常、これは変更すべきでないが、メモリが非常に小さい場合には、予測されるクエリサイズに設定できる。これは、クライアントによって送信される SQL ステートメントの予測される長さ。ステートメントがこの長さを超えた場合、バッファは自動的に max_allowed_packet バイトまで拡大される。
net_read_timeout
読み取りを停止する前に、接続からのデータを待機する秒数。注意: 接続からのデータが期待されない場合、タイムアウトは write_timeout によって定義される。slave_net_timeout も参照のこと。
net_retry_count
通信ポートの読み取りが中断した場合に、実行できる再試行回数。FreeBSD では、内部中断がすべてのスレッドに通知されるため、この値を大きくすべきである。
net_write_timeout
書き込みを停止する前に、ブロックが接続に書き込まれるのを待つ秒数。
open_files_limit
システムが mysqld に開くことを許可するファイルの数。これはシステムに指定されている実際の値であり、起動時のパラメータとして mysqld に指定したものとは異なっている場合がある。MySQL がオープンファイル数を変更できないシステムでは 0 になる。
pid_file
--pid-file オプションの値。
port
--port オプションの値。
protocol_version
MySQL サーバによって使用されるプロトコルバージョン。
range_alloc_block_size
範囲の最適化で割り当てられるブロックのサイズ。
read_buffer_size(以前は record_buffer)
順次スキャンを実行する各スレッドは、スキャンする各テーブルにこのサイズのバッファを割り当てる。多くの順次スキャンを実行する場合には、この値を大きくすることが必要である。
read_rnd_buffer_size(以前は record_rnd_buffer)
ソート後、ソートされた順序でレコードを読み取る際、ディスク検索を行わないように、レコードをこのバッファから読み取る。この値を大きく設定すると、ORDER BY を大幅に向上できる。これはスレッド固有の変数であるため、これをグローバルに大きく設定すべきではないが、いくつかの特別大きなクエリを実行するときだけ変更する。
query_alloc_block_size
クエリの解析および実行時に作成されるオブジェクトに割り当てられるメモリ割り当てブロックのサイズ。メモリの断片化に問題がある場合、これを少し大きくすると改善する可能性がある。
query_cache_limit
これより大きい結果はキャッシュしない(デフォルトは 1M)。
query_cache_size
古いクエリの結果を保存するために割り当てられたメモリ。この値を 0 にすると、クエリキャッシュは無効になる(デフォルト)。
query_cache_type
次のいずれかの値(数値のみ)を設定できる。
| 値 | エイリアス | コメント |
| 0 | OFF | 結果のキャッシュおよび読み込みを行わない。 |
| 1 | ON | SELECT SQL_NO_CACHE ... クエリを除くすべての結果をキャッシュする。 |
| 2 | DEMAND | SELECT SQL_CACHE ... クエリのみキャッシュする。 |
query_prealloc_size
クエリの解析および実行時に使用される永続バッファのサイズ。このバッファはクエリとクエリの間でも解放されない。理論的には、この値を "十分大きく" 設定することにより、MySQL は malloc() 呼び出しを 1 回も実行することなくクエリを実行できる。
safe_show_database
ユーザがデータベース権限またはテーブル権限をまったく持たないデータベースは表示しない。これは、他のユーザが権限を持つデータベースを表示することができなくなるので、セキュリティの向上に役立つ。skip_show_database も参照のこと。
server_id
--server-id オプションの値。
skip_locking
mysqld が外部ロックを使用する場合は OFF。
skip_networking
ローカル(ソケット)接続のみを認める場合は ON。
skip_show_database
ユーザに PROCESS 権限がない場合、SHOW DATABASES の実行を認めない。これは、他のユーザが権限を持つデータベースを表示できなくなるので、セキュリティの向上に役立つ。safe_show_database も参照のこと。
slave_net_timeout
読み取りを停止する前に、マスタ/スレーブ接続からのデータを待機する秒数。
slow_launch_time
スレッドの作成にこの値(秒単位)より時間がかかれば、Slow_launch_threads カウンタがインクリメントされる。
socket
サーバによって使用される Unix ソケット。
sort_buffer_size
ソートを実行する必要のある各スレッドがこのサイズのバッファを割り当てる。ORDER BY 操作または GROUP BY 操作を速くするには、この値を大きくする。
「A.4.4 MySQL がテンポラリファイルを格納する場所」 節 参照 。
table_cache
すべてのスレッドでのオープンテーブル数。この値を大きくすると、mysqld が必要とするファイル記述子の数が多くなる。テーブルキャッシュを大きくする必要があるかどうかチェックするには、Opened_tables 変数を調べる。
「4.6.8.3 SHOW STATUS」 節 参照 。
この変数が大きく、FLUSH TABLES(すべてのテーブルを閉じて再び開く)をあまり実行しないのであれば、table_cache 変数の値を大きくすることが必要である。
テーブルキャッシュの詳細については、 「5.4.7 MySQL でのテーブルのオープンとクローズの方法」 を参照のこと。
table_type
デフォルトのテーブル型。
thread_cache_size
再利用のためにキャッシュに保持するスレッド数。クライアントが接続を切断したときに、以前のスレッド数が thread_cache_size 以下であれば、そのクライアントのスレッドはキャッシュに入る。新しいスレッドはすべてキャッシュから取り込まれ、キャッシュが空の場合のみ、新しいスレッドが作成される。新しい接続が多く発生する場合、この変数を大きくすることによりパフォーマンスを向上できる(スレッド実装が既に理想的な状態であれば、それほどパフォーマンスは向上しない)。Connections ステータス変数と Threads_created ステータス変数(詳細については、 「4.6.8.3 SHOW STATUS」 節 参照 )の差異を調べることにより、スレッドキャッシュの効率性を確認できる。
thread_concurrency
Solaris では、mysqld はこの値で thr_setconcurrency() を呼び出す。
thr_setconcurrency() により、アプリケーションは、同時に実行する理想的なスレッド数をスレッドシステムに指定する。
thread_stack
各スレッドのスタックサイズ。crash-me テストによって検知される制限の多くがこの値に依存する。通常の操作ではデフォルトで十分である。 「5.1.4 MySQL ベンチマークスィート」 節 参照 。
timezone
サーバのタイムゾーン。
tmp_table_size
メモリ内のテンポラリテーブルがこのサイズを超えると、MySQL は自動的にこれをディスク上の MyISAM テーブルに変換する。詳細な GROUP BY クエリを頻繁に行い、メモリに余裕がある場合は、tmp_table_size 値を大きくする。
tmpdir
テンポラリファイルおよびテンポラリテーブル用ディレクトリ。MySQL 4.1 以降、複数のパスをコロン :(Windows ではセミコロン ;)で区切って設定できるようになっている。これは、ラウンドロビン方式で使用される。この機能は、複数の物理ディスクに負荷を分散する目的で使用できる。メモリベースのファイルシステムを指すように tmpdir を設定することは可能。ただし、MySQL サーバがスレーブの場合はできない。スレーブの場合、マシンがリブートしてもテンポラリテーブルのレプリケーションまたは LOAD DATA INFILE のレプリケーション処理を続行するためのテンポラリファイルが必要となる。そのため、マシンのリブートで消去されるメモリベースの tmpdir は適しない。ディスクベースの tmpdir が必要。
transaction_alloc_block_size
コミットするときに、バイナリログに保存されるトランザクションの一部であるクエリを保存するために割り当てられるメモリ割り当てブロックのサイズ。
transaction_prealloc_block_size
transaction_alloc_blocks の永続的バッファ。クエリとクエリの間でも解放されない。通常のトランザクションのすべてのクエリに対応できるように "十分に大きく" 設定すれば、malloc() を何度も呼び出さないで済む。
version
サーバのバージョン番号。
wait_timeout
対話式ではない接続を終了する前に、サーバがアクティビティを待機する秒数。
スレッド開始時、SESSION.WAIT_TIMEOUT は、GLOBAL.WAIT_TIMEOUT または GLOBAL.INTERACTIVE_TIMEOUT によって初期化される。どちらになるかは、クライアントのタイプ(CLIENT_INTERACTIVE 接続オプションで定義)に依存する。interactive_timeout も参照のこと。
これら変数のチューニング方法については、MySQL のチューニングに関するセクションを参照してください。 「5.5.2 サーバパラメータのチューニング」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW [BDB] LOGS
SHOW LOGS は、既存のログファイルに関するステータス情報を表示します。現在は、Berkeley DB ログファイルの情報を表示するだけなので、そのエイリアスは(MySQL 4.1.1 で導入) SHOW BDB LOGS です。
File は、ログファイルのフルパスを示す。
Type は、ログファイルのタイプ(Berkeley DB ログファイルでは BDB)を示す。
Status は、ログファイルのステータス(ファイルを削除できる場合は FREE、ファイルがトランザクションサブシステムによって必要とされている場合は IN USE)を示す。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW PROCESSLIST
SHOW [FULL] PROCESSLIST は、実行中のスレッドを表示します。
mysqladmin processlist コマンドでもこの情報を取得できます。SUPER 権限があれば、すべてのスレッドを表示できます。この権限がない場合は、自分のスレッドのみ表示できます。
「4.6.7 KILL 構文」 節 参照 。
FULL オプションを使用していない場合、各クエリの最初の 100 文字だけが表示されます。
4.0.12 以降、MySQL は TCP/IP 接続のホスト名を hostname:client_port 形式で報告するので、どのクライアントが何を行っているかわかりやすくなっています。
このコマンドは、'too many connections' エラーメッセージが表示され、原因を知りたいときに便利です。MySQL は、SUPER 権限を持つクライアントのために 1 つの特別接続枠を予約しており、いつでもシステムにログインしてチェックできるようになっています(ユーザ全員にこの権限を与えていないようにしてください)。
mysqladmin processlist で確認できる一般的な状態は以下のとおりです。
Checking table
スレッドがテーブルの自動チェックを実行している。
Closing tables
スレッドが、変更されたテーブルデータをディスクにフラッシュし、使用したテーブルを閉じている。これには通常それほど時間がかからない。時間がかかる場合、ディスクの使用率をチェックする必要がある。
Connect Out
マスタに接続しているスレーブ。
Copying to tmp table on disk
テンポラリ結果セットが tmp_table_size よりも大きく、スレッドがメモリベースのテンポラリテーブルをディスクベースに変更して、メモリの節約を図っている。
Creating tmp table
スレッドは、クエリの結果の一部を保持するためのテンポラリテーブルを作成中。
deleting from main table
複数テーブルを削除する最初の段階で、最初のテーブルを削除中。
deleting from reference tables
複数テーブルを削除する 2 番目の段階で、他のテーブルから、一致したレコードを削除中。
Flushing tables
スレッドが FLUSH TABLES を実行中。すべてのスレッドによりそのテーブルが閉じられるのを待っている。
Killed
誰かがスレッドを強制終了の命令を出したため、次回のキルフラグチェック時に強制終了される。MySQL では大きな各ループでフラグがチェックされるが、それでもスレッド終了には少し時間がかかる場合がある。スレッドが他のスレッドによってロックされている場合、そのロックが解除されたところで強制終了が実行される。
Sending data
スレッドは SELECT ステートメントのレコードを処理中で、かつクライアントにデータを送信中。
Sorting for group
スレッドは、GROUP BY のソートを実行中。
Sorting for order
スレッドは、ORDER BY のソートを実行中。
Opening tables
スレッドがテーブルを開こうとしている。これは、何かが妨害していなければすぐに終わるはずである。たとえば、ALTER TABLE や LOCK TABLE などにより、そのコマンドの終了時までテーブルが開かないことがある。
Removing duplicates
クエリで SELECT DISTINCT が使用されたが、MySQL は初期段階で重複を除外する最適化を実行できなかった。このため、MySQL は結果をクライアントに送信する前に、重複レコードを削除する段階を踏む必要がある。
Reopen table
スレッドはテーブルのロックを取得したが、ロック取得後、下のテーブル構造が変更されていることを認識した。このため、ロックを解除し、テーブルを閉じて、再び開こうとしている。
Repair by sorting
修復コードがソートを使用してインデックスを作成している。
Repair with keycache
修復コードが、キーキャッシュにより、キーを 1 つずつ作成している。これは、Repair by sorting よりも大幅に時間がかかる。
Searching rows for update
スレッドがレコード更新の初期段階として、更新対象の一致レコードを検索中である。レコード検索に使用するインデックスを UPDATE が変更すると、この段階が必要となる。
Sleeping
スレッドが、クライアントから新しいコマンドが送信されるのを待っている。
System lock
スレッドが、テーブルの外部システムロックを待っている。同じテーブルにアクセスする複数の mysqld サーバを使用していない場合、--skip-external-locking オプションでシステムロックを無効にできる。
Upgrading lock
INSERT DELAYED ハンドラが、レコード挿入のためにテーブルをロックしようとしている。
Updating
スレッドが更新対象レコードを検索して更新している。
User Lock
スレッドが GET_LOCK() を待っている。
Waiting for tables
下のテーブル構造が変更されているため、テーブルを開き直して新しい構造を取得する必要があるという通知をスレッドが受け取った。テーブルを開き直すためには、他のすべてのスレッドがそのテーブルを閉じるのを待つ必要がある。
この通知は、他のスレッドがそのテーブルに対して FLUSH TABLES、FLUSH TABLES table_name、ALTER TABLE、RENAME TABLE、REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE のいずれかを実行している場合に発生する。
waiting for handler insert
INSERT DELAYED ハンドラがすべての挿入処理を完了し、新規の挿入を待機中である。
ほとんどの状態はすぐに終わります。何秒も同じ状態が続く場合は、問題のある可能性があるので、調査が必要です。
他にも説明していない状態がありますが、そのほとんどは mysqld のバグ発見に役立つものです。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW GRANTS
SHOW GRANTS FOR user は、ユーザの権限を複製するために発行する必要がある grant コマンドを列挙します。
mysql> SHOW GRANTS FOR root@localhost; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ |
現在のセッションの権限を列挙するには、CURRENT_USER() 関数(バージョン 4.0.6 で導入)を使用して、そのセッションで認証されているユーザを確認できます。
「6.3.6.2 その他の各種関数」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW CREATE TABLE
指定したテーブルを作成する CREATE TABLE ステートメントを表示します。
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE t (
id INT(11) default NULL auto_increment,
s char(60) default NULL,
PRIMARY KEY (id)
) TYPE=MyISAM
|
SHOW CREATE TABLE で表示されるテーブル名とカラム名は、SQL_QUOTE_SHOW_CREATE オプションの値に従って引用符で囲まれます。
「5.5.6 SET 構文」 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW WARNINGS | ERRORS
SHOW WARNINGS [LIMIT row_count] SHOW ERRORS [LIMIT row_count] |
このコマンドは、MySQL 4.1.0 で導入されました。
これは、前回のコマンドでのエラー、警告、およびコメントを表示します。エラーおよび警告は、テーブルを使用する新規コマンドごとにリセットされます。
MySQL サーバは、前回のコマンドで発生した警告とエラーの合計数を返します。これは、mysql_warning_count() を呼び出すことによって取得できます。
max_error_count までのメッセージが保存されます(グローバルおよびスレッド固有変数)。
@error_count でエラー数を、@warning_count で警告数を取得できます。
SHOW WARNINGS では前回のコマンドで発生したエラー、警告、およびコメントがすべて表示され、SHOW ERRORS ではエラーだけが表示されます。
mysql> DROP TABLE IF EXISTS no_such_table; mysql> SHOW WARNINGS; +-------+------+-------------------------------+ | Level | Code | Message | +-------+------+-------------------------------+ | Note | 1051 | Unknown table 'no_such_table' | +-------+------+-------------------------------+ |
注意: MySQL 4.1.0 では警告のフレームワークが追加されただけなので、MySQL コマンドの多くは警告を生成しません。4.1.1 では、LOAD DATA INFILE、および INSERT、UPDATE、ALTER などの DML ステートメントのあらゆる種類の警告をサポートします。
以下、挿入ステートメントの変換警告を生成する簡単な例を示します。
mysql> create table t1(a tinyint NOT NULL, b char(4)); Query OK, 0 rows affected (0.00 sec) mysql> insert into t1 values(10,'mysql'),(NULL,'test'),(300,'open source'); Query OK, 3 rows affected, 4 warnings (0.15 sec) Records: 3 Duplicates: 0 Warnings: 4 mysql> show warnings; +---------+------+---------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | | Warning | 1261 | Data truncated, NULL supplied to NOT NULL column 'a' at row 2 | | Warning | 1262 | Data truncated, out of range for column 'a' at row 3 | | Warning | 1263 | Data truncated for column 'b' at row 3 | +---------+------+---------------------------------------------------------------+ 4 rows in set (0.00 sec) |
警告の最大数は、サーバ変数 'max_error_count'、SET max_error_count=[count] を使用して指定できます。デフォルトは 64 です。この変数を '0' にリセットすればこの設定を無効できます。max_error_count が 0 の場合でも、警告が何回発生したか表示されますが、メッセージは保存されません。
たとえば、上記の例での以下の ALTER テーブルステートメントの場合、max_error_count=1 に設定すると、警告が 3 回発生しても、返される警告メッセージは 1 つだけになります。
mysql> show variables like 'max_error_count'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_error_count | 64 | +-----------------+-------+ 1 row in set (0.00 sec) mysql> set max_error_count=1; Query OK, 0 rows affected (0.00 sec) mysql> alter table t1 modify b char; Query OK, 3 rows affected, 3 warnings (0.00 sec) Records: 3 Duplicates: 0 Warnings: 3 mysql> show warnings; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1263 | Data truncated for column 'b' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec) mysql> |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW TABLE TYPES
SHOW TABLE TYPES |
このコマンドは、MySQL 4.1.0 で導入されました。
SHOW TABLE TYPES は、テーブル型に関するステータス情報を表示します。このコマンドは、テーブル型がサポートされているかどうか、およびデフォルトのテーブル型を確認するのに使用されます。
mysql> SHOW TABLE TYPES; +--------+---------+-----------------------------------------------------------+ | Type | Support | Comment | +--------+---------+-----------------------------------------------------------+ | MyISAM | DEFAULT | Default type from 3.23 with great performance | | HEAP | YES | Hash based, stored in memory, useful for temporary tables | | MERGE | YES | Collection of identical MyISAM tables | | ISAM | YES | Obsolete table type; Is replaced by MyISAM | | InnoDB | YES | Supports transactions, row-level locking and foreign keys | | BDB | NO | Supports transactions and page-level locking | +--------+---------+-----------------------------------------------------------+ 6 rows in set (0.00 sec) |
'Support' フィールドの DEFAULT は、そのテーブル型がサポートされていることと、テーブル型がデフォルトであることを示します。サーバを --default-table-type=InnoDB で起動した場合、InnoDB の 'Support' フィールド値が DEFAULT になります。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
SHOW PRIVILEGES
SHOW PRIVILEGES |
このコマンドは、MySQL 4.1.0 で導入されました。
SHOW PRIVILEGES は、下の MySQL サーバがサポートするシステム権限を一覧表示します。
mysql> show privileges; +------------+--------------------------+-------------------------------------------------------+ | Privilege | Context | Comment | +------------+--------------------------+-------------------------------------------------------+ | Select | Tables | To retrieve rows from table | | Insert | Tables | To insert data into tables | | Update | Tables | To update existing rows | | Delete | Tables | To delete existing rows | | Index | Tables | To create or drop indexes | | Alter | Tables | To alter the table | | Create | Databases,Tables,Indexes | To create new databases and tables | | Drop | Databases,Tables | To drop databases and tables | | Grant | Databases,Tables | To give to other users those privileges you possess | | References | Databases,Tables | To have references on tables | | Reload | Server Admin | To reload or refresh tables, logs and privileges | | Shutdown | Server Admin | To shutdown the server | | Process | Server Admin | To view the plain text of currently executing queries | | File | File access on server | To read and write files on the server | +------------+--------------------------+-------------------------------------------------------+ 14 rows in set (0.00 sec) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| 4.7.1 データおよびソート用キャラクタセット | ||
| 4.7.2 英語以外のエラーメッセージ | ||
| 4.7.3 新しいキャラクタセットの追加 | ||
| 4.7.4 キャラクタ定義配列 | ||
| 4.7.5 文字列照合サポート | ||
| 4.7.6 マルチバイト文字サポート | ||
| 4.7.7 キャラクタセットに関する問題 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
デフォルトでは、MySQL はスウェーデン語およびフィンランド語に従ってソートされる ISO-8859-1(Latin1)キャラクタセットを使用します。これは、米国と西ヨーロッパに適したキャラクタセットです。
標準 MySQL バイナリは、--with-extra-charsets=complex でコンパイルされます。これにより、すべての標準プログラムにコードが追加され、バイナリ内で latin1 とすべてのマルチバイトキャラクタセットを処理できるようになります。他のキャラクタセットが必要な場合は、キャラクタセット定義ファイルからロードします。
キャラクタセットにより、名前に使用できる文字と、SELECT ステートメントの ORDER BY 節および GROUP BY 節での文字列のソート方法が決定します。
サーバ起動時に --default-character-set オプションでキャラクタセットを変更できます。利用可能なキャラクタセットは、--with-charset=charset オプションと --with-extra-charsets= list-of-charset | complex | all | none オプションが configure になっているかどうか、および `SHAREDIR/charsets/Index' に含まれているキャラクタセット設定ファイルに依存します。 「2.3.3 一般的な configure オプション」 節 参照 。
MySQL の実行中にキャラクタセットを変更した場合(ソート順序が変わる可能性もあります)、すべてのテーブルで myisamchk -r -q --set-character-set=charset を実行する必要があります。このことを行わない場合、インデックスが正しい順序でなくなる可能性があります。
クライアントが MySQL サーバに接続すると、サーバはデフォルトのキャラクタセットをクライアントに送ります。クライアントは、この接続用としてそのキャラクタセットに切り替えます。
SQL クエリの文字列をエスケープする場合は、mysql_real_escape_string() を使用してください。最初のパラメータとして MYSQL 接続ハンドルを使用すること以外、mysql_real_escape_string() は旧 mysql_escape_string() 関数と同じです。
サーバのインストールパス以外のパスでクライアントがコンパイルされており、MySQL をコンフィギャしたユーザがすべてのキャラクタセットを MySQL バイナリに組み込んでいない場合、サーバがクライアントとは異なるキャラクタセットで実行しているときに必要となる追加キャラクタセットの場所を、クライアントに指定する必要があります。
これは、MySQL オプション設定ファイルで指定することができます。
[client] character-sets-dir=/usr/local/mysql/share/mysql/charsets |
ここで、パスは、動的 MySQL キャラクタセットが保存されているディレクトリを指します。
以下のように、クライアントに特定のキャラクタセットの使用を強制することも可能です。
[client] default-character-set=character-set-name |
しかし、通常は必要ありません。
| 4.7.1.1 ドイツ語キャラクタセット |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
ドイツ語のソート順序が必要な場合、mysqld を --default-character-set=latin1_de で起動します。これには、以下のような特徴があります。
文字列のソートおよび比較時、比較の実行前に以下の文字列のマッピングが実行される。
@"a -> ae @"o -> oe @"u -> ue ß -> ss |
アクセント文字はすべて、対応するアクセントなしの大文字に変換されます。また、すべての文字が大文字に変換されます。
文字列を LIKE で比較する際には、1 文字から 2 文字へのマッピングは実行されません。すべての文字が大文字に変換されます。@"U、@"u、@"O、@"o、@"A、および @"a 以外、すべての文字からアクセントが削除されます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld では、以下の言語でエラーメッセージを出力できます。
チョコ語、デンマーク語、オランダ語、英語(デフォルト)、エストニア語、フランス語、ドイツ語、ギリシャ語、ハンガリー語、イタリア語、日本語、韓国語、ノルウェー語、新ノルウェー語、ポーランド語、ポルトガル語、ルーマニア語、ロシア語、スロバキア語、スペイン語、およびスウェーデン語。
特定の言語で mysqld を起動するには、--language=lang または -L lang オプションを使用します。次に例を示します。
shell> mysqld --language=swedish |
または
shell> mysqld --language=/usr/local/share/swedish |
注意: 言語名はすべて小文字で指定します。
言語ファイルは(デフォルトで)`mysql_base_dir/share/LANGUAGE/' にあります。
エラーメッセージファイルを更新するには、`errmsg.txt' ファイルを編集し、以下のコマンドを実行して `errmsg.sys' ファイルを生成します。
shell> comp_err errmsg.txt errmsg.sys |
MySQL を新しいバージョンにアップグレードした場合、この変更を、新規 `errmsg.txt' ファイルでも同じように行ってください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
他のキャラクタセットを MySQL に追加するには、以下の手順を実行します。
キャラクタセットがシンプルなものかコンプレックスなものかを判断します。キャラクタセットが、ソートのために特殊文字照合ルーチンを必要とせず、マルチバイト文字のサポートも必要なければ、それはシンプルです。どちらかを必要とする場合、それはコンプレックスです。
たとえば、latin1 と danish はシンプルなキャラクタセットで、big5 や czech はコンプレックスなキャラクタセットです。
以下のセクションでは、キャラクタセットを MYSET という名前にすることが前提です。
シンプルなキャラクタセットの場合、以下を実行します。
ファイルの構文は、以下のとおり非常にシンプルである。
ctype 配列は、最初の 257 語を占める。to_lower[]、to_upper[]、および sort_order[] 配列はそれぞれその後の 256 語を占める。
「4.7.4 キャラクタ定義配列」 節 参照 。
configure.in の CHARSETS_AVAILABLE リストおよび COMPILED_CHARSETS リストに追加する。
コンプレックスなキャラクタセットの場合、以下を実行します。
ctype_MYSET、to_lower_MYSET などであることが必要。これは、シンプルなキャラクタセットの配列に対応する。 「4.7.4 キャラクタ定義配列」 節 参照 。
/* * This comment is parsed by configure to create ctype.c, * so don't change it unless you know what you are doing. * * .configure. number_MYSET=MYNUMBER * .configure. strxfrm_multiply_MYSET=N * .configure. mbmaxlen_MYSET=N */ |
configure プログラムはこのコメントを使用して、自動的にキャラクタセットを MySQL ライブラリに組み込む。
strxfrm_multiply 行および mbmaxlen 行については、後続セクションで説明する。これらはそれぞれ、文字列照合関数またはマルチバイト文字セット関数が必要な場合に組み込む。
my_strncoll_MYSET()
my_strcoll_MYSET()
my_strxfrm_MYSET()
my_like_range_MYSET()
「4.7.5 文字列照合サポート」 節 参照 。
configure.in の CHARSETS_AVAILABLE リストおよび COMPILED_CHARSETS リストに追加する。
`sql/share/charsets/README' ファイルに、より詳細な説明が含まれています。
MySQL ディストリビューションへのキャラクタセットの組み込みを希望する場合には、MySQL internals メーリングリストにパッチをメールしてください。 「1.7.1.1 MySQL メーリングリスト」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
to_lower[] と to_upper[] は、キャラクタセットの各メンバに対応する、大文字と小文字が格納されるシンプルな配列です。次に例を示します。
to_lower['A'] は 'a' を含む to_upper['a'] は 'A' を含む |
sort_order[] は、文字をどのような順番で比較しソートするかを示すマップです。多くの場合(すべてのキャラクタセットについてではありませんが)、これは to_upper[] と同じです(ソートで大文字と小文字が区別されません)。MySQL は、sort_order[character] の値に基づいて文字をソートします。さらに複雑なソートルールに関しては、後述の文字列照合の説明を参照してください。 「4.7.5 文字列照合サポート」 節 参照 。
ctype[] はビット値の配列で、1 文字が 1 要素です。注意: to_lower[]、to_upper[]、および sort_order[] は文字値でインデックス化されますが、ctype[] は文字値 + 1 でインデックス化されます。これは、EOF を処理することが必要だったときの古いレガシです。
`m_ctype.h' に、以下のビットマスク定義があります。
#define _U 01 /* Uppercase */ #define _L 02 /* Lowercase */ #define _N 04 /* Numeral (digit) */ #define _S 010 /* Spacing character */ #define _P 020 /* Punctuation */ #define _C 040 /* Control character */ #define _B 0100 /* Blank */ #define _X 0200 /* heXadecimal digit */ |
各文字の ctype[] エントリは、文字を指定するビットマスク値の組み合わせになっている必要があります。たとえば、'A' は大文字(_U)であると同時に 16 進数(_X)でもあるので、ctype['A'+1] には以下の値が含まれます。
_U + _X = 01 + 0200 = 0201 |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
使用する言語のソートルールが、シンプルな sort_order[] テーブルで処理するには複雑すぎる場合、文字列照合を行う必要があります。
現在のところ、これに関する最良のドキュメントは、すでに実装されているキャラクタセットです。たとえば、big5、czech、gbk、sjis、tis160 などのキャラクタセットを見てみてください。
ファイルの先頭の特殊コメントで、strxfrm_multiply_MYSET=N 値を指定する必要があります。N には、my_strxfrm_MYSET で文字列が大きくなれる最大比率(正の整数)を設定してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
マルチバイト文字を含む新しいキャラクタセットのサポートを追加する場合、マルチバイト文字関数を使用する必要があります。
現在のところ、これに関する最良のドキュメントは、すでに実装されているキャラクタセットです。たとえば、euc_kr、gb2312、gbk、sjis、ujis などのキャラクタセットを参照してください。これらは、`strings' ディレクトリの `ctype-'charset'.c' ファイルに実装されています。
ソースファイルの先頭の特殊コメントで mbmaxlen_MYSET=N 値を指定する必要があります。N には、キャラクタセット内の最大文字のバイト数を設定してください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
使用しているバイナリにコンパイルされていないキャラクタセットを使用すると、いくつかの問題が発生する可能性があります。
--character-sets-dir オプションを使用することによって解決できる。
ERROR 1105: File '/usr/local/share/mysql/charsets/?.conf' not found (Errcode: 2) |
この場合、新しい Index ファイルを入手するか、または手動でキャラクタセット名を追加する。
MyISAM テーブルでは、テーブルのキャラクタセットの名前と番号を myisamchk -dvv table_name で確認できます。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
| 4.8.1 サーバサイドのスクリプトとユーティリティの概要 | ||
4.8.2 mysqld_safe(mysqld のラッパ) | ||
4.8.3 mysqld_multi(複数の MySQL サーバを管理するプログラム) | ||
4.8.4 myisampack(MySQL 圧縮読み取り専用テーブルジェネレータ) | ||
4.8.5 mysqld-max(拡張 mysqld サーバ) |
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
すべての MySQL プログラムが多くのさまざまなオプションを使用します。しかし、すべての MySQL プログラムに --help オプションが用意されており、このオプションを使用することにより、そのプログラムのすべてのオプションの説明を表示することができます。たとえば、mysql --help を試してみてください。
すべての標準プログラムのデフォルトオプションは、オプション設定ファイルで上書きできます。 「4.1.2 `my.cnf' オプション設定ファイル」 。
以下の一覧は、サーバサイドの MySQL プログラムを簡単に説明したものです。
myisamchk
myisamchk には多くの機能があるため、別の章で説明する。 「4. データベース管理」 節 参照 。
make_binary_distribution
support.mysql.com の `/pub/mysql/Incoming' に送信することができる。
mysqlbug
mysqld
mysql_install_db
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld_safe(mysqld のラッパ)
mysqld_safe は、mysqld デーモンを Unix で起動するときの推奨される方法です。mysqld_safe により、エラー発生時にサーバを再起動したり、ランタイム情報をログファイルに記録するなどのセーフティ機能が加わります。
注意:
MySQL 4.0 より前は、mysqld_safe は safe_mysqld という名前でした。下位互換性を維持するため、しばらくの間、MySQL バイナリディストリビューションには mysqld_safe へのシンボリックリンクとして safe_mysqld が含められています。
--mysqld=# または --mysqld-version=# を使用しない場合、mysqld_safe は、mysqld-max という名前の実行可能ファイルがあればこれを使用します。このファイルがなければ、mysqld_safe は mysqld を開始します。これにより、mysqld の代わりに mysqld-max が使用されるかどうかのテストを簡単に実行できます。mysqld-max を mysqld のある場所にコピーするだけで、前者が使用されます。
通常、mysqld_safe スクリプトは編集しないでください。代わりに、`my.cnf' ファイルの [mysqld_safe] セクションの mysqld_safe にオプションを設定します。mysqld_safe は、オプション設定ファイルの [mysqld]、[server]、[mysqld_safe] の各セクションからすべてのオプションを読み取ります(下位互換性のため、[safe_mysqld] セクションからもオプションが読み取られます)。
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
注意: mysqld_safe に対するコマンドラインオプションはすべて mysqld に渡されます。mysqld がサポートしていないオプションを mysqld_safe で使用するには、オプション設定ファイルでそのオプションを指定する必要があります。
mysqld_safe のオプションのほとんどは、mysqld のオプションと同じです。 「4.1.1 mysqld コマンドラインオプション」 節 参照 。
mysqld_safe は、以下のオプションをサポートします。
--basedir=path
--core-file-size=#
mysqld が作成できるコアファイルのサイズ。ulimit -c に渡される。
--datadir=path
--defaults-extra-file=path
--defaults-file=path
--err-log=path(4.0 で廃止。代わりに --log-error を使用すること)
--log-error=path
--ledir=path
mysqld のパス。
--log=path
--mysqld=mysqld-version
ledir ディレクトリ内にある起動する mysqld バージョンの名前。
--mysqld-version=version
--mysqld= と同様であるが、ここでは mysqld のサフィックスのみ指定する。
たとえば、--mysqld-version=max を使用すると、mysqld_safe は ledir/mysqld-max バージョンを起動する。--mysqld-version の引数が空白の場合、ledir/mysqld が使用される。
--nice=#(MySQL 4.0.14 で追加)
--no-defaults
--open-files-limit=#
mysqld が開くことのできるファイルの数。ulimit -n に渡される。注意: これを正常に機能させるには、mysqld_safe を root として起動する必要がある。
--pid-file=path
--port=#
--socket=path
--timezone=#
TZ)変数を、このパラメータの値に設定する。
--user=#
mysqld_safe スクリプトは、MySQL のソースバージョンまたはバイナリバージョンのどちらでインストールされたサーバでも起動できるように記述されています。サーバが多少異なる場所にインストールされていても問題ありません。mysqld_safe は、以下のいずれかの条件が満たされていることを必要とします。
mysqld_safe を起動するディレクトリとの相対関係でサーバとデータベースを検出できる。mysqld_safe は、その作業ディレクトリ以下で、`bin' ディレクトリと `data' ディレクトリ(バイナリディストリビューションの場合)、または `libexec' ディレクトリと `var' ディレクトリ(ソースディストリビューションの場合)を探す。MySQL インストールディレクトリ(たとえば、バイナリディストリビューションの場合は `/usr/local/mysql')から mysqld_safe を実行する場合、この条件が満たされていることが必要である。
mysqld_safe は絶対パスによって検出しようとする。通常、この場所は、`/usr/local/libexec' や `/usr/local/var' になる。実際の場所は、ディストリビューションがビルドされたときに決定され、ここから mysqld_safe が起動する。MySQL が標準の場所にインストールされている場合、この絶対パスが正しいことが必要になる。
mysqld_safe はその作業ディレクトリに相対してサーバとデータベースを探すため、MySQL インストールディレクトリから mysqld_safe を開始するのであれば、MySQL のバイナリディストリビューションはどこにでもインストールできます。
shell> cd mysql_installation_directory shell> bin/mysqld_safe & |
MySQL インストールディレクトリから起動しても mysqld_safe が失敗する場合、システムにとって正しい mysqld のパスとパス名オプションが使用されるように修正します。注意: MySQL をアップグレードすると、mysqld_safe の修正バージョンは上書きされます。再インストールできるように、編集バージョンのコピーを取っておいてください。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
mysqld_multi(複数の MySQL サーバを管理するプログラム)
mysqld_multi は、さまざまな Unix ソケットおよび TCP/IP ポートをリッスンする複数の mysqld プロセスを管理するためのプログラムです。
このプログラムは、[mysqld#] という名前のグループを `my.cnf'(または --config-file=... オプションで指定されたファイル)から検索します。ここで、# は 1 で始まる任意の正の数です。この番号は、以下の説明ではオプショングループ番号、または GNR と呼びます。グループ番号はオプショングループを識別し、起動したり、停止したり、またはステータス情報を取得するサーバを指定する mysqld_multi の引数として使用します。これらのグループに含まれるオプションは、mysqld の起動に使用される通常の [mysqld] グループと同じです( 「2.4.3 MySQL を自動的に起動および停止する」 などを参照してください)。ただし、mysqld_multi では、各グループに、各 mysqld プロセスで使用されるポートやソケットなどを指定するオプションが含まれていることが必要です。
mysqld_multi は、以下の構文で起動します。
mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...]
か mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...]
|
各 GNR は、オプショングループ番号を表します。任意の GNR を開始、停止、または報告でき、複数の GNR を同時に開始、停止、または報告することもできます。オプション設定ファイルの設定例を表示するには、以下のコマンドを実行します。
shell> mysqld_multi --example |
リスト内の GNR の値はコンマで区切ったり、ダッシュ記号で結合できます。結合の場合、GNR1-GNR2 間のすべての GNR が対象になります。GNR 引数を指定しなかった場合、リスト内のすべてのグループが起動、停止、または報告されます。注意: GNR リストには空白スペースを使用できません。空白スペースを挿入すると、スペースの後は無視されます。
mysqld_multi は、以下のオプションをサポートします。
--config-file=...
[mysqld_multi] グループ)には影響せず、[mysqld#] グループにのみ影響する。このオプションがない場合、通常の `my.cnf' ファイルからすべてが検索される。
--example
--help
--log=...
--mysqladmin=...
mysqladmin バイナリ。
--mysqld=...
mysqld バイナリ。注意: このオプションに mysqld_safe を指定することもできる。このオプションは、mysqld に渡される。環境変数 PATH が mysqld を指定していることを確認するか、mysqld_safe を修正する。
--no-log
--password=...
mysqladmin のユーザのパスワード。
--tcp-ip
--user=...
mysqladmin の MySQL ユーザ。
--version
mysqld_multi に関する補足コメント
mysqladmin プログラムなどを使用して mysqld サービスを停止する MySQL ユーザのパスワードとユーザ名が、アクセスされるすべてのデータディレクトリ(mysql データベースへのアクセス)用のパスワードとユーザ名と同じであることを確認すること。また、ユーザに SHUTDOWN 権限があることも確認する。多くのデータディレクトリがあり、MySQL root ユーザのパスワードが異なる多くの mysql データベースがある場合、以下のように同じパスワードを使用する共通 multi_admin ユーザを作成できる。以下、その例。
shell> mysql -u root -S /tmp/mysql.sock -proot_password -e "GRANT SHUTDOWN ON *.* TO multi_admin@localhost IDENTIFIED BY 'multipass'" |
mysqld に対してこのコマンドを実行する必要がある(ソケット -S=... のみ変更する)。
pid-file は、mysqld_safe を使用して mysqld を起動する場合(たとえば、--mysqld=mysqld_safe)非常に重要である。すべての mysqld に独自の pid-file が必要である。ここで mysqld を直接使用せずに mysqld_safe を使用する利点は、kill -9 で送信されるシグナルや、その他セグメント化エラー(MySQL では発生してはいけないことだが)などによって mysqld プロセスが強制終了した場合でも、mysqld_safe がすべての mysqld プロセスを "保護" し、再起動することである。注意: mysqld_safe スクリプトは、特定の場所から起動することが必要な場合がある。つまり、mysqld_multi を開始する前に、特定のディレクトリに cd することが必要な場合がある。起動時に問題が発生した場合は、mysqld_safe スクリプトを確認のこと。特に以下の行をチェックする。
-------------------------------------------------------------------------- MY_PWD=`pwd` Check if we are starting this relative (for the binary release) if test -d /data/mysql -a -f ./share/mysql/english/errmsg.sys -a \ -x ./bin/mysqld -------------------------------------------------------------------------- |
mysqld_safe(mysqld のラッパ)」 節 参照 。
上記のテストがうまくいかなければ、問題が発生する可能性がある。
mysqld サーバを開始することには危険が伴う。完全に理解していない限り、別々のデータディレクトリを使用すべきである。
mysqld に対して異なるソケットファイルと TCP/IP ポートが指定されていることが必要である。
mysqld グループは、例から意図的に除外してある。設定ファイルには '空行' を入れておくことが可能である。これにより、柔軟性が高まる。mysqlds の開始と停止の順序は、設定ファイルでの順序に依存する。
[mysqld17] という名前のグループの GNR は 17 である。
mysqld で --user オプションを使用するには、mysqld_multi スクリプトを Unix root ユーザとして実行する必要がある。設定ファイルにこのオプションがあっても問題はない。スーパーユーザでないユーザが自分の Unix アカウントで mysqld を開始している場合でも、警告が発生するだけである。重要: 特定の mysqld プロセスを開始しているその Unix ユーザが pid-file およびデータディレクトリの読み取り権限と書き込み権限を(データディレクトリの場合は実行権限も)持っていることを確認すること。完全に理解していない限り、この目的で Unix root アカウントを使用してはいけない。
mysqld サーバに渡されるオプションの意味、および mysqld プロセスを個別に使用する方が望ましい理由を理解しておくこと。同じデータディレクトリで複数のサーバを起動しても、スレッドシステムではパフォーマンスの向上は望めない。
「4.2 同じマシン上で複数の MySQL サーバを実行する」 節 参照 。
以下、mysqld_multi の設定が含まれる設定ファイルの例です。
# This file should probably be in your home dir (~/.my.cnf) or /etc/my.cnf # Version 2.1 by Jani Tolonen [mysqld_multi] mysqld = /usr/local/bin/mysqld_safe mysqladmin = /usr/local/bin/mysqladmin user = multi_admin password = multipass [mysqld2] socket = /tmp/mysql.sock2 port = 3307 pid-file = /usr/local/mysql/var2/hostname.pid2 datadir = /usr/local/mysql/var2 language = /usr/local/share/mysql/english user = john [mysqld3] socket = /tmp/mysql.sock3 port = 3308 pid-file = /usr/local/mysql/var3/hostname.pid3 datadir = /usr/local/mysql/var3 language = /usr/local/share/mysql/swedish user = monty [mysqld4] socket = /tmp/mysql.sock4 port = 3309 pid-file = /usr/local/mysql/var4/hostname.pid4 datadir = /usr/local/mysql/var4 language = /usr/local/share/mysql/estonia user = tonu [mysqld6] socket = /tmp/mysql.sock6 port = 3311 pid-file = /usr/local/mysql/var6/hostname.pid6 datadir = /usr/local/mysql/var6 language = /usr/local/share/mysql/japanese user = jani |
「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。
| [ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top ] | [Contents ] | [Index] | [ ? ] |
myisampack(MySQL 圧縮読み取り専用テーブルジェネレータ)
myisampack は MyISAM テーブルの圧縮に、pack_isam は ISAM テーブルの圧縮に使用します。ISAM テーブルは廃止されているため、ここでは myisampack に限って話を進めますが、myisampack について説明することはすべて、pack_isam にも当てはまります。
myisampack は、テーブル内の各カラムを個別に圧縮します。テーブルを開いたとき、カラムを展開するための情報がメモリに読み込まれます。これにより、個々のレコードにアクセスする際のパフォーマンスが向上します。この場合、Stacker を MS-DOS で使用するときのような大きなディスクブロックではなく、1 つのレコードだけを解凍するだけで済みます。
通常、myisampack はデータファイルを 40% 〜 70% 圧縮します。
MySQL は、圧縮テーブルでメモリマッピング(mmap())を使用し、mmap() が機能しない場合は、通常のファイルの読み取り/書き込み使用法に戻ります。
以下に注意してください。
myisampack は、BLOB カラムまたは TEXT カラムもパックできる。
古い pack_isam(ISAM テーブル用)ではパックできない。
myisampack は以下のコマンドで起動します。
shell> myisampack [options] filename ... |
各ファイル名は、インデックス(`.MYI')ファイル名になっていることが必要です。データディレクトリがカレントディレクトリでなければ、ファイルのパスを指定してください。`.MYI' 拡張子は省略可能です。
myisampack は、以下のオプションをサポートします。
-b, --backup
tbl_name.OLD として作成する。
-#, --debug=debug_options
debug_options 文字列には、'd:t:o,filename' がよく使用される。
-f, --force
myisampack は、テーブルの圧縮中、`tbl_name.TMD' という名前のテンポラリファイルを生成する。myisampack を強制終了した場合、`.TMD' ファイルが削除されない場合がある。通常、`tbl_name.TMD' があれば、myisampack はエラーを出力して終了する。--force を使用すると、テンポラリファイルの有無に関わらず myisampack はテーブルをパックする。
-?, --help
-j big_tbl_name, --join=big_tbl_name
big_tbl_name にする。結合するテーブルはすべて、同一(同じカラム名、同じ型、同じインデックスなど)のテーブルであることが必要である。
-p #, --packlength=#
myisampack は、すべてのレコードを 1、2、または 3 バイトの長さポインタで保存する。ほとんどの場合、myisampack はファイルをパックする前に、正しい長さを判断できるが、パック中にさらに短くてもよいことを認識する場合がある。この場合、myisampack は、次回同じファイルをパックするときに、レコード長を短くできるというメモを出力する。
-s, --silent
-t, --test
-T dir_name, --tmp_dir=dir_name
-v, --verbose
-V, --version
-w, --wait
テーブルが使用中の場合、待機して再試行する。mysqld サーバが --skip-external-locking オプションで起動しいる場合、パッキングプロセス中にテーブルが更新される可能性があれば、myisampack を使用すべきではない。