This chapter describes how to obtain and install MySQL:
Check the MySQL home page for information about the current version and for downloading instructions.
Our main download mirror is located at:
http://download.sourceforge.net/mirrors/mysql/
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 webmaster@mysql.com 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.
Please report bad or out-of-date mirrors to webmaster@mysql.com.
Europe:
North America:
South America:
Asia:
Australia:
Africa:
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 RedHat Linux Version 6.x.
Note that for many operating systems, the native thread support works only in the latest versions. MySQL has been reported to compile sucessfully on the following operating system/thread package combinations:
glibc
2.0.7+ . See section 4.12.5 Linux Notes (All Linux Versions).
The first decision to make is whether you want to use the latest development release or the last stable release:
crash-me
and benchmark tests.
See section 12.7 Using Your Own Benchmarks. Note that all MySQL releases are
checked with the MySQL benchmarks and an extensive test suite
before each release.
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 there exist one for your platform, as this is generally, it will be easier to install than a source distribution.
In the following cases you will probably be better of with a source installation:
mysqld
with some extra feature that is NOT in
the standard binary distributions. Here is a list of the most common
extra options that you may want to use
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:
3
) describes the file format. All
Version 3 releases have the same file format. When a Version 4 appears, every
table will have to be converted to the new format (nice tools for this will
be included, of course.)
21
) is the release level. Normally there are two to
choose from. One is the release/stable branch (currently 22
) and the
other is the development branch (currently 23
) . Normally both are
stable, but the development version may have quirks, missing documentation on
new features, or may fail to compile on some systems.
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 choosen.
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
MySQL release.
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
more unreliable.
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.
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:
crash-me
test
Another test is that we use the newest MySQL version in our internal production environment, on at least one machine. We have more than 100 gigabytes of data to work with.
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:
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 already working.''
This section describes the default layout of the directories created by installing binary and source distributions.
A binary distribution is installed by unpacking it at the installation location you choose (typically `/usr/local/mysql') and creates the following directories in that location:
Directory | Contents of directory |
`bin' | Client programs and the mysqld server
|
`data' | Log files, databases |
`include' | Include (header) files |
`lib' | Libraries |
`scripts' | mysql_install_db
|
`share/mysql' | Error message files |
`sql-bench' | Benchmarks |
A source distribution is installed after you configure and compile it. By default, the installation step installs files under `/usr/local', in the following subdirectories:
Directory | Contents of directory |
`bin' | Client programs and scripts |
`include/mysql' | Include (header) files |
`info' | Documentation in Info format |
`lib/mysql' | Libraries |
`libexec' | The mysqld server
|
`share/mysql' | Error message files |
`sql-bench' | Benchmarks and crash-me test
|
`var' | Databases and log files |
Within an installation directory, the layout of a source installation differs from that of a binary installation in the following ways:
mysqld
server is installed in the `libexec'
directory rather than in the `bin' directory.
mysql_install_db
is installed in the `/usr/local/bin' directory
rather than in `/usr/local/mysql/scripts'.
You can create your own binary installation from a compiled source distribution by executing the script `scripts/make_binary_distribution'.
You need the following tools to install a MySQL binary distribution:
gunzip
to uncompress the distribution.
tar
to unpack the distribution. GNU tar
is
known to work. Sun tar
is known to have problems.
An alternative installation method under Linux is to use RPM (RedHat Package Manager) distributions. See section 4.6.1 Linux RPM Notes.
If you run into problems, PLEASE ALWAYS USE mysqlbug
when
posting questions to mysql@lists.mysql.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
`bin' directory after you unpack the distribution. See section 2.3 How to Report Bugs or Problems.
The basic commands you must execute to install and use a MySQL binary distribution are:
shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s mysql-VERSION-OS mysql shell> cd mysql shell> scripts/mysql_install_db shell> chown -R mysql /usr/local/mysql shell> chgrp -R mysql /usr/local/mysql shell> bin/safe_mysqld --user=mysql &
You can add new users using the bin/mysql_setpermission
script if
you install the DBI
and Msql-Mysql-modules
Perl modules.
A more detailed description follows.
To install a binary distribution, follow the steps below, then proceed to section 4.16 Post-installation Setup and Testing, for post-installation setup and testing:
root
.)
tar
archives and have names like `mysql-VERSION-OS.tar.gz', where
VERSION
is a number (for example, 3.21.15
), and OS
indicates the type of operating system for which the distribution is intended
(for example, pc-linux-gnu-i586
).
mysqld
to run as:
shell> groupadd mysql shell> useradd -g mysql mysqlThese commands add the
mysql
group and the mysql
user. The
syntax for useradd
and groupadd
may differ slightly on different
Unixes. They may also be called adduser
and addgroup
. You may
wish to call the user and group something else instead of mysql
.
shell> cd /usr/local
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s mysql-VERSION-OS mysqlThe first command creates a directory named `mysql-VERSION-OS'. The second command makes a symbolic link to that directory. This lets you refer more easily to the installation directory as `/usr/local/mysql'.
shell> cd mysqlYou will find several files and subdirectories in the
mysql
directory.
The most important for installation purposes are the `bin' and
`scripts' subdirectories.
PATH
environment variable so that your shell finds the MySQL
programs properly. See section A Environment Variables.
mysql_install_db
script used to initialize
the server access permissions.
mysqlaccess
and have the MySQL
distribution in some nonstandard place, you must change the location where
mysqlaccess
expects to find the mysql
client. Edit the
`bin/mysqlaccess' script at approximately line 18. Search for a line
that looks like this:
$MYSQL = '/usr/local/bin/mysql'; # path to mysql executableChange the path to reflect the location where
mysql
actually is
stored on your system. If you do not do this, you will get a Broken
pipe
error when you run mysqlaccess
.
shell> scripts/mysql_install_dbNote that MySQL versions older than Version 3.22.10 started the MySQL server when you run
mysql_install_db
. This is no
longer true!
mysqld
as:
shell> chown -R mysql /usr/local/mysql shell> chgrp -R mysql /usr/local/mysqlThe first command changes the
owner
attribute of the files to the
mysql
user, and the second changes the group
attribute to
the mysql
group.
DBI
/DBD
interface,
see section 4.11 Perl Installation Comments.
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 4.16.3 Starting and Stopping MySQL Automatically.
After everything has been unpacked and installed, you should initialize and test your distribution.
You can start the MySQL server with the following command:
shell> bin/safe_mysqld --user=mysql &
See section 14.2 safe_mysqld, the wrapper around mysqld.
See section 4.16 Post-installation Setup and Testing.
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
.
If you have problems with an RPM file, for example, if you receive the error
``Sorry, the host 'xxxx' could not be looked up
'', see
section 4.6.3.1 Linux Notes for Binary Distributions.
The RPM files you may want to use are:
MySQL-VERSION.i386.rpm
The MySQL server. You will need this unless you only want to
connect to a MySQL server running on another machine.
MySQL-client-VERSION.i386.rpm
The standard MySQL client programs. You probably always want to
install this package.
MySQL-bench-VERSION.i386.rpm
Tests and benchmarks. Requires Perl and msql-mysql-modules RPMs.
MySQL-devel-VERSION.i386.rpm
Libraries and include files needed if you want to compile other
MySQL clients, such as the Perl modules.
MySQL-VERSION.src.rpm
This contains the source code for all of the above packages. It can also
be used to try to build RPMs for other architectures (for example, Alpha
or SPARC).
To see all files in an RPM package, run:
shell> rpm -qpl MySQL-VERSION.i386.rpm
To perform a standard minimal installation, run:
shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
To install just the client package, run:
shell> rpm -i MySQL-client-VERSION.i386.rpm
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 your changes.)
After installing the RPM file(s), the `mysqld' daemon should be running and you should now be able to start using MySQL. See section 4.16 Post-installation Setup and Testing.
If something goes wrong, you can find more information in the binary installation chapter. See section 4.6 Installing a MySQL Binary Distribution.
If you compile MySQL clients that you've written yourself or that
you obtain from a third party, they must be linked using the
-lmysqlclient
option on the link command. You may also need to
specify a -L
option to tell the linker where to find the library. For
example, if the library is installed in `/usr/local/mysql/lib', use
-L/usr/local/mysql/lib -lmysqlclient
on the link command.
For clients that use MySQL header files, you may need to specify a
-I
option when you compile them (for example,
-I/usr/local/mysql/include
), so the compiler can find the header
files.
The following sections indicate some of the issues that have been observed on particular systems when installing MySQL from a binary distribution.
MySQL needs at least Linux Version 2.0.
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
dynamic linking.
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
mysql_install_db
:
Sorry, the host 'xxxx' could not be looked up
or the following error when you try to run mysqld with the --user
option:
getpwnam: No such file or directory
You can solve this problem in one of the following ways:
tar.gz
distribution) and install this instead.
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.
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 TCP/IP.
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.
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:
The following configurations almost definitely won't work:
To install the distribution, use one of the commands below, where
/path/to/depot
is the full pathname of the depot file:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.full
shell> /usr/sbin/swinstall -s /path/to/depot mysql.server
shell> /usr/sbin/swinstall -s /path/to/depot mysql.client
shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
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
tar
.
You need the following tools to build and install MySQL from source:
gunzip
to uncompress the distribution.
tar
to unpack the distribution. GNU tar
is
known to work. Sun tar
is known to have problems.
gcc
>= 2.8.1, egcs
>=
1.0.2, 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.95.2 is recommended when compiling MySQL
Version 3.23.x.
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 run into problems, PLEASE ALWAYS USE mysqlbug
when
posting questions to mysql@lists.mysql.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 2.3 How to Report Bugs or Problems.
The basic commands you must execute to install a MySQL source distribution are:
shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql shell> make shell> make install shell> scripts/mysql_install_db shell> chown -R mysql /usr/local/mysql shell> chgrp -R mysql /usr/local/mysql shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
If you start from a source RPM, then do the following:
shell> rpm --rebuild MySQL-VERSION.src.rpm
This will make a binary RPM that you can install.
You can add new users using the bin/mysql_setpermission
script if
you install the DBI
and Msql-Mysql-modules
Perl modules.
A more detailed description follows.
To install a source distribution, follow the steps below, then proceed to section 4.16 Post-installation Setup and Testing, for post-installation initialization and testing:
tar
archives and have names like `mysql-VERSION.tar.gz', where
VERSION
is a number like 3.23.33.
mysqld
to run as:
shell> groupadd mysql shell> useradd -g mysql mysqlThese commands add the
mysql
group, and the mysql
user. The
syntax for useradd
and groupadd
may differ slightly on different
Unixes. They may also be called adduser
and addgroup
. You may
wish to call the user and group something else instead of mysql
.
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -This command creates a directory named `mysql-VERSION'.
shell> cd mysql-VERSIONNote that currently you must configure and build MySQL from this top-level directory. You can not build it in a different directory.
shell> ./configure --prefix=/usr/local/mysql shell> makeWhen you run
configure
, you might want to specify some options.
Run ./configure --help
for a list of options.
section 4.7.3 Typical configure
Options, discusses some of the
more useful options.
If configure
fails, and you are going to send mail to
mysql@lists.mysql.com 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 2.3 How to Report Bugs or Problems.
If the compile fails, see section 4.9 Problems Compiling?, for help with
a number of common problems.
shell> make installYou might need to run this command as
root
.
shell> scripts/mysql_install_dbNote that MySQL versions older than Version 3.22.10 started the MySQL server when you run
mysql_install_db
. This is no
longer true!
mysqld
as:
shell> chown -R mysql /usr/local/mysql shell> chgrp -R mysql /usr/local/mysqlThe first command changes the
owner
attribute of the files to the
mysql
user, and the second changes the group
attribute to
the mysql
group.
DBI
/DBD
interface,
see section 4.11 Perl Installation Comments.
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 4.16.3 Starting and Stopping MySQL Automatically.
After everything has been installed, you should initialize and test your distribution:
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
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 21.3 Running Multiple MySQL Servers on the Same Machine.
See section 4.16 Post-installation Setup and Testing.
Sometimes patches appear on the mailing list or are placed in the patches area of the MySQL Web site.
To apply a patch from the mailing list, save the message in which the patch appears in a file, change into the top-level directory of your MySQL source tree, and run these commands:
shell> patch -p1 < patch-file-name shell> rm config.cache shell> make clean
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
commands:
shell> gunzip < patch-file-name.gz | patch -p1 shell> rm config.cache shell> make clean
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.
configure
Options
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 A Environment Variables. For a list of options supported by configure
, run
this command:
shell> ./configure --help
Some of the more commonly-used configure
options are described below:
--without-server
option:
shell> ./configure --without-serverIf 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.)
configure
command, something like one
of these:
shell> ./configure --prefix=/usr/local/mysql shell> ./configure --prefix=/usr/local \ --localstatedir=/usr/local/mysql/dataThe 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
/usr/local/mysql/data
.
configure
command like this:
shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sockNote that the given file must be an absolute pathname!
configure
like this:
shell> ./configure --with-client-ldflags=-all-static \ --with-mysqld-ldflags=-all-static
gcc
and don't have libg++
or libstdc++
installed, you can tell configure
to use gcc
as your C++
compiler:
shell> CC=gcc CXX=gcc ./configureWhen you use
gcc
as your C++ compiler, it will not attempt to link in
libg++
or libstdc++
.
Here is some common environment variables to set depending on
the compiler you are using:
gcc 2.7.2.1 | CC=gcc CXX=gcc CXXFLAGS="-O6 -felide-constructors" |
egcs 1.0.3a | CC=gcc CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" |
gcc 2.95.2 | CFLAGS="-O6 -mpentiumpro" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" |
pgcc 2.90.29 or newer | CFLAGS="-O6 -mpentiumpro -mstack-align-double" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti" |
--prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-staticThe full configure line would in other words be something like the following for all recent gcc versions:
CFLAGS="-O6 -mpentiumpro" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-staticThe binaries we provide at on the MySQL home site http://www.mysql.com, are all compiled with full optimization and should be ok for most users. See section 4.15 MySQL Binaries. There is some things one can tweak to make an even faster binary, but this is only for advanced users. See section 12.2.1 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.
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:
shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
--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 10.1.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 7.33 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-debug
option:
shell> ./configure --with-debugThis causes a safe memory allocator to be included that can find some errors and that provides output about what is happening. See section I.1 Debugging a MySQL server.
--with-thread-safe-client
configure options. This will create a
libmysqlclient_r
library with which you should link your threaded
applications. See section 23.4.57 How to Make a Thread-safe Client.
CAUTION: You should only read this section 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 either source or binary distribution.
Below are the instructions to obtain our most recent development source tree:
bk clone bk://work.mysql.com:7000 mysql
- the initial download
may take a while, depending on the speed of your connection.
cd mysql bk -r edit aclocal; autoheader; autoconf; automake; ./configure # Add your favorite options here makeWe have a collection of our standard configure scripts in the
BUILD/
subdirectory - if you are lazy, you can do
BUILD/compile-pentium-debug
. It will actually work on a lot of
non-x86 machines despite its name.
make install
. Be careful with this on
a production machine - this may overwrite your live release binary. We
recommend that if you have another installation of MySQL that
you ./configure
with different values for prefix
,
tcp-port
, and unix-socket-path
.
make
stage and it does not compile,
please report it to bugs@lists.mysql.com. If you have
installed the update version of the required GNU tools, and they crash
trying to process our configuration files, please report it also. However,
if you execute aclocal
and get command not found
, or a
similar problem, do not report it - make sure all the needed tools are
installed and your PATH
variable is set correctly.
bk clone
, do bk pull
to get the updates.
bk sccstool
. If you see some funny diffs or code that you have a
question about, do not hesitate and e-mail
internals@lists.mysql.com. Also if you think you have a
better idea on how to do something, send an email to the same place
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 a description.
bk helptool
.
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 4.10 MIT-pthreads Notes, for warnings
that may occur when using MIT-pthreads. For other problems, check the list
below.
The solution to many problems involves reconfiguring. If you do need to reconfigure, take note of the following:
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.
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:
Internal compiler error: program cc1plus got fatal signal 11 or Out of virtual memory or Virtual memory exhaustedThe 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-memoryThis 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.
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" ./configureThis 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++
.
make
to GNU make
:
making all in mit-pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment or make: file `Makefile' line 18: Must be a separator (: or pthread.h: No such file or directorySolaris and FreeBSD are known to have troublesome
make
programs.
GNU make
Version 3.75 is known to work.
CFLAGS
and CXXFLAGS
environment
variables. You can also specify the compiler names this way using CC
and CXX
. For example:
shell> CC=gcc shell> CFLAGS=-O6 shell> CXX=gcc shell> CXXFLAGS=-O6 shell> export CC CFLAGS CXX CXXFLAGSSee section 4.15 MySQL Binaries, for a list of flag definitions that have been found to be useful on various systems.
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.
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 XXXChange
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'.)
"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.
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 I.2 Debugging a MySQL client.
This section describes some of the issues involved in using MIT-pthreads.
Note that on Linux you should NOT use MIT-pthreads but install LinuxThreads! See section 4.12.5 Linux Notes (All Linux Versions).
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 4.2 Operating Systems Supported by MySQL.
configure
with the --with-mit-threads
option:
shell> ./configure --with-mit-threadsBuilding in a non-source directory is not supported when using MIT-pthreads, because we want to minimize our changes to this code.
--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.
--use-locking
option.
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.
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.
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
implicit declaration of function `int strtoll(...)' implicit declaration of function `int strtoul(...)'
readline
to work with MIT-pthreads. (This isn't
needed, but may be interesting for someone.)
Perl support for MySQL is provided by means of the
DBI
/DBD
client interface. See section 23.5 MySQL Perl API. The Perl
DBD
/DBI
client code requires Perl Version 5.004 or later. The
interface will not work if you have an older version of Perl.
MySQL Perl support also requires that you've installed MySQL client programming support. If you installed MySQL from RPM files, client programs are in the client RPM, but client programming support is in the developer RPM. Make sure you've installed the latter RPM.
As of Version 3.22.8, Perl support is distributed separately from the main MySQL distribution. If you want to install Perl support, the files you will need can be obtained from http://www.mysql.com/Downloads/Contrib/.
The Perl distributions are provided as compressed tar
archives and
have names like `MODULE-VERSION.tar.gz', where MODULE
is the
module name and VERSION
is the version number. You should get the
Data-Dumper
, DBI
, and Msql-Mysql-modules
distributions
and install them in that order. The installation procedure is shown below.
The example shown is for the Data-Dumper
module, but the procedure is
the same for all three distributions:
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -This command creates a directory named `Data-Dumper-VERSION'.
shell> cd Data-Dumper-VERSION
shell> perl Makefile.PL shell> make shell> make test shell> make install
The make test
command is important because it verifies that the
module is working. Note that when you run that command during the
Msql-Mysql-modules
installation to exercise the interface code, the
MySQL server must be running or the test will fail.
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.
If you don't have the right to install Perl modules in the system directory or if you to install local Perl modules, the following reference may help you:
http://www.iserver.com/support/contrib/perl5/modules.html
Look under the heading
Installing New Modules that Require Locally Installed Modules
.
To install the MySQL DBD
module with ActiveState Perl on
Windows, you should do the following:
set HTTP_proxy=my.proxy.com:3128
C:\perl\bin\ppm.pl
DBI
: install DBI
ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
The above should work at least with ActiveState Perl Version 5.6.
If you can't get the above to work, you should instead install the MyODBC driver and connect to MySQL server through ODBC:
use DBI; $dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") || die "Got error $DBI::errstr when connecting to $dsn\n";
The MySQL Perl distribution contains DBI
,
DBD:MySQL
and DBD:ODBC
.
C:
so that you get a `C:\PERL' directory.
perl
works by executing perl -v
in a DOS shell.
DBI
/DBD
Interface
If Perl reports that it can't find the ../mysql/mysql.so
module,
then the problem is probably that Perl can't locate the shared library
`libmysqlclient.so'.
You can fix this by any of the following methods:
Msql-Mysql-modules
distribution with perl
Makefile.PL -static -config
rather than perl Makefile.PL
.
libmysqlclient.so
to the directory where your other shared
libraries are located (probably `/usr/lib' or `/lib').
Linux
you can add the pathname of the directory where
libmysqlclient.so
is located to the `/etc/ld.so.conf' file.
libmysqlclient.so
is located
to the LD_RUN_PATH
environment variable.
If you get the following errors from DBD-mysql
,
you are probably using gcc
(or using an old binary compiled with
gcc
):
/usr/bin/perl: can't resolve symbol '__moddi3' /usr/bin/perl: can't resolve symbol '__divdi3'
Add -L/usr/lib/gcc-lib/... -lgcc
to the link command when the
`mysql.so' library gets built (check the output from make
for
`mysql.so' when you compile the Perl client). The -L
option
should specify the pathname of the directory where `libgcc.a' is located
on your system.
Another cause of this problem may be that Perl and MySQL aren't both
compiled with gcc
. In this case, you can solve the mismatch by
compiling both with gcc
.
If you get the following error from Msql-Mysql-modules
when you run the tests:
t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
it means that you need to include the compression library, -lz, to the link line. This can be doing the following change in the file `lib/DBD/mysql/Install.pm':
$sysliblist .= " -lm"; to $sysliblist .= " -lm -lz";
After this, you MUST run 'make realclean' and then proceed with the installation from the beginning.
If you want to use the Perl module on a system that doesn't support dynamic
linking (like SCO) you can generate a static version of Perl that includes
DBI
and DBD-mysql
. The way this works is that you generate a
version of Perl with the DBI
code linked in and install it on top of
your current Perl. Then you use that to build a version of Perl that
additionally has the DBD
code linked in, and install that.
On SCO, you must have the following environment variables set:
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib or shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:
First, create a Perl that includes a statically linked DBI
by running
these commands in the directory where your DBI
distribution is
located:
shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl
Then you must install the new Perl. The output of make perl
will
indicate the exact make
command you will need to execute to perform
the installation. On SCO, this is make -f Makefile.aperl inst_perl
MAP_TARGET=perl
.
Next, use the just-created Perl to create another Perl that also includes a
statically-linked DBD::mysql
by running these commands in the
directory where your Msql-Mysql-modules
distribution is located:
shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl
Finally, you should install this new Perl. Again, the output of make
perl
indicates the command to use.
The following sections indicate some of the issues that have been observed to occur on particular systems when installing MySQL from a source distribution.
On Solaris, you may run into trouble even before you get the MySQL
distribution unpacked! Solaris tar
can't handle long file names, so
you may see an error like this when you unpack MySQL:
x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks tar: directory checksum error
In this case, you must use GNU tar
(gtar
) to unpack the
distribution. You can find a precompiled copy for Solaris at
http://www.mysql.com/Downloads/.
Sun native threads work only on Solaris 2.5 and higher. For Version 2.4 and earlier, MySQL will automatically use MIT-pt threads. See section 4.10 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
config.cache
file:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
If you are using Solaris on a SPARC, the recommended compiler is
gcc
2.95.2. You can find this at http://gcc.gnu.org/.
Note that egs
1.1.1 and gcc
2.8.1 don't work reliably on
SPARC!
The recommended configure
line when using gcc
2.95.2 is:
CC=gcc CFLAGS="-O6" \ CXX=gcc CXXFLAGS="-O6 -felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
If you have a ultra sparc, you can get 4 % more performance by adding "-mcpu=v8 -Wa,-xarch=v8plusa" to CFLAGS and CXXFLAGS.
If you have the Sun Workshop (SunPro) 4.2 (or newer) compiler, you can
run configure
like this:
CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -xO4 -mt" \ ./configure --prefix=/usr/local/mysql --enable-assembler
You may also have to edit the configure
script to change this line:
#if !defined(__STDC__) || __STDC__ != 1
to this:
#if !defined(__STDC__)
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
If too many processes try to connect very rapidly to mysqld
, you will
see this error in the MySQL log:
Error in accept: Protocol error
You might try starting the server with the --set-variable back_log=50
option as a workaround for this. See section 4.16.4 Command-line Options.
If you are linking your own MySQL client, you might get the following error when you try to execute it:
ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
The problem can be avoided by one of the following methods:
-Lpath
):
-Wl,r/full-path-to-libmysqlclient.so
.
libmysqclient.so
to `/usr/lib'.
libmysqlclient.so
is located
to the LD_RUN_PATH
environment variable before running your client.
When using the --with-libwrap
configure option, you must also
include the libraries that libwrap.a
needs:
--with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket
If you have problems with configure trying to link with -lz
and
you don't have zlib
installed, you have two options:
--with-named-z-libs=no
.
If you are using gcc and have problems with loading UDF
functions
into MySQL, try adding -lgcc
to the link line for the
UDF
function.
If you would like MySQL to start automatically, you can copy
`support-files/mysql.server' to `/etc/init.d' and create a
symbolic link to it named /etc/rc3.d/S99mysql.server
.
You can normally use a Solaris 2.6 binary on Solaris 2.7 and 2.8. Most of the Solaris 2.6 issues also apply for Solaris 2.7 and 2.8.
Note that MySQL Version 3.23.4 and above should be able to autodetect new versions of Solaris and enable workarounds for the following problems!
Solaris 2.7 / 2.8 has some bugs in the include files. You may see the
following error when you use gcc
:
/usr/include/widec.h:42: warning: `getwc' redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition
If this occurs, you can do the following to fix the problem:
Copy /usr/include/widec.h
to
.../lib/gcc-lib/os/gcc-version/include
and change line 41 from:
#if !defined(lint) && !defined(__lint) to #if !defined(lint) && !defined(__lint) && !defined(getwc)
Alternatively, you can edit `/usr/include/widec.h' directly. Either
way, after you make the fix, you should remove `config.cache' and run
configure
again!
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:
CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure
.
#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
following methods:
LD_LIBRARY_PATH
.
libz.so
from /lib
.
--with-named-z-libs=no
option.
If you are using gcc
or egcs
on Solaris x86 and you
experience problems with core dumps under load, you should use the
following configure
command:
CC=gcc CFLAGS="-O6 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \ ./configure --prefix=/usr/local/mysql
This will avoid problems with the libstdc++
library and with C++
exceptions.
If this doesn't help, you should compile a debug version and run
it with a trace file or under gdb
. See section I.1 Debugging a MySQL server.
On SunOS 4, MIT-pthreads is needed to compile MySQL, which in turn
means you will need GNU make
.
Some SunOS 4 systems have problems with dynamic libraries and
libtool
. You can use the following configure
line to avoid
this problem:
shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
When compiling readline
, you may get warnings about duplicate defines.
These may be ignored.
When compiling mysqld
, there will be some implicit declaration
of function
warnings. These may be ignored.
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. http://www.mysql.com/Downloads/Linux
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
. If you are using INSERT DELAYED
, you
MUST add the following patch to your glibc library:
http://www.mysql.com/Downloads/Patches/glibc-pthread_cond_timedwait.patch.
MySQL Versions 3.23.7 and 3.22.32 contain a temporary
workaround for this bug.
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 `internals.h' to 256 KB. Note that MySQL
will not be stable with around 1000 connections if STACK_SIZE
is the default of 2 MB.
If you have glibc 2.1.3-65 or newer, you don't have to increase STACK_SIZE;
You can instead just change the thread_stack
value for mysqld
.
If you use a lot of concurrent connections, you may suffer from a Version 2.2 kernel "feature" 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. We have done some limited testing in which the patch greatly improved the scalabitility of MySQL. The patch is available here (http://www.mysql.com/Downloads/Patches/linux-fork.patch). Be warned, though, that we assume no reponsibility for any damage that this patch could do. Use it at your own risk. We have also been told by the Linux kernel developers that this problem is fixed in Version 2.4, although we have not yet done any testing.
We have also tested MySQL on Linux Version 2.4 on a 2 CPU machine and MySQL scales MUCH better on this! If your plan to set up a dedicated Linux SMP machine to run MySQL under heavy load, we recommend that you give Version 2.4 a try!
The current implementation of mutex in Linuxthreads is also very bad for programs with many threads that only hold the mutex for a short time. We have made a patch available for glibc 2.1, linuxthreads-2.1-patch and for glibc 2.2, linuxthreads-2.2-patch.
If you apply the patches, you are doing this at your own risk. We can only say that they appear to work well for us!.
If you can't start mysqld
or if mysql_install_db
doesn't work,
please continue reading! This only happens on Linux system with problems in
the LinuxThreads or libc
/glibc
libraries. There are a lot of
simple workarounds to get MySQL to work! The simplest is to use the
binary version of MySQL (not the RPM) for Linux x86. One nice
aspect of this version is that it's probably 10% faster than any version you
would compile yourself! See section 12.2.1 How Compiling and Linking Affects the Speed of MySQL.
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 4.6.3.1 Linux Notes for Binary Distributions.
myisamchk
hangs with libc.so.5.3.12
. Upgrading to the newest
libc
fixes this problem.
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 a unpatched system. The page http://www.volano.com/linuxnotes.html contains information how to go around this limit.
If you see a dead mysqld
daemon process with ps
, this usually
means that you have found a bug in MySQL or you have a corrupted
table. See section 20.2 What to Do if MySQL Keeps Crashing.
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 14.2 safe_mysqld, the wrapper around mysqld.
If you are using LinuxThreads and mysqladmin shutdown
doesn't work,
you must upgrade to LinuxThreads Version 0.7.1 or newer.
If you are using RedHat, you might get errors like this:
/usr/bin/perl is needed... /usr/sh is needed... /usr/sh is needed...
If so, you should upgrade your version of rpm
to
`rpm-2.4.11-1.i386.rpm' and `rpm-devel-2.4.11-1.i386.rpm' (or later).
You can get the upgrades of libraries to RedHat Version 4.2 from ftp://ftp.redhat.com/updates/4.2/i386. Or http://www.sunsite.unc.edu/pub/Linux/distributions/redhat/code/rpm/ for other distributions.
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 methods:
-Lpath
):
-Wl,r/path-libmysqlclient.so
.
libmysqclient.so
to `/usr/lib'.
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
gcc
oriented.
The following configure
line should work with fcc/FCC
:
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory
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
like this:
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:
shell> cp support-files/mysql.server /etc/init.d/mysql.server shell> /usr/sbin/update-rc.d mysql.server defaults 99
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. RedHat Version 5.0
also has a similar problem with some new glibc
versions.
See section 4.12.5.2 RedHat Version 5.0 Notes.
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:
shell> CXX=gcc ./configure
If you have any problems with MySQL on RedHat, you should start by
upgrading glibc
to the newest possible version!
If you install all the official RedHat patches (including
glibc-2.0.7-19
and glibc-devel-2.0.7-19
), both the
binary and source distributions of MySQL should work without
any trouble!
The updates are needed because there is a bug in glibc
2.0.5 in how
pthread_key_create
variables are freed. With glibc
2.0.5, you
must use a statically linked MySQL binary distribution. If you
want to compile from source, you must install the corrected version of
LinuxThreads from http://www.mysql.com/Downloads/Linux or upgrade your
glibc
.
If you have an incorrect version of glibc
or LinuxThreads, the symptom
is that mysqld
crashes after each connection. For example,
mysqladmin version
will crash mysqld
when it finishes!
Another symptom of incorrect libraries is that mysqld
crashes at
once when it starts. On some Linux systems, this can be fixed by configuring
like this:
shell> ./configure --with-mysqld-ldflags=-all-static
On Redhat Version 5.0, the easy way out is to install the glibc
2.0.7-19 RPM and run configure
without the
--with-mysqld-ldflags=-all-static
option.
For the source distribution of glibc
2.0.7, a patch that is easy to
apply and is tested with MySQL may be found at:
http://www.mysql.com/Download/Linux/glibc-2.0.7-total-patch.tar.gz
If you experience crashes like these when you build MySQL, you can always download the newest binary version of MySQL. This is statically-linked to avoid library conflicts and should work on all Linux systems!
MySQL comes with an internal debugger that can generate trace files with a lot of information that can be used to find and solve a wide range of different problems. See section I.1 Debugging a MySQL server.
The glibc
of RedHat Version 5.1 (glibc
2.0.7-13) has a memory
leak, so to get a stable MySQL version, you must upgrade glibc
,
to 2.0.7-19, downgrade glibc
or use a binary version of mysqld
.
If you don't do this, you will encounter memory problems (out of memory, etc.).
The most common error in this case is:
Can't create a new thread (errno 11). If you are not out of available memory, you can consult the manual for any possible OS dependent bug
After you have upgraded to glibc
2.0.7-19, you can configure
MySQL with dynamic linking (the default), but you cannot
run configure
with the --with-mysqld-ldflags=-all-static
option
until you have installed glibc
2.0.7-19 from source!
You can check which version of glibc
you have with rpm -q glibc
.
Another reason for the above error is if you try to use more threads than your Linux kernel is configured for. In this case you should raise the limits in `include/linux/tasks.h' and recompile your kernel!
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 before compiling.
Some problems will require patching your Linux installation. The patch can
be found at
http://www.mysql.com/Downloads/patches/Linux-sparc-2.0.30.diff. 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 + 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
You can find the above compilers at http://www.support.compaq.com/alpha-tools). By using these compilers, instead of gcc, we get about 9-14 % better performance with MySQL.
Note that the configure line optimized the binary for the current CPU; This means you can only use our binary if you have an Alpha EV6 processor. We also compile staticly to avoid library problems.
CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
If you want to use egcs the following configure line worked for us:
CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared
Some known problems when running MySQL on Linux-Alpha:
gdb 4.18
. You should download and use gdb 5.0 instead!
--with-mysqld-ldflags=-all-static
with gcc
MySQL should work on MkLinux with the newest glibc
package
(tested with glibc
2.0.7).
To get MySQL to work on Qube2, (Linux Mips), you need the
newest glibc
libraries (glibc-2.0.7-29C2
is known to
work). You must also use the egcs
C++ compiler
(egcs-1.0.2-9
, gcc 2.95.2
or newer).
To get MySQL to compile on Linux Ia64, we had to do the following (we assume that this will be easier when next gcc version for ia64 is released).
Using gcc-2.9-final
:
CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex
After make
you will get an error that sql/opt_range.cc
will not compile (internal compiler error). To fix this, go to the sql
directory and type make
again. Copy the compile line, but change
-O2 to -O0. The file should now compile.
Now you can do:
cd .. make make_install
and mysqld should be ready to run.
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:
CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
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 14.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 work:
CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ --enable-shared=yes \ --with-named-thread-libs="-lpthread -lmach -lexc -lc" gnumake
If you get a problem with libtool, when compiling with shared libraries
as above, when linking mysql
, you should be able to get around
this by issuing:
cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db
If you have problems compiling and have DEC CC
and gcc
installed, try running configure
like this:
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
If you get problems with the `c_asm.h' file, you can create and use a 'dummy' `c_asm.h' file with:
touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Note that the following problems with the ld
program can be fixed
by downloading the latest DEC (Compaq) patch kit from:
http://ftp.support.compaq.com/public/unix/.
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:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
With the Digital compiler "C++ V6.1-029", the following should work:
CC=cc -pthread CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host CXX=cxx -pthread CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -noexceptions -nortti export CC CFLAGS CXX CXXFLAGS ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc"
In some versions of OSF1, the alloca()
function is broken. Fix
this by removing the line in `config.h' that defines 'HAVE_ALLOCA'
.
The alloca()
function also may have an incorrect prototype in
/usr/include/alloca.h
. This warning resulting from this can be ignored.
configure
will use the following thread libraries automatically:
--with-named-thread-libs="-lpthread -lmach -lexc -lc"
.
When using gcc
, you can also try running configure
like this:
shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
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 configuring with:
shell> CFLAGS=-DDONT_USE_THR_ALARM \ CXXFLAGS=-DDONT_USE_THR_ALARM \ ./configure ...
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
again.
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:
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
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: http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html
At the very minimum, you should install the latest kernel rollup, the
latest rld
rollup, and the latest libc
rollup.
You definately need all the POSIX patches on this page, for pthreads support:
http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html
If you get the something like the following error when compiling `mysql.cc':
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
then type the following in the top-level directory of your MySQL source tree:
shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h shell> make
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
configure
command:
CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --with-thread-safe-client --with-named-thread-libs=-lpthread
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:
It is recomended 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 Makefiles 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 4.10 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:
shell> rm config.cache shell> ./configure --with-mit-threads
FreeBSD is also known to have a very low default file handle limit. See section 20.13 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 witg 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 14.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 A Environment Variables.
To get a secure and stable system you should only use FreeBSD kernels
that are marked -STABLE
To compile on NetBSD you need GNU make
. Otherwise the compile will crash
when make
tries to run lint
on C++ files.
On OpenBSD Version 2.5, you can compile MySQL with native threads with the following options:
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
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.
If you get the following error when compiling MySQL, your
ulimit
value for virtual memory is too low:
item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)': item_func.h:28: virtual memory exhausted make[2]: *** [item_func.o] Error 1
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
.
If you are using gcc
, you may also use have to use the
--with-low-memory
flag for configure
to be able to compile
`sql_yacc.cc'.
If you get problems with the current date in MySQL, setting the
TZ
variable will probably help. See section A Environment Variables.
Upgrade to BSD/OS Version 3.1. If that is not possible, install BSDIpatch M300-038.
Use the following command when configuring MySQL:
shell> env CXX=shlicc++ CC=shlicc2 \ ./configure \ --prefix=/usr/local/mysql \ --localstatedir=/var/mysql \ --without-perl \ --with-unix-socket-path=/var/mysql/mysql.sock
The following is also known to work:
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure \ --prefix=/usr/local/mysql \ --with-unix-socket-path=/var/mysql/mysql.sock
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).
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)
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:
shell> cp -p /usr/include/pthread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pthread/
./configure
in the `threads/src' directory and select
the SCO OpenServer option. This command copies `Makefile.SCO5' to
`Makefile'.
make
.
cd
to the `thread/src' directory, and run make
install
.
make
when making MySQL.
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.
configure
command should work:
shell> ./configure --prefix=/usr/local/mysql --disable-shared
configure
command should work:
shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \ ./configure \ --with-debug --prefix=/usr/local/mysql \ --with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \ --with-named-curses-libs="-lcurses"You may get some problems with some include files. In this case, you can find new SCO-specific include files at http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz. You should unpack this file in the `include' directory of your MySQL source tree.
SCO development notes:
mysqld
with -lgthreads -lsocket -lgthreads
.
malloc
. If you encounter problems with memory usage, make sure that
`gmalloc.o'
is included in `libgthreads.a' and `libgthreads.so'.
read()
,
write()
, getmsg()
, connect()
, accept()
,
select()
, and wait()
.
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:
OLD: NEW: CC = cc CC = gcc CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic CCDLFLAGS = -wl,-Bexport CCDLFLAGS = LD = ld LD = gcc -G -fpic LDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/lib LDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = ld LD = gcc -G -fpic OPTIMISE = -Od OPTIMISE = -O1 OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include NEW: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
This is because the Perl dynaloader will not load the DBI
modules
if they were compiled with icc
or cc
.
Perl works best when compiled with cc
.
You must use a version of MySQL at least as recent as Version 3.22.13 because that version fixes some portability problems under Unixware.
We have been able to compile MySQL with the following configure
command on Unixware Version 7.0.1:
CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
If you want to use gcc
, you must use gcc
2.95.2 or newer.
Automatic detection of xlC
is missing from Autoconf, so a
configure
command something like this is needed when compiling
MySQL (The example uses the IBM compiler):
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" export LDLFAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sysconfdir=/etc/mysql \ --sbindir='/usr/local/bin' \ --libexecdir='/usr/local/bin' \ --enable-thread-safe-client \ --enable-large-files
Above are the options used to compile the MySQL distribution that can be found at www-frec.bull.com.
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:
CC="gcc -pipe -mcpu=power2 -Wa,-many" \ CXX="gcc -pipe -mcpu=power2 -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory
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 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 configuring with:
shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \ ./configure --prefix=/usr/local/mysql --with-debug --with-low-memory
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
to IBM.
There are a couple of small problems when compiling MySQL on
HP-UX. We recommend that you use gcc
instead of the HP-UX native
compiler, because gcc
produces better code!
We recommend using gcc 2.95 on HP-UX. Don't use high optimization flags (like -O6) as this may not be safe on HP-UX.
Note that MIT-pthreads can't be compiled with the HP-UX compiler
because it can't compile .S
(assembler) files.
The following configure line should work:
CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
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!
For HPUX Version 11.x we recommend MySQL Version 3.23.15 or later.
Because of some critical bugs in the standard HPUX libraries, one should install the following patches before trying to run MySQL on HPUX 11.0:
PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative
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 a unpatched HPUX 11.x system,
you will get the error:
In file included from /usr/include/unistd.h:11, from ../include/global.h:125, from mysql_priv.h:15, from item.cc:19: /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, from mysql_priv.h:158, from item.cc:19:
The problem is that HP-UX doesn't define pthreads_atfork()
consistently.
It has conflicting prototypes in
`/usr/include/sys/unistd.h':184 and
`/usr/include/sys/pthread.h':440 (I post the 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:
183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); --- > extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void));
After this, the following configure line should work:
CFLAGS="-fomit-frame-pointer -O6 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O6" ./configure --prefix=/usr/local/mysql --disable-shared
Here is some information that a HPUX Version 11.x user sent us about compiling MySQL with HPUX:x compiler:
Environment: proper compilers. setenv CC cc setenv CXX aCC flags 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. configuration: ./configure --with-pthread \ --prefix=/source-control/mysql \ --with-named-thread-libs=-lpthread \ --with-low-memory 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_H #define __CTYPE_INCLUDED #define _CTYPE_INCLUDED #define _CTYPE_USING /* Don't put names in global namespace. */
-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.
MySQL should work without any probelms on Mac OS X public beta. (Darwin); You don't need the pthread patches for this os!
Before trying to configure MySQL on Mac OS X server you must first first install the pthread package from http://www.prnet.de/RegEx/mysql.html. Note that this is not neeaded
Our binary for Mac OS X is compiled on Rhapsody 5.5 with the following configure line:
CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql "--with-comment=Official MySQL binary" --with-extra-charsets=complex --disable-shared
You might want to also add aliases to your shell's resource file to
access mysql
and mysqladmin
from the command line:
alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
We are really interested in getting MySQL to work on BeOS, but unfortunately we don't have any person who knows BeOS or has time to do a port.
We are interested in finding someone to do a port, and we will help them with any techincal questions they may have while doing the port.
We have previously talked with some BeOS developers that have said that MySQL is 80% ported to BeOS, but we haven't heard from these in a while.
This section describes installation and use of MySQL on Windows. This is also described in the `README' file that comes with the MySQL Windows distribution.
If you don't have a copy of the MySQL distribution, you should first download one from http://www.mysql.com/.
If you plan to connect to MySQL from some other program, you will probably also need the MyODBC driver. You can find this at the MyODBC download page (http://www.mysql.com/downloads/api-myodbc.html).
To install either distribution, unzip it in some empty directory and run the
Setup.exe
program.
By default, MySQL-Windows is configured to be installed in
`C:\mysql'. If you want to install MySQL elsewhere, install it
in `C:\mysql', then move the installation to where you want it. If you
do move MySQL, you must tell mysqld
where everything is by
supplying options to mysqld
. Use C:\mysql\bin\mysqld --help
to
display all options! For example, if you have moved the MySQL
distribution to `D:\programs\mysql', you must start mysqld
with:
D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql
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 this to suit your setup. Note that you should specify all paths with `/' instead of `\'. If you use `\', you need to specify this twice, as `\' is the escape character in MySQL. See section 4.16.5 Option Files.
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 Microsoft. Win98 has as default the new Winsock 2 library, so the above doesn't apply for Win98.
There are 2 different MySQL servers you can use:
mysqld | Compiled with full debugging and automatic memory allocation checking |
mysqld-opt | Optimized for a Pentium processor. |
Both of the above should work on any Intel processor >= i386.
To start the mysqld
server, you should start an MS-DOS window and type:
C:\mysql\bin\mysqld
This will start mysqld
in the background without a window.
You can kill the MySQL server by executing:
C:\mysql\bin\mysqladmin -u root shutdown
Note that Win95/Win98 don't support creation of named pipes. On Win95/Win98, you can only use named pipes to connect to a remote MySQL running on an NT server.
If mysqld
doesn't start, please check whether or not the
`\mysql\mysql.err' file contains any reason for this. You can also
try to start it with mysqld --standalone
; In this case you may
get some useful information on the screen that may help solve this.
The last option is to start mysqld
with --debug
. In this
case mysqld
will write a log file in `\mysqld.trace'
that should contain the reason why mysqld
doesn't start. If you
make a bug report about this, please only send the lines to the mailing list
where something seems to go wrong!
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 Win2000!
For NT/Win2000, the server name is mysqld-nt
. Normally you
should install MySQL as a service on NT/Win2000:
C:\mysql\bin\mysqld-nt --install
(You could use the mysqld
or mysqld-opt
servers on NT,
but those cannot be started as a service or use named pipes.)
You can start and stop the MySQL service with:
NET START mysql 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 starts 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 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:
Permission Denied | Means that it cannot find mysqld-nt.exe .
|
Cannot Register | 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:\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
follows:
C:\mysql\bin\mysqld-nt --standalone
or
C:\mysql\bin\mysqld --standalone --debug
The last version gives you a debug trace in `C:\mysqld.trace'.
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:
Protocol | |
NULL (none) | On NT, try named pipes first; if that doesn't work, use TCP/IP. On Win95/Win98, TCP/IP is used. |
. | Named pipes |
localhost | TCP/IP to current host |
hostname | TCP/IP |
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.
You can test whether or not MySQL is working by executing the following commands:
C:\mysql\bin\mysqlshow C:\mysql\bin\mysqlshow -u root mysql C:\mysql\bin\mysqladmin version status proc 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
MySQL clients.
There are two versions of the MySQL command-line tool:
mysql | Compiled on native Windows, which offers very limited text editing capabilities. |
mysqlc | 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 `\windows\system' (or similar
place).
The default privileges on Windows give all local users full privileges
to all databases. 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
User=''
.
You should also add a password for the root
user.
(The following example starts by removing the anonymous user, that allows
anyone to access the 'test' database.):
C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\mysql\bin\mysqladmin reload 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:
mysqladmin --user=root --password=your_password shutdown
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'
. This is because the old shareware version,
which is based on MySQL Version 3.21, doesn't have the
SET PASSWORD
command. The fix is in this case to upgrade to
the Version 3.22 shareware.
With the newer MySQL versions you can easily add new users
and change privileges with GRANT
and REVOKE
commands.
See section 7.34 GRANT
and REVOKE
Syntax.
Here is a note about how to connect to get a secure connection to remote MySQL server with SSH (by David Carlson dcarlson@mplcomm.com):
secureCRT
from http://www.vandyke.com/.
Another option is f-secure
from http://www.f-secure.com/. You
can also find some free ones on Google at
http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/Clients/Windows/.
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.
local_port: 3306
, remote_host: yourmysqlservername_or_ip
, remote_port: 3306
)
or a local forward (Set port: 3306
, host: localhost
, remote port: 3306
).
localhost
for the MySQL host server - not yourmysqlservername
.
You should now have your ODBC connection to MySQL encrypted using SSH.
On windows MySQL Version 3.23.16 and above is 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 similar manner that
symbolic links works 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 only be used if the directory
mysql_data_dir\database
doesn't exist.
For example, if you want to have database foo
on `D:\data\foo', you
should create the file `C:\mysql\data\foo.sym' that contains the
text D:\data\foo
. After this, all tables created in the database
foo
will be created in `D:\data\foo'.
In your source files, you should include `windows.h' before you include
mysql.h
:
#if defined(_WIN32) || defined(_WIN64) #include <windows.h> #endif #include <mysql.h>
You can either link your code with the dynamic `libmysql.lib' library, which is just a wrapper to load in `libmysql.dll' on demand, or link with the static `mysqlclient.lib' library.
Note that as the mysqlclient libraries are compiled as threaded libraries, you should also compile your code to be multi-threaded!
We will shortly do a full test on the new BDB interface on Windows. When this is done we will start to release binary distributions (for Windows and Unix) of MySQL that will include support for BDB tables.
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:
mysqld
for an extended time on Win95 if
you do many connections, because each connection in MySQL creates
a new thread! WinNT and Win98 don't suffer from this bug.
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 will however limit 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.
mysqladmin kill
will not work on a sleeping connection.
mysqladmin shutdown
can't abort as long as there are sleeping
connections.
DROP DATABASE
mysqladmin shutdown
.
LOAD
DATA INFILE
or SELECT ... INTO OUTFILE
, you must double the `\'
character or use Unix style filenames `/' characters:
LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Can't open named pipe
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 a file `C:\my.cnf' that contains the following information:
[client] host = localhost
Access denied for user
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
properly.
To fix this, you should create a file `\windows\hosts' with the
following information:
127.0.0.1 localhost
ALTER TABLE
ALTER TABLE
the table is locked from usage
by other threads. This has to do with the fact that you on Windows can't
delete a file that is in use by another threads. (We may in the future
find some way to go around this problem).
DROP TABLE
on a table that is in use by a MERGE
table will not work.
MERGE
handler does it table mapping hidden from MySQL.
Because windows doesn't allow one to drop files that are open, you have
to first flush all MERGE
tables (with FLUSH TABLES
) or drop the
MERGE
table before drooping the table. We will fix this at
the same time we introduce VIEW
's.
Here are some open issues for anyone who might want to help us with the Windows release:
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.
mysqld.cc
,
but it should be recoded to be more parameter oriented.
The tool should also be able to update the `\my.cnf' file if the user
prefers to use this instead of the registry.
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 update the `C:\my.cnf' file
instead.
mysqld
daemon doesn't accept new connections when the laptop is resumed.
We don't know if this is a problem with Win95, TCP/IP, or MySQL.
mysqld
from the
task manager. For the moment, you must use mysqladmin shutdown
.
readline
to Windows for use in the mysql
command line tool.
mysql
,
mysqlshow
, mysqladmin
, and mysqldump
) would be nice.
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.
.DLL
s.
Other Windows-specific issues are described in the `README' file that comes with the MySQL-Windows distribution.
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 for MySQL.
Dynamic module support is compiled in but not fully tested. Dynamic modules should be compiled using the Pthreads run-time library.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \ -o example udf_example.cc -L../lib -lmysqlclient udf_example.def mv example.dll example.udf
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:
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:
CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
As a service, we at MySQL AB provides a set of binary distributions of MySQL that are compiled at our site or at sites where customers kindly have given us access to their machines.
These distributions are generated with
scripts/make_binary_distribution
and are configured with the
following compilers and options:
gcc
2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-assembler
egcs
1.0.3a
CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
egcs
2.90.27
CC=gcc CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
gcc
2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
pgcc
2.90.29 (egcs
1.0.3a)
CFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentium -mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=complex
gcc
2.95.2
CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charset=complex
gcc
2.7-95q4
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.8.1
CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
gcc
2.8.0
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc
2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
Anyone who has more optimal options for any of the configurations listed above can always mail them to the developer's mailing list at internals@lists.mysql.com.
RPM distributions prior to MySQL Version 3.22 are user-contributed. Beginning with Version 3.22, some RPMs are generated by us at MySQL AB.
If you want to compile a debug version of MySQL, you should add
--with-debug
or --with-debug=full
to the above configure lines
and remove any -fomit-frame-pointer
options.
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> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld --user=mysql &
For a binary distribution, do this:
shell> cd mysql_installation_directory shell> ./bin/mysql_install_db 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
`/usr/local/libexec'.
Testing is described in detail below:
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
mysql_install_db
script:
shell> scripts/mysql_install_dbTypically,
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 6.13 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 14.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 20.10 How to Run MySQL As a Normal User.
If you have problems with mysql_install_db
, see
section 4.16.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:
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
tables!
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.
mysql_install_db
.
shell> cd mysql_installation_directory shell> bin/safe_mysqld &If you have problems starting the server, see section 4.16.2 Problems Starting the MySQL Server.
mysqladmin
to verify that the server is running. The following
commands provide a simple test to check that the server is up and responding
to connections:
shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variablesThe output from
mysqladmin version
varies slightly depending on your
platform and version of MySQL, but should be similar to that shown
below:
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: 16773KTo get a feeling for what else you can do with
BINDIR/mysqladmin
,
invoke it with the --help
option.
shell> BINDIR/mysqladmin -u root shutdown
safe_mysqld
or
by invoking mysqld
directly. For example:
shell> BINDIR/safe_mysqld --log &If
safe_mysqld
fails, try running it from the MySQL
installation directory (if you are not already there). If that doesn't work,
see section 4.16.2 Problems Starting the MySQL Server.
shell> BINDIR/mysqlshow +-----------+ | Databases | +-----------+ | mysql | +-----------+ shell> BINDIR/mysqlshow mysql Database: 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 shell> run-all-testsIf 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 this:
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tstThe 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
tables installed!
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:
mv mysql-data-directory/mysql mysql-data-directory/mysql-old mysql_install_db
This section lists problems you might encounter when you run
mysql_install_db
:
mysql_install_db
doesn't install the grant tables
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 endedIn 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
mysqlbug
!
See section 2.3 How to Report Bugs or Problems.
mysqld
daemon running
mysql_install_db
at
all. You have to run mysql_install_db
only once, when you install
MySQL the first time.
mysqld
daemon doesn't work when one daemon is running
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.17 Installing many servers on the same machine.
mysql_install_db
or when
starting or using mysqld
.
You can specify a different socket and temporary directory as follows:
shell> TMPDIR=/some_tmp_dir/ shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT`some_tmp_dir' should be the path to some directory for which you have write permission. See section A Environment Variables. After this you should be able to run
mysql_install_db
and start
the server with these commands:
shell> scripts/mysql_install_db shell> BINDIR/safe_mysqld &
mysqld
crashes immediately
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 at the online
MySQL documentation page.
Also, see section 4.12.5 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 mysqlFrom
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.
Generally, you start the mysqld
server in one of three ways:
mysql.server
. This script is used primarily at
system startup and shutdown, and is described more fully in
section 4.16.3 Starting and Stopping MySQL Automatically.
safe_mysqld
, which tries to determine the proper options
for mysqld
and then runs it with those options. See section 14.2 safe_mysqld, the wrapper around mysqld.
mysqld
as a service as follows:
bin\mysqld-nt --install # Install MySQL as a serviceYou can now start/stop
mysqld
as follows:
NET START mysql NET STOP mysqlNote 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
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 --help
must 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\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:
shell> tail host_name.err shell> tail host_name.log
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 started mysqld with --bdb-no-recover
and Berkeley DB found something wrong with it's 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
again.
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 or 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 4.16.1 Problems Running mysql_install_db and section 21.3 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 or 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:
127.0.0.1 localhost
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.
On Windows, you can try to start mysqld
as follows:
C:\mysql\bin\mysqld --standalone --debug
This will not run in the background and it should also write a trace in `\mysqld.trace', which may help you determine the source of your problems. See section 4.13 Windows Notes.
If you are using BDB (Berkeley DB) tables, you should familiarize yourself with the different BDB specific startup options. See section 8.5.3 BDB startup options.
The mysql.server
script can be used to start or stop the server
by invoking it with start
or stop
arguments:
shell> mysql.server start shell> mysql.server stop
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, you can change the mysql_daemon_user=root
line to use
another user. You can also modify mysql.server
to pass other
options to safe_mysqld
.
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:
/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
You can also add options for mysql.server
in a global
`/etc/my.cnf' file. A typical `/etc/my.cnf' file might look like
this:
[mysqld] datadir=/usr/local/mysql/var socket=/tmp/mysqld.sock port=3306 [mysql.server] user=mysql basedir=/usr/local/mysql
The mysql.server
script uses the following variables:
user
, datadir
, basedir
, bindir
, and
pid-file
.
The following table shows which option sections each of the startup script uses:
mysqld | mysqld and server
|
mysql.server | mysql.server , mysqld and server
|
safe_mysqld | mysql.server , mysqld and server
|
See section 4.16.5 Option Files.
mysqld
accepts the following command-line options:
--ansi
-b, --basedir=path
--big-tables
--bind-address=IP
--character-sets-dir=path
--chroot=path
LOAD DATA INFILE
and SELECT ... INTO OUTFILE
though.
-h, --datadir=path
--default-character-set=charset
--default-table-type=type
--delay-key-write-for-all-tables
MyISAM
table.
See section 12.2.3 Tuning Server Parameters.
--enable-locking
-T, --exit-info
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=file]
--log-isam[=file]
--log-slow-queries[=file]
long_query_time
seconds to
execute to file. See section 22.5 The Slow Query Log.
--log-update[=file]
file.#
where #
is a unique number if not given.
See section 22.3 The Update Log.
--log-long-format
--log-slow-queries
then queries that are not using indexes are logged
to the slow query log.
--low-priority-updates
INSERT
/DELETE
/UPDATE
)
will have lower priority than selects.
It can also be done via {INSERT | REPLACE | UPDATE | DELETE}
LOW_PRIORITY ...
to lower the priority of only one query, or by
SET OPTION SQL_LOW_PRIORITY_UPDATES=1
to change the
priority in one thread.
See section 12.2.9 Table Locking Issues.
--memlock
mysqld
process in memory. This works only if your system
supports the mlockall()
system call. This may help if you have
a problem where the operating system is causing mysqld
to swap on disk.
--myisam-recover [=option[,option...]]] where option is one of DEFAULT, BACKUP, FORCE or QUICK.
mysqld
will on open check if the table is
marked as crashed or if if the table wasn't closed properly
(The last option only works if you are running with --skip-locking
).
If this is the case mysqld will run check on the table. If the table was
corrupted, mysqld
will attempt to repair it.
The following options affects how the repair works.
DEFAULT | The same as not giving any option to --myisam-recover .
|
BACKUP | If the data table was changed during recover, save a backup of the `table_name.MYD' data file as `table_name-datetime.BAK'. |
FORCE | Run recover even if we will loose more than one row from the .MYD file. |
QUICK | Don't check the rows in the table if there isn't any delete blocks. |
BACKUP,FORCE
. This will force a repair of a table even if some rows
would be deleted, but it will keep the old data file as a backup so that
you can later examine what happened.
--pid-file=path
safe_mysqld
.
-P, --port=...
-o, --old-protocol
--one-thread
-O, --set-variable var=option
--help
lists variables.
You can find a full description for all variables in the SHOW VARIABLES
section in this manual. See section 7.28.4 SHOW VARIABLES.
The tuning server parameters section includes information of how to optimize
these. See section 12.2.3 Tuning Server Parameters.
--safe-mode
--skip-delay-key-write
.
--safe-show-database
--secure
gethostbyname()
system call are
checked to make sure they resolve back to the original hostname. This
makes it harder for someone on the outside to get access by pretending
to be another host. This option also adds some sanity checks of
hostnames. The option is turned off by default in MySQL Version 3.21
because sometimes it takes a long time to perform backward resolutions.
MySQL Version 3.22 caches hostnames (unless --skip-host-cache
is used) and has this option enabled by default.
--skip-concurrent-insert
MyISAM
tables. (This is only to be used if you think you have found a bug
in this feature).
--skip-delay-key-write
delay_key_write
option for all tables.
See section 12.2.3 Tuning Server Parameters.
-Sg, --skip-grant-tables
mysqladmin
flush-privileges
or mysqladmin reload
.)
--skip-locking
isamchk
or myisamchk
you must
shut down the server. See section 1.7 How Stable Is MySQL?. Note that in MySQL Version
3.23 you can use REPAIR
and CHECK
to repair/check MyISAM
tables.
--skip-name-resolve
Host
column values in the grant
tables must be IP numbers or localhost
. See section 12.2.10 How MySQL uses DNS.
--skip-networking
mysqld
must be made via Unix sockets.
This option is highly recommended for systems where only local requests
are allowed. See section 12.2.10 How MySQL uses DNS.
--skip-new
--skip-delay-key-write
.
This will also set default table type to ISAM
. See section 8.3 ISAM Tables.
--skip-host-cache
--skip-show-database
--skip-thread-priority
--socket=path
/tmp/mysql.sock
.
-t, --tmpdir=path
/tmp
directory resides on a partition too small to hold temporary tables.
-u, --user=user_name
mysqld
daemon as user user_name
. This option is
mandatory when starting mysqld
as root.
-V, --version
MySQL Version 3.22 can read default startup options for the server and for clients from option files.
MySQL reads default options from the following files on Unix:
Filename | Purpose |
/etc/my.cnf | Global options |
DATADIR/my.cnf | Server-specific options |
defaults-extra-file | The file specified with --defaults-extra-file=# |
~/.my.cnf | User-specific options |
DATADIR
is the MySQL data directory (typically
`/usr/local/mysql/data' for a binary installation or
`/usr/local/var' for a source installation). Note that this is the
directory that was specified at configuration time, not the one specified
with --datadir
when mysqld
starts up! (--datadir
has no
effect on where the server looks for option files, because it looks for them
before it processes any command-line arguments.)
MySQL reads default options from the following files on Windows:
Filename | Purpose |
windows-system-directory\my.ini | Global options |
C:\my.cnf | Global options |
C:\mysql\data\my.cnf | Server-specific options |
Note that on Windows, you should specify all paths with /
instead of
\
. If you use \
, you need to specify this twice, as
\
is the escape character in MySQL.
MySQL tries to read option files in the order listed above. If multiple option files exist, an option specified in a file read later takes precedence over the same option specified in a file read earlier. Options specified on the command line take precedence over options specified in any option file. Some options can be specified using environment variables. Options specified on the command line or in option files take precedence over environment variable values. See section A Environment Variables.
The following programs support option files: mysql
,
mysqladmin
, mysqld
, mysqldump
, mysqlimport
,
mysql.server
, myisamchk
, and myisampack
.
You can use option files to specify any long option that a program supports!
Run the program with --help
to get a list of available options.
An option file can contain lines of the following forms:
#comment
[group]
group
is the name of the program or group for which you want to set
options. After a group line, any option
or set-variable
lines
apply to the named group until the end of the option file or another group
line is given.
option
--option
on the command line.
option=value
--option=value
on the command line.
set-variable = variable=value
--set-variable variable=value
on the command line.
This syntax must be used to set a mysqld
variable.
The client
group allows you to specify options that apply to all
MySQL clients (not mysqld
). This is the perfect group to use
to specify the password you use to connect to the server. (But make
sure the option file is readable and writable only to yourself.)
Note that for options and values, all leading and trailing blanks are automatically deleted. You may use the escape sequences `\b', `\t', `\n', `\r', `\\', and `\s' in your value string (`\s' == blank).
Here is a typical global option file:
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick
Here is typical user option file:
[client] # The following password will be sent to all standard MySQL clients password=my_password [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysql-hot-copy] interactive-timeout
If you have a source distribution, you will find sample configuration
files named `my-xxxx.cnf' in the `support-files' directory.
If you have a binary distribution, look in the `DIR/share/mysql'
directory, where DIR
is the pathname to the MySQL
installation directory (typically `/usr/local/mysql'). Currently
there are sample configuration files for small, medium, large, and very
large systems. You can copy `my-xxxx.cnf' to your home directory
(rename the copy to `.my.cnf') to experiment with this.
All MySQL clients that support option files support the following options:
--no-defaults | Don't read any option files. |
--print-defaults | Print the program name and all options that it will get. |
--defaults-file=full-path-to-default-file | Only use the given configuration file. |
--defaults-extra-file=full-path-to-default-file | Read this configuration file after the global configuration file but before the user configuration file. |
Note that the above options must be first on the command line to work!
--print-defaults
may however be used directly after the
--defaults-xxx-file
commands.
Note for developers: Option file handling is implemented simply by processing all matching options (that is, options in the appropriate group) before any command-line arguments. This works nicely for programs that use the last instance of an option that is specified multiple times. If you have an old program that handles multiply-specified options this way but doesn't read option files, you need add only two lines to give it that capability. Check the source code of any of the standard MySQL clients to see how to do this.
In shell scripts you can use the `my_print_defaults' command to parse the config files:
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
The above output contains all options for the groups 'client' and 'mysql'.
In some cases you may want to have many different mysqld
deamons
(servers) running on the same machine. You may for example want to run
a new version of MySQL for testing together with an old version
that is in production. Another case is when you want to give different
users access to different mysqld servers that they manage themself.
One way to get a new server running is by starting it with a different socket and port as follows:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/safe_mysqld &
The environment variables appendix includes a list of other environment
variables you can use to affect mysqld
. See section A Environment Variables.
The above is the quick and dirty way that one commonly use for testing. The nice thing with this is that all connections you do in the above shell will automaticly be directed to the new running server!
If you need to do this more permanently, you should create an own option file for each server. See section 4.16.5 Option Files. In your startup script that is executed at boot time (mysql.server?) you should specify for both servers:
safe_mysqld --default-file=path-to-option-file
At least the following options should be different per server:
port=#
socket=path
pid-file=path
The following options should be different, if they are used:
log=path
log-bin=path
log-update=path
log-isam=path
bdb-logdir=path
If you want more performance, you can also specify the following differently:
tmpdir=path
bdb-tmpdir=path
See section 4.16.4 Command-line Options.
If you are installing binary MySQL versions (.tar files) and
start them with ./bin/safe_mysqld
then in most cases the only
option you need to add/change is the socket
and port
argument to safe_mysqld
.
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 may 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
or the Perl script
mysql_convert_table_format
.
Version 3.22 and 3.21 clients will work without any problems with a Version 3.23 server.
The following lists tell what you have to watch out for when upgrading to Version 3.23:
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.
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.
german
character sort order, you must repair
all your tables with isamchk -r
, as we have made some changes in
the sort order!
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.
DECIMAL(length,dec)
the length argument no
longer includes a place for the sign or the decimal point.
TIME
string must now be of one of the following formats:
[[[DAYS] [H]H:]MM:]SS[.fraction]
or
[[[[[H]H]H]H]MM]SS[.fraction]
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.
CHECK TABLE
or myisamchk
for MyISAM
tables (.MYI
) and
isamchk
for ISAM (.ISM
) tables.
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
.
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_FIELD
.
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.
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.
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
mysql_fix_privilege_tables
.
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
handler structure.
The mysqld
variable key_buffer
has changed names to
key_buffer_size
, but you can still use the old name in your
startup files.
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:
scripts/add_long_password
must be run to convert the
Password
field in the mysql.user
table to CHAR(16)
.
mysql.user
table (to get 62-bit
rather than 31-bit passwords).
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
places).
See section 23.5.2 The DBI
Interface.
The following changes may affect queries in old applications:
HAVING
must now be specified before any ORDER BY
clause.
LOCATE()
have been swapped.
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:
shell> mysqladmin -h 'other hostname' create db_name shell> mysqldump --opt db_name \ | mysql -h 'other hostname' db_name
If you want to copy a database from a remote machine over a slow network, you can use:
shell> mysqladmin create db_name shell> mysqldump -h 'other hostname' --opt --compress db_name \ | mysql db_name
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:
shell> mysqldump --quick db_name | gzip > db_name.contents.gz
(The file created in this example is compressed.) Transfer the file containing the database contents to the target machine and run these commands there:
shell> mysqladmin create db_name shell> gunzip < db_name.contents.gz | mysql db_name
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:
shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR db_name
Then transfer the files in the DUMPDIR
directory to some corresponding
directory on the target machine and load the files into MySQL
there:
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
information.
Go to the first, previous, next, last section, table of contents.