[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4. データベース管理

4.1 MySQL のコンフィギャ   
4.2 同じマシン上で複数の MySQL サーバを実行する   
4.3 一般的なセキュリティ関連事項と MySQL アクセス制御システム   
4.4 MySQL のユーザ管理   
4.5 障害の予防とリカバリ   
4.6 データベース管理言語リファレンス   
4.7 MySQL のローカライズと国際的な使用   
4.8 MySQL サーバサイドのスクリプトとユーティリティ   
4.9 MySQL クライアントサイドのスクリプトとユーティリティ   
4.10 MySQL ログファイル   
4.11 MySQL のレプリケーション   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.1 MySQL のコンフィギャ

4.1.1 mysqld コマンドラインオプション   
4.1.2 `my.cnf' オプション設定ファイル   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.1.1 mysqld コマンドラインオプション

通常、mysqld オプションはオプション設定ファイルから管理してください。 「4.1.2 `my.cnf' オプション設定ファイル」 節 参照 。

mysqldmysqld.servermysqld グループと server グループからオプションを読み込みます。 mysqld_safemysqldservermysqld_safesafe_mysqld の各グループからオプションを読み込みます。 組み込み MySQL サーバは通常、serverembedded、および xxxxx_SERVER からオプションを読み込みます。ここで、xxxxx はアプリケーションの名前です。

mysqld には、多くのコマンドラインオプションがあります。以下、一般的なコマンドラインオプションについて説明します。 完全なオプション一覧を参照するには、mysqld --help を実行してください。 レプリケーション用のオプションについては、別のセクションで説明します。 「4.11.6 レプリケーションスタートアップオプション」 を参照してください。

--ansi
MySQL 構文ではなく、SQL-99 構文を使用する。 「1.8.2 ANSI モードでの MySQL の実行」 節 参照 。

-b, --basedir=path
インストールディレクトリのパス。すべてのパスは通常、このパスからの相対パスで解決される。

--big-tables
すべてのテンポラリセットをファイルに保存することにより、大きな結果セットを可能にする。これによりほとんどの 'table full' エラーが解決されるが、メモリ内テーブルだけで事足りるクエリの実行速度も遅くなる。MySQL バージョン 3.23.2 以降、小さなテンポラリテーブルの場合はメモリを使用し、必要に応じて自動的にディスクテーブルに切り替わるようになっている。

--bind-address=IP
バインドする IP アドレス。

--console
--log-error が指定されている場合でも、stderr/stdout にエラーログメッセージを書き込む。このオプションを使用した場合、Windows では mysqld によりコンソール画面が開かれたままになる。

--character-sets-dir=path
キャラクタセットが格納されているディレクトリ。 「4.7.1 データおよびソート用キャラクタセット」 節 参照 。

--chroot=path
起動時に chroot 環境に mysqld デーモンを配置する。MySQL 4.0 以降の推奨セキュリティ設定(MySQL 3.23 では、完全に閉じた chroot ジェイルを提供できない)。 ただし、LOAD DATA INFILESELECT ... INTO OUTFILE に制約が加わる。

--core-file
mysqld が異常終了した場合に、コアファイルを作成する。システムによっては、mysqld_safe--core-file-size を指定することも必要になる。 「4.8.2 mysqld_safemysqld のラッパ)」 節 参照 。 注意: --user オプションも使用している場合、Solaris などシステムではコアファイルを作成できない。

-h, --datadir=path
データベースルートのパス。

--debug[...]=
MySQL を --with-debug でコンフィギャしている場合、このオプションを使用して mysqld の動作を示すトレースファイルを取得できる。 「E.1.2 トレースファイルの作成」 節 参照 。

--default-character-set=charset
デフォルトのキャラクタセットを設定する。 「4.7.1 データおよびソート用キャラクタセット」 節 参照 。

--default-table-type=type
デフォルトのテーブル型を設定する。 「7. MySQL のテーブル型」 節 参照 。

--delay-key-write[= OFF | ON | ALL]
MyISAM で、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
名前付きパイプのサポートを有効化する(Windows NT/2000/XP のみ)。

-T, --exit-info
mysqld サーバのデバッグに使用できる、複数の異なるフラグのビットマスク。完全に理解していない限り、このオプションは使用しないこと。

