Several versions of MySQL are available in both binary and
source distributions. We also provide public access to our current
source tree for those who want to see our most recent developments and
help us test new code. To determine which version and type of
distribution you should use, see section 2.2.3 Which MySQL Version to Use. When in doubt,
use the binary distribution.
The recommended way to install MySQL on Linux is by using an RPM
file. The MySQL RPMs are currently being built on a RedHat Version
6.2 system but should work on other versions of Linux that support rpm
and use glibc.
The RPM places data in `/var/lib/mysql'. The RPM also creates the
appropriate entries in `/etc/rc.d/' to start the server automatically
at boot time. (This means that if you have performed a previous
installation, you may want to make a copy of your previously installed
MySQL startup file if you made any changes to it, so you don't lose
To install either distribution, unzip it in some empty directory and run the
By default, MySQL-Windows is configured to be installed in
`C:\mysql'. If you want to install MySQL elsewhere,
install it in `C:\mysql' first, then move the installation to
where you want it. If you do move MySQL, you must indicate
where everything is located by supplying a --basedir option when
you start the server. For example, if you have moved the MySQL
distribution to `D:\programs\mysql', you must start mysqld
Use mysqld --help to display all the options that mysqld
With all newer MySQL versions, you can also create a
`C:\my.cnf' file that holds any default options for the
MySQL server. Copy the file `\mysql\my-xxxxx.cnf' to
`C:\my.cnf' and edit it to suit your setup. Note that you should
specify all paths with `/' instead of `\'. If you use
`\', you need to specify it twice, because `\' is the escape
character in MySQL. See section 4.1.2 my.cnf Option Files.
Starting with MySQL 3.23.38, the Windows distribution includes
both the normal and the MySQL-Max binaries. The main benefit
of using the normal mysqld.exe binary is that it's a little
faster and uses less resources.
Here is a list of the different MySQL servers you can use:
Compiled with full debugging and automatic memory allocation checking,
symbolic links, BDB and InnoDB tables.
Optimized binary with no support for transactional tables.
Optimized binary for NT with support for named pipes. You can run this
version on Win98, but in this case no named pipes are created and you must
have TCP/IP installed.
Optimized binary with support for symbolic links, BDB and InnoDB tables.
Like mysqld-max, but compiled with support for named pipes.
Starting from 3.23.50, named pipes are only enabled if mysqld is started with
All of the above binaries are optimized for the Pentium Pro processor but
should work on any Intel processor >= i386.
NOTE: If you want to use InnoDB tables, there are certain startup
options that must be specified in your `my.ini' file! See section 7.6.2 InnoDB startup options.
If you are interested in becoming a MySQL mirror site, you may
anonymously rsync with: rsync://download.sourceforge.net/mysql/. Please
send e-mail to firstname.lastname@example.org notifying us of your mirror to be
added to the list below.
If you have problems downloading from our main site, try using one of the
mirrors listed below.
We use GNU Autoconf, so it is possible to port MySQL to all modern
systems with working Posix threads and a C++ compiler. (To compile only the
client code, a C++ compiler is required but not threads.) We use and develop
the software ourselves primarily on Sun Solaris (Versions 2.5 - 2.7) and
SuSE Linux Version 7.x.
Note that for many operating systems, the native thread support works only
in the latest versions. MySQL has been reported to compile
successfully on the following operating system/thread package combinations:
Note that not all platforms are suited equally well for running
MySQL. How well a certain platform is suited for a high-load
mission critical MySQL server is determined by the following
General stability of the thread library. A platform may have excellent
reputation otherwise, but if the thread library is unstable in the code
that is called by MySQL, even if everything else is perfect, MySQL will
be only as stable as the thread library.
The ability of the kernel and/or thread library to take advantage of
SMP on multi-processor systems. In other words, when a process
creates a thread, it should be possible for that thread to run on a different
CPU than the original process.
The ability of the kernel and/or the thread library to run many threads which
acquire/release a mutex over a short critical region frequently without
excessive context switches. In other words, if the implementation of
pthread_mutex_lock() is too anxious to yield CPU, this will hurt
MySQL tremendously. If this issue is not taken care of, adding extra CPUs
will actually make MySQL slower.
General file system stability/performance.
Ability of the file system to deal with large files at all and deal with them
efficiently, if your tables are big.
Our level of expertise here at MySQL AB with the platform. If we know
a platform well, we introduce platform-specific optimizations/fixes enabled at
compile time. We can also provide advice on configuring your system optimally
The amount of testing of similar configurations we have done internally.
The number of users that have successfully run MySQL on that
platform in similar configurations. If this number is high, the chances of
hitting some platform-specific surprise are much smaller.
Based on the above criteria, the best platforms for running
MySQL at this point are x86 with SuSE Linux 7.1, 2.4 kernel and
ReiserFS (or any similar Linux distribution) and Sparc with Solaris 2.7
or 2.8. FreeBSD comes third, but we really hope it will join the top
club once the thread library is improved. We also hope that at some
point we will be able to include all other platforms on which
MySQL compiles, runs ok, but not quite with the same level of
stability and performance, into the top category. This will require some
effort on our part in cooperation with the developers of the OS/library
components MySQL depends upon. If you are interested in making
one of those components better, are in a position to influence their
development, and need more detailed instructions on what MySQL
needs to run better, send an e-mail to
Please note that the comparison above is not to say that one OS is better or
worse than the other in general. We are talking about choosing a particular OS
for a dedicated purpose - running MySQL, and compare platforms in that
regard only. With this in mind, the result of this comparison
would be different if we included more issues into it. And in some cases,
the reason one OS is better than the other could simply be that we have put
forth more effort into testing on and optimizing for that particular platform.
We are just stating our observations to help you make a
decision on which platform to use MySQL on in your setup.
The first decision to make is whether you want to use the latest development
release or the last stable release:
Normally, if you are beginning to use MySQL for the first time
or trying to port it to some system for which there is no binary
distribution, we recommend going with the stable release (currently
Version 3.23.51. Note that all MySQL releases are
checked with the MySQL benchmarks and an extensive test suite
before each release.
Otherwise, if you are running an old system and want to upgrade, but
don't want to take chances with a non-seamless upgrade, you should
upgrade to the latest in the same branch you are using (where only the
last version number is newer than yours). We have tried to fix only
fatal bugs and make small, relatively safe changes to that version.
The second decision to make is whether you want to use a source
distribution or a binary distribution. In most cases you should probably
use a binary distribution, if one exists for your platform, as this
generally will be easier to install than a source distribution.
In the following cases you probably will be better off with a source
If you want to install MySQL at some explicit location. (The standard
binary distributions are ``ready to run'' at any place, but you may want
to get even more flexibility).
To be able to satisfy different user requirements, we are providing two
different binary versions; One compiled with the non-transactional table
handlers, (a small, fast binary), and one configured with the most
important extended options like transaction-safe tables. Both versions
are compiled from the same source distribution. All native MySQL
clients can connect to both MySQL versions.
The extended MySQL binary distribution is marked with the
-max suffix and is configured with the same options as
mysqld-max. See section 4.7.5 mysqld-max, An extended mysqld server.
If you want to use the MySQL-Max RPM, you must first
install the standard MySQL RPM.
If you want to configure mysqld with some extra features that are
NOT in the standard binary distributions. Here is a list of the most
common extra options that you may want to use:
--with-named-z-lib (This is done for some of the binaries)
The default binary distribution is normally compiled with support
for all characters sets and should work on a variety of processors from
the same processor family.
If you want a faster MySQL server you may want to recompile it
with support for only the character sets you need, use a better compiler
(like pgcc) or use compiler options that are better optimized for your
If you have found a bug and reported it to the MySQL
development team you will probably receive a patch that you need to apply to
the source distribution to get the bug fixed.
If you want to read (and/or modify) the C and C++ code that makes up
MySQL, you should get a source distribution. The source code is
always the ultimate manual. Source distributions also contain more
tests and examples than binary distributions.
The MySQL naming scheme uses release numbers that consist of three
numbers and a suffix. For example, a release name like
mysql-3.21.17-beta is interpreted like this:
The first number (3) describes the file format. All Version 3
releases have the same file format.
The second number (21) is the release level. Normally there are two to
choose from. One is the release/stable branch (currently 23) and the
other is the development branch (currently 4.0). Normally both are
stable, but the development version may have quirks, missing documentation on
new features, or may fail to compile on some systems.
The third number (17) is the version number within the
release level. This is incremented for each new distribution. Usually you
want the latest version for the release level you have chosen.
The suffix (beta) indicates the stability level of the release.
The possible suffixes are:
alpha indicates that the release contains some large section of
new code that hasn't been 100% tested. Known bugs (usually there are none)
should be documented in the News section. See section F MySQL change history. There are also new
commands and extensions in most alpha releases. Active development that
may involve major code changes can occur on an alpha release, but everything
will be tested before doing a release. There should be no known bugs in any
beta means that all new code has been tested. No major new
features that could cause corruption on old code are added. There should
be no known bugs. A version changes from alpha to beta when there
haven't been any reported fatal bugs within an alpha version for at least
a month and we don't plan to add any features that could make any old command
gamma is a beta that has been around a while and seems to work fine.
Only minor fixes are added. This is what many other companies call a release.
If there is no suffix, it means that the version has been run for a
while at many different sites with no reports of bugs other than
platform-specific bugs. Only critical bug fixes are applied to the
release. This is what we call a stable release.
All versions of MySQL are run through our standard tests and
benchmarks to ensure that they are relatively safe to use. Because the
standard tests are extended over time to check for all previously found bugs,
the test suite keeps getting better.
Note that all releases have been tested at least with:
An internal test suite
This is part of a production system for a customer. It has many tables with
hundreds of megabytes of data.
The MySQL benchmark suite
This runs a range of common queries. It is also a test to see whether the
latest batch of optimizations actually made the code faster.
See section 5.1.4 The MySQL Benchmark Suite.
MySQL is evolving quite rapidly here at MySQL AB and we
want to share this with other MySQL users. We try to make a release
when we have very useful features that others seem to have a need for.
We also try to help out users who request features that are easy to
implement. We take note of what our licensed users want to have, and
we especially take note of what our extended e-mail supported customers
want and try to help them out.
No one has to download a new release. The News section will tell you if
the new release has something you really want. See section F MySQL change history.
We use the following policy when updating MySQL:
For each minor update, the last number in the version string is incremented.
When there are major new features or minor incompatibilities with previous
versions, the second number in the version string is incremented. When the
file format changes, the first number is increased.
Stable tested releases are meant to appear about 1-2 times a year, but
if small bugs are found, a release with only bug fixes will be released.
Working releases are meant to appear about every 1-8 weeks.
Binary distributions for some platforms will be made by us for major releases.
Other people may make binary distributions for other systems but probably
We usually make patches available as soon as we have located and fixed
For non-critical but annoying bugs, we will make patches available if they
are sent to us. Otherwise we will combine many of them into a larger
If there is, by any chance, a fatal bug in a release we will make a new
release as soon as possible. We would like other companies to do this,
The current stable release is Version 3.23; We have already moved active
development to Version 4.0. Bugs will still be fixed in the stable version.
We don't believe in a complete freeze, as this also leaves out bug fixes
and things that ``must be done.'' ``Somewhat frozen'' means that we may
add small things that ``almost surely will not affect anything that's
Before you proceed with the source installation, check first to see if our
binary is available for your platform and if it will work for you. We
put in a lot of effort into making sure that our binaries are built with the
best possible options.
You need the following tools to build and install MySQL from source:
GNU gunzip to uncompress the distribution.
A reasonable tar to unpack the distribution. GNU tar is
known to work. Sun tar is known to have problems.
A working ANSI C++ compiler. gcc >= 2.95.2, egcs >= 1.0.2
or egcs 2.91.66, SGI C++, and SunPro C++ are some of the
compilers that are known to work. libg++ is not needed when
using gcc. gcc 2.7.x has a bug that makes it impossible
to compile some perfectly legal C++ files, such as
`sql/sql_base.cc'. If you only have gcc 2.7.x, you must
upgrade your gcc to be able to compile MySQL. gcc
2.8.1 is also known to have problems on some platforms so it should be
avoided if there exists a new compiler for the platform..
gcc >= 2.95.2 is recommended when compiling MySQL
A good make program. GNU make is always recommended and is
sometimes required. If you have problems, we recommend trying GNU
make 3.75 or newer.
If you are using a recent version of gcc, recent enough to understand
-fno-exceptions option, it is VERY IMPORTANT that you use
it. Otherwise, you may compile a binary that crashes randomly. We also
recommend that you use -felide-contructors and -fno-rtti along
with -fno-exceptions. When in doubt, do the following:
On most systems this will give you a fast and stable binary.
If you run into problems, PLEASE ALWAYS USE mysqlbug when
posting questions to email@example.com. Even if the problem
isn't a bug, mysqlbug gathers system information that will help others
solve your problem. By not using mysqlbug, you lessen the likelihood
of getting a solution to your problem! You will find mysqlbug in the
`scripts' directory after you unpack the distribution.
See section 184.108.40.206 How to Report Bugs or Problems.
If you are interested in using Berkeley DB tables with MySQL, you
will need to obtain a patched version of the Berkeley DB source
code. Please read the chapter on Berkeley DB tables before
proceeding. See section 7.5 BDB or Berkeley_DB Tables.
MySQL source distributions are provided as compressed tar
archives and have names like `mysql-VERSION.tar.gz', where
VERSION is a number like 3.23.51.
Add a user and group for mysqld to run as:
shell> groupadd mysql
shell> useradd -g mysql mysql
These commands add the mysql group, and the mysql user. The
syntax for useradd and groupadd may differ slightly on different
versions of Unix. They may also be called adduser and addgroup.
You may wish to call the user and group something else instead of mysql.
Unpack the distribution into the current directory:
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -
This command creates a directory named `mysql-VERSION'.
Change into the top-level directory of the unpacked distribution:
shell> cd mysql-VERSION
Note that currently you must configure and build MySQL from
this top-level directory. You can not build it in a different
Configure the release and compile everything:
shell> ./configure --prefix=/usr/local/mysql
When you run configure, you might want to specify some options.
Run ./configure --help for a list of options.
section 2.3.3 Typical configure Options, discusses some of the
more useful options.
If configure fails, and you are going to send mail to
firstname.lastname@example.org to ask for assistance, please include any
lines from `config.log' that you think can help solve the problem. Also
include the last couple of lines of output from configure if
configure aborts. Post the bug report using the mysqlbug
script. See section 220.127.116.11 How to Report Bugs or Problems.
If the compile fails, see section 2.3.5 Problems Compiling?, for help with
a number of common problems.
shell> make install
You might need to run this command as root.
Create the MySQL grant tables (necessary only if you haven't
installed MySQL before):
Note that MySQL versions older than Version 3.22.10 started the
MySQL server when you run mysql_install_db. This is no
Change ownership of binaries to root and ownership of the data
directory to the user that you will run mysqld as:
shell> chown -R root /usr/local/mysql
shell> chown -R mysql /usr/local/mysql/var
shell> chgrp -R mysql /usr/local/mysql
The first command changes the owner attribute of the files to the
root user, the second one changes the owner attribute of the
data directory to the mysql user, and the third one changes the
group attribute to the mysql group.
If you would like MySQL to start automatically when you boot your
machine, you can copy support-files/mysql.server to the location where
your system has its startup files. More information can be found in the
support-files/mysql.server script itself and in
section 2.4.3 Starting and Stopping MySQL Automatically.
After everything has been installed, you should initialize and test your
If that command fails immediately with mysqld daemon ended then you can
find some information in the file `mysql-data-directory/'hostname'.err'.
The likely reason is that you already have another mysqld server
running. See section 4.1.4 Running Multiple MySQL Servers on the Same Machine.
Patches from the FTP site are distributed as plain text files or as files
compressed with gzip. Apply a plain patch as shown above for
mailing list patches. To apply a compressed patch, change into the
top-level directory of your MySQL source tree and run these
After applying a patch, follow the instructions for a normal source install,
beginning with the ./configure step. After running the make
install step, restart your MySQL server.
You may need to bring down any currently running server before you run
make install. (Use mysqladmin shutdown to do this.) Some
systems do not allow you to install a new version of a program if it replaces
the version that is currently executing.
The configure script gives you a great deal of control over how
you configure your MySQL distribution. Typically you do this
using options on the configure command line. You can also affect
configure using certain environment variables. See section H Environment Variables. For a list of options supported by configure, run
shell> ./configure --help
Some of the more commonly-used configure options are described below:
To compile just the MySQL client libraries and client programs and
not the server, use the --without-server option:
shell> ./configure --without-server
If you don't have a C++ compiler, mysql will not compile (it is the
one client program that requires C++). In this case,
you can remove the code in configure that tests for the C++ compiler
and then run ./configure with the --without-server option. The
compile step will still try to build mysql, but you can ignore any
warnings about `mysql.cc'. (If make stops, try make -k
to tell it to continue with the rest of the build even if errors occur.)
If you don't want your log files and database directories located under
`/usr/local/var', use a configure command, something like one
The first command changes the installation prefix so that everything is
installed under `/usr/local/mysql' rather than the default of
`/usr/local'. The second command preserves the default installation
prefix, but overrides the default location for database directories
(normally `/usr/local/var') and changes it to
If you are using Unix and you want the MySQL socket located somewhere
other than the default location (normally in the directory `/tmp' or
`/var/run') use a configure command like this:
If you want to compile statically linked programs (for example, to make a
binary distribution, to get more speed, or to work around problems with some
RedHat Linux distributions), run configure like this:
The binaries we provide on the MySQL Web site at
http://www.mysql.com are all compiled with full optimization and
should be perfect for most users. See section 2.2.6 MySQL Binaries Compiled by MySQL AB. There are some
things you can tweak to make an even faster binary, but this is only for
advanced users. See section 5.5.3 How Compiling and Linking Affects the Speed of MySQL.
If the build fails and produces errors about your compiler or linker not
being able to create the shared library `libmysqlclient.so.#' (`#'
is a version number), you can work around this problem by giving the
--disable-shared option to configure. In this case,
configure will not build a shared libmysqlclient.so.# library.
You can configure MySQL not to use DEFAULT column values for
non-NULL columns (that is, columns that are not allowed to be
NULL). This causes INSERT statements to generate an error
unless you explicitly specify values for all columns that require a
non-NULL value. To suppress use of default values, run
configure like this:
By default, MySQL uses the ISO-8859-1 (Latin1) character set. To
change the default set, use the --with-charset option:
shell> ./configure --with-charset=CHARSET
CHARSET may be one of big5, cp1251, cp1257,
czech, danish, dec8, dos, euc_kr,
gb2312, gbk, german1, hebrew, hp8,
hungarian, koi8_ru, koi8_ukr, latin1,
latin2, sjis, swe7, tis620, ujis,
usa7, or win1251ukr.
See section 4.6.1 The Character Set Used for Data and Sorting.
If you want to convert characters between the server and the client,
you should take a look at the SET OPTION CHARACTER SET command.
See section 5.5.6 SET Syntax.
Warning: If you change character sets after having created any
tables, you will have to run myisamchk -r -q on every table. Your
indexes may be sorted incorrectly otherwise. (This can happen if you
install MySQL, create some tables, then reconfigure
MySQL to use a different character set and reinstall it.)
With the option --with-extra-charset=LIST you can define
which additional character sets should be incompiled in the server.
Here LIST is either a list of character set separated with space,
complex to include all characters that can't be dynamically loaded
or all to include all character sets into the binaries.
To configure MySQL with debugging code, use the --with-debug
shell> ./configure --with-debug
This causes a safe memory allocator to be included that can find some errors
and that provides output about what is happening.
See section G.1 Debugging a MySQL server.
If your client programs are using threads, you need to also compile a
thread-safe version of the MySQL client library with the
--enable-thread-safe-client configure options. This will create a
libmysqlclient_r library with which you should link your threaded
applications. See section 8.4.7 How to Make a Threaded Client.
CAUTION: You should read this section only if you are interested
in helping us test our new code. If you just want to get MySQL up
and running on your system, you should use a standard release distribution
(either a source or binary distribution will do).
To obtain our most recent development source tree, use these instructions:
After BitKeeper is installed, use this command if you want to clone
the MySQL 3.23 branch:
shell> bk clone bk://work.mysql.com:7000 mysql
To clone the 4.0 branch, use this command instead:
shell> bk clone bk://work.mysql.com:7001 mysql-4.0
The initial download of the source tree may take a while, depending on the
speed of your connection; be patient.
You will need GNU autoconf, automake, libtool, and
m4 to run the next set of commands.
If you get some strange error during this stage, check that you really
have libtool installed!
shell> cd mysql
shell> bk -r edit
shell> aclocal; autoheader; autoconf; automake;
shell> ./configure # Add your favorite options here
A collection of our standard configure scripts is located in the
`BUILD/' subdirectory. If you are lazy, you can use
`BUILD/compile-pentium-debug'. To compile on a different architecture,
modify the script removing flags that are Pentium-specific.
When the build is done, run make install. Be careful with this
on a production machine; the command may overwrite your live release
installation. If you have another installation of MySQL, we
recommand that you run ./configure with different values for the
prefix, tcp-port, and unix-socket-path options than
those used for your production server.
Play hard with your new installation and try to make the new features
crash. Start by running make test. See section 9.3.2 MySQL Test Suite.
If you have gotten to the make stage and the distribution does
not compile, please report it to email@example.com. If you
have installed the latest versions of the required GNU tools, and they
crash trying to process our configuration files, please report that also.
However, if you execute aclocal and get a command not found
error or a similar problem, do not report it. Instead, make sure all
the necessary tools are installed and that your PATH variable is
set correctly so your shell can find them.
After the initial bk clone operation to get the source tree, you
should run bk pull periodically to get the updates.
You can examine the change history for the tree with all the diffs by using
bk sccstool. If you see some funny diffs or code that you have a
question about, do not hesitate to send e-mail to
firstname.lastname@example.org. Also, if you think you have a better idea
on how to do something, send an email to the same address with a patch.
bk diffs will produce a patch for you after you have made changes
to the source. If you do not have the time to code your idea, just send
BitKeeper has a nice help utility that you can access via
All MySQL programs compile cleanly for us with no warnings on
Solaris using gcc. On other systems, warnings may occur due to
differences in system include files. See section 2.3.6 MIT-pthreads Notes for warnings
that may occur when using MIT-pthreads. For other problems, check the list
The solution to many problems involves reconfiguring. If you do need to
reconfigure, take note of the following:
If configure is run after it already has been run, it may use
information that was gathered during its previous invocation. This
information is stored in `config.cache'. When configure starts
up, it looks for that file and reads its contents if it exists, on the
assumption that the information is still correct. That assumption is invalid
when you reconfigure.
Each time you run configure, you must run make again
to recompile. However, you may want to remove old object files from previous
builds first, because they were compiled using different configuration options.
To prevent old configuration information or object files from being used,
run these commands before rerunning configure:
shell> rm config.cache
shell> make clean
Alternatively, you can run make distclean.
The list below describes some of the problems compiling MySQL
that have been found to occur most often:
If you get errors when compiling `sql_yacc.cc', such as the ones shown
below, you have probably run out of memory or swap space:
Internal compiler error: program cc1plus got fatal signal 11
Out of virtual memory
Virtual memory exhausted
The problem is that gcc requires huge amounts of memory to compile
`sql_yacc.cc' with inline functions. Try running configure with
the --with-low-memory option:
shell> ./configure --with-low-memory
This option causes -fno-inline to be added to the compile line if you
are using gcc and -O0 if you are using something else. You
should try the --with-low-memory option even if you have so much
memory and swap space that you think you can't possibly have run out. This
problem has been observed to occur even on systems with generous hardware
configurations, and the --with-low-memory option usually fixes it.
By default, configure picks c++ as the compiler name and
GNU c++ links with -lg++. If you are using gcc,
that behavior can cause problems during configuration such as this:
configure: error: installation or configuration problem:
C++ compiler cannot create executables.
You might also observe problems during compilation related to
g++, libg++, or libstdc++.
One cause of these problems is that you may not have g++, or you may
have g++ but not libg++, or libstdc++. Take a look at
the `config.log' file. It should contain the exact reason why your c++
compiler didn't work! To work around these problems, you can use gcc
as your C++ compiler. Try setting the environment variable CXX to
"gcc -O3". For example:
shell> CXX="gcc -O3" ./configure
This works because gcc compiles C++ sources as well as g++
does, but does not link in libg++ or libstdc++ by default.
Another way to fix these problems, of course, is to install g++,
libg++ and libstdc++.
If your compile fails with errors, such as any of the following,
you must upgrade your version of make to GNU make:
making all in mit-pthreads
make: Fatal error in reader: Makefile, line 18:
Badly formed macro assignment
make: file `Makefile' line 18: Must be a separator (:
pthread.h: No such file or directory
Solaris and FreeBSD are known to have troublesome make programs.
GNU make Version 3.75 is known to work.
If you want to define flags to be used by your C or C++ compilers, do so by
adding the flags to the CFLAGS and CXXFLAGS environment
variables. You can also specify the compiler names this way using CC
and CXX. For example:
If you get an error message like this,
you need to upgrade your gcc compiler:
client/libmysql.c:273: parse error before `__attribute__'
gcc 2.8.1 is known to work, but we recommend using gcc 2.95.2 or
egcs 1.0.3a instead.
If you get errors such as those shown below when compiling mysqld,
configure didn't correctly detect the type of the last argument to
accept(), getsockname(), or getpeername():
cxx: Error: mysqld.cc, line 645: In this statement, the referenced
type of the pointer value "&length" is "unsigned long", which
is not compatible with "int".
new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
To fix this, edit the `config.h' file (which is generated by
configure). Look for these lines:
/* Define as the base type of the last arg to accept */
#define SOCKET_SIZE_TYPE XXX
Change XXX to size_t or int, depending on your
operating system. (Note that you will have to do this each time you run
configure, because configure regenerates `config.h'.)
The `sql_yacc.cc' file is generated from `sql_yacc.yy'. Normally
the build process doesn't need to create `sql_yacc.cc', because
MySQL comes with an already-generated copy. However, if you do need
to re-create it, you might encounter this error:
"sql_yacc.yy", line xxx fatal: default action causes potential...
This is a sign that your version of yacc is deficient.
You probably need to install bison (the GNU version of yacc)
and use that instead.
If you need to debug mysqld or a MySQL client, run
configure with the --with-debug option, then recompile and
link your clients with the new client library. See section G.2 Debugging a MySQL client.
If your system does not provide native thread support, you will need to
build MySQL using the MIT-pthreads package. This includes
older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others.
See section 2.2.2 Operating Systems Supported by MySQL.
On most systems, you can force MIT-pthreads to be used by running
configure with the --with-mit-threads option:
shell> ./configure --with-mit-threads
Building in a non-source directory is not supported when using
MIT-pthreads, because we want to minimize our changes to this code.
The checks that determine whether or not to use MIT-pthreads occur only
during the part of the configuration process that deals with the server
code. If you have configured the distribution using --without-server
to build only the client code, clients will not know whether or not
MIT-pthreads is being used and will use Unix socket connections by default.
Because Unix sockets do not work under MIT-pthreads, this means you will need
to use -h or --host when you run client programs.
When MySQL is compiled using MIT-pthreads, system locking is
disabled by default for performance reasons. You can tell the server to use
system locking with the --use-locking option.
Sometimes the pthread bind() command fails to bind to a socket without
any error message (at least on Solaris). The result is that all connections
to the server fail. For example:
shell> mysqladmin version
mysqladmin: connect to server at '' failed;
error: 'Can't connect to mysql server on localhost (146)'
The solution to this is to kill the mysqld server and restart it.
This has only happened to us when we have forced the server down and done
a restart immediately.
With MIT-pthreads, the sleep() system call isn't interruptible with
SIGINT (break). This is only noticeable when you run
mysqladmin --sleep. You must wait for the sleep() call to
terminate before the interrupt is served and the process stops.
When linking, you may receive warning messages like these (at least on
Solaris); they can be ignored:
ld: warning: symbol `_iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
ld: warning: symbol `__iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
Some other warnings also can be ignored:
implicit declaration of function `int strtoll(...)'
implicit declaration of function `int strtoul(...)'
We haven't gotten readline to work with MIT-pthreads. (This isn't
needed, but may be interesting for someone.)
Once you've installed MySQL (from either a binary or source
distribution), you need to initialize the grant tables, start the server,
and make sure that the server works okay. You may also wish to arrange
for the server to be started and stopped automatically when your system
starts up and shuts down.
Normally you install the grant tables and start the server like this
for installation from a source distribution:
shell> cd mysql_installation_directory
shell> ./bin/safe_mysqld --user=mysql &
For a binary distribution (not RPM or pkg packages), do this:
shell> cd mysql_installation_directory
shell> ./bin/safe_mysqld --user=mysql &
This creates the mysql database which will hold all database
privileges, the test database which you can use to test
MySQL and also privilege entries for the user that run
mysql_install_db and a root user (without any passwords).
This also starts the mysqld server.
mysql_install_db will not overwrite any old privilege tables, so
it should be safe to run in any circumstances. If you don't want to
have the test database you can remove it with mysqladmin -u
root drop test.
Testing is most easily done from the top-level directory of the MySQL
distribution. For a binary distribution, this is your installation directory
(typically something like `/usr/local/mysql'). For a source
distribution, this is the main directory of your MySQL source tree.
In the commands shown below in this section and in the following
subsections, BINDIR is the path to the location in which programs
like mysqladmin and safe_mysqld are installed. For a
binary distribution, this is the `bin' directory within the
distribution. For a source distribution, BINDIR is probably
`/usr/local/bin', unless you specified an installation directory
other than `/usr/local' when you ran configure.
EXECDIR is the location in which the mysqld server is
installed. For a binary distribution, this is the same as
BINDIR. For a source distribution, EXECDIR is probably
Testing is described in detail below:
If necessary, start the mysqld server and set up the initial
MySQL grant tables containing the privileges that determine how
users are allowed to connect to the server. This is normally done with the
Typically, mysql_install_db needs to be run only the first time you
install MySQL. Therefore, if you are upgrading an existing
installation, you can skip this step. (However, mysql_install_db is
quite safe to use and will not update any tables that already exist, so if
you are unsure of what to do, you can always run mysql_install_db.)
mysql_install_db creates six tables (user, db,
host, tables_priv, columns_priv, and func) in the
mysql database. A description of the initial privileges is given in
section 4.3.4 Setting Up the Initial MySQL Privileges. Briefly, these privileges allow the MySQL
root user to do anything, and allow anybody to create or use databases
with a name of 'test' or starting with 'test_'.
If you don't set up the grant tables, the following error will appear in the
log file when you start the server:
mysqld: Can't find file: 'host.frm'
The above may also happen with a binary MySQL distribution if you
don't start MySQL by executing exactly ./bin/safe_mysqld!
See section 4.7.2 safe_mysqld, the wrapper around mysqld.
You might need to run mysql_install_db as root. However,
if you prefer, you can run the MySQL server as an unprivileged
(non-root) user, provided that user can read and write files in
the database directory. Instructions for running MySQL as an
unprivileged user are given in section A.3.2 How to Run MySQL As a Normal User.
If you have problems with mysql_install_db, see
section 2.4.1 Problems Running mysql_install_db.
There are some alternatives to running the mysql_install_db
script as it is provided in the MySQL distribution:
You may want to edit mysql_install_db before running it, to change
the initial privileges that are installed into the grant tables. This is
useful if you want to install MySQL on a lot of machines with the
same privileges. In this case you probably should need only to add a few
extra INSERT statements to the mysql.user and mysql.db
If you want to change things in the grant tables after installing them, you
can run mysql_install_db, then use mysql -u root mysql to
connect to the grant tables as the MySQL root user and issue
SQL statements to modify the grant tables directly.
It is possible to re-create the grant tables completely after they have
already been created. You might want to do this if you've already installed
the tables but then want to re-create them after editing
Use mysqladmin to verify that the server is running. The following
commands provide a simple test to check that the server is up and responding
shell> BINDIR/mysqladmin version
shell> BINDIR/mysqladmin variables
The output from mysqladmin version varies slightly depending on your
platform and version of MySQL, but should be similar to that shown
shell> BINDIR/mysqladmin version
mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586
Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license
Server version 3.23.32-debug
Protocol version 10
Connection Localhost via Unix socket
TCP port 3306
UNIX socket /tmp/mysql.sock
Uptime: 16 sec
Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2 Open tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773K
To get a feeling for what else you can do with BINDIR/mysqladmin,
invoke it with the --help option.
Verify that you can shut down the server:
shell> BINDIR/mysqladmin -u root shutdown
Verify that you can restart the server. Do this using safe_mysqld or
by invoking mysqld directly. For example:
Run some simple tests to verify that the server is working.
The output should be similar to what is shown below:
| Databases |
| mysql |
shell> BINDIR/mysqlshow mysql
| Tables |
| columns_priv |
| db |
| func |
| host |
| tables_priv |
| user |
shell> BINDIR/mysql -e "select host,db,user from db" mysql
| host | db | user |
| % | test | |
| % | test_% | |
There is also a benchmark suite in the `sql-bench' directory (under the
MySQL installation directory) that you can use to compare how
MySQL performs on different platforms. The `sql-bench/Results'
directory contains the results from many runs against different databases and
platforms. To run all tests, execute these commands:
shell> cd sql-bench
If you don't have the `sql-bench' directory, you are probably using an
RPM for a binary distribution. (Source distribution RPMs include the
benchmark directory.) In this case, you must first install the benchmark
suite before you can use it. Beginning with MySQL Version 3.22,
there are benchmark RPM files named `mysql-bench-VERSION-i386.rpm' that
contain benchmark code and data.
If you have a source distribution, you can also run the tests in the
`tests' subdirectory. For example, to run `auto_increment.tst', do
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tst
The expected results are shown in the `./tests/auto_increment.res' file.
The purpose of the mysql_install_db script is to generate new
MySQL privilege tables. It will not affect any other data!
It will also not do anything if you already have MySQL privilege
If you want to re-create your privilege tables, you should take down
the mysqld server, if it's running, and then do something like:
This section lists problems you might encounter when you run
mysql_install_db doesn't install the grant tables
You may find that mysql_install_db fails to install the grant
tables and terminates after displaying the following messages:
starting mysqld daemon with databases from XXXXXX
mysql daemon ended
In this case, you should examine the log file very carefully! The log
should be located in the directory `XXXXXX' named by the error message,
and should indicate why mysqld didn't start. If you don't understand
what happened, include the log when you post a bug report using
See section 18.104.22.168 How to Report Bugs or Problems.
There is already a mysqld daemon running
In this case, you probably don't have to run mysql_install_db at
all. You have to run mysql_install_db only once, when you install
MySQL the first time.
Installing a second mysqld daemon doesn't work when one daemon is running
This can happen when you already have an existing MySQL
installation, but want to put a new installation in a different place (for
example, for testing, or perhaps you simply want to run two installations at
the same time). Generally the problem that occurs when you try to run the
second server is that it tries to use the same socket and port as the old one.
In this case you will get the error message: Can't start server: Bind on
TCP/IP port: Address already in use or Can't start server : Bind on
unix socket.... See section 4.1.3 Installing Many Servers on the Same Machine.
You don't have write access to `/tmp'
If you don't have write access to create a socket file at the default place
(in `/tmp') or permission to create temporary files in `/tmp,'
you will get an error when running mysql_install_db or when
starting or using mysqld.
You can specify a different socket and temporary directory as follows:
If you are running RedHat Version 5.0 with a version of glibc older than
2.0.7-5, you should make sure you have installed all glibc patches!
There is a lot of information about this in the MySQL mail
archives. Links to the mail archives are available online at
Also, see section 2.6.1 Linux Notes (All Linux Versions).
You can also start mysqld manually using the --skip-grant-tables
option and add the privilege information yourself using mysql:
shell> BINDIR/safe_mysqld --skip-grant-tables &
shell> BINDIR/mysql -u root mysql
From mysql, manually execute the SQL commands in
mysql_install_db. Make sure you run mysqladmin
flush-privileges or mysqladmin reload afterward to tell the server to
reload the grant tables.
If you are going to use tables that support transactions (BDB, InnoDB),
you should first create a my.cnf file and set startup options
for the table types you plan to use. See section 7 MySQL Table Types.
Generally, you start the mysqld server in one of three ways:
On NT you should install mysqld as a service as follows:
bin\mysqld-nt --install # Install MySQL as a service
You can now start/stop mysqld as follows:
NET START mysql
NET STOP mysql
Note that in this case you can't use any other options for mysqld!
You can remove the service as follows:
bin\mysqld-nt --remove # remove MySQL as a service
By invoking mysqld directly.
When the mysqld daemon starts up, it changes directory to the
data directory. This is where it expects to write log files and the pid
(process ID) file, and where it expects to find databases.
The data directory location is hardwired in when the distribution is
compiled. However, if mysqld expects to find the data directory
somewhere other than where it really is on your system, it will not work
properly. If you have problems with incorrect paths, you can find out
what options mysqld allows and what the default path settings are by
invoking mysqld with the --help option. You can override the
defaults by specifying the correct pathnames as command-line arguments to
mysqld. (These options can be used with safe_mysqld as well.)
Normally you should need to tell mysqld only the base directory under
which MySQL is installed. You can do this with the --basedir
option. You can also use --help to check the effect of changing path
options (note that --helpmust be the final option of the
mysqld command). For example:
shell> EXECDIR/mysqld --basedir=/usr/local --help
Once you determine the path settings you want, start the server without
the --help option.
Whichever method you use to start the server, if it fails to start up
correctly, check the log file to see if you can find out why. Log files
are located in the data directory (typically
`/usr/local/mysql/data' for a binary distribution,
`/usr/local/var' for a source distribution,
`\mysql\data\mysql.err' on Windows.) Look in the data directory for
files with names of the form `host_name.err' and
`host_name.log' where host_name is the name of your server
host. Then check the last few lines of these files:
If you find something like the following in the log file:
000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed
000729 14:50:10 bdb: warning: ./test/t1.db: No such file or directory
000729 14:50:10 Can't init databases
This means that you didn't start mysqld with --bdb-no-recover
and Berkeley DB found something wrong with its log files when it
tried to recover your databases. To be able to continue, you should
move away the old Berkeley DB log file from the database directory to
some other place, where you can later examine these. The log files are
named `log.0000000001', where the number will increase over time.
If you are running mysqld with BDB table support and mysqld core
dumps at start this could be because of some problems with the BDB
recover log. In this case you can try starting mysqld with
--bdb-no-recover. If this helps, then you should remove all
`log.*' files from the data directory and try starting mysqld
If you get the following error, it means that some other program (or another
mysqld server) is already using the TCP/IP port or socket
mysqld is trying to use:
Can't start server: Bind on TCP/IP port: Address already in use
Can't start server : Bind on unix socket...
Use ps to make sure that you don't have another mysqld server
running. If you can't find another server running, you can try to execute
the command telnet your-host-name tcp-ip-port-number and press
RETURN a couple of times. If you don't get an error message like
telnet: Unable to connect to remote host: Connection refused,
something is using the TCP/IP port mysqld is trying to use.
See section 2.4.1 Problems Running mysql_install_db and section 4.1.4 Running Multiple MySQL Servers on the Same Machine.
If mysqld is currently running, you can find out what path settings
it is using by executing this command:
shell> mysqladmin variables
shell> mysqladmin -h 'your-host-name' variables
If safe_mysqld starts the server but you can't connect to it,
you should make sure you have an entry in `/etc/hosts' that looks like
This problem occurs only on systems that don't have a working thread
library and for which MySQL must be configured to use MIT-pthreads.
mysql.server can be found in the `share/mysql' directory
under the MySQL installation directory or in the `support-files'
directory of the MySQL source tree.
Before mysql.server starts the server, it changes directory to
the MySQL installation directory, then invokes safe_mysqld.
You might need to edit mysql.server if you have a binary distribution
that you've installed in a non-standard location. Modify it to cd
into the proper directory before it runs safe_mysqld. If you want the
server to run as some specific user, add an appropriate user line
to the `/etc/my.cnf' file, as shown later in this section.
mysql.server stop brings down the server by sending a signal to it.
You can take down the server manually by executing mysqladmin shutdown.
You might want to add these start and stop commands to the appropriate places
in your `/etc/rc*' files when you start using MySQL for
production applications. Note that if you modify mysql.server, then
upgrade MySQL sometime, your modified version will be overwritten,
so you should make a copy of your edited version that you can reinstall.
If your system uses `/etc/rc.local' to start external scripts, you
should append the following to it:
You can always move the MySQL form and data files between
different versions on the same architecture as long as you have the same
base version of MySQL. The current base version is
3. If you change the character set when running MySQL (which may
also change the sort order), you must run myisamchk -r -q on all
tables. Otherwise your indexes may not be ordered correctly.
If you are afraid of new versions, you can always rename your old
mysqld to something like mysqld-'old-version-number'. If
your new mysqld then does something unexpected, you can simply shut it
down and restart with your old mysqld!
When you do an upgrade you should also back up your old databases, of course.
If after an upgrade, you experience problems with recompiled client programs,
like Commands out of sync or unexpected core dumps, you probably have
used an old header or library file when compiling your programs. In this
case you should check the date for your `mysql.h' file and
`libmysqlclient.a' library to verify that they are from the new
MySQL distribution. If not, please recompile your programs!
If you get some problems that the new mysqld server doesn't want to
start or that you can't connect without a password, check that you don't
have some old `my.cnf' file from your old installation! You can
check this with: program-name --print-defaults. If this outputs
anything other than the program name, you have an active my.cnf
file that will affect things!
It is a good idea to rebuild and reinstall the Msql-Mysql-modules
distribution whenever you install a new release of MySQL,
particularly if you notice symptoms such as all your DBI scripts
dumping core after you upgrade MySQL.
MySQL Version 3.23 supports tables of the new MyISAM type and
the old ISAM type. You don't have to convert your old tables to
use these with Version 3.23. By default, all new tables will be created with
type MyISAM (unless you start mysqld with the
--default-table-type=isam option). You can change an ISAM
table to a MyISAM table with ALTER TABLE table_name TYPE=MyISAM
or the Perl script mysql_convert_table_format.
Version 3.22 and 3.21 clients will work without any problems with a Version
The following lists tell what you have to watch out for when upgrading to
All tables that uses the tis620 character set must be fixed
with myisamchk -r or REPAIR TABLE.
If you do a DROP DATABASE on a symbolic linked database, both the
link and the original database is deleted. (This didn't happen in 3.22
because configure didn't detect the readlink system call).
OPTIMIZE TABLE now only works for MyISAM tables.
For other table types, you can use ALTER TABLE to optimize the table.
During OPTIMIZE TABLE the table is now locked from other threads.
The MySQL client mysql is now by default started with the
option --no-named-commands (-g). This option can be disabled with
--enable-named-commands (-G). This may cause incompatibility problems in
some cases, for example in SQL scripts that use named commands without a
semicolon! Long format commands still work from the first line.
If you are using the german character sort order, you must repair
all your tables with isamchk -r, as we have made some changes in
the sort order!
The default return type of IF will now depend on both arguments
and not only the first argument.
AUTO_INCREMENT will not work with negative numbers. The reason
for this is that negative numbers caused problems when wrapping from -1 to 0.
AUTO_INCREMENT is now for MyISAM tables handled at a lower level and
is much faster than before. For MyISAM tables old numbers are also not reused
anymore, even if you delete some rows from the table.
CASE, DELAYED, ELSE, END, FULLTEXT,
INNER, RIGHT, THEN and WHEN are now reserved words.
FLOAT(X) is now a true floating-point type and not a value with a
fixed number of decimals.
When declaring DECIMAL(length,dec) the length argument no longer
includes a place for the sign or the decimal point.
A TIME string must now be of one of the following formats:
[[[DAYS] [H]H:]MM:]SS[.fraction] or
LIKE now compares strings using the same character comparison rules
as '='. If you require the old behavior, you can compile
MySQL with the CXXFLAGS=-DLIKE_CMP_TOUPPER flag.
REGEXP is now case insensitive for normal (not binary) strings.
When you check/repair tables you should use CHECK TABLE
or myisamchk for MyISAM tables (.MYI) and
isamchk for ISAM (.ISM) tables.
If you want your mysqldump files to be compatible between
MySQL Version 3.22 and Version 3.23, you should not use the
--opt or --full option to mysqldump.
Check all your calls to DATE_FORMAT() to make sure there is a
`%' before each format character. (Later MySQL Version 3.22
did allow this syntax.)
mysql_fetch_fields_direct is now a function (it was a macro) and
it returns a pointer to a MYSQL_FIELD instead of a
mysql_num_fields() can no longer be used on a MYSQL* object (it's
now a function that takes MYSQL_RES* as an argument. You should now
use mysql_field_count() instead.
In MySQL Version 3.22, the output of SELECT DISTINCT ... was
almost always sorted. In Version 3.23, you must use GROUP BY or
ORDER BY to obtain sorted output.
SUM() now returns NULL, instead of 0, if there is no matching
rows. This is according to ANSI SQL.
An AND or OR with NULL values will now return
NULL instead of 0. This mostly affects queries that use NOT
on an AND/OR expression as NOT NULL = NULL.
LPAD() and RPAD() will shorten the result string if it's longer
than the length argument.
Nothing that affects compatibility has changed between Version 3.21 and 3.22.
The only pitfall is that new tables that are created with DATE type
columns will use the new way to store the date. You can't access these new
fields from an old version of mysqld.
After installing MySQL Version 3.22, you should start the new server
and then run the mysql_fix_privilege_tables script. This will add the
new privileges that you need to use the GRANT command. If you forget
this, you will get Access denied when you try to use ALTER
TABLE, CREATE INDEX, or DROP INDEX. If your MySQL root
user requires a password, you should give this as an argument to
The C API interface to mysql_real_connect() has changed. If you have
an old client program that calls this function, you must place a 0 for
the new db argument (or recode the client to send the db
element for faster connections). You must also call mysql_init()
before calling mysql_real_connect()! This change was done to allow
the new mysql_options() function to save options in the MYSQL
The mysqld variable key_buffer has changed names to
key_buffer_size, but you can still use the old name in your
If you are running a version older than Version 3.20.28 and want to
switch to Version 3.21, you need to do the following:
You can start the mysqld Version 3.21 server with safe_mysqld
--old-protocol to use it with clients from a Version 3.20 distribution.
In this case, the new client function mysql_errno() will not
return any server error, only CR_UNKNOWN_ERROR (but it
works for client errors), and the server uses the old password()
checking rather than the new one.
If you are NOT using the --old-protocol option to
mysqld, you will need to make the following changes:
All client code must be recompiled. If you are using ODBC, you must get
the new MyODBC 2.x driver.
The script scripts/add_long_password must be run to convert the
Password field in the mysql.user table to CHAR(16).
All passwords must be reassigned in the mysql.user table (to get 62-bit
rather than 31-bit passwords).
The table format hasn't changed, so you don't have to convert any tables.
MySQL Version 3.20.28 and above can handle the new user table
format without affecting clients. If you have a MySQL version earlier
than Version 3.20.28, passwords will no longer work with it if you convert the
user table. So to be safe, you should first upgrade to at least Version
3.20.28 and then upgrade to Version 3.21.
The new client code works with a 3.20.x mysqld server, so
if you experience problems with 3.21.x, you can use the old 3.20.x server
without having to recompile the clients again.
If you are not using the --old-protocol option to mysqld,
old clients will issue the error message:
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
The new Perl DBI/DBD interface also supports the old
mysqlperl interface. The only change you have to make if you use
mysqlperl is to change the arguments to the connect() function.
The new arguments are: host, database, user,
password (the user and password arguments have changed
See section 8.2.2 The DBI Interface.
The following changes may affect queries in old applications:
HAVING must now be specified before any ORDER BY clause.
The parameters to LOCATE() have been swapped.
There are some new reserved words. The most notable are DATE,
TIME, and TIMESTAMP.
If you are using MySQL Version 3.23, you can copy the .frm,
.MYI, and .MYD files between different architectures that
support the same floating-point format. (MySQL takes care of any
byte swapping issues.)
The MySQL ISAM data and index files (`.ISD' and
`*.ISM', respectively) are architecture-dependent and in some cases
OS-dependent. If you want to move your applications to another machine
that has a different architecture or OS than your current machine, you
should not try to move a database by simply copying the files to the
other machine. Use mysqldump instead.
By default, mysqldump will create a file full of SQL statements.
You can then transfer the file to the other machine and feed it as input
to the mysql client.
Try mysqldump --help to see what options are available.
If you are moving the data to a newer version of MySQL, you should use
mysqldump --opt with the newer version to get a fast, compact dump.
The easiest (although not the fastest) way to move a database between two
machines is to run the following commands on the machine on which the
database is located:
You can also store the result in a file, then transfer the file to the
target machine and load the file into the database there. For example,
you can dump a database to a file on the source machine like this:
You can also use mysqldump and mysqlimport to accomplish
the database transfer.
For big tables, this is much faster than simply using mysqldump.
In the commands shown below, DUMPDIR represents the full pathname
of the directory you use to store the output from mysqldump.
First, create the directory for the output files and dump the database:
Then transfer the files in the DUMPDIR directory to some corresponding
directory on the target machine and load the files into MySQL
shell> mysqladmin create db_name # create database
shell> cat DUMPDIR/*.sql | mysql db_name # create tables in database
shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables
Also, don't forget to copy the mysql database, because that's where the
grant tables (user, db, host) are stored. You may have
to run commands as the MySQL root user on the new machine
until you have the mysql database in place.
After you import the mysql database on the new machine, execute
mysqladmin flush-privileges so that the server reloads the grant table
The notes below regarding glibc apply only to the situation
when you build MySQL
yourself. If you are running Linux on an x86 machine, in most cases it is
much better for you to just use our binary. We link our binaries against
the best patched version of glibc we can come up with and with the
best compiler options, in an attempt to make it suitable for a high-load
server. So if you read the text below, and are in doubt about
what you should do, try our binary first to see if it meets your needs, and
worry about your own build only after you have discovered that our binary is
not good enough. In that case, we would appreciate a note about it, so we
can build a better binary next time. For a typical user, even for setups with
a lot of concurrent connections and/or tables exceeding 2GB limit, our
binary in most cases is the best choice.
MySQL uses LinuxThreads on Linux. If you are using an old
Linux version that doesn't have glibc2, you must install
LinuxThreads before trying to compile MySQL. You can get
LinuxThreads at http://www.mysql.com/Downloads/Linux.
NOTE: We have seen some strange problems with Linux 2.2.14 and
MySQL on SMP systems; If you have a SMP system, we recommend
you to upgrade to Linux 2.4 ASAP! Your system will be faster and more
stable by doing this!
Note that glibc versions before and including Version 2.1.1 have
a fatal bug in pthread_mutex_timedwait handling, which is used
when you do INSERT DELAYED. We recommend you to not use
INSERT DELAYED before upgrading glibc.
If you plan to have 1000+ concurrent connections, you will need to make
some changes to LinuxThreads, recompile it, and relink MySQL against
the new `libpthread.a'. Increase PTHREAD_THREADS_MAX in
`sysdeps/unix/sysv/linux/bits/local_lim.h' to 4096 and decrease
STACK_SIZE in `linuxthreads/internals.h' to 256 KB. The paths are
relative to the root of glibc Note that MySQL will not be
stable with around 600-1000 connections if STACK_SIZE is the default
of 2 MB.
If you have a problem with that MySQL can't open enough files,
or connections, it may be that you haven't configured Linux to handle
In Linux 2.2 and forwards, you can check the number of allocated
file handlers by doing:
You can also run the above from the command line as root, but in this case
your old limits will be used next time your computer reboots.
You should also add /etc/my.cnf:
The above should allow MySQL to create up to 8192 connections + files.
The STACK_SIZE constant in LinuxThreads controls the spacing of thread
stacks in the address space. It needs to be large enough so that there will
be plenty of room for the stack of each individual thread, but small enough
to keep the stack of some thread from running into the global mysqld
data. Unfortunately, the Linux implementation of mmap(), as we have
experimentally discovered, will successfully unmap an already mapped region
if you ask it to map out an address already in use, zeroing out the data
on the entire page, instead of returning an error. So, the safety of
mysqld or any other threaded application depends on the "gentleman"
behavior of the code that creates threads. The user must take measures to
make sure the number of running threads at any time is sufficiently low for
thread stacks to stay away from the global heap. With mysqld, you
should enforce this "gentleman" behavior by setting a reasonable value for
the max_connections variable.
If you build MySQL yourself and do not want to mess with patching
LinuxThreads, you should set max_connections to a value no higher
than 500. It should be even less if you have a large key buffer, large
heap tables, or some other things that make mysqld allocate a lot
of memory or if you are running a 2.2 kernel with a 2GB patch. If you are
using our binary or RPM version 3.23.25 or later, you can safely set
max_connections at 1500, assuming no large key buffer or heap tables
with lots of data. The more you reduce STACK_SIZE in LinuxThreads
the more threads you can safely create. We recommend the values between
128K and 256K.
If you use a lot of concurrent connections, you may suffer from a "feature"
in the 2.2 kernel that penalizes a process for forking or cloning a child
in an attempt to prevent a fork bomb attack. This will cause MySQL
not to scale well as you increase the number of concurrent clients. On
single CPU systems, we have seen this manifested in a very slow thread
creation, which means it may take a long time to connect to MySQL
(as long as 1 minute), and it may take just as long to shut it down. On
multiple CPU systems, we have observed a gradual drop in query speed as
the number of clients increases. In the process of trying to find a
solution, we have received a kernel patch from one of our users, who
claimed it made a lot of difference for his site. The patch is available here
(http://www.mysql.com/Downloads/Patches/linux-fork.patch). We have
now done rather extensive testing of this patch on both development and
production systems. It has significantly
improved MySQL performance without causing any problems and we now
recommend it to our users who are still running high-load servers on
2.2 kernels. This issue has been fixed in the 2.4 kernel, so if you are not
the current performance of your system, rather than patching your 2.2 kernel,
it might be easier to just upgrade to 2.4, which will also give you a nice
SMP boost in addition to fixing this fairness bug.
We have tested MySQL on the 2.4 kernel on a 2 CPU machine and
found MySQL scales MUCH better - there was virtually no slowdown
on query throughput all the way up
to 1000 clients, and MySQL scaling factor ( computed as the ratio of
maximum throughput to the throughput with one client) was 180%.
We have observed similar results on a 4-CPU system - virtually no
slowdown as the number of
clients was increased up to 1000, and 300% scaling factor. So for a high-load
SMP server we would definitely recommend the 2.4 kernel at this point. We
have discovered that it is essential to run mysqld process with the
highest possible priority on the 2.4 kernel to achieve maximum performance.
This can be done by adding
renice -20 $$ command to safe_mysqld. In our testing on a
4-CPU machine, increasing the priority gave 60% increase in throughput with
We are currently also trying to collect
more info on how well MySQL performs on 2.4 kernel on 4-way and 8-way
systems. If you have access such a system and have done some benchmarks,
please send a mail to email@example.com with the results - we will
include them in the manual.
There is another issue that greatly hurts MySQL performance,
especially on SMP systems. The implementation of mutex in
LinuxThreads in glibc-2.1 is very bad for programs with many
threads that only
hold the mutex for a short time. On an SMP system, ironic as it is, if
you link MySQL against unmodified LinuxThreads,
removing processors from the machine improves MySQL performance
in many cases. We have made a patch available for glibc 2.1.3,
to correct this behavior.
MySQL version 3.23.36 will use the adaptive mutex, which is much
better than even the patched one in glibc-2.1.3. Be warned, however,
that under some conditions, the current mutex code in glibc-2.2.2
overspins, which hurts MySQL performance. The chance of this
condition can be reduced by renicing mysqld process to the highest
priority. We have also been able to correct the overspin behavior with
a patch, available here. It combines the correction of overspin, maximum number of
threads, and stack spacing all in one. You will need to apply it in the
linuxthreads directory with
patch -p0 </tmp/linuxthreads-2.2.2.patch.
We hope it will be included in
some form in to the future releases of glibc-2.2. In any case, if
you link against glibc-2.2.2 you still need to correct
STACK_SIZE and PTHREAD_THREADS_MAX. We hope that the defaults
will be corrected to some more acceptable values for high-load
MySQL setup in the future, so that your own build can be reduced
to ./configure; make; make install.
We recommend that you use the above patches to build a special static
version of libpthread.a and use it only for statically linking
against MySQL. We know that the patches are safe for MySQL
and significantly improve its performance, but we cannot say anything
about other applications. If you link other applications against the
patched version of the library, or build a patched shared version and
install it on your system, you are doing it at your own risk with regard
to other applications that depend on LinuxThreads.
If you experience any strange problems during the installation of
MySQL, or with some common utilties hanging, it is very likely that
they are either library or compiler related. If this is the case, using our
binary will resolve them.
One known problem with the binary distribution is that with older Linux
systems that use libc (like RedHat 4.x or Slackware), you will get
some non-fatal problems with hostname resolution.
See section 22.214.171.124 Linux Notes for Binary Distributions.
When using LinuxThreads you will see a minimum of three processes
running. These are in fact threads. There will be one thread for the
LinuxThreads manager, one thread to handle connections, and one thread
to handle alarms and signals.
Note that the Linux kernel and the LinuxThread library can by default
only have 1024 threads. This means that you can only have up to 1021
connections to MySQL on an unpatched system. The page
http://www.volano.com/linuxnotes.html contains information how to
go around this limit.
To get a core dump on Linux if mysqld dies with a SIGSEGV
signal, you can start mysqld with the --core-file option. Note
that you also probably need to raise the core file size by adding
ulimit -c 1000000 to safe_mysqld or starting safe_mysqld
with --core-file-sizes=1000000. See section 4.7.2 safe_mysqld, the wrapper around mysqld.
If you are linking your own MySQL client and get the error:
ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
When executing them, the problem can be avoided by one of the following
Link the client with the following flag (instead of -Lpath):
Copy libmysqclient.so to `/usr/lib'.
Add the pathname of the directory where libmysqlclient.so is located
to the LD_RUN_PATH environment variable before running your client.
If you are using the Fujitsu compiler (fcc / FCC) you will have
some problems compiling MySQL because the Linux header files are very
The following configure line should work with fcc/FCC:
The binary release is linked with -static, which means you do not
normally need to worry about which version of the system libraries you
have. You need not install LinuxThreads, either. A program linked with
-static is slightly bigger than a dynamically linked program but
also slightly faster (3-5%). One problem, however, is that you can't use
user-definable functions (UDFs) with a statically linked program. If
you are going to write or use UDF functions (this is something only for
C or C++ programmers), you must compile MySQL yourself, using
If you are using a libc-based system (instead of a glibc2
system), you will probably get some problems with hostname resolving and
getpwnam() with the binary release. (This is because glibc
unfortunately depends on some external libraries to resolve hostnames
and getpwent(), even when compiled with -static). In this
case you probably get the following error message when you run
Sorry, the host 'xxxx' could not be looked up
or the following error when you try to run mysqld with the --user
getpwnam: No such file or directory
You can solve this problem in one of the following ways:
Get a MySQL source distribution (an RPM or the tar.gz
distribution) and install this instead.
Execute mysql_install_db --force; This will not execute the
resolveip test in mysql_install_db. The downside is that
you can't use host names in the grant tables; you must use IP numbers
instead (except for localhost). If you are using an old MySQL
release that doesn't support --force, you have to remove the
resolveip test in mysql_install with an editor.
Start mysqld with su instead of using --user.
The Linux-Intel binary and RPM releases of MySQL are configured
for the highest possible speed. We are always trying to use the fastest
stable compiler available.
MySQL Perl support requires Version Perl 5.004_03 or newer.
On some Linux 2.2 versions, you may get the error Resource
temporarily unavailable when you do a lot of new connections to a
mysqld server over TCP/IP.
The problem is that Linux has a delay between when you close a TCP/IP
socket and until this is actually freed by the system. As there is only
room for a finite number of TCP/IP slots, you will get the above error if
you try to do too many new TCP/IP connections during a small time, like
when you run the MySQL `test-connect' benchmark over
We have mailed about this problem a couple of times to different Linux
mailing lists but have never been able to resolve this properly.
The only known 'fix' to this problem is to use persistent connections in
your clients or use sockets, if you are running the database server
and clients on the same machine. We hope that the Linux 2.4
kernel will fix this problem in the future.
MySQL requires libc Version 5.4.12 or newer. It's known to
work with libc 5.4.46. glibc Version 2.0.6 and later should
also work. There have been some problems with the glibc RPMs from
RedHat, so if you have problems, check whether or not there are any updates!
The glibc 2.0.7-19 and 2.0.7-29 RPMs are known to work.
On some older Linux distributions, configure may produce an error
Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file.
See the Installation chapter in the Reference Manual.
Just do what the error message says and add an extra underscore to the
_P macro that has only one underscore, then try again.
You may get some warnings when compiling; those shown below can be ignored:
mysqld.cc -o objs-thread/mysqld.o
mysqld.cc: In function `void init_signals()':
mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int'
mysqld.cc: In function `void * signal_hand(void *)':
mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'
In Debian GNU/Linux, if you want MySQL to start automatically when
the system boots, do the following:
mysql.server can be found in the `share/mysql' directory
under the MySQL installation directory or in the
`support-files' directory of the MySQL source tree.
If mysqld always core dumps when it starts up, the problem may be that
you have an old `/lib/libc.a'. Try renaming it, then remove
`sql/mysqld' and do a new make install and try again. This
problem has been reported on some Slackware installations.
If you get the following error when linking mysqld,
it means that your `libg++.a' is not installed correctly:
/usr/lib/libc.a(putc.o): In function `_IO_putc':
putc.o(.text+0x0): multiple definition of `_IO_putc'
You can avoid using `libg++.a' by running configure like this:
In some implementations, readdir_r() is broken. The symptom is that
SHOW DATABASES always returns an empty set. This can be fixed by
removing HAVE_READDIR_R from `config.h' after configuring and
Some problems will require patching your Linux installation. The patch can
be found at
This patch is against the Linux distribution `sparclinux-2.0.30.tar.gz'
that is available at vger.rutgers.edu (a version of Linux that was
never merged with the official 2.0.30). You must also install LinuxThreads
Version 0.6 or newer.
MySQL Version 3.23.12 is the first MySQL version that is
tested on Linux-Alpha. If you plan to use MySQL on Linux-Alpha,
you should ensure that you have this version or newer.
We have tested MySQL on Alpha with our benchmarks and test suite,
and it appears to work nicely. The main thing we haven't yet had time to
test is how things works with many concurrent users.
When we compiled the standard MySQL binary we are using SuSE 6.4,
kernel 2.2.13-SMP, Compaq C compiler (V6.2-504) and Compaq C++ compiler
(V6.3-005) on a Comaq DS20 machine with an Alpha EV6 processor.
On Ia64 the MySQL client binaries are using shared libraries. This means
that if you install our binary distribution in some other place than
`/usr/local/mysql' you need to either modify `/etc/ld.so.conf'
or add the path to the directory where you have `libmysqlclient.so'
to the LD_LIBRARY_PATH environment variable.
MySQL uses TCP/IP to connect a client to a server. (This will
allow any machine on your network to connect to your MySQL
server.) Because of this, you must install TCP/IP on your machine before
starting MySQL. You can find TCP/IP on your Windows CD-ROM.
Note that if you are using an old Win95 release (for example OSR2), it's
likely that you have an old Winsock package! MySQL requires
Winsock 2! You can get the newest Winsock from
http://www.microsoft.com/. Win98 has the new Winsock 2 library, so
the above doesn't apply for Win98.
To start the mysqld server, you should start an MS-DOS window and type:
This will start mysqld in the background without a window.
You can kill the MySQL server by executing:
C:\> C:\mysql\bin\mysqladmin -u root shutdown
Note that Win95 and Win98 don't support creation of named pipes.
On Win95 and Win98, you can only use named pipes to connect to a
remote MySQL server running on a Windows NT server host.
(The MySQL server must also support named pipes, of
course. For example, using mysqld-opt under NT will not allow
named pipe connections. You should use either mysqld-nt or
If mysqld doesn't start, please check the
`\mysql\data\mysql.err' file to see if the server wrote any message
there to indicate the cause of the problem. You can also try to start
the server with mysqld --standalone; In this case, you may get
some useful information on the screen that may help solve the problem.
The last option is to start mysqld with --standalone
--debug. In this case mysqld will write a log file
`C:\mysqld.trace' that should contain the reason why mysqld
doesn't start. See section G.1.2 Creating trace files.
The Win95/Win98 section also applies to MySQL on NT/Win2000, with
the following differences:
To get MySQL to work with TCP/IP on NT, you must install
service pack 3 (or newer)!
Note that everything in the following that applies for NT also applies
For NT/Win2000, the server name is mysqld-nt. Normally you
should install MySQL as a service on NT/Win2000:
C:\> C:\mysql\bin\mysqld-nt --install
C:\> C:\mysql\bin\mysqld-max-nt --install
(Under Windows NT, you can actually install any of the server binaries
as a service, but only those having names that end with -nt.exe
provide support for named pipes.)
You can start and stop the MySQL service with these commands:
C:\> NET START mysql
C:\> NET STOP mysql
Note that in this case you can't use any other options for mysqld-nt!
You can also run mysqld-nt as a stand-alone program on NT if you need
to start mysqld-nt with any options! If you start mysqld-nt
without options on NT, mysqld-nt tries to start itself as a service
with the default service options. If you have stopped mysqld-nt, you
have to start it with NET START mysql.
The service is installed with the name MySQL. Once installed, it must
be started using the Services Control Manager (SCM) Utility found in the
Control Panel, or by using the NET START MySQL command. If any options
are desired, they must be specified as ``Startup parameters'' in the SCM utility
before you start the MySQL service. Once running, mysqld-nt
can be stopped using mysqladmin, or from the SCM utility or by using
the command NET STOP MySQL. If you use SCM to stop mysqld-nt,
there is a strange message from SCM about mysqld shutdown normally.
When run as a service, mysqld-nt has no access to a console and so no
messages can be seen.
On NT you can get the following service error messages:
Means that it cannot find mysqld-nt.exe.
Means that the path is incorrect.
Failed to install service.
Means that the service is already installed or that the Service Control Manager is in bad state.
If you have problems installing mysqld-nt as a service, try starting
it with the full path:
C:\> C:\mysql\bin\mysqld-nt --install
If this doesn't work, you can get mysqld-nt to start properly by fixing
the path in the registry!
If you don't want to start mysqld-nt as a service, you can start it as
MySQL supports TCP/IP on all Windows platforms and named pipes on NT.
The default is to use named pipes for local connections on NT and TCP/IP for
all other cases if the client has TCP/IP installed. The host name specifies
which protocol is used:
On NT, try named pipes first; if that doesn't work, use TCP/IP. On Win95/Win98, TCP/IP is used.
TCP/IP to current host
You can force a MySQL client to use named pipes by specifying the
--pipe option or by specifying . as the host name. Use the
--socket option to specify the name of the pipe.
Note that starting from 3.23.50, named pipes are only enabled if mysqld is
started with with --enable-named-pipe. This is because some users
have experienced problems shutting down the MySQL server when one uses
You can test whether or not MySQL is working by executing the
C:\> C:\mysql\bin\mysqlshow -u root mysql
C:\> C:\mysql\bin\mysqladmin version status proc
C:\> C:\mysql\bin\mysql test
If mysqld is slow to answer to connections on Win95/Win98, there is
probably a problem with your DNS. In this case, start mysqld with
--skip-name-resolve and use only localhost and IP numbers in
the MySQL grant tables. You can also avoid DNS when connecting to a
mysqld-nt MySQL server running on NT by using the
--pipe argument to specify use of named pipes. This works for most
There are two versions of the MySQL command-line tool:
Compiled on native Windows, which offers very limited text editing capabilities.
Compiled with the Cygnus GNU compiler and libraries, which offers readline editing.
If you want to use mysqlc.exe, you must copy
`C:\mysql\lib\cygwinb19.dll' to your Windows system directory
(`\windows\system' or similar place).
The default privileges on Windows give all local users full privileges
to all databases without specifying a password. To make MySQL
more secure, you should set a password for all users and remove the row in
the mysql.user table that has Host='localhost' and
You should also add a password for the root user. The following
example starts by removing the anonymous user that can be used by anyone
to access the test database, then sets a root user password:
C:\> C:\mysql\bin\mysql mysql
mysql> DELETE FROM user WHERE Host='localhost' AND User='';
C:\> C:\mysql\bin\mysqladmin reload
C:\> C:\mysql\bin\mysqladmin -u root password your_password
After you've set the password, if you want to take down the mysqld
server, you can do so using this command:
If you are using the old shareware version of MySQL Version
3.21 under Windows, the above command will fail with an error:
parse error near 'SET OPTION password'. The fix is in to upgrade
to the current MySQL version, which is freely available.
With the current MySQL versions you can easily add new users
and change privileges with GRANT and REVOKE commands.
See section 4.3.1 GRANT and REVOKE Syntax.
Start your Windows SSH client.
Set Host_Name = yourmysqlserver_URL_or_IP.
Set userid=your_userid to log in to your server (probably not the same
as your MySQL login/password.
Set up port forwarding. Either do a remote forward (Set local_port: 3306, remote_host: yourmysqlservername_or_ip, remote_port: 3306 )
or a local forward (Set port: 3306, host: localhost, remote port: 3306).
Save everything, otherwise you'll have to redo it the next time.
Log in to your server with SSH session you just created.
On your Windows machine, start some ODBC application (such as Access).
Create a new file in Windows and link to MySQL using the ODBC
driver the same way you normally do, EXCEPT type in localhost
for the MySQL host server -- not yourmysqlservername.
You should now have an ODBC connection to MySQL, encrypted using SSH.
Beginning with MySQL Version 3.23.16, the mysqld-max
and mysql-max-nt servers in the MySQL distribution are
compiled with the -DUSE_SYMDIR option. This allows you to put a
database on different disk by adding a symbolic link to it
(in a manner similar to the way that symbolic links work on Unix).
On Windows, you make a symbolic link to a database by creating a file
that contains the path to the destination directory and saving this in
the `mysql_data' directory under the filename `database.sym'.
Note that the symbolic link will be used only if the directory
`mysql_data_dir\database' doesn't exist.
For example, if the MySQL data directory is `C:\mysql\data'
and you want to have database foo located at `D:\data\foo', you
should create the file `C:\mysql\data\foo.sym' that contains the
text D:\data\foo\. After that, all tables created in the database
foo will be created in `D:\data\foo'.
Note that because of the speed penalty you get when opening every table,
we have not enabled this by default even if you have compiled
MySQL with support for this. To enable symlinks you should put
in your my.cnf or my.ini file the following entry:
In MySQL 4.0 we will enable symlinks by default. Then you
should instead use the skip-symlink option if you want to
MySQL-Windows has by now proven itself to be very stable. This version
of MySQL has the same features as the corresponding Unix version
with the following exceptions:
Win95 and threads
Win95 leaks about 200 bytes of main memory for each thread creation.
Each connection in MySQL creates a new thread, so you shouldn't
run mysqld for an extended time on Win95 if your server handles
many connections! WinNT and Win98 don't suffer from this bug.
MySQL depends on the pread() and pwrite() calls to be
able to mix INSERT and SELECT. Currently we use mutexes
to emulate pread()/pwrite(). We will, in the long run,
replace the file level interface with a virtual interface so that we can
use the readfile()/writefile() interface on NT to get more speed.
The current implementation limits the number of open files MySQL
can use to 1024, which means that you will not be able to run as many
concurrent threads on NT as on Unix.
MySQL uses a blocking read for each connection.
This means that:
A connection will not be disconnected automatically after 8 hours, as happens
with the Unix version of MySQL.
If a connection hangs, it's impossible to break it without killing
mysqladmin kill will not work on a sleeping connection.
mysqladmin shutdown can't abort as long as there are sleeping
We plan to fix this problem when our Windows developers have figured out a
For the moment, MySQL-Windows does not support user-definable
You can't drop a database that is in use by some thread.
Killing MySQL from the task manager
You can't kill MySQL from the task manager or with the shutdown
utility in Win95. You must take it down with mysqladmin shutdown.
Filenames are case insensitive on Windows, so database and table names
are also case insensitive in MySQL for Windows. The only
restriction is that database and table names must be specified using the same
case throughout a given statement. See section 6.1.3 Case Sensitivity in Names.
The `\' directory character
Pathname components in Win95 are separated by the `\' character, which is
also the escape character in MySQL. If you are using LOAD
DATA INFILE or SELECT ... INTO OUTFILE, you must double the `\'
mysql> LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:\\tmp\\skr.txt' FROM skr;
Alternatively, use Unix style filenames with `/' characters:
mysql> LOAD DATA INFILE "C:/tmp/skr.txt" INTO TABLE skr;
mysql> SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Can't open named pipe error
If you use a MySQL 3.22 version on NT with the newest mysql-clients
you will get the following error:
error 2017: can't open named pipe to host: . pipe...
This is because the release version of MySQL uses named pipes on NT
by default. You can avoid this error by using the --host=localhost
option to the new MySQL clients or create an option file
`C:\my.cnf' that contains the following information:
host = localhost
Starting from 3.23.50, named pipes are only enabled if mysqld is started
Access denied for user error
If you get the error Access denied for user: 'some-user@unknown'
to database 'mysql' when accessing a MySQL server on the same
machine, this means that MySQL can't resolve your host name
To fix this, you should create a file `\windows\hosts' with the
While you are executing an ALTER TABLE statement, the table is locked
from usage 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 threads. (In the future,
we may find some way to work around this problem.)
DROP TABLE on a table that is in use by a MERGE table will not work
The MERGE handler does its table mapping hidden from MySQL.
Because Windows doesn't allow you to drop files that are open, you first
must flush all MERGE tables (with FLUSH TABLES) or drop the
MERGE table before dropping the table. We will fix this at the same
time we introduce VIEWs.
Here are some open issues for anyone who might want to help us with the Windows
Make a single-user MYSQL.DLL server. This should include everything in
a standard MySQL server, except thread creation. This will make
MySQL much easier to use in applications that don't need a true
client/server and don't need to access the server from other hosts.
Add some nice start and shutdown icons to the MySQL installation.
Create a tool to manage registry entries for the MySQL startup
options. The registry entry reading is already coded into `mysqld.cc',
but it should be recoded to be more parameter oriented. The tool should
also be able to update the `C:\my.cnf' option file if the user prefers
to use that instead of the registry.
When registering mysqld as a service with --install (on NT)
it would be nice if you could also add default options on the command line.
For the moment, the workaround is to list the parameters in the
`C:\my.cnf' file instead.
It would be real nice to be able to kill mysqld from the task manager.
For the moment, you must use mysqladmin shutdown.
Port readline to Windows for use in the mysql command line tool.
GUI versions of the standard MySQL clients (mysql,
mysqlshow, mysqladmin, and mysqldump) would be nice.
It would be nice if the socket read and write functions in `net.c' were
interruptible. This would make it possible to kill open threads with
mysqladmin kill on Windows.
mysqld always starts in the "C" locale and not in the default locale.
We would like to have mysqld use the current locale for the sort order.
Implement UDF functions with .DLLs.
Add macros to use the faster thread-safe increment/decrement methods
provided by Windows.
Other Windows-specific issues are described in the `README' file that
comes with the MySQL-Windows distribution.
Sun native threads work only on Solaris 2.5 and higher. For Version 2.4 and
earlier, MySQL will automatically use MIT-pthreads.
See section 2.3.6 MIT-pthreads Notes.
If you get the following error from configure:
checking for restartable system calls... configure: error can not run test
programs while cross compiling
This means that you have something wrong with your compiler installation!
In this case you should upgrade your compiler to a newer version. You may
also be able to solve this problem by inserting the following row into the
In the MySQL benchmarks, we got a 6 % speedup on an Ultrasparc when
using Sun Workshop 5.3 compared to using gcc with -mcpu flags.
If you get a problem with fdatasync or sched_yield,
you can fix this by adding LIBS=-lrt to the configure line
The following paragraph is only relevant for older compilers than
You may also have to edit the configure script to change this line:
#if !defined(__STDC__) || __STDC__ != 1
If you turn on __STDC__ with the -Xc option, the Sun compiler
can't compile with the Solaris `pthread.h' header file. This is a Sun
bug (broken compiler or broken include file).
If mysqld issues the error message shown below when you run it, you have
tried to compile MySQL with the Sun compiler without enabling the
multi-thread option (-mt):
libc internal error: _rmutex_unlock: rmutex not held
Add -mt to CFLAGS and CXXFLAGS and try again.
If you get the following error when compiling MySQL with gcc,
it means that your gcc is not configured for your version of Solaris:
shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ...
./thr_alarm.c: In function `signal_hand':
./thr_alarm.c:556: too many arguments to function `sigwait'
The proper thing to do in this case is to get the newest version of
gcc and compile it with your current gcc compiler! At
least for Solaris 2.5, almost all binary versions of gcc have
old, unusable include files that will break all programs that use
threads (and possibly other programs)!
Solaris doesn't provide static versions of all system libraries
(libpthreads and libdl), so you can't compile MySQL
with --static. If you try to do so, you will get the error:
ld: fatal: library -ldl: not found
undefined reference to `dlopen'
cannot find -lrt
If too many processes try to connect very rapidly to mysqld, you will
see this error in the MySQL log:
Alternatively, you can edit `/usr/include/widec.h' directly. Either
way, after you make the fix, you should remove `config.cache' and run
If you get errors like this when you run make, it's because
configure didn't detect the `curses.h' file (probably
because of the error in `/usr/include/widec.h'):
In file included from mysql.cc:50:
/usr/include/term.h:1060: syntax error before `,'
/usr/include/term.h:1081: syntax error before `;'
The solution to this is to do one of the following:
Configure with CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure.
Edit `/usr/include/widec.h' as indicted above and rerun configure.
Remove the #define HAVE_TERM line from `config.h' file and
run make again.
If you get a problem that your linker can't find -lz when linking
your client program, the problem is probably that your `libz.so' file is
installed in `/usr/local/lib'. You can fix this by one of the
Add `/usr/local/lib' to LD_LIBRARY_PATH.
Add a link to `libz.so' from `/lib'.
If you are using Solaris 8, you can install the optional zlib from your
Solaris 8 CD distribution.
Configure MySQL with the --with-named-z-libs=no option.
FreeBSD 3.x is recommended for running MySQL since the thread package
is much more integrated.
The easiest and therefor the preferred way to install is to use the
mysql-server and mysql-client ports available on http://www.freebsd.org.
Using these gives you:
A working MySQL with all optimizations known to work on your version
of FreeBSD enabled.
Automatic configuration and build.
Startup scripts installed in /usr/local/etc/rc.d.
Ability to see which files that are installed with pkg_info -L. And to
remove them all with pkg_delete if you no longer want MySQL on that
It is recommended you use MIT-pthreads on FreeBSD 2.x and native threads on
Versions 3 and up. It is possible to run with native threads on some late
2.2.x versions but you may encounter problems shutting down mysqld.
The MySQL `Makefile's require GNU make (gmake) to work. If
you want to compile MySQL you need to install GNU make first.
Be sure to have your name resolver setup correct. Otherwise you may
experience resolver delays or failures when connecting to mysqld.
Make sure that the localhost entry in the `/etc/hosts' file is
correct (otherwise you will have problems connecting to the database). The
`/etc/hosts' file should start with a line:
127.0.0.1 localhost localhost.your.domain
If you notice that configure will use MIT-pthreads, you should read
the MIT-pthreads notes. See section 2.3.6 MIT-pthreads Notes.
If you get an error from make install that it can't find
`/usr/include/pthreads', configure didn't detect that you need
MIT-pthreads. This is fixed by executing these commands:
FreeBSD is also known to have a very low default file handle limit.
See section A.2.16 File Not Found. Uncomment the ulimit -n section in
safe_mysqld or raise the limits for the mysqld user in /etc/login.conf
(and rebuild it with cap_mkdb /etc/login.conf). Also be sure you set the
appropriate class for this user in the password file if you are not
using the default (use: chpass mysqld-user-name). See section 4.7.2 safe_mysqld, the wrapper around mysqld.
If you get problems with the current date in MySQL, setting the
TZ variable will probably help. See section H Environment Variables.
To get a secure and stable system you should only use FreeBSD kernels
that are marked -STABLE.
Our users have reported that OpenBSD 2.8 has a threading bug which causes
problems with MySQL. The OpenBSD Developers have fixed the problem,
but as of January 25th, 2001, it's only available in the ``-current'' branch.
The symptoms of this threading bug are: slow response, high load, high CPU
usage, and crashes.
You can change the directory locations if you wish, or just use the
defaults by not specifying any locations.
If you have problems with performance under heavy load, try using the
--skip-thread-priority option to mysqld! This will run
all threads with the same priority; on BSDI Version 3.1, this gives better
performance (at least until BSDI fixes their thread scheduler).
If you get the error virtual memory exhausted while compiling,
you should try using ulimit -v 80000 and run make again.
If this doesn't work and you are using bash, try switching to
csh or sh; some BSDI users have reported problems with
bash and ulimit.
BSDI Version 4.x has some thread-related bugs. If you want to use
MySQL on this, you should install all thread-related patches. At
least M400-023 should be installed.
On some BSDI Version 4.x systems, you may get problems with shared libraries.
The symptom is that you can't execute any client programs, for example,
mysqladmin. In this case you need to reconfigure not to use
shared libraries with the --disable-shared option to configure.
Some customers have had problems on BSDI 4.0.1 that the mysqld
binary after a while can't open tables. This is because some
library/system related bug causes mysqld to change current
directory without asking for this!
The fix is to either upgrade to 3.23.34 or after running configure
remove the line #define HAVE_REALPATH from config.h
before running make.
Note that the above means that you can't symbolic link a database directories
to another database directory or symbolic link a table to another database
on BSDI! (Making a symbolic link to another disk is ok).
Some of the binary distributions of MySQL for HP-UX is
distributed as an HP depot file and as a tar file. To use the depot
file you must be running at least HP-UX 10.x to have access to HP's
software depot tools.
The HP version of MySQL was compiled on an HP 9000/8xx server
under HP-UX 10.20, and uses MIT-pthreads. It is known to work well under
this configuration. MySQL Version 3.22.26 and newer can also be
built with HP's native thread package.
Other configurations that may work:
HP 9000/7xx running HP-UX 10.20+
HP 9000/8xx running HP-UX 10.30
The following configurations almost definitely won't work:
HP 9000/7xx or 8xx running HP-UX 10.x where x < 2
HP 9000/7xx or 8xx running HP-UX 9.x
To install the distribution, use one of the commands below, where
/path/to/depot is the full pathname of the depot file:
To install everything, including the server, client and development tools:
The depot places binaries and libraries in `/opt/mysql' and data in
`/var/opt/mysql'. The depot also creates the appropriate entries in
`/etc/init.d' and `/etc/rc2.d' to start the server automatically
at boot time. Obviously, this entails being root to install.
To install the HP-UX tar.gz distribution, you must have a copy of GNU
If you are compiling gcc 2.95 yourself, you should NOT link it with
the DCE libraries (libdce.a or libcma.a) if you want to compile
MySQL with MIT-pthreads. If you mix the DCE and MIT-pthreads
packages you will get a mysqld to which you cannot connect. Remove
the DCE libraries while you compile gcc 2.95!
This will solve a problem that one gets EWOULDBLOCK from recv()
and EBADF from accept() in threaded applications.
If you are using gcc 2.95.1 on an unpatched HP-UX 11.x system,
you will get the error:
In file included from /usr/include/unistd.h:11,
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pthread.h:440: previous declaration ...
In file included from item.h:306,
The problem is that HP-UX doesn't define pthreads_atfork() consistently.
It has conflicting prototypes in
`/usr/include/sys/pthread.h':440 (details below).
One solution is to copy `/usr/include/sys/unistd.h' into
`mysql/include' and edit `unistd.h' and change it to match
the definition in `pthread.h'. Here's the diff:
Here is some information that a HP-UX Version 11.x user sent us about compiling
MySQL with HP-UX:x compiler:
setenv CC cc
setenv CXX aCC
setenv CFLAGS -D_REENTRANT
setenv CXXFLAGS -D_REENTRANT
setenv CPPFLAGS -D_REENTRANT
% aCC -V
aCC: HP ANSI C++ B3910B X.03.14.06
% cc -V /tmp/empty.c
cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI)
ccom: HP92453-01 A.11.01.00 HP C Compiler
cc: "/tmp/empty.c", line 1: warning 501: Empty source file.
./configure --with-pthread \
added '#define _CTYPE_INCLUDED' to include/m_ctype.h. This
symbol is the one defined in HP's /usr/include/ctype.h:
/* Don't include std ctype.h when this is included */
#define _CTYPE_USING /* Don't put names in global namespace. */
I had to use the compile-time flag -D_REENTRANT to get the compiler
to recognize the prototype for localtime_r. Alternatively I could have
supplied the prototype for localtime_r. But I wanted to catch other
bugs without needing to run into them. I wasn't sure where I needed it, so I
added it to all flags.
The optimization flags used by MySQL (-O3) are not recognized by HP's
compilers. I did not change the flags.
If you get the following error from configure
checking for cc option to accept ANSI C... no
configure: error: MySQL requires a ANSI C compiler (and a C++ compiler). Try gcc. See the Installation chapter in the Reference Manual.
Check that you don't have the path to the K&R compiler before the path
to the HP-UX C and C++ compiler.
If you change the -O3 to -O2 in the above configure line,
you must also remove the -qstrict option (this is a limitation in
the IBM C compiler).
If you are using gcc or egcs to compile MySQL, you
MUST use the -fno-exceptions flag, as the exception
handling in gcc/egcs is not thread safe! (This is tested with
egcs 1.1.). There are also some known problems with IBM's assembler,
which may cause it to generate bad code when used with gcc.
We recommend the following configure line with egcs and
gcc 2.95 on AIX:
The -Wa,-many is necessary for the compile to be successful. IBM is
aware of this problem but is in to hurry to fix it because of the workaround
available. We don't know if the -fno-exceptions is required with
gcc 2.95, but as MySQL doesn't use exceptions and the above
option generates faster code, we recommend that you should always use this
option with egcs / gcc.
If you get a problem with assembler code try changing the -mcpu=xxx to
match your cpu. Typically power2, power, or powerpc may need to be used,
alternatively you might need to use 604 or 604e. I'm not positive but I
would think using "power" would likely be safe most of the time, even on
a power2 machine.
If you don't know what your cpu is then do a "uname -m", this will give
you back a string that looks like "000514676700", with a format of
xxyyyyyymmss where xx and ss are always 0's, yyyyyy is a unique system
id and mm is the id of the CPU Planar. A chart of these values can be
This will give you a machine type and a machine model you can use to
determine what type of cpu you have.
If you have problems with signals (MySQL dies unexpectedly
under high load) you may have found an OS bug with threads and
signals. In this case you can tell MySQL not to use signals by
This doesn't affect the performance of MySQL, but has the side
effect that you can't kill clients that are ``sleeping'' on a connection with
mysqladmin kill or mysqladmin shutdown. Instead, the client
will die when it issues its next command.
On some versions of AIX, linking with libbind.a makes
getservbyname core dump. This is an AIX bug and should be reported
For AIX 4.2.1 and gcc you have to do the following changes.
After configuring, edit `config.h' and `include/my_config.h'
and change the line that says
#define HAVE_SNPRINTF 1
And finally, in `mysqld.cc' you need to add a prototype for initgoups.
extern "C" int initgroups(const char *,int);
If you are using egcs 1.1.2 on Digital Unix, you should upgrade to gcc
2.95.2, as egcs on DEC has some serious bugs!
When compiling threaded programs under Digital Unix, the documentation
recommends using the -pthread option for cc and cxx and
the libraries -lmach -lexc (in addition to -lpthread). You
should run configure something like this:
When compiling mysqld, you may see a couple of warnings like this:
mysqld.cc: In function void handle_connections()':
mysqld.cc:626: passing long unsigned int *' as argument 3 of
accept(int,sockadddr *, int *)'
You can safely ignore these warnings. They occur because configure
can detect only errors, not warnings.
If you start the server directly from the command line, you may have problems
with it dying when you log out. (When you log out, your outstanding processes
receive a SIGHUP signal.) If so, try starting the server like this:
shell> nohup mysqld [options] &
nohup causes the command following it to ignore any SIGHUP
signal sent from the terminal. Alternatively, start the server by running
safe_mysqld, which invokes mysqld using nohup for you.
See section 4.7.2 safe_mysqld, the wrapper around mysqld.
If you get a problem when compiling mysys/get_opt.c, just remove the
line #define _NO_PROTO from the start of that file!
If you are using Compac's CC compiler, the following configure line should
On OSF1 V4.0D and compiler "DEC C V5.6-071 on Digital Unix V4.0 (Rev. 878)"
the compiler had some strange behavior (undefined asm symbols).
/bin/ld also appears to be broken (problems with _exit
undefined errors occuring while linking mysqld). On this system, we
have managed to compile MySQL with the following configure
line, after replacing /bin/ld with the version from OSF 4.0C:
If you have problems with signals (MySQL dies unexpectedly
under high load), you may have found an OS bug with threads and
signals. In this case you can tell MySQL not to use signals by
This doesn't affect the performance of MySQL, but has the side
effect that you can't kill clients that are ``sleeping'' on a connection with
mysqladmin kill or mysqladmin shutdown. Instead, the client
will die when it issues its next command.
With gcc 2.95.2, you will probably run into the following compile error:
sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566
Please submit a full bug report.
To fix this you should change to the sql directory and do a ``cut
and paste'' of the last gcc line, but change -O3 to
-O0 (or add -O0 immediately after gcc if you don't
have any -O option on your compile line.) After this is done you
can just change back to the top-level directly and run make
If you are using Irix Version 6.5.3 or newer mysqld will only be able to
create threads if you run it as a user with CAP_SCHED_MGT
privileges (like root) or give the mysqld server this privilege
with the following shell command:
You may have to undefine some things in `config.h' after running
configure and before compiling.
In some Irix implementations, the alloca() function is broken. If the
mysqld server dies on some SELECT statements, remove the lines
from `config.h' that define HAVE_ALLOC and HAVE_ALLOCA_H.
If mysqladmin create doesn't work, remove the line from `config.h'
that defines HAVE_READDIR_R. You may have to remove the
HAVE_TERM_H line as well.
SGI recommends that you install all of the patches on this page as a set:
At the very minimum, you should install the latest kernel rollup, the
latest rld rollup, and the latest libc rollup.
You definitely need all the POSIX patches on this page, for pthreads support:
If you get the something like the following error when compiling
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
Type the following in the top-level directory of your MySQL source
shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h
There have also been reports of scheduling problems. If only one thread is
running, things go slow. Avoid this by starting another client. This may
lead to a 2-to-10-fold increase in execution speed thereafter for the other
thread. This is a poorly understood problem with Irix threads; you may have
to improvise to find solutions until this can be fixed.
If you are compiling with gcc, you can use the following
The current port is tested only on a ``sco3.2v5.0.4'' and
``sco3.2v5.0.5'' system. There has also been a lot of progress on a
port to ``sco 3.2v4.2''.
For the moment the recommended compiler on OpenServer is gcc 2.95.2. With this
you should be able to compile MySQL with just:
CC=gcc CXX=gcc ./configure ... (options)
For OpenServer 5.0.X you need to use GDS in Skunkware 95 (95q4c). This
is necessary because GNU gcc 2.7.2 in Skunkware 97 does not have
GNU as. You can also use egcs 1.1.2 or newer
http://www.egcs.com/. If you are using egcs 1.1.2 you have
to execute the following command:
FSU Pthreads can be compiled with SCO Unix 4.2 with tcpip. Or
OpenServer 3.0 or Open Desktop 3.0 (OS 3.0 ODT 3.0), with the SCO
Development System installed using a good port of GCC 2.5.x ODT or OS
3.0 you will need a good port of GCC 2.5.x There are a lot of problems
without a good port. The port for this product requires the SCO Unix
Development system. Without it, you are missing the libraries and the
linker that is needed.
To build FSU Pthreads on your system, do the following:
Run ./configure in the `threads/src' directory and select
the SCO OpenServer option. This command copies `Makefile.SCO5' to
To install in the default `/usr/include' directory, login as root,
then cd to the `thread/src' directory, and run make
Remember to use GNU make when making MySQL.
If you don't start safe_mysqld as root, you probably will get only the
default 110 open files per process. mysqld will write a note about this
in the log file.
With SCO 3.2V5.0.5, you should use FSU Pthreads version 3.5c or newer.
You should also use gcc 2.95.2 or newer!
The following configure command should work:
MySQL should automatically detect FSU Pthreads and link mysqld
with -lgthreads -lsocket -lgthreads.
The SCO development libraries are re-entrant in FSU Pthreads. SCO claims
that its libraries' functions are re-entrant, so they must be reentrant with
FSU Pthreads. FSU Pthreads on OpenServer tries to use the SCO scheme to
make re-entrant libraries.
FSU Pthreads (at least the version at http://www.mysql.com/) comes
linked with GNU malloc. If you encounter problems with memory usage,
make sure that `gmalloc.o' is included in `libgthreads.a' and
In FSU Pthreads, the following system calls are pthreads-aware: read(),
write(), getmsg(), connect(), accept(),
select(), and wait().
The CSSA-2001-SCO.35.2 (the patch is listed in custom as
erg711905-dscr_remap security patch (ver 2.0.0) breaks FSU threads and
makes mysqld instable. You have to remove this one if you want to run
mysqld on an OpenServer 5.0.6 machine.
If you want to install DBI on SCO, you have to edit the `Makefile' in
DBI-xxx and each subdirectory.
Note that the following assumes gcc 2.95.2 or newer:
MySQL uses quite a few open files. Because of this, you should add
something like the following to your `CONFIG.SYS' file:
SET EMXOPT=-c -n -h1024
If you don't do this, you will probably run into the following error:
File 'xxxx' not found (Errcode: 24)
When using MySQL with OS/2 Warp 3, FixPack 29 or above is
required. With OS/2 Warp 4, FixPack 4 or above is required. This is a
requirement of the Pthreads library. MySQL must be installed
in a partition that supports long filenames such as HPFS, FAT32, etc.
The `INSTALL.CMD' script must be run from OS/2's own `CMD.EXE'
and may not work with replacement shells such as `4OS2.EXE'.
The `scripts/mysql-install-db' script has been renamed. It is now called
`install.cmd' and is a REXX script, which will set up the default
MySQL security settings and create the WorkPlace Shell icons
Dynamic module support is compiled in but not fully tested. Dynamic
modules should be compiled using the Pthreads run-time library.
Note: Due to limitations in OS/2, UDF module name stems must not
exceed 8 characters. Modules are stored in the `/mysql2/udf'
directory; the safe-mysqld.cmd script will put this directory in
the BEGINLIBPATH environment variable. When using UDF modules,
specified extensions are ignored -- it is assumed to be `.udf'.
For example, in Unix, the shared module might be named `example.so'
and you would load a function from it like this:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
Is OS/2, the module would be named `example.udf', but you would not
specify the module extension:
mysql> CREATE FUNCTION metaphon RETURNS STRING SONAME "example";