MySQL for Windows has proven itself to be very stable. The Windows version of MySQL has the same features as the corresponding Unix version, with the following exceptions:
-
Limited number of ports
Windows systems have about 4,000 ports available for client connections, and after a connection on a port closes, it takes two to four minutes before the port can be reused. In situations where clients connect to and disconnect from the server at a high rate, it is possible for all available ports to be used up before closed ports become available again. If this happens, the MySQL server appears to be unresponsive even though it is running. Note that ports may be used by other applications running on the machine as well, in which case the number of ports available to MySQL is lower.
For more information about this problem, see http://support.microsoft.com/default.aspx?scid=kb;en-us;196271.
-
Concurrent reads
MySQL depends on the
pread()
andpwrite()
system calls to be able to mixINSERT
andSELECT
. Currently, we use mutexes to emulatepread()
andpwrite()
. We intend to replace the file level interface with a virtual interface in the future so that we can use thereadfile()
/writefile()
interface to get more speed. The current implementation limits the number of open files that MySQL 5.0 can use to 2,048, which means that you cannot run as many concurrent threads on Windows as on Unix. -
Blocking read
MySQL uses a blocking read for each connection. That has the following implications if named-pipe connections are enabled:
A connection is not disconnected automatically after eight hours, as happens with the Unix version of MySQL.
If a connection hangs, it is not possible to break it without killing MySQL.
mysqladmin kill does not work on a sleeping connection.
mysqladmin shutdown cannot abort as long as there are sleeping connections.
We plan to fix this problem in the future.
-
While you are executing an
ALTER TABLE
statement, the table is locked from being used by other threads. This has to do with the fact that on Windows, you can't delete a file that is in use by another thread. In the future, we may find some way to work around this problem. -
DROP TABLE
on a table that is in use by aMERGE
table does not work on Windows because theMERGE
handler does the table mapping hidden from the upper layer of MySQL. Because Windows does not allow dropping files that are open, you first must flush allMERGE
tables (withFLUSH TABLES
) or drop theMERGE
table before dropping the table. -
DATA DIRECTORY
andINDEX DIRECTORY
The
DATA DIRECTORY
andINDEX DIRECTORY
options forCREATE TABLE
are ignored on Windows, because Windows doesn't support symbolic links. These options also are ignored on systems that have a non-functionalrealpath()
call. -
You cannot drop a database that is in use by some thread.
-
Case-insensitive names
File names are not case sensitive on Windows, so MySQL database and table names are also not case sensitive on Windows. The only restriction is that database and table names must be specified using the same case throughout a given statement.
-
Directory and file names
On Windows, MySQL Server supports only directory and file names that are compatible with the current ANSI code pages. For example, the following Japanese directory name will not work in the Western locale (code page 1252):
datadir="C:/维基百科关于中文维基百科"
The same limitation applies to directory and file names referred to in SQL statements, such as the data file path name in
LOAD DATA INFILE
. -
The “
\
” path name separator characterPath name components in Windows are separated by the “
\
” character, which is also the escape character in MySQL. If you are usingLOAD DATA INFILE
orSELECT ... INTO OUTFILE
, use Unix-style file names with “/
” characters:mysql>
LOAD DATA INFILE 'C:/tmp/skr.txt' INTO TABLE skr;
mysql>SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Alternatively, you must double the “
\
” character:mysql>
LOAD DATA INFILE 'C:\\tmp\\skr.txt' INTO TABLE skr;
mysql>SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
-
Problems with pipes
Pipes do not work reliably from the Windows command-line prompt. If the pipe includes the character
^Z
/CHAR(24)
, Windows thinks that it has encountered end-of-file and aborts the program.This is mainly a problem when you try to apply a binary log as follows:
shell>
mysqlbinlog
binary_log_file
| mysql --user=rootIf you have a problem applying the log and suspect that it is because of a
^Z
/CHAR(24)
character, you can use the following workaround:shell>
mysqlbinlog
binary_log_file
--result-file=/tmp/bin.sql
shell>mysql --user=root --execute "source /tmp/bin.sql"
The latter command also can be used to reliably read in any SQL file that may contain binary data.
-
Access denied for user
errorIf MySQL cannot resolve your host name properly, you may get the following error when you attempt to run a MySQL client program to connect to a server running on the same machine:
Access denied for user '
some_user
'@'unknown'
to database 'mysql'To fix this problem, you should create a file named
\windows\hosts
containing the following information:127.0.0.1 localhost