--flush
各 SQL コマンド実行後、ディスクへの変更をすべてフラッシュする。通常、MySQL は各 SQL コマンドの後、ディスクへの変更の書き込みだけを行い、ディスクへの同期処理はオペレーティングシステムに任せる。 「A.4.1 MySQL が何度もクラッシュする場合に行うこと」 節 参照 。

-?, --help
ショートヘルプを表示して終了する。

--init-file=file
起動時に、このファイルから SQL コマンドを読み取る。

-L, --language=...
クライアントエラーメッセージに使用する言語。フルパスで指定できる。 「4.7.2 英語以外のエラーメッセージ」 節 参照 。

-l, --log[=file]
接続とクエリをログファイルに記録する。 「4.10.2 一般クエリログ」 節 参照 。

--log-bin=[file]
データを変更するクエリをすべてログファイルに記録する。バックアップおよびレプリケーション用に使用する。 「4.10.4 バイナリログ」 節 参照 。

--log-bin-index[=file]
バイナリログファイル名のインデックスファイル。 「4.10.4 バイナリログ」 節 参照 。

--log-error[=file]
エラーメッセージおよびスタートアップメッセージをこのログファイルに記録する。 「4.10.1 エラーログ」 節 参照 。

--log-isam[=file]
ISAM および MyISAM の変更をすべてログファイルに記録する(ISAM および MyISAM のデバッグ時のみ使用)。

--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
ログファイル(更新ログ、バイナリ更新ログ、スロークエリログなど、有効化されているすべてのログ)に記録される情報が少なくなる。たとえば、クエリのユーザ名とタイムスタンプが記録されなくなる。このオプションは MySQL 4.1 で導入。

--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
テーブル編集操作(INSERTDELETEUPDATE)の優先順位が選択よりも低くなる。{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...]]
オプションは、DEFAULTBACKUPFORCE、および 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
バージョン 4.0.12 から使用可能となったオプション。--new オプションを使用すると、特定の局面でサーバを 4.1 のように動作させることができ、簡単に 4.0 から 4.1 にアップグレードできる。

--pid-file=path
mysqld_safe によって使用される PID ファイルのパス。

-P, --port=...
TCP/IP 接続をリッスンするポート番号。

-o, --old-protocol
非常に古いクライアントとの互換性のために 3.20 プロトコルを使用する。 「2.5.5 バージョン 3.20 から 3.21 へのアップグレード」 節 参照 。

--one-thread
1 スレッドのみ使用する(Linux でのデバッグ用)。 このオプションは、サーバのデバッグが有効になっている場合のみ使用可能。 「E.1 MySQL サーバのデバッグ」 節 参照 。

--open-files-limit=
mysqld で使用可能なファイル記述子の数を変更できる。 これが設定されていないか、または 0 に設定されている場合、mysqld は、setrlimit() で使用する値を使用してファイル記述子を予約する。この値が 0 の場合、mysqldmax_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
BDB テーブルの使用を無効にする。メモリの節約および演算処理のスピードアップに役立つ。

--skip-concurrent-insert
MyISAM テーブルで SELECTINSERT を同時に実行できなくする(これは、この機能にバグがあると思われる場合だけ使用すること)。

--skip-delay-key-write
MySQL 4.0.3 では、代わりに --delay-key-write=OFF を使用する。 すべてのテーブルの DELAY_KEY_WRITE オプションを無視する。 「5.5.2 サーバパラメータのチューニング」 節 参照 。

--skip-grant-tables
サーバが一切の権限システムを使用しないようにする。これによりすべての人が、すべてのデータベースにフルアクセスできるようになる(実行中のサーバに権限テーブルを再び使用させるには、mysqladmin flush-privileges または mysqladmin reload を実行する)。

--skip-host-cache
IP への名前解決に、ホスト名キャッシュを使用せず、接続ごとに DNS サーバに対しクエリを発行する。 「5.5.5 MySQL の DNS の使用」 節 参照 。

--skip-innodb
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
TCP ポートを一切リッスンしない。mysqld とのやり取りはすべて、名前付きパイプまたは Unix ソケットを介して行う必要がある。ローカルからの接続要求のみが許可されているシステムにおいて、特にこのオプションが推奨される。 「5.5.5 MySQL の DNS の使用」 節 参照 。

