Windows を使用した MySQL は実証済みで安定しています。Windows バージョンの MySQL は以下の例外を除いて Unix バージョンの MySQL と同じです。
ポート数の制限
Windows システムにはクライアント接続のポートがおよそ 4,000 あり、1 つのポート接続が閉じるとそのポートを再度利用できるまで 2~4 分かかります。クライアントのサーバーへに接続/切断頻度が高い環境では、すべての利用できるポートは閉じたポートが再度利用できるようになる前に使用してしまうことができます。このようになると、MySQL サーバーはそれが動作中であっても反応していないようにみえます。ポートはマシンで実行されているほかのアプリケーションでも同様に使用できます。その際、MySQL に利用できるポート数は少なくなります。
この問題については、http://support.microsoft.com/default.aspx?scid=kb;en-us;196271 を参照してください。
同時読み込み
MySQL は INSERT
と
SELECT
を混合する際
pread()
および
pwrite()
のシステムコールに依存しています。現在、弊社では
pread()
および
pwrite()
をエミュレートするために mutex
を使用しています。弊社では将来的にファイルレベルのインタフェースを仮想インタフェースに置き換えて、readfile()
/writefile()
インタフェースを使用して高速化を図れるようにする予定です。現在の実装では
MySQL 5.1
が使用できるオープンファイルの数は 2,048
に制限されており、Windows 上では Unix
上と同じほど多数の並列スレッドを実行できません。
ブロック読み込み
MySQL は各接続にブロック読み込みを使用しています。それは名前付きパイプ接続が有効になった場合以下が想定されます。
接続は、Unix バージョンの MySQL とは異なり、8 時間後でも自動的に切断されない。
接続がハングした場合、MySQL を停止せずにハングを解消できない。
mysqladmin kill はスリープ中の接続には機能しない。
mysqladmin shutdown はスリープ接続がある限るシャットダウンできない。
弊社でこの問題を将来的に解決する予定です。
ALTER
TABLE
ALTER TABLE
ステートメントを実行中は、テーブルはほかのスレッドが使用できないようにロックされます。これは
Windows
の場合、使用中のファイルは別のスレッドで削除できないという事実に関連しています。将来的にはこの問題を解決する方法を見つける予定でます。
DROP
TABLE
MERGE
ハンドラーがテーブルのマッピングを上部層の
MySQL
に非表示にしているために、MERGE
テーブルで使用されている
DROP TABLE
は Windows
では機能しません。Windows
では開いているファイルは削除できないようになっているため、まずすべての
MERGE
テーブル
(FLUSH
TABLES
で)
をフラッシュするか、あるいはテーブルを削除する前に
MERGE
テーブルを削除する必要があります。
DATA
DIRECTORY
および INDEX
DIRECTORY
CREATE TABLE
の
DATA DIRECTORY
オプションと
INDEX
DIRECTORY
オプションは Windows
がシンボリックリンクをサポートしていないので
Windows
では無視されます。これらのオプションは、関数でない
realpath()
呼び出しがあるシステムでも無視されます。
DROP
DATABASE
スレッドで使用中のデータベースは削除できません。
ケースインセンシティブネーム
Windows ではファイル名の大文字と小文字は区別されないため、MySQL のデータベース名とテーブル名も Windows では大文字と小文字は区別されません。唯一の制限はデータベースおよびテーブル名は所定のステートメントでは同じケースを使用して指定される必要があるということだけです。項5.2.2. 「識別子の大文字小文字の区別」 を参照してください。
ディレクトリ名とファイル名
Windows では、MySQL サーバーは現行の ANSI コードページと互換性のあるディレクトリ名とファイル名のみをサポートします。たとえば、次の日本語のディレクトリ名は欧米のロケール (コードページ 1252) では使用できません。
datadir="C:/ç»´åºç¾ç§å ³äºä¸æç»´åºç¾ç§"
同じ制限は、LOAD
DATA INFILE
のデータファイルパス名など、SQL
ステートメントで参照されるディレクトリ名とファイル名にも適用されます。
「\
」
(パス名の区切り文字)
Winndows のパス名の構成要素は
「\
」
文字で区切られますが、これは MySQL
のエスケープ文字でもあります。LOAD
DATA INFILE
あるいは
SELECT...INTO
OUTFILE
を使用している場合は、Unix
スタイルのファイル名と
「/
」
文字を一緒に使用します。
mysql>LOAD DATA INFILE 'C:/tmp/skr.txt' INTO TABLE skr;
mysql>SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
または、「\
」
文字を 2 重にする必要があります。
mysql>LOAD DATA INFILE 'C:\\tmp\\skr.txt' INTO TABLE skr;
mysql>SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
パイプに関する問題
Pipes は Windows
のコマンドラインプロンプトでは信頼性に欠けます。パイプに
^Z
/
CHAR(24)
が含まれている場合、Windows
はファイルの最後だと勘違いしてプログラムを中止します。
これは以下のようにバイナリのログを適用する際の主な問題です。
C:\> mysqlbinlog binary_log_file
| mysql --user=root
ログに関する問題が発生しその問題が
^Z
/
CHAR(24)
文字によるものだと考えられる場合は、以下の回避法が使用できます。
C:\>mysqlbinlog
C:\>binary_log_file
--result-file=/tmp/bin.sqlmysql --user=root --execute "source /tmp/bin.sql"
後者のコマンドはバイナリのデータを含む SQL ファイルを確実に読み込むためにも使用できます。
Access denied
for user
エラー
MySQL がホスト名を正しく解決できない場合は、MySQL クライアントプログラムを実行して同じマシン上で動作しているサーバーに接続しようとすると、次のエラーが発生する場合があります。
Access denied for user 'some_user
'@'unknown'
to database 'mysql'
この問題を解決するためには、以下の情報を含むファイル名
\windows\hosts
を作成する必要があります。
127.0.0.1 localhost
ここに皆さんから改善に向けたご協力を頂けるであろう Windows を使用した MySQL の周知の問題を示します。
Microsoft から提供された高速のスレッドセーフな増分/減分メソッドを使用するためにマクロを追加します。