--skip-new
新しくて間違っている可能性のあるルーチンを使用しない。

--skip-symlink
4.0.13 で廃止。代わりに --skip-symbolic-links を使用すること。

--symbolic-links, --skip-symbolic-links
シンボリックリンクのサポートを有効または無効にする。このオプションは、Windows と Unix では効果が異なる。

Windows でシンボリックリンクを有効にすると、実際のディレクトリへのパスが含まれる directory.sym ファイルの作成により、データベースディレクトリへのシンボリックリンクを作成できるようになる。 「5.6.1.3 Windows 上のデータベースに対するシンボリックリンクの使用」 節 参照 。

Unix でシンボリックリンクを有効にすると、CREATE TABLE ステートメントの INDEX DIRECTORY オプションまたは DATA DIRECTORY オプションで MyISAM のインデックスファイルまたはデータファイルを別ディレクトリにリンクできるようになる。テーブルを削除したり名前を変更すると、そのシンボリックリンクがポイントするファイルも削除または名前変更される。

--skip-safemalloc
MySQL を --with-debug=full でコンフィギャしていれば、すべてのプログラムが、メモリの割り当て時と解放時に必ずメモリのオーバーランをチェックする。このチェックには時間がかかるため、このチェックを行わないで済むサーバに対しては、--skip-safemalloc オプションによりチェックをスキップできる。

--skip-show-database
ユーザが SHOW DATABASES 権限を持っていない場合に、SHOW DATABASES コマンドを無効にする。

--skip-stack-trace
スタックトレースを書き込まない。このオプションは、デバッガで mysqld を実行するときに役立つ。システムによっては、コアファイルを取得するためにこのオプションの使用が必要な場合もある。 「E.1 MySQL サーバのデバッグ」 節 参照 。

--skip-thread-priority
応答時間を短くするため、スレッド優先度の使用を無効にする。

--socket=path
Unix では、ローカル接続に使用するソケットファイル(デフォルトでは `/tmp/mysql.sock')。 Windows では、名前付きパイプを使用するローカル接続用パイプ名(デフォルトでは MySQL)。

--sql-mode=value[,value[,value...]]
オプション値として、次の任意の組み合わせを設定できる。 REAL_AS_FLOATPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACEONLY_FULL_GROUP_BYNO_UNSIGNED_SUBTRACTIONNO_AUTO_VALUE_ON_ZERONO_TABLE_OPTIONSNO_FIELD_OPTIONSNO_KEY_OPTIONSNO_DIR_IN_CREATEMYSQL323MYSQL40DB2MAXDBMSSQLORACLEPOSTGRESQL、および 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 ステートメントの他のサーバへの移植性が高まる。

mysqldumpSHOW 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 の実行」 を参照のこと。

他の "グループ" 値は、DB2MAXDBMSSQLORACLE、および POSTGRESQL。 これらのいずれの値を指定しても、PIPES_AS_CONCATANSI_QUOTESIGNORE_SPACENO_TABLE_OPTIONSNO_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_ZERONO_TABLE_OPTIONSNO_FIELD_OPTIONSNO_KEY_OPTIONSMYSQL323MYSQL40DB2MAXDBMSSQLORACLEPOSTGRESQL、および ANSI は 4.1.1 で追加された。

--temp-pool
このオプションを使用すると、サーバによって作成される大部分のテンポラリファイルが、それぞれ一意の名前ではなく、小さな名前のセットを使用する。これは、多くの新規ファイルが異なる名前で作成され、それを Linux カーネルが処理する問題を回避するためである。Linux では、メモリがディスクキャッシュではなく、ディレクトリエントリキャッシュに割り当てられるため、以前の動作ではメモリの "リーク" が発生しやすい。

--transaction-isolation={ READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
デフォルトのトランザクション分離レベルを設定する。 「6.7.6 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 ユーザではなく、システムログインアカウントを指す)。

このオプションは、mysqldroot アカウントで起動する場合、必須である。 起動シーケンス中にサーバがそのユーザ 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] [ ? ]

4.1.2 `my.cnf' オプション設定ファイル

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. 環境変数」 節 参照 。

オプション設定ファイルをサポートするプログラムは、mysqlmysqladminmysqldmysqld_safemysql.servermysqldumpmysqlimportmysqlshowmysqlcheckmyisamchk、および myisampack です。

バージョン 4.0.2 より、loose プリフィックスをコマンドラインオプション(または my.cnf のオプション)に使用できます。オプションの前に loose を付けると、オプションが未知の場合でも、それを読み取ったプログラムはエラー終了せず、以下の警告を出力します。

 
shell> mysql --loose-no-such-option

MySQL プログラム実行時にコマンドラインで指定できる長いオプションは、オプション設定ファイルで指定できます(ダッシュ2つを前に付けない)。使用可能なオプションの一覧を表示するには、--help オプション付きでそのプログラムを実行してください。

オプション設定ファイルには、以下の形式の行を含めることができます。

#comment
コメント行は、`#' または `;' で始める。MySQL 4.0.14 より、コメントを行の途中からでも開始できるようになった。空白行は無視される。

[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 同じマシン上で複数の MySQL サーバを実行する

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 は、TCP/IP 接続のポート番号を制御します。 --socket は、Unix ではソケットファイルパスを、Windows では名前付きパイプの名前を制御します(名前付きパイプ接続をサポートしているサーバに対してのみ、Windows 上で一意のパイプ名を指定する必要があります)。 --shared-memory-base-name は、Windows サーバが使用する共有メモリ名を指定します。これにより、クライアントはその共有メモリを介して接続できるようになります。 --pid-file は、Unix サーバがプロセス ID を書き込むファイルの名前を示します。

以下のオプションを使用する場合、サーバごとに異なる値を設定する必要があります。

パフォーマンスを高めるには、以下のオプションをサーバごとに個別に設定し、負荷を複数のディスクに分散します。

複数のテンポラリディレクトリを上記のように設定し、どの MySQL サーバにどのテンポラリファイルが属するのかわかりやすくしておくことを推奨します。

一般的に、データディレクトリについても、各サーバが異なるディレクトリを使用するようにします。これは --datadir=path オプションで指定します。

警告: 2 つのサーバから同じデータベースのデータを更新しないようにしてください。使用しているオペレーティングシステムが障害からの保護をおこなうようなシステムロックをサポートしていない場合、予期しない事態が発生する可能性があります。また、複数のサーバが同じデータディレクトリを使用し、ログが有効になっている場合、適切なオプションを使用して各サーバに異なるログファイル名を指定する必要があります。そうしないと、サーバは同じファイルにログしてしまいます。

サーバ間でのデータディレクトリ共有に関するこの警告は、NFS 環境にも当てはまります。NFS 環境で複数の MySQL サーバに同じデータディレクトリへのアクセスを認めることは避けてください

簡単な方法を選択してください。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] [ ? ]

4.2.1 Windows 上で複数のサーバを実行する

適切なパラメータを使用し、コマンドラインからサーバを手動で起動することにより、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] [ ? ]

4.2.1.1 コマンドラインから複数の Windows サーバを起動する

コマンドラインから手動で複数のサーバを起動するには、コマンドラインまたはオプション設定ファイルで必要なオプションを指定します。オプション設定ファイルでオプションを設定する方が便利ですが、各サーバに独自のオプションセットを確実に設定する必要があります。これを行うには各サーバ用のオプション設定ファイルを作成し、サーバ起動時に --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] [ ? ]

4.2.1.2 複数の Windows サーバをサービスとして起動する

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 サービスをインストールする場合、以下の原則が当てはまります。

これらの原則は、--install-manual オプションを使用してサーバをインストールした場合にも当てはまります。

以上の情報に基づいて、複数のサービスをセットアップする方法はいくつかあります。 次に、いくつかの例を示します。いずれを試す場合でも、最初に既存の MySQL サービスをシャットダウンして削除しておくことが必要です。

複数のサービスを削除するには、mysqld --remove を使用して 1 つずつ削除します。削除するサービスがデフォルト名でない場合は、--remove オプションの後にサービス名を指定します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.2.2 Unix 上で複数のサーバを実行する

複数のサーバを 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_numberfile_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] [ ? ]

4.2.3 複数サーバ環境でクライアントプログラムを使用する

クライアントにコンパイルされたネットワークインタフェース以外のネットワークインタフェースをリッスンしている MySQL サーバにそのクライアントから接続するには、以下のいずれかの方法を実行します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3 一般的なセキュリティ関連事項と MySQL アクセス制御システム

MySQL には、非標準ですが、上級のセキュリティおよび権限システムがあります。このセクションでは、その機能について説明します。

4.3.1 一般的なセキュリティガイドライン   
4.3.2 MySQL のクラッカー対策   
4.3.3 セキュリティ関連の mysqld スタートアップオプション   
4.3.4 LOAD DATA LOCAL のセキュリティ関連事項   
4.3.5 権限システムが行うこと   
4.3.6 権限システムはどのように機能するか   
4.3.7 MySQL が提供する権限   
4.3.8 MySQL サーバへの接続   
4.3.9 アクセス制御の段階 1: 接続確認   
4.3.10 アクセス制御の段階 2: 要求確認   
4.3.11 MySQL 4.1 のパスワードハッシュ   
4.3.12 Access denied エラーの原因   


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.1 一般的なセキュリティガイドライン

インターネットに接続されたコンピュータで MySQL を使用するユーザはすべて、このセクションを読んで、頻発しているセキュリティ侵害を回避するようにしてください。

盗聴傍受、改ざん、再生、サービス妨害など、あらゆるタイプの攻撃に対して、MySQL サーバだけでなく、サーバホスト全体を、最大限の努力をもって保護することが必要です。ここでは、可用性および耐障害性のすべてについてはカバーしていません。

MySQL では、すべての接続、クエリなど、ユーザが実行する可能性のある操作に対して、そのセキュリティを、アクセス制御リスト(ACL)をベースにして保護しています。MySQL クライアントとサーバ間の SSL 暗号化接続もサポートしています。ここで説明する概念の多くは、MySQL 固有ではありません。ほとんどすべてのアプリケーションに当てはまります。

MySQL を実行する際には、可能な限り以下のガイドラインに従ってください。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.2 MySQL のクラッカー対策

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 システムのセキュリティを確保するためには、以下の事項を強く推奨します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.3 セキュリティ関連の 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-privilegesmysqladmin reload または FLUSH PRIVILEGES; を実行すればよい。

--skip-name-resolve
ホスト名を解決しない。権限テーブルの Host カラム値はすべて IP アドレスか localhost でなければならない。

--skip-networking
TCP/IP 経由の接続を認めない。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] [ ? ]

4.3.4 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] [ ? ]

4.3.5 権限システムが行うこと

MySQL 権限システムは、主に、任意のホストから接続したユーザを認証し、そのユーザを、データベース上に登録されている権限(SELECTINSERTUPDATEDELETE)と関連付けます。

さらに、匿名ユーザを作成し、LOAD DATA INFILE や管理操作機能など MySQL 固有の機能を実行するための権限を設定します。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.6 権限システムはどのように機能するか

MySQL 権限システムは、すべてのユーザがそれぞれ許可された操作だけを実行できるようにします。MySQL サーバに接続すると、ユーザの ID は接続元のホストおよび指定したユーザ名によって特定されます。権限システムは、ユーザ ID と行いたい操作に応じて権限を設定します。

MySQL では、ホスト名とユーザ名を使用してユーザを認証します。1 つのユーザ名がインターネット上のどこででも同じユーザを示しているという保証がないためです。たとえば、office.com から接続したユーザ joe は、elsewhere.com から接続した joe と同一人物とは限りません。 MySQL では、同じユーザ名でも異なるホストから接続するユーザ間で区別することにより、このことを処理しています。joe に対して、office.com から接続した場合の権限セットと、elsewhere.com から接続した場合の権限セットを別々に設定できます。

MySQL のアクセス制御には 2 段階があります。

注意: 接続中に権限が変更された場合(ユーザ自身または第三者によって)、必ずしもその変更は次のクエリに反映されません。詳細については、 「4.4.3 権限の変更はいつ反映されるか」 を参照してください。

サーバはアクセス制御の両方の段階で、mysql データベースの userdbhost の各テーブルを使用します。これらの権限テーブルのフィールドを以下に示します。

テーブル名 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

各権限テーブルには、スコープフィールドと権限フィールドがあります。

スコープフィールドは、テーブルの各登録の範囲を特定します。たとえば、HostUser の値が 'thomas.loc.gov' および 'bob' である user テーブルエントリは、thomas.loc.gov ホストからサーバに接続しようとする bob を認証します。同様に、HostUserDb の各フィールドの値が 'thomas.loc.gov''bob'、および 'reports' である db テーブルエントリは、thomas.loc.gov ホストから reports データベースに接続しようとする bob を認証します。tables_priv テーブルおよび columns_priv テーブルには、各エントリに許可されているテーブルまたはテーブルとカラムの組み合わせを示すスコープフィールドが含まれています。

アクセスをチェックする目的において、Host 値は大文字と小文字の区別がありません。UserPasswordDb、および 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)

userdbhost の各テーブルでは、すべての権限フィールドが 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'

以下、サーバが権限テーブルをどのように使用するか簡潔に説明します。

注意: 管理者権限(RELOADSHUTDOWN など)は、user テーブルでのみ指定します。管理操作はデータベース固有ではなく、サーバそのもので行う操作なので、この権限を他の権限テーブルで設定する必要はありません。実際、管理操作を実行できるかどうか決定する際には、user テーブルを参照するだけで済みます。

FILE 権限も user テーブルだけで指定します。 これは管理者権限ではありませんが、サーバホスト上でのファイルの読み書きは、アクセスしているデータベースに依存しません。

mysqld サーバは権限テーブルの内容を、起動時に 1 回読み取ります。権限テーブルへの変更の反映については、 「4.4.3 権限の変更はいつ反映されるか」 を参照してください。

権限テーブルの内容を変更する場合、その変更によって、目的の権限が適切に設定されていることを確認してください。問題診断のヘルプについては、 「4.3.12 Access denied エラーの原因」 を参照してください。セキュリティに関するアドバイスについては、 「4.3.2 MySQL のクラッカー対策」 を参照してください。

便利な診断ツールとして、mysqlaccess スクリプトがあります。これは、Yves Carlier が MySQL ディストリビューション用に提供したものです。このツールの動作を確認したい場合には、mysqlaccess--help オプションで起動してください。 注意: mysqlaccessuserdb、および host テーブルだけを使用してアクセスをチェックします。テーブルまたはカラムレベルの権限はチェックしません。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.7 MySQL が提供する権限

ユーザ権限に関する情報は、mysql データベース(mysql という名前のデータベース)の userdbhosttables_privcolumns_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 サーバ管理

SELECTINSERTUPDATEDELETE の各権限は、データベース上の既存テーブルのレコードに対する各操作を許可するものです。

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 reloadrefreshflush-privilegesflush-hostsflush-logsflush-tables
SHUTDOWN shutdown
PROCESS processlist
SUPER kill

reload コマンドは、権限テーブルを再読み込みするようにサーバに命令します。refresh コマンドは、すべてのテーブルをフラッシュし、ログファイルを開いて閉じます。flush-privilegesreload のシノニムです。他の flush-* コマンドも refresh と同様の機能を果たしますが、範囲が限られており、状況によって使い分けてください。たとえば、ログファイルだけをフラッシュするには、refresh の代わりに flush-logs を使用します。

shutdown コマンドはサーバをシャットダウンします。

processlist コマンドは、サーバで実行中のスレッドに関する情報を表示します。kill コマンドはサーバスレッドを強制終了します。ユーザはいつでも自分のスレッドを表示および強制終了することができますが、他のユーザによって開始されたスレッドを表示するには PROCESS 権限が、強制終了するには SUPER 権限が必要です。 「4.6.7 KILL 構文」 節 参照 。

一般的な指針として、ユーザにはそのユーザが必要とする権限だけを与えてください。また、以下の権限を与える際には注意が必要です。

MySQL 権限システムでは達成できないこともいくつかあります。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top ] [Contents ] [Index] [ ? ]

4.3.8 MySQL サーバへの接続

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 は、コマンドラインで指定されなかった接続パラメータに以下のデフォルト値を使用します。

したがって、Unix ユーザ joe では、以下のコマンドがいずれも同じ意味になります。

 
shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

他の MySQL クライアントでも同様です。

Unix システムでは、接続時に別のデフォルト値を使用するように設定することができます。これにより、クライアントプログラムを起動するたびにコマンドラインで指定する必要がなくなります。設定方法は 2 つあります。