Table of Contents
This appendix lists common problems and errors that may occur and potential resolutions, in addition to listing the errors that may appear when you call MySQL from any host language. The first section covers problems and resolutions. Detailed information on errors is provided; The first list displays server error messages. The second list displays client program messages.
MySQL Enterprise The MySQL Enterprise Monitor provides a “Virtual DBA” to assist with problem solving. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
This section lists some common problems and error messages that you may encounter. It describes how to determine the causes of the problems and what to do to solve them.
When you run into a problem, the first thing you should do is to find out which program or piece of equipment is causing it:
If you have one of the following symptoms, then it is probably a hardware problems (such as memory, motherboard, CPU, or hard disk) or kernel problem:
The keyboard doesn't work. This can normally be checked by pressing the Caps Lock key. If the Caps Lock light doesn't change, you have to replace your keyboard. (Before doing this, you should try to restart your computer and check all cables to the keyboard.)
The mouse pointer doesn't move.
The machine doesn't answer to a remote machine's pings.
Other programs that are not related to MySQL don't behave correctly.
Your system restarted unexpectedly. (A faulty user-level program should never be able to take down your system.)
In this case, you should start by checking all your cables
and run some diagnostic tool to check your hardware! You
should also check whether there are any patches, updates, or
service packs for your operating system that could likely
solve your problem. Check also that all your libraries (such
as glibc
) are up to date.
It's always good to use a machine with ECC memory to discover memory problems early.
If your keyboard is locked up, you may be able to recover by
logging in to your machine from another machine and
executing kbd_mode -a
.
Please examine your system log file
(/var/log/messages
or similar) for
reasons for your problem. If you think the problem is in
MySQL, you should also examine MySQL's log files. See
Section 5.3, “MySQL Server Logs”.
If you don't think you have hardware problems, you should try to find out which program is causing problems. Try using top, ps, Task Manager, or some similar program, to check which program is taking all CPU or is locking the machine.
Use top, df, or a similar program to check whether you are out of memory, disk space, file descriptors, or some other critical resource.
If the problem is some runaway process, you can always try to kill it. If it doesn't want to die, there is probably a bug in the operating system.
If after you have examined all other possibilities and you have concluded that the MySQL server or a MySQL client is causing the problem, it's time to create a bug report for our mailing list or our support team. In the bug report, try to give a very detailed description of how the system is behaving and what you think is happening. You should also state why you think that MySQL is causing the problem. Take into consideration all the situations in this chapter. State any problems exactly how they appear when you examine your system. Use the “copy and paste” method for any output and error messages from programs and log files.
Try to describe in detail which program is not working and all symptoms you see. We have in the past received many bug reports that state only “the system doesn't work.” This doesn't provide us with any information about what could be the problem.
If a program fails, it's always useful to know the following information:
Has the program in question made a segmentation fault (did it dump core)?
Is the program taking up all available CPU time? Check with top. Let the program run for a while, it may simply be evaluating something computationally intensive.
If the mysqld server is causing problems, can you get any response from it with mysqladmin -u root ping or mysqladmin -u root processlist?
What does a client program say when you try to connect to the MySQL server? (Try with mysql, for example.) Does the client jam? Do you get any output from the program?
When sending a bug report, you should follow the outline described in Section 1.7, “How to Report Bugs or Problems”.
Access denied
Can't connect to [local] MySQL server
Lost connection to MySQL server
Client does not support authentication protocol
Host 'host_name
' is
blocked
Too many connections
Out of memory
MySQL server has gone away
Packet too large
The table is full
Can't create/write to file
Commands out of sync
Ignoring user
Table 'tbl_name
' doesn't
exist
Can't initialize character set
File
' Not Found and
Similar ErrorsThis section lists some errors that users frequently encounter when running MySQL programs. Although the problems show up when you try to run client programs, the solutions to many of the problems involves changing the configuration of the MySQL server.
An Access denied
error can have many
causes. Often the problem is related to the MySQL accounts
that the server allows client programs to use when connecting.
See Section 5.5.8, “Causes of Access denied
Errors”, and
Section 5.5.2, “How the Privilege System Works”.
A MySQL client on Unix can connect to the
mysqld server in two different ways: By
using a Unix socket file to connect through a file in the
filesystem (default /tmp/mysql.sock
), or
by using TCP/IP, which connects through a port number. A Unix
socket file connection is faster than TCP/IP, but can be used
only when connecting to a server on the same computer. A Unix
socket file is used if you don't specify a hostname or if you
specify the special hostname localhost
.
If the MySQL server is running on Windows 9x or Me, you can
connect only via TCP/IP. If the server is running on Windows
NT, 2000, XP, or 2003 and is started with the
--enable-named-pipe
option, you can also
connect with named pipes if you run the client on the host
where the server is running. The name of the named pipe is
MySQL
by default. If you don't give a
hostname when connecting to mysqld, a MySQL
client first tries to connect to the named pipe. If that
doesn't work, it connects to the TCP/IP port. You can force
the use of named pipes on Windows by using
.
as the hostname.
The error (2002) Can't connect to ...
normally means that there is no MySQL server running on the
system or that you are using an incorrect Unix socket filename
or TCP/IP port number when trying to connect to the server.
The error (2003) Can't connect to MySQL server on
'
indicates that the network connection has been refused. You
should check that there is a MySQL server running, that it has
network connections enabled, the network port you specified is
the one configured on the server, and that the TCP/IP port you
are using has not been blocked by a firewall or port blocking
service.
server
' (10061)
Start by checking whether there is a process named mysqld running on your server host. (Use ps xa | grep mysqld on Unix or the Task Manager on Windows.) If there is no such process, you should start the server. See Section 2.10.2.3, “Starting and Troubleshooting the MySQL Server”.
If a mysqld process is running, you can
check it by trying the following commands. The port number or
Unix socket filename might be different in your setup.
host_ip
represents the IP number of the
machine where the server is running.
shell>mysqladmin version
shell>mysqladmin variables
shell>mysqladmin -h `hostname` version variables
shell>mysqladmin -h `hostname` --port=3306 version
shell>mysqladmin -h host_ip version
shell>mysqladmin --protocol=socket --socket=/tmp/mysql.sock version
Note the use of backticks rather than forward quotes with the
hostname
command; these cause the output of
hostname
(that is, the current hostname) to
be substituted into the mysqladmin command.
If you have no hostname
command or are
running on Windows, you can manually type the hostname of your
machine (without backticks) following the
-h
option. You can also try -h
127.0.0.1
to connect with TCP/IP to the local host.
Here are some reasons the Can't connect to local
MySQL server
error might occur:
mysqld is not running. Check your operating system's process list to ensure the mysqld process is present.
You're running a MySQL server on Windows with many TCP/IP
connections to it. If you're experiencing that quite often
your clients get that error, you can find a workaround
here:
Section A.1.2.2.1, “Connection to MySQL Server Failing on Windows
”.
You are running on a system that uses MIT-pthreads. If you are running on a system that doesn't have native threads, mysqld uses the MIT-pthreads package. See Section 2.1.1, “Operating Systems On Which MySQL Is Known To Run”. However, not all MIT-pthreads versions support Unix socket files. On a system without socket file support, you must always specify the hostname explicitly when connecting to the server. Try using this command to check the connection to the server:
shell> mysqladmin -h `hostname` version
Someone has removed the Unix socket file that
mysqld uses
(/tmp/mysql.sock
by default). For
example, you might have a cron job that
removes old files from the /tmp
directory. You can always run mysqladmin
version to check whether the Unix socket file
that mysqladmin is trying to use really
exists. The fix in this case is to change the
cron job to not remove
mysql.sock
or to place the socket
file somewhere else. See
Section A.1.4.5, “How to Protect or Change the MySQL Unix Socket File”.
You have started the mysqld server with
the --socket=/path/to/socket
option, but
forgotten to tell client programs the new name of the
socket file. If you change the socket pathname for the
server, you must also notify the MySQL clients. You can do
this by providing the same --socket
option when you run client programs. You also need to
ensure that clients have permission to access the
mysql.sock
file. To find out where
the socket file is, you can do:
shell> netstat -ln | grep mysql
See Section A.1.4.5, “How to Protect or Change the MySQL Unix Socket File”.
You are using Linux and one server thread has died (dumped core). In this case, you must kill the other mysqld threads (for example, with kill or with the mysql_zap script) before you can restart the MySQL server. See Section A.1.4.2, “What to Do If MySQL Keeps Crashing”.
The server or client program might not have the proper
access privileges for the directory that holds the Unix
socket file or the socket file itself. In this case, you
must either change the access privileges for the directory
or socket file so that the server and clients can access
them, or restart mysqld with a
--socket
option that specifies a socket
filename in a directory where the server can create it and
where client programs can access it.
If you get the error message Can't connect to MySQL
server on some_host
, you can try the following
things to find out what the problem is:
Check whether the server is running on that host by
executing telnet some_host 3306
and
pressing the Enter key a couple of times. (3306 is the
default MySQL port number. Change the value if your server
is listening to a different port.) If there is a MySQL
server running and listening to the port, you should get a
response that includes the server's version number. If you
get an error such as telnet: Unable to connect to
remote host: Connection refused
, then there is
no server running on the given port.
If the server is running on the local host, try using
mysqladmin -h localhost variables to
connect using the Unix socket file. Verify the TCP/IP port
number that the server is configured to listen to (it is
the value of the port
variable.)
Make sure that your mysqld server was
not started with the --skip-networking
option. If it was, you cannot connect to it using TCP/IP.
Check to make sure that there is no firewall blocking access to MySQL. Your firewall may be configured on the basis of the application being executed, or the post number used by MySQL for communication (3306 by default).
Under Linux or Unix, check your IP tables (or similar) configuration to ensure that the port has not been blocked.
Under Windows, applications such as ZoneAlarm and the Windows XP personal firewall may need to be configured to allow external access to a MySQL server.
If you are running under Linux and Security-Enhanced Linux
(SELinux) is enabled, make sure you have disabled SELinux
protection for the mysqld
process.
When you're running a MySQL server on Windows with many
TCP/IP connections to it, and you're experiencing that quite
often your clients get a Can't connect to MySQL
server
error, the reason might be that Windows
doesn't allow for enough ephemeral (short-lived) ports to
serve those connections.
By default, Windows allows 5000 ephemeral (short-lived) TCP
ports to the user. After any port is closed it will remain
in a TIME_WAIT
status for 120 seconds.
This status allows the connection to be reused at a much
lower cost than reinitializing a brand new connection.
However, the port will not be available again until this
time expires.
With a small stack of available TCP ports (5000) and a high
number of TCP ports being open and closed over a short
period of time along with the TIME_WAIT
status you have a good chance for running out of ports.
There are two ways to address this problem:
Reduce the number of TCP ports consumed quickly by investigating connection pooling or persistent connections where possible
Tune some settings in the Windows registry (see below)
IMPORTANT: The following procedure involves modifying the Windows registry. Before you modify the registry, make sure to back it up and make sure that you understand how to restore the registry if a problem occurs. For information about how to back up, restore, and edit the registry, view the following article in the Microsoft Knowledge Base: http://support.microsoft.com/kb/256986/EN-US/.
Start Registry Editor
(Regedt32.exe
).
Locate the following key in the registry:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
On the Edit
menu, click Add
Value
, and then add the following registry
value:
Value Name: MaxUserPort Data Type: REG_DWORD Value: 65534
This sets the number of ephemeral ports available to any user. The valid range is between 5000 and 65534 (decimal). The default value is 0x1388 (5000 decimal).
On the Edit
menu, click Add
Value
, and then add the following registry
value:
Value Name: TcpTimedWaitDelay Data Type: REG_DWORD Value: 30
This sets the number of seconds to hold a TCP port
connection in TIME_WAIT
state before
closing. The valid range is between 0 (zero) and 300
(decimal). The default value is 0x78 (120 decimal).
Quit Registry Editor.
Reboot the machine.
Note: Undoing the above should be as simple as deleting the registry entries you've created.
An error of the form Lost connection to MySQL server
at '
can indicate that
the server's XXX
', system error:
errno
connect_timeout
value is set
too low.
MySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is incompatible with that used by older clients. If you upgrade the server from 4.0, attempts to connect to it with an older client may fail with the following message:
shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
To solve this problem, you should use one of the following approaches:
Upgrade all client programs to use a 4.1.1 or newer client library.
When connecting to the server with a pre-4.1 client program, use an account that still has a pre-4.1-style password.
Reset the password to pre-4.1 style for each user that
needs to use a pre-4.1 client program. This can be done
using the SET PASSWORD
statement and
the OLD_PASSWORD()
function:
mysql>SET PASSWORD FOR
->'
some_user
'@'some_host
' = OLD_PASSWORD('newpwd
');
Alternatively, use UPDATE
and
FLUSH PRIVILEGES
:
mysql>UPDATE mysql.user SET Password = OLD_PASSWORD('
->newpwd
')WHERE Host = '
mysql>some_host
' AND User = 'some_user
';FLUSH PRIVILEGES;
Substitute the password you want to use for
“newpwd
” in the
preceding examples. MySQL cannot tell you what the
original password was, so you'll need to pick a new one.
Tell the server to use the older password hashing algorithm:
Start mysqld with the
--old-passwords
option.
Assign an old-format password to each account that has had its password updated to the longer 4.1 format. You can identify these accounts with the following query:
mysql>SELECT Host, User, Password FROM mysql.user
->WHERE LENGTH(Password) > 16;
For each account record displayed by the query, use
the Host
and
User
values and assign a password
using the
OLD_PASSWORD()
function and either SET PASSWORD
or
UPDATE
, as described earlier.
In PHP, the standard mysql
extension does
not support the new authentication protocol in MySQL 4.1.1
and higher. This is true regardless of the PHP version being
used. If you wish to use the mysql
extension with MySQL 4.1 or newer, you will need to follow
one of the options discussed above for configuring MySQL to
work with old clients. The mysqli
extension (stands for "MySQL, Improved"; new in PHP 5)
is compatible with the
improved password hashing employed in MySQL 4.1 and higher,
and no special configuration of MySQL need be done to use
this newer MySQL client library for PHP. For more
information about the mysqli
extension,
see http://php.net/mysqli.
It may also be possible to compile the older
mysql
extension against the new MySQL
client library. This is beyond the scope of this Manual;
consult the PHP documentation for more information. You also
be able to obtain assistance with these issues in our
MySQL with PHP
forum.
For additional background on password hashing and authentication, see Section 5.5.9, “Password Hashing as of MySQL 4.1”.
MySQL client programs prompt for a password when invoked with
a --password
or -p
option
that has no following password value:
shell> mysql -u user_name
-p
Enter password:
On some systems, you may find that your password works when
specified in an option file or on the command line, but not
when you enter it interactively at the Enter
password:
prompt. This occurs when the library
provided by the system to read passwords limits password
values to a small number of characters (typically eight). That
is a problem with the system library, not with MySQL. To work
around it, change your MySQL password to a value that is eight
or fewer characters long, or put your password in an option
file.
If you get the following error, it means that
mysqld has received many connect requests
from the host
'
that
have been interrupted in the middle:
host_name
'
Host 'host_name
' is blocked because of many connection errors.
Unblock with 'mysqladmin flush-hosts'
The number of interrupted connect requests allowed is
determined by the value of the
max_connect_errors
system variable. After
max_connect_errors
failed requests,
mysqld assumes that something is wrong (for
example, that someone is trying to break in), and blocks the
host from further connections until you execute a
mysqladmin flush-hosts command or issue a
FLUSH HOSTS
statement. See
Section 5.1.3, “System Variables”.
By default, mysqld blocks a host after 10 connection errors. You can adjust the value by starting the server like this:
shell> mysqld_safe --max_connect_errors=10000 &
If you get this error message for a given host, you should
first verify that there isn't anything wrong with TCP/IP
connections from that host. If you are having network
problems, it does you no good to increase the value of the
max_connect_errors
variable.
If you get a Too many connections
error
when you try to connect to the mysqld
server, this means that all available connections are in use
by other clients.
The number of connections allowed is controlled by the
max_connections
system variable. Its
default value is 100. If you need to support more connections,
you should set a larger value for this variable.
MySQL Enterprise
Subscribers to the MySQL Enterprise Monitor receive advice
on dynamically configuring the
max_connections
variable — avoiding
failed connection attempts. For more information, see
http://www.mysql.com/products/enterprise/advisors.html.
mysqld actually allows
max_connections+1
clients to connect. The
extra connection is reserved for use by accounts that have the
SUPER
privilege. By granting the
SUPER
privilege to administrators and not
to normal users (who should not need it), an administrator can
connect to the server and use SHOW
PROCESSLIST
to diagnose problems even if the maximum
number of unprivileged clients are connected. See
Section 12.5.4.16, “SHOW PROCESSLIST
Syntax”.
The maximum number of connections MySQL can support depends on the quality of the thread library on a given platform. Linux or Solaris should be able to support 500-1000 simultaneous connections, depending on how much RAM you have and what your clients are doing. Static Linux binaries provided by MySQL AB can support up to 4000 connections.
If you issue a query using the mysql client program and receive an error like the following one, it means that mysql does not have enough memory to store the entire query result:
mysql: Out of memory at line 42, 'malloc.c' mysql: needed 8136 byte (8k), memory in use: 12481367 bytes (12189k) ERROR 2008: MySQL client ran out of memory
To remedy the problem, first check whether your query is
correct. Is it reasonable that it should return so many rows?
If not, correct the query and try again. Otherwise, you can
invoke mysql with the
--quick
option. This causes it to use the
mysql_use_result()
C API
function to retrieve the result set, which places less of a
load on the client (but more on the server).
This section also covers the related Lost connection
to server during query
error.
The most common reason for the MySQL server has gone
away
error is that the server timed out and closed
the connection. In this case, you normally get one of the
following error codes (which one you get is operating
system-dependent):
Error Code | Description |
CR_SERVER_GONE_ERROR | The client couldn't send a question to the server. |
CR_SERVER_LOST | The client didn't get an error when writing to the server, but it didn't get a full answer (or any answer) to the question. |
By default, the server closes the connection after eight hours
if nothing has happened. You can change the time limit by
setting the wait_timeout
variable when you
start mysqld. See
Section 5.1.3, “System Variables”.
If you have a script, you just have to issue the query again
for the client to do an automatic reconnection. This assumes
that you have automatic reconnection in the client enabled
(which is the default for the mysql
command-line client).
Some other common reasons for the MySQL server has
gone away
error are:
You (or the db administrator) has killed the running
thread with a KILL
statement or a
mysqladmin kill command.
You tried to run a query after closing the connection to the server. This indicates a logic error in the application that should be corrected.
A client application running on a different host does not have the necessary privileges to connect to the MySQL server from that host.
You got a timeout from the TCP/IP connection on the client
side. This may happen if you have been using the commands:
mysql_options(...,
MYSQL_OPT_READ_TIMEOUT,...)
or
mysql_options(...,
MYSQL_OPT_WRITE_TIMEOUT,...)
. In this case
increasing the timeout may help solve the problem.
You have encountered a timeout on the server side and the
automatic reconnection in the client is disabled (the
reconnect
flag in the
MYSQL
structure is equal to 0).
You are using a Windows client and the server had dropped
the connection (probably because
wait_timeout
expired) before the
command was issued.
The problem on Windows is that in some cases MySQL doesn't get an error from the OS when writing to the TCP/IP connection to the server, but instead gets the error when trying to read the answer from the connection.
In this case, even if the reconnect
flag in the MYSQL
structure is equal to
1, MySQL does not automatically reconnect and re-issue the
query as it doesn't know if the server did get the
original query or not.
The solution to this is to either do a
mysql_ping()
on the
connection if there has been a long time since the last
query (this is what MyODBC
does) or set
wait_timeout
on the
mysqld server so high that it in
practice never times out.
You can also get these errors if you send a query to the
server that is incorrect or too large. If
mysqld receives a packet that is too
large or out of order, it assumes that something has gone
wrong with the client and closes the connection. If you
need big queries (for example, if you are working with big
BLOB
columns), you can increase the
query limit by setting the server's
max_allowed_packet
variable, which has
a default value of 1MB. You may also need to increase the
maximum packet size on the client end. More information on
setting the packet size is given in
Section A.1.2.10, “Packet too large
”.
An INSERT
or REPLACE
statement that inserts a great many rows can also cause
these sorts of errors. Either one of these statements
sends a single request to the server irrespective of the
number of rows to be inserted; thus, you can often avoid
the error by reducing the number of rows sent per
INSERT
or REPLACE
.
You also get a lost connection if you are sending a packet 16MB or larger if your client is older than 4.0.8 and your server is 4.0.8 and above, or the other way around.
It is also possible to see this error if hostname lookups fail (for example, if the DNS server on which your server or network relies goes down). This is because MySQL is dependent on the host system for name resolution, but has no way of knowing whether it is working — from MySQL's point of view the problem is indistinguishable from any other network timeout.
You may also see the MySQL server has gone
away
error if MySQL is started with the
--skip-networking
option.
Another networking issue that can cause this error occurs if the MySQL port (default 3306) is blocked by your firewall, thus preventing any connections at all to the MySQL server.
You can also encounter this error with applications that fork child processes, all of which try to use the same connection to the MySQL server. This can be avoided by using a separate connection for each child process.
You have encountered a bug where the server died while executing the query.
You can check whether the MySQL server died and restarted by executing mysqladmin version and examining the server's uptime. If the client connection was broken because mysqld crashed and restarted, you should concentrate on finding the reason for the crash. Start by checking whether issuing the query again kills the server again. See Section A.1.4.2, “What to Do If MySQL Keeps Crashing”.
You can get more information about the lost connections by
starting mysqld with the --log-warnings=2
option. This logs some of the disconnected errors in the
hostname.err
file. See
Section 5.3.1, “The Error Log”.
If you want to create a bug report regarding this problem, be sure that you include the following information:
Indicate whether the MySQL server died. You can find information about this in the server error log. See Section A.1.4.2, “What to Do If MySQL Keeps Crashing”.
If a specific query kills mysqld and
the tables involved were checked with CHECK
TABLE
before you ran the query, can you provide
a reproducible test case? See
MySQL
Internals: Porting.
What is the value of the wait_timeout
system variable in the MySQL server? (mysqladmin
variables gives you the value of this variable.)
Have you tried to run mysqld with the
--log
option to determine whether the
problem query appears in the log?
See also Section A.1.2.11, “Communication Errors and Aborted Connections”, and Section 1.7, “How to Report Bugs or Problems”.
A communication packet is a single SQL statement sent to the MySQL server, a single row that is sent to the client, or a binary log event sent from a master replication server to a slave.
In MySQL 3.23, the largest possible packet is 16MB, due to limits in the client/server protocol. In MySQL 4.0.1 and up, the limit is 1GB.
When a MySQL client or the mysqld server
receives a packet bigger than
max_allowed_packet
bytes, it issues a
Packet too large
error and closes the
connection. With some clients, you may also get a
Lost connection to MySQL server during
query
error if the communication packet is too
large.
Both the client and the server have their own
max_allowed_packet
variable, so if you want
to handle big packets, you must increase this variable both in
the client and in the server.
If you are using the mysql client program,
its default max_allowed_packet
variable is
16MB. That is also the maximum value before MySQL 4.0. To set
a larger value from 4.0 on, start mysql
like this:
shell> mysql --max_allowed_packet=32M
That sets the packet size to 32MB.
The server's default max_allowed_packet
value is 1MB. You can increase this if the server needs to
handle big queries (for example, if you are working with big
BLOB
columns). For example, to set the
variable to 16MB, start the server like this:
shell> mysqld --max_allowed_packet=16M
Before MySQL 4.0, use this syntax instead:
shell> mysqld --set-variable=max_allowed_packet=16M
You can also use an option file to set
max_allowed_packet
. For example, to set the
size for the server to 16MB, add the following lines in an
option file:
[mysqld] max_allowed_packet=16M
Before MySQL 4.0, use this syntax instead:
[mysqld] set-variable = max_allowed_packet=16M
It's safe to increase the value of this variable because the extra memory is allocated only when needed. For example, mysqld allocates more memory only when you issue a long query or when mysqld must return a large result row. The small default value of the variable is a precaution to catch incorrect packets between the client and server and also to ensure that you don't run out of memory by using large packets accidentally.
You can also get strange problems with large packets if you
are using large BLOB
values but have not
given mysqld access to enough memory to
handle the query. If you suspect this is the case, try adding
ulimit -d 256000 to the beginning of the
mysqld_safe script and restarting
mysqld.
The server error log can be a useful source of information
about connection problems. See Section 5.3.1, “The Error Log”.
Starting with MySQL 3.23.40, if you start the server with the
--warnings
option (or
--log-warnings
from MySQL 4.0.3 on), you
might find messages like this in your error log:
010301 14:38:23 Aborted connection 854 to db: 'users' user: 'josh'
If Aborted connections
messages appear in
the error log, the cause can be any of the following:
The client program did not call
mysql_close()
before
exiting.
The client had been sleeping more than
wait_timeout
or
interactive_timeout
seconds without
issuing any requests to the server. See
Section 5.1.3, “System Variables”.
The client program ended abruptly in the middle of a data transfer.
When any of these things happen, the server increments the
Aborted_clients
status variable.
The server increments the Aborted_connects
status variable when the following things happen:
A client doesn't have privileges to connect to a database.
A client uses an incorrect password.
A connection packet doesn't contain the right information.
It takes more than connect_timeout
seconds to get a connect packet. See
Section 5.1.3, “System Variables”.
If these kinds of things happen, it might indicate that someone is trying to break into your server!
MySQL Enterprise
For reasons of security and performance the advisors
provided by the MySQL Enterprise Monitor pay special
attention to the Aborted_connections
status variable. For more information, see
http://www.mysql.com/products/enterprise/advisors.html.
Other reasons for problems with aborted clients or aborted connections:
Use of Ethernet protocol with Linux, both half and full duplex. Many Linux Ethernet drivers have this bug. You should test for this bug by transferring a huge file via FTP between the client and server machines. If a transfer goes in burst-pause-burst-pause mode, you are experiencing a Linux duplex syndrome. The only solution is switching the duplex mode for both your network card and hub/switch to either full duplex or to half duplex and testing the results to determine the best setting.
Some problem with the thread library that causes interrupts on reads.
Badly configured TCP/IP.
Faulty Ethernets, hubs, switches, cables, and so forth. This can be diagnosed properly only by replacing hardware.
The max_allowed_packet
variable value
is too small or queries require more memory than you have
allocated for mysqld. See
Section A.1.2.10, “Packet too large
”.
The effective maximum table size for MySQL databases is usually determined by operating system constraints on file sizes, not by MySQL internal limits. The following table lists some examples of operating system file-size limits. This is only a rough guide and is not intended to be definitive. For the most up-to-date information, be sure to check the documentation specific to your operating system.
Operating System | File-size Limit |
Win32 w/ FAT/FAT32 | 2GB/4GB |
Win32 w/ NTFS | 2TB (possibly larger) |
Linux 2.2-Intel 32-bit | 2GB (LFS: 4GB) |
Linux 2.4+ | (using ext3 filesystem) 4TB |
Solaris 9/10 | 16TB |
MacOS X w/ HFS+ | 2TB |
NetWare w/NSS filesystem | 8TB |
Windows users, please note that FAT and VFAT (FAT32) are not considered suitable for production use with MySQL. Use NTFS instead.
On Linux 2.2, you can get MyISAM
tables
larger than 2GB in size by using the Large File Support (LFS)
patch for the ext2 filesystem. Most current Linux
distributions are based on kernel 2.4 or higher and include
all the required LFS patches. On Linux 2.4, patches also exist
for ReiserFS to get support for big files (up to 2TB). With
JFS and XFS, petabyte and larger files are possible on Linux.
For a detailed overview about LFS in Linux, have a look at Andreas Jaeger's Large File Support in Linux page at http://www.suse.de/~aj/linux_lfs.html.
If you do encounter a full-table error, there are several reasons why it might have occurred:
You are using a MySQL server older than 3.23 and an
in-memory temporary table becomes larger than
tmp_table_size
bytes. To avoid this
problem, you can use the
--tmp_table_size=
option to make mysqld increase the
temporary table size or use the SQL option
val
SQL_BIG_TABLES
before you issue the
problematic query. See Section 12.5.3, “SET
Syntax”.
Under Windows you may get an error OS error code
22: Invalid argument
if you are using NTFS file
system compression and the size od your data or temporary
table files exceesds 30GB. This is due to a limitation in
the NTFS file system that it is unable to compress files
of this size. See
http://msdn2.microsoft.com/en-us/library/aa364219.aspx.
You can also start mysqld with the
--big-tables
option. This is exactly the
same as using SQL_BIG_TABLES
for all
queries.
As of MySQL 3.23, this problem should not occur. If an
in-memory temporary table becomes larger than
tmp_table_size
, the server
automatically converts it to a disk-based
MyISAM
table.
The InnoDB
storage engine maintains
InnoDB
tables within a tablespace that
can be created from several files. This allows a table to
exceed the maximum individual file size. The tablespace
can include raw disk partitions, which allows extremely
large tables. The maximum tablespace size is 64TB.
If you are using InnoDB
tables and run
out of room in the InnoDB
tablespace.
In this case, the solution is to extend the
InnoDB
tablespace. See
Section 13.2.8, “Adding and Removing InnoDB
Data and Log Files”.
You are using ISAM
or
MyISAM
tables on an operating system
that supports files only up to 2GB in size and you have
hit this limit for the data file or index file.
You are using a MyISAM
table and the
space required for the table exceeds what is allowed by
the internal pointer size. MyISAM
creates tables to allow up to 4GB by default, but this
limit can be changed up to the maximum allowable size of
65,536TB (2567 – 1
bytes).
If you need a MyISAM
table that is
larger than the default limit and your operating system
supports large files, the CREATE TABLE
statement supports AVG_ROW_LENGTH
and
MAX_ROWS
options. See
Section 12.1.5, “CREATE TABLE
Syntax”. The server uses these
options to determine how large a table to allow.
If the pointer size is too small for an existing table,
you can change the options with ALTER
TABLE
to increase a table's maximum allowable
size. See Section 12.1.2, “ALTER TABLE
Syntax”.
ALTER TABLEtbl_name
MAX_ROWS=1000000000 AVG_ROW_LENGTH=nnn
;
You have to specify AVG_ROW_LENGTH
only
for tables with BLOB
or
TEXT
columns; in this case, MySQL can't
optimize the space required based only on the number of
rows.
To change the default size limit for
MyISAM
tables, set the
myisam_data_pointer_size
, which sets
the number of bytes used for internal row pointers. The
value is used to set the pointer size for new tables if
you do not specify the MAX_ROWS
option.
The value of myisam_data_pointer_size
can be from 2 to 7. A value of 4 allows tables up to 4GB;
a value of 6 allows tables up to 256TB.
You can check the maximum data and index sizes by using this statement:
SHOW TABLE STATUS FROMdb_name
LIKE 'tbl_name
';
You also can use myisamchk -dv
/path/to/table-index-file. See
Section 12.5.4, “SHOW
Syntax”, or Section 4.6.2, “myisamchk — MyISAM Table-Maintenance Utility”.
Other ways to work around file-size limits for
MyISAM
tables are as follows:
If your large table is read only, you can use myisampack to compress it. myisampack usually compresses a table by at least 50%, so you can have, in effect, much bigger tables. myisampack also can merge multiple tables into a single table. See Section 4.6.4, “myisampack — Generate Compressed, Read-Only MyISAM Tables”.
You can also get around the operating system file
limit for MyISAM
data files by
using the RAID
options for
CREATE TABLE
. See
Section 12.1.5, “CREATE TABLE
Syntax”.
MySQL includes a MERGE
library that
allows you to handle a collection of
MyISAM
tables that have identical
structure as a single MERGE
table.
See Section 13.3, “The MERGE
Storage Engine”.
You are using the NDB
storage engine,
in which case you need to increase the values for the
DataMemory
and
IndexMemory
configuration parameters in
your config.ini
file. See
Section 14.3.5.1, “Data Node Configuration Parameters”.
You are using the MEMORY
(HEAP
) storage engine; in this case you
need to increase the value of the
max_heap_table_size
system variable.
See Section 5.1.3, “System Variables”.
If you get an error of the following type for some queries, it means that MySQL cannot create a temporary file for the result set in the temporary directory:
Can't create/write to file '\\sqla3fe_0.ism'.
The preceding error is a typical message for Windows; the Unix message is similar.
One fix is to start mysqld with the
--tmpdir
option or to add the option to the
[mysqld]
section of your option file. For
example, to specify a directory of
C:\temp
, use these lines:
[mysqld] tmpdir=C:/temp
The C:\temp
directory must exist and have
sufficient space for the MySQL server to write to. See
Section 4.2.2.2, “Using Option Files”.
Another cause of this error can be permissions issues. Make
sure that the MySQL server can write to the
tmpdir
directory.
Check also the error code that you get with perror. One reason the server cannot write to a table is that the filesystem is full:
shell> perror 28
OS error code 28: No space left on device
If you get an error of the following type during startup, it indicates that the filesystem and/or directory used for storing data files is write protected. Providing the write error is to a test file, This error is not serious and can be safely ignored.
Can't create test file /usr/local/mysql/data/master.lower-test
If you get Commands out of sync; you can't run this
command now
in your client code, you are calling
client functions in the wrong order.
This can happen, for example, if you are using
mysql_use_result()
and try to
execute a new query before you have called
mysql_free_result()
. It can
also happen if you try to execute two queries that return data
without calling
mysql_use_result()
or
mysql_store_result()
in
between.
If you get the following error, it means that when
mysqld was started or when it reloaded the
grant tables, it found an account in the
user
table that had an invalid password.
Found wrong password for user
'
some_user
'@'some_host
';
ignoring user
As a result, the account is simply ignored by the permission system.
The following list indicates possible causes of and fixes for this problem:
You may be running a new version of
mysqld with an old
user
table. You can check this by
executing mysqlshow mysql user to see
whether the Password
column is shorter
than 16 characters. If so, you can correct this condition
by running the
scripts/add_long_password
script.
The account has an old password (eight characters long)
and you didn't start mysqld with the
--old-protocol
option. Update the account
in the user
table to have a new
password or restart mysqld with the
--old-protocol
option.
You have specified a password in the
user
table without using the
PASSWORD()
function. Use
mysql to update the account in the
user
table with a new password, making
sure to use the PASSWORD()
function:
mysql>UPDATE user SET Password=PASSWORD('
->newpwd
')WHERE User='
some_user
' AND Host='some_host
';
If you get either of the following errors, it usually means that no table exists in the default database with the given name:
Table 'tbl_name
' doesn't exist Can't find file: 'tbl_name
' (errno: 2)
In some cases, it may be that the table does exist but that you are referring to it incorrectly:
Because MySQL uses directories and files to store databases and tables, database and table names are case sensitive if they are located on a filesystem that has case-sensitive filenames.
Even for filesystems that are not case sensitive, such as on Windows, all references to a given table within a query must use the same lettercase.
You can check which tables are in the default database with
SHOW TABLES
. See Section 12.5.4, “SHOW
Syntax”.
You might see an error like this if you have character set problems:
MySQL Connection Failed: Can't initialize character set charset_name
This error can have any of the following causes:
The character set is a multi-byte character set and you
have no support for the character set in the client. In
this case, you need to recompile the client by running
configure with the
--with-charset=
or
charset_name
--with-extra-charsets=
option. See Section 2.9.2, “Typical configure Options”.
charset_name
All standard MySQL binaries are compiled with
--with-extra-character-sets=complex
,
which enables support for all multi-byte character sets.
See Section 9.2, “The Character Set Used for Data and Sorting”.
The character set is a simple character set that is not compiled into mysqld, and the character set definition files are not in the place where the client expects to find them.
In this case, you need to use one of the following methods to solve the problem:
Recompile the client with support for the character set. See Section 2.9.2, “Typical configure Options”.
Specify to the client the directory where the
character set definition files are located. For many
clients, you can do this with the
--character-sets-dir
option.
Copy the character definition files to the path where the client expects them to be.
If you get ERROR '...' not found (errno:
23)
, Can't open file: ... (errno:
24)
, or any other error with errno
23
or errno 24
from MySQL, it
means that you haven't allocated enough file descriptors for
the MySQL server. You can use the perror
utility to get a description of what the error number means:
shell>perror 23
OS error code 23: File table overflow shell>perror 24
OS error code 24: Too many open files shell>perror 11
OS error code 11: Resource temporarily unavailable
The problem here is that mysqld is trying to keep open too many files simultaneously. You can either tell mysqld not to open so many files at once or increase the number of file descriptors available to mysqld.
To tell mysqld to keep open fewer files at
a time, you can make the table cache smaller by reducing the
value of the table_cache
system variable
(the default value is 64). Reducing the value of
max_connections
also reduces the number of
open files (the default value is 100).
To change the number of file descriptors available to
mysqld, you can use the
--open-files-limit
option to
mysqld_safe or (as of MySQL 3.23.30) set
the open_files_limit
system variable. See
Section 5.1.3, “System Variables”. The easiest way to
set these values is to add an option to your option file. See
Section 4.2.2.2, “Using Option Files”. If you have an old version of
mysqld that doesn't support setting the
open files limit, you can edit the
mysqld_safe script. There is a
commented-out line ulimit -n 256 in the
script. You can remove the “#
”
character to uncomment this line, and change the number
256
to set the number of file descriptors
to be made available to mysqld.
--open-files-limit
and
ulimit can increase the number of file
descriptors, but only up to the limit imposed by the operating
system. There is also a “hard” limit that can be
overridden only if you start mysqld_safe or
mysqld as root
(just
remember that you also need to start the server with the
--user
option in this case so that it does
not continue to run as root
after it starts
up). If you need to increase the operating system limit on the
number of file descriptors available to each process, consult
the documentation for your system.
If you run the tcsh shell, ulimit does not work! tcsh also reports incorrect values when you ask for the current limits. In this case, you should start mysqld_safe using sh.
If you have started mysqld with
--myisam-recover
, MySQL automatically checks
and tries to repair MyISAM
tables if they
are marked as 'not closed properly' or 'crashed'. If this
happens, MySQL writes an entry in the
hostname.err
file 'Warning:
Checking table ...'
which is followed by
Warning: Repairing table
if the table needs
to be repaired. If you get a lot of these errors, without
mysqld having died unexpectedly just
before, then something is wrong and needs to be investigated
further.
See also Section 5.1.2, “Command Options”, and Section 2.16.1.6, “Making a Test Case If You Experience Table Corruption”.
When you are linking an application program to use the MySQL
client library, you might get undefined reference errors for
symbols that start with mysql_
, such as
those shown here:
/tmp/ccFKsdPa.o: In function `main': /tmp/ccFKsdPa.o(.text+0xb): undefined reference to `mysql_init' /tmp/ccFKsdPa.o(.text+0x31): undefined reference to `mysql_real_connect' /tmp/ccFKsdPa.o(.text+0x57): undefined reference to `mysql_real_connect' /tmp/ccFKsdPa.o(.text+0x69): undefined reference to `mysql_error' /tmp/ccFKsdPa.o(.text+0x9a): undefined reference to `mysql_close'
You should be able to solve this problem by adding
-Ldir_path -lmysqlclient
at the end of your
link command, where dir_path
represents the
pathname of the directory where the client library is located.
To determine the correct directory, try this command:
shell> mysql_config --libs
The output from mysql_config might indicate other libraries that should be specified on the link command as well.
If you get undefined reference
errors for
the uncompress
or
compress
function, add
-lz
to the end of your link command and try
again.
If you get undefined reference
errors for a
function that should exist on your system, such as
connect
, check the manual page for the
function in question to determine which libraries you should
add to the link command.
You might get undefined reference
errors
such as the following for functions that don't exist on your
system:
mf_format.o(.text+0x201): undefined reference to `__lxstat'
This usually means that your MySQL client library was compiled on a system that is not 100% compatible with yours. In this case, you should download the latest MySQL source distribution and compile MySQL yourself. See Section 2.9, “MySQL Installation Using a Source Distribution”.
You might get undefined reference errors at runtime when you
try to execute a MySQL program. If these errors specify
symbols that start with mysql_
or indicate
that the mysqlclient
library can't be
found, it means that your system can't find the shared
libmysqlclient.so
library. The fix for
this is to tell your system to search for shared libraries
where the library is located. Use whichever of the following
methods is appropriate for your system:
Add the path to the directory where
libmysqlclient.so
is located to the
LD_LIBRARY_PATH
environment variable.
Add the path to the directory where
libmysqlclient.so
is located to the
LD_LIBRARY
environment variable.
Copy libmysqlclient.so
to some
directory that is searched by your system, such as
/lib
, and update the shared library
information by executing ldconfig
.
Another way to solve this problem is by linking your program
statically with the -static
option, or by
removing the dynamic MySQL libraries before linking your code.
Before trying the second method, you should be sure that no
other programs are using the dynamic libraries.
If you have problems with file permissions, the
UMASK
environment variable might be set
incorrectly when mysqld starts. For
example, MySQL might issue the following error message when
you create a table:
ERROR: Can't find file: 'path/with/filename.frm' (Errcode: 13)
The default UMASK
value is
0660
. You can change this behavior by
starting mysqld_safe as follows:
shell>UMASK=384 # = 600 in octal
shell>export UMASK
shell>mysqld_safe &
By default, MySQL creates database and RAID
directories with an access permission value of
0700
. You can modify this behavior by
setting the UMASK_DIR
variable. If you set
its value, new directories are created with the combined
UMASK
and UMASK_DIR
values. For example, if you want to give group access to all
new directories, you can do this:
shell>UMASK_DIR=504 # = 770 in octal
shell>export UMASK_DIR
shell>mysqld_safe &
In MySQL 3.23.25 and above, MySQL assumes that the value for
UMASK
and UMASK_DIR
is
in octal if it starts with a zero.
If you have never set a root
password for
MySQL, the server does not require a password at all for
connecting as root
. However, it is
recommended to set a password for each account. See
Section 5.4.1, “General Security Guidelines”.
If you set a root
password previously, but
have forgotten what it was, you can set a new password. The
next two sections show procedures for Windows and Unix
systems, respectively.
The procedure for resetting the MySQL root account's password on Windows is as follows:
Log on to your system as Administrator.
Stop the MySQL server if it is running. For a server that is running as a Windows service, go to the Services manager:
Start Menu -> Control Panel -> Administrative Tools -> Services
Then find the MySQL service in the list, and stop it.
If your server is not running as a service, you may need to use the Task Manager to force it to stop.
Create a text file and place the following command within it on a single line:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPassword');
Save the file with any name. For this example the file
will be C:\mysql-init.txt
.
Open a console window to get to the DOS command prompt:
Start Menu -> Run -> cmd
We are assuming that you installed MySQL to
C:\mysql
. If you installed MySQL to
another location, adjust the following commands
accordingly.
At the DOS command prompt, execute this command:
C:\> C:\mysql\bin\mysqld-nt --init-file=C:\mysql-init.txt
The contents of the file named by the
--init-file
option are executed at
server startup, changing the root
password. After the server has started successfully, you
should delete C:\mysql-init.txt
.
Users of MySQL 4.1 and higher who install MySQL using
the MySQL Installation Wizard may need to specify a
--defaults-file
option:
C:\>"C:\Program Files\MySQL\MySQL Server 4.1\bin\mysqld-nt.exe"
--defaults-file="C:\Program Files\MySQL\MySQL Server 4.1\my.ini"
--init-file=C:\mysql-init.txt
The appropriate --defaults-file
setting
can be found using the Services Manager:
Start Menu -> Control Panel -> Administrative Tools -> Services
Find the MySQL service in the list, right-click on it,
and choose the Properties
option. The
Path to executable
field contains the
--defaults-file
setting.
Stop the MySQL server, then restart it in normal mode again. If you run the server as a service, start it from the Windows Services window. If you start the server manually, use whatever command you normally use.
You should be able to connect using the new password.
MySQL Enterprise For expert advice on security-related issues, subscribe to the MySQL Enterprise Monitor. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
In a Unix environment, the procedure for resetting the MySQL
root
password is as follows:
Log on to your system as either the Unix
root
user or as the same user that
the mysqld server runs as.
Locate the .pid
file that contains
the server's process ID. The exact location and name of
this file depend on your distribution, hostname, and
configuration. Common locations are
/var/lib/mysql/
,
/var/run/mysqld/
, and
/usr/local/mysql/data/
. Generally,
the filename has the extension of
.pid
and begins with either
mysqld
or your system's hostname.
You can stop the MySQL server by sending a normal
kill
(not kill -9
)
to the mysqld process, using the
pathname of the .pid
file in the
following command:
shell> kill `cat /mysql-data-directory/host_name.pid`
Note the use of backticks rather than forward quotes
with the cat
command; these cause the
output of cat
to be substituted into
the kill
command.
Create a text file and place the following command within it on a single line:
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('MyNewPassword');
Save the file with any name. For this example the file
will be ~/mysql-init
.
Restart the MySQL server with the special
--init-file=~/mysql-init
option:
shell> mysqld_safe --init-file=~/mysql-init &
The contents of the init-file are executed at server
startup, changing the root password. After the server
has started successfully you should delete
~/mysql-init
.
You should be able to connect using the new password.
Alternatively, on any platform, you can set the new password using the mysql client(but this approach is less secure):
Stop mysqld and restart it with the
--skip-grant-tables --user=root
options
(Windows users omit the --user=root
portion).
Connect to the mysqld server with this command:
shell> mysql -u root
Issue the following statements in the mysql client:
mysql>UPDATE mysql.user SET Password=PASSWORD('
->newpwd
')WHERE User='root';
mysql>FLUSH PRIVILEGES;
Replace “newpwd
”
with the actual root
password that
you want to use.
You should be able to connect using the new password.
Each MySQL version is tested on many platforms before it is released. This doesn't mean that there are no bugs in MySQL, but if there are bugs, they should be very few and can be hard to find. If you have a problem, it always helps if you try to find out exactly what crashes your system, because you have a much better chance of getting the problem fixed quickly.
First, you should try to find out whether the problem is that the mysqld server dies or whether your problem has to do with your client. You can check how long your mysqld server has been up by executing mysqladmin version. If mysqld has died and restarted, you may find the reason by looking in the server's error log. See Section 5.3.1, “The Error Log”.
On some systems, you can find in the error log a stack trace
of where mysqld died that you can resolve
with the resolve_stack_dump
program. See
MySQL
Internals: Porting. Note that the variable values
written in the error log may not always be 100% correct.
Many server crashes are caused by corrupted data files or
index files. MySQL updates the files on disk with the
write()
system call after every SQL
statement and before the client is notified about the result.
(This is not true if you are running with
--delay-key-write
, in which case data files
are written but not index files.) This means that data file
contents are safe even if mysqld crashes,
because the operating system ensures that the unflushed data
is written to disk. You can force MySQL to flush everything to
disk after every SQL statement by starting
mysqld with the --flush
option.
The preceding means that normally you should not get corrupted tables unless one of the following happens:
The MySQL server or the server host was killed in the middle of an update.
You have found a bug in mysqld that caused it to die in the middle of an update.
Some external program is manipulating data files or index files at the same time as mysqld without locking the table properly.
You are running many mysqld servers
using the same data directory on a system that doesn't
support good filesystem locks (normally handled by the
lockd
lock manager), or you are running
multiple servers with external locking disabled.
You have a crashed data file or index file that contains very corrupt data that confused mysqld.
You have found a bug in the data storage code. This isn't
likely, but it's at least possible. In this case, you can
try to change the storage engine to another engine by
using ALTER TABLE
on a repaired copy of
the table.
Because it is very difficult to know why something is crashing, first try to check whether things that work for others crash for you. Please try the following things:
Stop the mysqld server with
mysqladmin shutdown, run
myisamchk --silent --force */*.MYI from
the data directory to check all MyISAM
tables, and restart mysqld. This
ensures that you are running from a clean state. See
Chapter 5, MySQL Server Administration.
Start mysqld with the
--log
option and try to determine from
the information written to the log whether some specific
query kills the server. About 95% of all bugs are related
to a particular query. Normally, this is one of the last
queries in the log file just before the server restarts.
See Section 5.3.2, “The General Query Log”. If you can repeatedly
kill MySQL with a specific query, even when you have
checked all tables just before issuing it, then you have
been able to locate the bug and should submit a bug report
for it. See Section 1.7, “How to Report Bugs or Problems”.
Try to make a test case that we can use to repeat the problem. See MySQL Internals: Porting.
Try running the tests in the
mysql-test
directory and the MySQL
benchmarks. See Section 19.1.2, “MySQL Test Suite”. They
should test MySQL rather well. You can also add code to
the benchmarks that simulates your application. The
benchmarks can be found in the
sql-bench
directory in a source
distribution or, for a binary distribution, in the
sql-bench
directory under your MySQL
installation directory.
Try the fork_big.pl
script. (It is
located in the tests
directory of
source distributions.)
If you configure MySQL for debugging, it is much easier to
gather information about possible errors if something goes
wrong. Configuring MySQL for debugging causes a safe
memory allocator to be included that can find some errors.
It also provides a lot of output about what is happening.
Reconfigure MySQL with the --with-debug
or --with-debug=full
option to
configure and then recompile. See
MySQL
Internals: Porting.
Make sure that you have applied the latest patches for your operating system.
Use the --skip-external-locking
option to
mysqld. On some systems, the
lockd
lock manager does not work
properly; the --skip-external-locking
option tells mysqld not to use external
locking. (This means that you cannot run two
mysqld servers on the same data
directory and that you must be careful if you use
myisamchk. Nevertheless, it may be
instructive to try the option as a test.)
Have you tried mysqladmin -u root processlist when mysqld appears to be running but not responding? Sometimes mysqld is not comatose even though you might think so. The problem may be that all connections are in use, or there may be some internal lock problem. mysqladmin -u root processlist usually is able to make a connection even in these cases, and can provide useful information about the current number of connections and their status.
Run the command mysqladmin -i 5 status or mysqladmin -i 5 -r status in a separate window to produce statistics while you run your other queries.
Try the following:
Start mysqld from gdb (or another debugger). See MySQL Internals: Porting.
Run your test scripts.
Print the backtrace and the local variables at the three lowest levels. In gdb, you can do this with the following commands when mysqld has crashed inside gdb:
backtrace info local up info local up info local
With gdb, you can also examine
which threads exist with info
threads
and switch to a specific thread with
thread
, where
N
N
is the thread ID.
Try to simulate your application with a Perl script to force MySQL to crash or misbehave.
Send a normal bug report. See Section 1.7, “How to Report Bugs or Problems”. Be even more detailed than usual. Because MySQL works for many people, it may be that the crash results from something that exists only on your computer (for example, an error that is related to your particular system libraries).
If you have a problem with tables containing
dynamic-length rows and you are using only
VARCHAR
columns (not
BLOB
or TEXT
columns), you can try to change all
VARCHAR
to CHAR
with
ALTER TABLE
. This forces MySQL to use
fixed-size rows. Fixed-size rows take a little extra
space, but are much more tolerant to corruption.
The current dynamic row code has been in use at MySQL AB for several years with very few problems, but dynamic-length rows are by nature more prone to errors, so it may be a good idea to try this strategy to see whether it helps.
Do not rule out your server hardware when diagnosing problems. Defective hardware can be the cause of data corruption. Particular attention should be paid to both RAMS and hard-drives when troubleshooting hardware.
This section describes how MySQL responds to disk-full errors (such as “no space left on device”), and, as of MySQL 4.0.22, to quota-exceeded errors (such as “write failed” or “user block limit reached”).
This section is relevant for writes to
MyISAM
tables. As of MySQL 4.1.9, it also
applies for writes to binary log files and binary log index
file, except that references to “row” and
“record” should be understood to mean
“event.”
When a disk-full condition occurs, MySQL does the following:
It checks once every minute to see whether there is enough space to write the current row. If there is enough space, it continues as if nothing had happened.
Every 10 minutes it writes an entry to the log file, warning about the disk-full condition.
To alleviate the problem, you can take the following actions:
To continue, you only have to free enough disk space to insert all records.
To abort the thread, you must use mysqladmin kill. The thread is aborted the next time it checks the disk (in one minute).
Other threads might be waiting for the table that caused the disk-full condition. If you have several “locked” threads, killing the one thread that is waiting on the disk-full condition allows the other threads to continue.
Exceptions to the preceding behavior are when you use
REPAIR TABLE
or OPTIMIZE
TABLE
or when the indexes are created in a batch
after LOAD DATA INFILE
or after an
ALTER TABLE
statement. All of these
statements may create large temporary files that, if left to
themselves, would cause big problems for the rest of the
system. If the disk becomes full while MySQL is doing any of
these operations, it removes the big temporary files and mark
the table as crashed. The exception is that for ALTER
TABLE
, the old table is left unchanged.
MySQL Enterprise For early notification of possible problems with your MySQL configuration subscribe to the MySQL Enterprise Monitor. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
MySQL uses the value of the TMPDIR
environment variable as the pathname of the directory in which
to store temporary files. If you don't have
TMPDIR
set, MySQL uses the system default,
which is normally /tmp
,
/var/tmp
, or
/usr/tmp
. If the filesystem containing
your temporary file directory is too small, you can use the
--tmpdir
option to mysqld
to specify a directory in a filesystem where you have enough
space.
Starting from MySQL 4.1, the --tmpdir
option
can be set to a list of several paths that are used in
round-robin fashion. Paths should be separated by colon
characters (“:
”) on Unix and
semicolon characters (“;
”) on
Windows, NetWare, and OS/2.
To spread the load effectively, these paths should be located on different physical disks, not different partitions of the same disk.
If the MySQL server is acting as a replication slave, you
should not set --tmpdir
to point to a
directory on a memory-based filesystem or to a directory that
is cleared when the server host restarts. A replication slave
needs some of its temporary files to survive a machine restart
so that it can replicate temporary tables or LOAD
DATA INFILE
operations. If files in the temporary
file directory are lost when the server restarts, replication
fails.
MySQL creates all temporary files as hidden files. This ensures that the temporary files are removed if mysqld is terminated. The disadvantage of using hidden files is that you do not see a big temporary file that fills up the filesystem in which the temporary file directory is located.
MySQL Enterprise Advisors provided by the MySQL Enterprise Monitor automatically detect excessive temporary table storage to disk. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
When sorting (ORDER BY
or GROUP
BY
), MySQL normally uses one or two temporary files.
The maximum disk space required is determined by the following
expression:
(length of what is sorted + sizeof(row pointer)) * number of matched rows * 2
The row pointer size is usually four bytes, but may grow in the future for really big tables.
For some SELECT
queries, MySQL also creates
temporary SQL tables. These are not hidden and have names of
the form SQL_*
.
ALTER TABLE
creates a temporary table in
the same directory as the original table.
The default location for the Unix socket file that the server
uses for communication with local clients is
/tmp/mysql.sock
. (For some distribution
formats, the directory might be different, such as
/var/lib/mysql
for RPMs.)
On some versions of Unix, anyone can delete files in the
/tmp
directory or other similar
directories used for temporary files. If the socket file is
located in such a directory on your system, this might cause
problems.
On most versions of Unix, you can protect your
/tmp
directory so that files can be
deleted only by their owners or the superuser
(root
). To do this, set the
sticky
bit on the /tmp
directory by logging in as root
and using
the following command:
shell> chmod +t /tmp
You can check whether the sticky
bit is set
by executing ls -ld /tmp
. If the last
permission character is t
, the bit is set.
Another approach is to change the place where the server creates the Unix socket file. If you do this, you should also let client programs know the new location of the file. You can specify the file location in several ways:
Specify the path in a global or local option file. For
example, put the following lines in
/etc/my.cnf
:
[mysqld] socket=/path/to/socket [client] socket=/path/to/socket
Specify a --socket
option on the command
line to mysqld_safe and when you run
client programs.
Set the MYSQL_UNIX_PORT
environment
variable to the path of the Unix socket file.
Recompile MySQL from source to use a different default
Unix socket file location. Define the path to the file
with the --with-unix-socket-path
option
when you run configure. See
Section 2.9.2, “Typical configure Options”.
You can test whether the new socket location works by attempting to connect to the server with this command:
shell> mysqladmin --socket=/path/to/socket version
If you have a problem with SELECT NOW()
returning values in UTC and not your local time, you have to
tell the server your current time zone. The same applies if
UNIX_TIMESTAMP()
returns the
wrong value. This should be done for the environment in which
the server runs; for example, in
mysqld_safe or
mysql.server. See
Section 2.14, “Environment Variables”.
You can set the time zone for the server with the
--timezone=
option to mysqld_safe. You can also set it
by setting the timezone_name
TZ
environment variable
before you start mysqld.
The allowable values for --timezone
or
TZ
are system-dependent. Consult your
operating system documentation to see what values are
acceptable.
DATE
ColumnsNULL
Values
By default, MySQL searches are not case sensitive. This means
that if you search with
, you get all column values that start with
col_name
LIKE
'a%'A
or a
. If you want to
make this search case sensitive, make sure that one of the
operands has a case sensitive or binary collation. For
example, if you are comparing a column and a string that both
have the latin1
character set, you can use
the COLLATE
operator to cause either
operand to have the latin1_general_cs
or
latin1_bin
collation. For example:
col_name
COLLATE latin1_general_cs LIKE 'a%'col_name
LIKE 'a%' COLLATE latin1_general_cscol_name
COLLATE latin1_bin LIKE 'a%'col_name
LIKE 'a%' COLLATE latin1_bin
If you want a column always to be treated in case-sensitive
fashion, declare it with a case sensitive or binary collation.
See Section 12.1.5, “CREATE TABLE
Syntax”.
Before MySQL 4.1, COLLATE
is unavailable.
Use the BINARY
operator in expressions to
treat a string as a binary string: BINARY
or
col_name
LIKE 'a%'
. In column declarations, use the
col_name
LIKE BINARY
'a%'BINARY
attribute.
Simple comparison operations (>=, >, =, <,
<=
, sorting, and grouping) are based on each
character's “sort value.” Characters with the
same sort value (such as “E
”,
“e
”, and
“é
”) are treated as the
same character.
The format of a DATE
value is
'YYYY-MM-DD'
. According to standard SQL, no
other format is allowed. You should use this format in
UPDATE
expressions and in the
WHERE
clause of SELECT
statements. For example:
mysql> SELECT * FROM tbl_name
WHERE date >= '2003-05-05';
As a convenience, MySQL automatically converts a date to a
number if the date is used in a numeric context (and vice
versa). It is also smart enough to allow a
“relaxed” string form when updating and in a
WHERE
clause that compares a date to a
TIMESTAMP
, DATE
, or
DATETIME
column. (“Relaxed
form” means that any punctuation character may be used
as the separator between parts. For example,
'2004-08-15'
and
'2004#08#15'
are equivalent.) MySQL can
also convert a string containing no separators (such as
'20040815'
), provided it makes sense as a
date.
When you compare a DATE
,
TIME
, DATETIME
, or
TIMESTAMP
to a constant string with the
<
, <=
,
=
, >=
,
>
, or BETWEEN
operators, MySQL normally converts the string to an internal
long integer for faster comparison (and also for a bit more
“relaxed” string checking). However, this
conversion is subject to the following exceptions:
When you compare two columns
When you compare a DATE
,
TIME
, DATETIME
, or
TIMESTAMP
column to an expression
When you use any other comparison method than those just
listed, such as IN
or
STRCMP()
.
For these exceptional cases, the comparison is done by converting the objects to strings and performing a string comparison.
To keep things safe, assume that strings are compared as strings and use the appropriate string functions if you want to compare a temporal value to a string.
The special date '0000-00-00'
can be stored
and retrieved as '0000-00-00'.
When using a
'0000-00-00'
date through MyODBC, it is
automatically converted to NULL
in MyODBC
2.50.12 and above, because ODBC can't handle this kind of
date.
Because MySQL performs the conversions described above, the following statements work:
mysql>INSERT INTO
mysql>tbl_name
(idate) VALUES (19970505);INSERT INTO
mysql>tbl_name
(idate) VALUES ('19970505');INSERT INTO
mysql>tbl_name
(idate) VALUES ('97-05-05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('1997.05.05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('1997 05 05');INSERT INTO
mysql>tbl_name
(idate) VALUES ('0000-00-00');SELECT idate FROM
mysql>tbl_name
WHERE idate >= '1997-05-05';SELECT idate FROM
mysql>tbl_name
WHERE idate >= 19970505;SELECT MOD(idate,100) FROM
mysql>tbl_name
WHERE idate >= 19970505;SELECT idate FROM
tbl_name
WHERE idate >= '19970505';
However, the following does not work:
mysql> SELECT idate FROM tbl_name
WHERE STRCMP(idate,'20030505')=0;
STRCMP()
is a string function,
so it converts idate
to a string in
'YYYY-MM-DD'
format and performs a string
comparison. It does not convert '20030505'
to the date '2003-05-05'
and perform a date
comparison.
If the date cannot be converted to any reasonable value, a
0
is stored in the DATE
column, which is retrieved as '0000-00-00'
.
This is both a speed and a convenience issue. We believe that
the database server's responsibility is to retrieve the same
date you stored (even if the data was not logically correct in
all cases). We think it is up to the application and not the
server to check the dates.
The concept of the NULL
value is a common
source of confusion for newcomers to SQL, who often think that
NULL
is the same thing as an empty string
''
. This is not the case. For example, the
following statements are completely different:
mysql>INSERT INTO my_table (phone) VALUES (NULL);
mysql>INSERT INTO my_table (phone) VALUES ('');
Both statements insert a value into the
phone
column, but the first inserts a
NULL
value and the second inserts an empty
string. The meaning of the first can be regarded as
“phone number is not known” and the meaning of
the second can be regarded as “the person is known to
have no phone, and thus no phone number.”
To help with NULL
handling, you can use the
IS NULL
and
IS NOT NULL
operators and
the IFNULL()
function.
In SQL, the NULL
value is never true in
comparison to any other value, even NULL
.
An expression that contains NULL
always
produces a NULL
value unless otherwise
indicated in the documentation for the operators and functions
involved in the expression. All columns in the following
example return NULL
:
mysql> SELECT NULL, 1+NULL, CONCAT('Invisible',NULL);
If you want to search for column values that are
NULL
, you cannot use an expr =
NULL
test. The following statement returns no rows,
because expr = NULL
is never true for any
expression:
mysql> SELECT * FROM my_table WHERE phone = NULL;
To look for NULL
values, you must use the
IS NULL
test. The following
statements show how to find the NULL
phone
number and the empty phone number:
mysql>SELECT * FROM my_table WHERE phone IS NULL;
mysql>SELECT * FROM my_table WHERE phone = '';
See Section 3.3.4.6, “Working with NULL
Values”, for additional
information and examples.
You can add an index on a column that can have
NULL
values if you are using MySQL 3.23.2
or newer and are using the MyISAM
,
InnoDB
, or BDB
storage
engine. As of MySQL 4.0.2, the MEMORY
storage engine also supports NULL
values in
indexes. Otherwise, you must declare an indexed column
NOT NULL
and you cannot insert
NULL
into the column.
When reading data with LOAD DATA INFILE
,
empty or missing columns are updated with
''
. If you want a NULL
value in a column, you should use \N
in the
data file. The literal word
“NULL
” may also be used under
some circumstances. See Section 12.2.5, “LOAD DATA INFILE
Syntax”.
When using DISTINCT
, GROUP
BY
, or ORDER BY
, all
NULL
values are regarded as equal.
When using ORDER BY
,
NULL
values are presented first, or last if
you specify DESC
to sort in descending
order. Exception: In MySQL 4.0.2 through 4.0.10,
NULL
values sort first regardless of sort
order.
Aggregate (summary) functions such as
COUNT()
,
MIN()
, and
SUM()
ignore
NULL
values. The exception to this is
COUNT(*)
, which counts rows
and not individual column values. For example, the following
statement produces two counts. The first is a count of the
number of rows in the table, and the second is a count of the
number of non-NULL
values in the
age
column:
mysql> SELECT COUNT(*), COUNT(age) FROM person;
For some data types, MySQL handles NULL
values specially. If you insert NULL
into a
TIMESTAMP
column, the current date and time
is inserted. If you insert NULL
into an
integer or floating-point column that has the
AUTO_INCREMENT
attribute, the next number
in the sequence is inserted.
You can use an alias to refer to a column in GROUP
BY
, ORDER BY
, or
HAVING
clauses. Aliases can also be used to
give columns better names:
SELECT SQRT(a*b) AS root FROMtbl_name
GROUP BY root HAVING root > 0; SELECT id, COUNT(*) AS cnt FROMtbl_name
GROUP BY id HAVING cnt > 0; SELECT id AS 'Customer identity' FROMtbl_name
;
Standard SQL doesn't allow you to refer to a column alias in a
WHERE
clause. This restriction is imposed
because when the WHERE
code is executed,
the column value may not yet be determined. For example, the
following query is illegal:
SELECT id, COUNT(*) AS cnt FROM tbl_name
WHERE cnt > 0 GROUP BY id;
The WHERE
statement is executed to
determine which rows should be included in the GROUP
BY
part, whereas HAVING
is used
to decide which rows from the result set should be used.
If you receive the following message when trying to perform a
ROLLBACK
, it means that one or more of the
tables you used in the transaction do not support
transactions:
Warning: Some non-transactional changed tables couldn't be rolled back
These non-transactional tables are not affected by the
ROLLBACK
statement.
If you were not deliberately mixing transactional and
non-transactional tables within the transaction, the most
likely cause for this message is that a table you thought was
transactional actually is not. This can happen if you try to
create a table using a transactional storage engine that is
not supported by your mysqld server (or
that was disabled with a startup option). If
mysqld doesn't support a storage engine, it
instead creates the table as a MyISAM
table, which is non-transactional.
You can check the storage engine for a table by using either of these statements:
SHOW TABLE STATUS LIKE 'tbl_name
'; SHOW CREATE TABLEtbl_name
;
See Section 12.5.4.18, “SHOW TABLE STATUS
Syntax”, and
Section 12.5.4.5, “SHOW CREATE TABLE
Syntax”.
You can check which storage engines your mysqld server supports by using this statement:
SHOW ENGINES;
Before MySQL 4.1.2, SHOW ENGINES
is
unavailable. Use the following statement instead and check the
value of the variable that is associated with the storage
engine in which you are interested:
SHOW VARIABLES LIKE 'have_%';
For example, to determine whether the
InnoDB
storage engine is available, check
the value of the have_innodb
variable.
See Section 12.5.4.8, “SHOW ENGINES
Syntax”, and
Section 12.5.4.20, “SHOW VARIABLES
Syntax”.
MySQL Enterprise Ensure that your data is adequately protected by subscribing to the MySQL Enterprise Monitor. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
MySQL does not support subqueries prior to version 4.1, or the
use of more than one table in the DELETE
statement prior to version 4.0. If your version of MySQL does
not support subqueries or multiple-table
DELETE
statements, you can use the
following approach to delete rows from two related tables:
SELECT
the rows based on some
WHERE
condition in the main table.
DELETE
the rows in the main table based
on the same condition.
DELETE FROM related_table WHERE related_column IN
(selected_rows)
.
If the total length of the DELETE
statement
for related_table
is more than 1MB (the
default value of the max_allowed_packet
system variable), you should split it into smaller parts and
execute multiple DELETE
statements. You
probably get the fastest DELETE
by
specifying only 100 to 1,000 related_column
values per statement if the related_column
is indexed. If the related_column
isn't
indexed, the speed is independent of the number of arguments
in the IN
clause.
If you have a complicated query that uses many tables but that doesn't return any rows, you should use the following procedure to find out what is wrong:
Test the query with EXPLAIN
to check
whether you can find something that is obviously wrong.
See Section 12.3.2, “EXPLAIN
Syntax”.
Select only those columns that are used in the
WHERE
clause.
Remove one table at a time from the query until it returns
some rows. If the tables are large, it's a good idea to
use LIMIT 10
with the query.
Issue a SELECT
for the column that
should have matched a row against the table that was last
removed from the query.
If you are comparing FLOAT
or
DOUBLE
columns with numbers that have
decimals, you can't use equality (=
)
comparisons. This problem is common in most computer
languages because not all floating-point values can be
stored with exact precision. In some cases, changing the
FLOAT
to a DOUBLE
fixes this. See Section A.1.5.8, “Problems with Floating-Point Comparisons”.
Similar problems may be encountered when comparing
DECIMAL
values.
If you still can't figure out what's wrong, create a
minimal test that can be run with mysql test <
query.sql
that shows your problems. You can
create a test file by dumping the tables with
mysqldump --quick db_name
tbl_name_1
...
tbl_name_n
>
query.sql. Open the file in an editor, remove
some insert lines (if there are more than needed to
demonstrate the problem), and add your
SELECT
statement at the end of the
file.
Verify that the test file demonstrates the problem by executing these commands:
shell>mysqladmin create test2
shell>mysql test2 < query.sql
Attach the test file to a bug report, which you can file using the instructions in Section 1.7, “How to Report Bugs or Problems”.
Floating-point numbers sometimes cause confusion because they
are approximate. That is, they are not stored as exact values
inside computer architecture. What you can see on the screen
usually is not the exact value of the number. The
FLOAT
and DOUBLE
data
types are such, and DECIMAL
operations
before MySQL 5.0.3 are approximate as well.
Prior to MySQL 5.0.3, DECIMAL
columns store
values with exact precision because they are represented as
strings, but calculations on DECIMAL
values
are done using floating-point operations. As of 5.0.3, MySQL
performs DECIMAL
operations with a
precision of 64 decimal digits, which should solve most common
inaccuracy problems when it comes to
DECIMAL
columns. (If your server is from
MySQL 5.0.3 or higher, but you have DECIMAL
columns in tables that were created before 5.0.3, the old
behavior still applies to those columns. To convert the tables
to the newer DECIMAL
format, dump them with
mysqldump and reload them.)
The following example (for versions of MySQL older than 5.0.3)
demonstrates the problem. It shows that even for older
DECIMAL
columns, calculations that are done
using floating-point operations are subject to floating-point
error. (Were you to replace the DECIMAL
columns with FLOAT
, similar problems would
occur for all versions of MySQL.)
mysql>CREATE TABLE t1 (i INT, d1 DECIMAL(9,2), d2 DECIMAL(9,2));
mysql>INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
->(2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
->(2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
->(4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
->(5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
->(6, 0.00, 0.00), (6, -51.40, 0.00);
mysql>SELECT i, SUM(d1) AS a, SUM(d2) AS b
->FROM t1 GROUP BY i HAVING a <> b;
+------+--------+-------+ | i | a | b | +------+--------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | | 6 | -51.40 | 0.00 | +------+--------+-------+
The result is correct. Although the first five records look
like they should not satisfy the comparison (the values of
a
and b
do not appear to
be different), they may do so because the difference between
the numbers shows up around the tenth decimal or so, depending
on factors such as computer architecture or the compiler
version or optimization level. For example, different CPUs may
evaluate floating-point numbers differently.
As of MySQL 5.0.3, you will get only the last row in the above result.
The problem cannot be solved by using
ROUND()
or similar functions,
because the result is still a floating-point number:
mysql>SELECT i, ROUND(SUM(d1), 2) AS a, ROUND(SUM(d2), 2) AS b
->FROM t1 GROUP BY i HAVING a <> b;
+------+--------+-------+ | i | a | b | +------+--------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | | 6 | -51.40 | 0.00 | +------+--------+-------+
This is what the numbers in column a
look
like when displayed with more decimal places:
mysql>SELECT i, ROUND(SUM(d1), 2)*1.0000000000000000 AS a,
->ROUND(SUM(d2), 2) AS b FROM t1 GROUP BY i HAVING a <> b;
+------+----------------------+-------+ | i | a | b | +------+----------------------+-------+ | 1 | 21.3999999999999986 | 21.40 | | 2 | 76.7999999999999972 | 76.80 | | 3 | 7.4000000000000004 | 7.40 | | 4 | 15.4000000000000004 | 15.40 | | 5 | 7.2000000000000002 | 7.20 | | 6 | -51.3999999999999986 | 0.00 | +------+----------------------+-------+
Depending on your computer architecture, you may or may not see similar results. For example, on some machines you may get the “correct” results by multiplying both arguments by 1, as the following example shows.
Never use this method in your applications. It is not an example of a trustworthy method!
mysql>SELECT i, ROUND(SUM(d1), 2)*1 AS a, ROUND(SUM(d2), 2)*1 AS b
->FROM t1 GROUP BY i HAVING a <> b;
+------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+
The reason that the preceding example seems to work is that on the particular machine where the test was done, CPU floating-point arithmetic happens to round the numbers to the same value. However, there is no rule that any CPU should do so, so this method cannot be trusted.
The correct way to do floating-point number comparison is to first decide on an acceptable tolerance for differences between the numbers and then do the comparison against the tolerance value. For example, if we agree that floating-point numbers should be regarded the same if they are same within a precision of one in ten thousand (0.0001), the comparison should be written to find differences larger than the tolerance value:
mysql>SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
->GROUP BY i HAVING ABS(a - b) > 0.0001;
+------+--------+------+ | i | a | b | +------+--------+------+ | 6 | -51.40 | 0.00 | +------+--------+------+ 1 row in set (0.00 sec)
Conversely, to get rows where the numbers are the same, the test should find differences within the tolerance value:
mysql>SELECT i, SUM(d1) AS a, SUM(d2) AS b FROM t1
->GROUP BY i HAVING ABS(a - b) <= 0.0001;
+------+-------+-------+ | i | a | b | +------+-------+-------+ | 1 | 21.40 | 21.40 | | 2 | 76.80 | 76.80 | | 3 | 7.40 | 7.40 | | 4 | 15.40 | 15.40 | | 5 | 7.20 | 7.20 | +------+-------+-------+
MySQL uses a cost-based optimizer to determine the best way to resolve a query. In many cases, MySQL can calculate the best possible query plan, but sometimes MySQL doesn't have enough information about the data at hand and has to make “educated” guesses about the data.
For the cases when MySQL does not do the "right" thing, tools that you have available to help MySQL are:
Use the EXPLAIN
statement to get
information about how MySQL processes a query. To use it,
just add the keyword EXPLAIN
to the front
of your SELECT
statement:
mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
EXPLAIN
is discussed in more detail in
Section 12.3.2, “EXPLAIN
Syntax”.
Use ANALYZE TABLE
to update the
key distributions for the scanned table. See
Section 12.5.2.1, “tbl_name
ANALYZE TABLE
Syntax”.
Use FORCE INDEX
for the scanned table to
tell MySQL that table scans are very expensive compared to
using the given index:
SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX
and IGNORE
INDEX
may also be useful. See
Section 12.2.7.2, “Index Hint Syntax”.
Global and table-level STRAIGHT_JOIN
. See
Section 12.2.7, “SELECT
Syntax”.
You can tune global or thread-specific system variables. For
example, Start mysqld with the
--max-seeks-for-key=1000
option or use
SET max_seeks_for_key=1000
to tell the
optimizer to assume that no key scan causes more than 1,000
key seeks. See Section 5.1.3, “System Variables”.
MySQL Enterprise For expert advice on configuring MySQL servers for optimal performance, subscribe to the MySQL Enterprise Monitor. For more information, see http://www.mysql.com/products/enterprise/advisors.html.
ALTER TABLE
changes a table to the current
character set. If you get a duplicate-key error during
ALTER TABLE
, the cause is either that the
new character sets maps two keys to the same value or that the
table is corrupted. In the latter case, you should run
REPAIR TABLE
on the table.
If ALTER TABLE
dies with the following
error, the problem may be that MySQL crashed during an earlier
ALTER TABLE
operation and there is an old
table named
A-
or
xxx
B-
lying
around:
xxx
Error on rename of './database/name.frm'
to './database/B-xxx
.frm' (Errcode: 17)
In this case, go to the MySQL data directory and delete all
files that have names starting with A-
or
B-
. (You may want to move them elsewhere
instead of deleting them.)
ALTER TABLE
works in the following way:
Create a new table named
A-
with
the requested structural changes.
xxx
Copy all rows from the original table to
A-
.
xxx
Rename the original table to
B-
.
xxx
Rename
A-
to
your original table name.
xxx
Delete
B-
.
xxx
If something goes wrong with the renaming operation, MySQL
tries to undo the changes. If something goes seriously wrong
(although this shouldn't happen), MySQL may leave the old
table as
B-
. A
simple rename of the table files at the system level should
get your data back.
xxx
If you use ALTER TABLE
on a transactional
table or if you are using Windows or OS/2, ALTER
TABLE
unlocks the table if you had done a
LOCK TABLE
on it. This is done because
InnoDB
and these operating systems cannot
drop a table that is in use.
First, consider whether you really need to change the column
order in a table. The whole point of SQL is to abstract the
application from the data storage format. You should always
specify the order in which you wish to retrieve your data. The
first of the following statements returns columns in the order
col_name1
,
col_name2
,
col_name3
, whereas the second
returns them in the order
col_name1
,
col_name3
,
col_name2
:
mysql>SELECT
mysql>col_name1
,col_name2
,col_name3
FROMtbl_name
;SELECT
col_name1
,col_name3
,col_name2
FROMtbl_name
;
If you decide to change the order of table columns anyway, you can do so as follows:
Create a new table with the columns in the new order.
Execute this statement:
mysql>INSERT INTO new_table
->SELECT columns-in-new-order FROM old_table;
Drop or rename old_table
.
Rename the new table to the original name:
mysql> ALTER TABLE new_table RENAME old_table;
SELECT *
is quite suitable for testing
queries. However, in an application, you should
never rely on using SELECT
*
and retrieving the columns based on their
position. The order and position in which columns are returned
does not remain the same if you add, move, or delete columns.
A simple change to your table structure could cause your
application to fail.
The following list indicates limitations on the use of
TEMPORARY
tables:
A TEMPORARY
table can only be of type
HEAP
, ISAM
,
MyISAM
, MERGE
, or
InnoDB
.
Temporary tables are not supported for MySQL Cluster.
You cannot refer to a TEMPORARY
table
more than once in the same query. For example, the
following does not work:
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
The SHOW TABLES
statement does not list
TEMPORARY
tables.
You cannot use RENAME
to rename a
TEMPORARY
table. However, you can use
ALTER TABLE
instead:
mysql> ALTER TABLE orig_name RENAME new_name;
There are known issues in using temporary tables with replication. See Section 6.7, “Replication Features and Known Problems”, for more information.
This section is a list of the known issues in recent versions of MySQL.
For information about platform-specific issues, see the installation and porting instructions in Section 2.13, “Operating System-Specific Notes”, and MySQL Internals: Porting.
The following known issues have not been fixed in MySQL 3.23 for various reasons, and are not classified as critical.
Fixed in MySQL 4.0: Avoid using spaces at the end of column names because this can cause unexpected behavior. (Bug#4196)
Fixed in MySQL 4.0.12: You can get a deadlock (hung
thread) if you use LOCK TABLE
to lock
multiple tables and then in the same connection use
DROP TABLE
to drop one of them while
another thread is trying to lock it. (To break the
deadlock, you can use KILL
to terminate
any of the threads involved.)
Fixed in MySQL 4.0.11: SELECT MAX(key_column)
FROM t1,t2,t3...
where one of the tables are
empty doesn't return NULL
but instead
returns the maximum value for the column.
DELETE FROM heap_table
without a
WHERE
clause doesn't work on a locked
HEAP
table.
The following known issues have not been fixed in MySQL 4.0 for various reasons, and are not classified as critical.
Fixed in MySQL 4.1.10: Using HAVING
,
you can get a crash or wrong result if you use an alias to
a RAND()
function. This
will not be fixed in 4.0 because the fix may break
compatability with some applications.
Fixed in MySQL 4.1.1: In a UNION
, the
first SELECT
determines the type,
max_length
, and NULL
properties for the resulting columns.
Fixed in MySQL 4.1: In DELETE
with many
tables, you can't refer to tables to be deleted through an
alias.
Fixed in MySQL 4.1.2: You cannot mix UNION
ALL
and UNION DISTINCT
in the
same query. If you use ALL
for one
UNION
, it is used for all of them.
FLUSH TABLES WITH READ LOCK
does not
block CREATE TABLE
, which may cause a
problem with the binary log position when doing a full
backup of tables and the binary log.
Fixed in MySQL 4.1.8: mysqldump
--single-transaction --master-data
behaved like
mysqldump --master-data
, so the dump
was a blocking one.
When using the RPAD()
function (or any function adding spaces to the right) in a
query that had to be resolved by using a temporary table,
all resulting strings had rightmost spaces removed (i.e.
RPAD()
did not work).
The following known issues have not been fixed in MySQL 4.1 for various reasons, and are not classified as critical.
Fixed in 5.0.3: VARCHAR
and
VARBINARY
did not remember end space.
The following problems are known and fixing them is a high priority:
If you compare a NULL
value to a
subquery using ALL
,
ANY
, or SOME
, and
the subquery returns an empty result, the comparison might
evaluate to the non-standard result of
NULL
rather than to
TRUE
or FALSE
. This
issue has been fixed in MySQL 5.0 and later (Bug#8804).
Subquery optimization for IN
is not as
effective as for =
.
Even if you use
lower_case_table_names=2
(which enables
MySQL to remember the case used for databases and table
names), MySQL does not remember the case used for database
names for the function
DATABASE()
or within the
various logs (on case-insensitive systems).
Dropping a FOREIGN KEY
constraint
doesn't work in replication because the constraint may
have another name on the slave.
REPLACE
(and LOAD
DATA
with the REPLACE
option)
does not trigger ON DELETE CASCADE
.
DISTINCT
with ORDER
BY
doesn't work inside
GROUP_CONCAT()
if you
don't use all and only those columns that are in the
DISTINCT
list.
If one user has a long-running transaction and another
user drops a table that is updated in the transaction,
there is small chance that the binary log may contain the
DROP TABLE
command before the table is
used in the transaction itself. We plan to fix this by
having the DROP TABLE
command wait
until the table is not being used in any transaction.
When inserting a big integer value (between 263 and 264–1) into a decimal or string column, it is inserted as a negative value because the number is evaluated in a signed integer context.
FLUSH TABLES WITH READ LOCK
does not
block COMMIT
if the server is running
without binary logging, which may cause a problem (of
consistency between tables) when doing a full backup.
ANALYZE TABLE
on a
BDB
table may in some cases make the
table unusable until you restart
mysqld. If this happens, look for
errors of the following form in the MySQL error file:
001207 22:07:56 bdb: log_flush: LSN past current end-of-log
Don't execute ALTER TABLE
on a
BDB
table on which you are running
multiple-statement transactions until all those
transactions complete. (The transaction might be ignored.)
ANALYZE TABLE
, OPTIMIZE
TABLE
, and REPAIR TABLE
may
cause problems on tables for which you are using
INSERT DELAYED
.
Performing LOCK TABLE ...
and
FLUSH TABLES ...
doesn't guarantee that
there isn't a half-finished transaction in progress on the
table.
BDB
tables are relatively slow to open.
If you have many BDB
tables in a
database, it takes a long time to use the
mysql client on the database if you are
not using the -A
option or if you are
using rehash
. This is especially
noticeable when you have a large table cache.
Replication uses query-level logging: The master writes the executed queries to the binary log. This is a very fast, compact, and efficient logging method that works perfectly in most cases.
It is possible for the data on the master and slave to become different if a query is designed in such a way that the data modification is non-deterministic (generally not a recommended practice, even outside of replication).
For example:
CREATE ... SELECT
or
INSERT ... SELECT
statements that
insert zero or NULL
values into an
AUTO_INCREMENT
column.
DELETE
if you are deleting rows
from a table that has foreign keys with ON
DELETE CASCADE
properties.
REPLACE ... SELECT
, INSERT
IGNORE ... SELECT
if you have duplicate key
values in the inserted data.
If and only if the preceding queries
have no ORDER BY
clause guaranteeing a
deterministic order.
For example, for INSERT ... SELECT
with
no ORDER BY
, the
SELECT
may return rows in a different
order (which results in a row having different ranks,
hence getting a different number in the
AUTO_INCREMENT
column), depending on
the choices made by the optimizers on the master and
slave.
A query is optimized differently on the master and slave only if:
The files used by the two queries are not exactly the
same; for example, OPTIMIZE TABLE
was run on the master tables and not on the slave
tables. (To fix this, OPTIMIZE
TABLE
, ANALYZE TABLE
, and
REPAIR TABLE
are written to the
binary log as of MySQL 4.1.1).
The table is stored using a different storage engine
on the master than on the slave. (It is possible to
use different storage engines on the master and slave.
For example, you can use InnoDB
on
the master, but MyISAM
on the slave
if the slave has less available disk space.)
MySQL buffer sizes
(key_buffer_size
, and so on) are
different on the master and slave.
The master and slave run different MySQL versions, and the optimizer code differs between these versions.
This problem may also affect database restoration using mysqlbinlog|mysql.
The easiest way to avoid this problem is to add an
ORDER BY
clause to the aforementioned
non-deterministic queries to ensure that the rows are
always stored or modified in the same order.
In future MySQL versions, we will automatically add an
ORDER BY
clause when needed.
The following issues are known and will be fixed in due time:
Log filenames are based on the server hostname (if you
don't specify a filename with the startup option). You
have to use options such as
--log-bin=
if you change your hostname to something else. Another
option is to rename the old files to reflect your hostname
change (if these are binary logs, you need to edit the
binary log index file and fix the binlog names there as
well). See Section 5.1.2, “Command Options”.
old_host_name
-bin
mysqlbinlog does not delete temporary
files left after a LOAD DATA INFILE
command. See Section 4.6.6, “mysqlbinlog — Utility for Processing Binary Log Files”.
RENAME
doesn't work with
TEMPORARY
tables or tables used in a
MERGE
table.
Due to the way table format (.frm
)
files are stored, you cannot use character 255
(CHAR(255)
) in table names, column
names, or enumerations. This is scheduled to be fixed in
version 5.1 when we implement new table definition format
files.
When using SET CHARACTER SET
, you can't
use translated characters in database, table, and column
names.
You can't use “_
” or
“%
” with
ESCAPE
in
LIKE ...
ESCAPE
.
If you have a DECIMAL
column in which
the same number is stored in different formats (for
example, +01.00
,
1.00
, 01.00
),
GROUP BY
may regard each value as a
different value.
You cannot build the server in another directory when using MIT-pthreads. Because this requires changes to MIT-pthreads, we are not likely to fix this. See Section 2.9.5, “MIT-pthreads Notes”.
BLOB
and TEXT
values
can't “reliably” be used in GROUP
BY
, ORDER BY
or
DISTINCT
. Only the first
max_sort_length
bytes are used when
comparing BLOB
values in these cases.
The default value of max_sort_length
value is 1024 and can be changed at server startup time.
As of MySQL 4.0.3, it can be changed at runtime. For older
versions, a workaround is to use a substring. For example:
SELECT DISTINCT LEFT(blob_col
,2048) FROMtbl_name
;
Numeric calculations are done with
BIGINT
or DOUBLE
(both are normally 64 bits long). Which precision you get
depends on the function. The general rule is that bit
functions are performed with BIGINT
precision, IF
and
ELT()
with
BIGINT
or DOUBLE
precision, and the rest with DOUBLE
precision. You should try to avoid using unsigned long
long values if they resolve to be larger than 63 bits
(9223372036854775807) for anything other than bit fields.
MySQL Server 4.0 has better BIGINT
handling than 3.23.
You can have up to 255 ENUM
and
SET
columns in one table.
In MIN()
,
MAX()
, and other aggregate
functions, MySQL currently compares
ENUM
and SET
columns
by their string value rather than by the string's relative
position in the set.
mysqld_safe redirects all messages from
mysqld to the mysqld
log. One problem with this is that if you execute
mysqladmin refresh to close and reopen
the log, stdout
and
stderr
are still redirected to the old
log. If you use --log
extensively, you
should edit mysqld_safe to log to
instead of
host_name
.err
so that you can easily reclaim the space for the old log
by deleting it and executing mysqladmin
refresh.
host_name
.log
In an UPDATE
statement, columns are
updated from left to right. If you refer to an updated
column, you get the updated value instead of the original
value. For example, the following statement increments
KEY
by 2
,
not 1
:
mysql> UPDATE tbl_name
SET KEY=KEY+1,KEY=KEY+1;
You can refer to multiple temporary tables in the same query, but you cannot refer to any given temporary table more than once. For example, the following doesn't work:
mysql> SELECT * FROM temp_table, temp_table AS t2;
ERROR 1137: Can't reopen table: 'temp_table'
The optimizer may handle DISTINCT
differently when you are using “hidden”
columns in a join than when you are not. In a join, hidden
columns are counted as part of the result (even if they
are not shown), whereas in normal queries, hidden columns
don't participate in the DISTINCT
comparison. We will probably change this in the future to
never compare the hidden columns when executing
DISTINCT
.
An example of this is:
SELECT DISTINCT mp3id FROM band_downloads WHERE userid = 9 ORDER BY id DESC;
and
SELECT DISTINCT band_downloads.mp3id FROM band_downloads,band_mp3 WHERE band_downloads.userid = 9 AND band_mp3.id = band_downloads.mp3id ORDER BY band_downloads.id DESC;
In the second case, using MySQL Server 3.23.x, you may get
two identical rows in the result set (because the values
in the hidden id
column may differ).
Note that this happens only for queries where that do not
have the ORDER BY
columns in the
result.
If you execute a PROCEDURE
on a query
that returns an empty set, in some cases the
PROCEDURE
does not transform the
columns.
Creation of a table of type MERGE
doesn't check whether the underlying tables are compatible
types.
If you use ALTER TABLE
to add a
UNIQUE
index to a table used in a
MERGE
table and then add a normal index
on the MERGE
table, the key order is
different for the tables if there was an old,
non-UNIQUE
key in the table. This is
because ALTER TABLE
puts
UNIQUE
indexes before normal indexes to
be able to detect duplicate keys as early as possible.
MySQL programs have access to several types of error information when the server returns an error. For example, the mysql client program displays errors using the following format:
shell> SELECT * FROM no_such_table;
ERROR 1146 (42S02): Table 'test.no_such_table' doesn't exist
The message displayed contains three types of information:
A numeric error value (1146
). This number
is MySQL-specific and is not portable to other database
systems.
A five-character SQLSTATE value ('42S02'
).
The values are specified by ANSI SQL and ODBC and are more
standardized. Not all MySQL error numbers are mapped to
SQLSTATE error codes. The value 'HY000'
(general error) is used for unmapped errors.
A string that provides a textual description of the error.
Server error information comes from the following source files. For details about the way that error information is defined, see the MySQL Internals manual, available at http://dev.mysql.com/doc/.
The Error values and the symbols in parentheses correspond to
definitions in the include/mysqld_error.h
MySQL source file.
The SQLSTATE values correspond to definitions in the
include/sql_state.h
MySQL source file.
SQLSTATE error codes are displayed only if you use MySQL version 4.1 and up. SQLSTATE codes were added for compatibility with X/Open, ANSI, and ODBC behavior.
The Message values correspond to the error messages that are
listed in the sql/share/errmsg.txt
file.
%d
and %s
represent
numbers and strings, respectively, that are substituted into
the messages when they are displayed.
Because updates are frequent, it is possible that those files will contain additional error information not listed here.
Error: 1000
SQLSTATE: HY000
(ER_HASHCHK
)
Message: hashchk
Error: 1001
SQLSTATE: HY000
(ER_NISAMCHK
)
Message: isamchk
Error: 1002
SQLSTATE: HY000
(ER_NO
)
Message: NO
Error: 1003
SQLSTATE: HY000
(ER_YES
)
Message: YES
Error: 1004
SQLSTATE: HY000
(ER_CANT_CREATE_FILE
)
Message: Can't create file '%s' (errno: %d)
Error: 1005
SQLSTATE: HY000
(ER_CANT_CREATE_TABLE
)
Message: Can't create table '%s' (errno: %d)
Error: 1006
SQLSTATE: HY000
(ER_CANT_CREATE_DB
)
Message: Can't create database '%s' (errno: %d)
Error: 1007
SQLSTATE: HY000
(ER_DB_CREATE_EXISTS
)
Message: Can't create database '%s'; database exists
Error: 1008
SQLSTATE: HY000
(ER_DB_DROP_EXISTS
)
Message: Can't drop database '%s'; database doesn't exist
Error: 1009
SQLSTATE: HY000
(ER_DB_DROP_DELETE
)
Message: Error dropping database (can't delete '%s', errno: %d)
Error: 1010
SQLSTATE: HY000
(ER_DB_DROP_RMDIR
)
Message: Error dropping database (can't rmdir '%s', errno: %d)
Error: 1011
SQLSTATE: HY000
(ER_CANT_DELETE_FILE
)
Message: Error on delete of '%s' (errno: %d)
Error: 1012
SQLSTATE: HY000
(ER_CANT_FIND_SYSTEM_REC
)
Message: Can't read record in system table
Error: 1013
SQLSTATE: HY000
(ER_CANT_GET_STAT
)
Message: Can't get status of '%s' (errno: %d)
Error: 1014
SQLSTATE: HY000
(ER_CANT_GET_WD
)
Message: Can't get working directory (errno: %d)
Error: 1015
SQLSTATE: HY000
(ER_CANT_LOCK
)
Message: Can't lock file (errno: %d)
Error: 1016
SQLSTATE: HY000
(ER_CANT_OPEN_FILE
)
Message: Can't open file: '%s' (errno: %d)
Error: 1017
SQLSTATE: HY000
(ER_FILE_NOT_FOUND
)
Message: Can't find file: '%s' (errno: %d)
Error: 1018
SQLSTATE: HY000
(ER_CANT_READ_DIR
)
Message: Can't read dir of '%s' (errno: %d)
Error: 1019
SQLSTATE: HY000
(ER_CANT_SET_WD
)
Message: Can't change dir to '%s' (errno: %d)
Error: 1020
SQLSTATE: HY000
(ER_CHECKREAD
)
Message: Record has changed since last read in table '%s'
Error: 1021
SQLSTATE: HY000
(ER_DISK_FULL
)
Message: Disk full (%s); waiting for someone to free some space...
Error: 1022
SQLSTATE: 23000
(ER_DUP_KEY
)
Message: Can't write; duplicate key in table '%s'
Error: 1023
SQLSTATE: HY000
(ER_ERROR_ON_CLOSE
)
Message: Error on close of '%s' (errno: %d)
Error: 1024
SQLSTATE: HY000
(ER_ERROR_ON_READ
)
Message: Error reading file '%s' (errno: %d)
Error: 1025
SQLSTATE: HY000
(ER_ERROR_ON_RENAME
)
Message: Error on rename of '%s' to '%s' (errno: %d)
Error: 1026
SQLSTATE: HY000
(ER_ERROR_ON_WRITE
)
Message: Error writing file '%s' (errno: %d)
Error: 1027
SQLSTATE: HY000
(ER_FILE_USED
)
Message: '%s' is locked against change
Error: 1028
SQLSTATE: HY000
(ER_FILSORT_ABORT
)
Message: Sort aborted
Error: 1029
SQLSTATE: HY000
(ER_FORM_NOT_FOUND
)
Message: View '%s' doesn't exist for '%s'
Error: 1030
SQLSTATE: HY000
(ER_GET_ERRNO
)
Message: Got error %d from storage engine
Error: 1031
SQLSTATE: HY000
(ER_ILLEGAL_HA
)
Message: Table storage engine for '%s' doesn't have this option
Error: 1032
SQLSTATE: HY000
(ER_KEY_NOT_FOUND
)
Message: Can't find record in '%s'
Error: 1033
SQLSTATE: HY000
(ER_NOT_FORM_FILE
)
Message: Incorrect information in file: '%s'
Error: 1034
SQLSTATE: HY000
(ER_NOT_KEYFILE
)
Message: Incorrect key file for table '%s'; try to repair it
Error: 1035
SQLSTATE: HY000
(ER_OLD_KEYFILE
)
Message: Old key file for table '%s'; repair it!
Error: 1036
SQLSTATE: HY000
(ER_OPEN_AS_READONLY
)
Message: Table '%s' is read only
Error: 1037
SQLSTATE: HY001
(ER_OUTOFMEMORY
)
Message: Out of memory; restart server and try again (needed %d bytes)
Error: 1038
SQLSTATE: HY001
(ER_OUT_OF_SORTMEMORY
)
Message: Out of sort memory; increase server sort buffer size
Error: 1039
SQLSTATE: HY000
(ER_UNEXPECTED_EOF
)
Message: Unexpected EOF found when reading file '%s' (errno: %d)
Error: 1040
SQLSTATE: 08004
(ER_CON_COUNT_ERROR
)
Message: Too many connections
Error: 1041
SQLSTATE: HY000
(ER_OUT_OF_RESOURCES
)
Message: Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space
Error: 1042
SQLSTATE: 08S01
(ER_BAD_HOST_ERROR
)
Message: Can't get hostname for your address
Error: 1043
SQLSTATE: 08S01
(ER_HANDSHAKE_ERROR
)
Message: Bad handshake
Error: 1044
SQLSTATE: 42000
(ER_DBACCESS_DENIED_ERROR
)
Message: Access denied for user '%s'@'%s' to database '%s'
Error: 1045
SQLSTATE: 28000
(ER_ACCESS_DENIED_ERROR
)
Message: Access denied for user '%s'@'%s' (using password: %s)
Error: 1046
SQLSTATE: 3D000
(ER_NO_DB_ERROR
)
Message: No database selected
Error: 1047
SQLSTATE: 08S01
(ER_UNKNOWN_COM_ERROR
)
Message: Unknown command
Error: 1048
SQLSTATE: 23000
(ER_BAD_NULL_ERROR
)
Message: Column '%s' cannot be null
Error: 1049
SQLSTATE: 42000
(ER_BAD_DB_ERROR
)
Message: Unknown database '%s'
Error: 1050
SQLSTATE: 42S01
(ER_TABLE_EXISTS_ERROR
)
Message: Table '%s' already exists
Error: 1051
SQLSTATE: 42S02
(ER_BAD_TABLE_ERROR
)
Message: Unknown table '%s'
Error: 1052
SQLSTATE: 23000
(ER_NON_UNIQ_ERROR
)
Message: Column '%s' in %s is ambiguous
Error: 1053
SQLSTATE: 08S01
(ER_SERVER_SHUTDOWN
)
Message: Server shutdown in progress
Error: 1054
SQLSTATE: 42S22
(ER_BAD_FIELD_ERROR
)
Message: Unknown column '%s' in '%s'
Error: 1055
SQLSTATE: 42000
(ER_WRONG_FIELD_WITH_GROUP
)
Message: '%s' isn't in GROUP BY
Error: 1056
SQLSTATE: 42000
(ER_WRONG_GROUP_FIELD
)
Message: Can't group on '%s'
Error: 1057
SQLSTATE: 42000
(ER_WRONG_SUM_SELECT
)
Message: Statement has sum functions and columns in same statement
Error: 1058
SQLSTATE: 21S01
(ER_WRONG_VALUE_COUNT
)
Message: Column count doesn't match value count
Error: 1059
SQLSTATE: 42000
(ER_TOO_LONG_IDENT
)
Message: Identifier name '%s' is too long
Error: 1060
SQLSTATE: 42S21
(ER_DUP_FIELDNAME
)
Message: Duplicate column name '%s'
Error: 1061
SQLSTATE: 42000
(ER_DUP_KEYNAME
)
Message: Duplicate key name '%s'
Error: 1062
SQLSTATE: 23000
(ER_DUP_ENTRY
)
Message: Duplicate entry '%s' for key %d
Error: 1063
SQLSTATE: 42000
(ER_WRONG_FIELD_SPEC
)
Message: Incorrect column specifier for column '%s'
Error: 1064
SQLSTATE: 42000
(ER_PARSE_ERROR
)
Message: %s near '%s' at line %d
Error: 1065
SQLSTATE: HY000
(ER_EMPTY_QUERY
)
Message: Query was empty
Error: 1066
SQLSTATE: 42000
(ER_NONUNIQ_TABLE
)
Message: Not unique table/alias: '%s'
Error: 1067
SQLSTATE: 42000
(ER_INVALID_DEFAULT
)
Message: Invalid default value for '%s'
Error: 1068
SQLSTATE: 42000
(ER_MULTIPLE_PRI_KEY
)
Message: Multiple primary key defined
Error: 1069
SQLSTATE: 42000
(ER_TOO_MANY_KEYS
)
Message: Too many keys specified; max %d keys allowed
Error: 1070
SQLSTATE: 42000
(ER_TOO_MANY_KEY_PARTS
)
Message: Too many key parts specified; max %d parts allowed
Error: 1071
SQLSTATE: 42000
(ER_TOO_LONG_KEY
)
Message: Specified key was too long; max key length is %d bytes
Error: 1072
SQLSTATE: 42000
(ER_KEY_COLUMN_DOES_NOT_EXITS
)
Message: Key column '%s' doesn't exist in table
Error: 1073
SQLSTATE: 42000
(ER_BLOB_USED_AS_KEY
)
Message: BLOB column '%s' can't be used in key specification with the used table type
Error: 1074
SQLSTATE: 42000
(ER_TOO_BIG_FIELDLENGTH
)
Message: Column length too big for column '%s' (max = %d); use BLOB or TEXT instead
Error: 1075
SQLSTATE: 42000
(ER_WRONG_AUTO_KEY
)
Message: Incorrect table definition; there can be only one auto column and it must be defined as a key
Error: 1076
SQLSTATE: HY000
(ER_READY
)
Message: %s: ready for connections. Version: '%s' socket: '%s' port: %d
Error: 1077
SQLSTATE: HY000
(ER_NORMAL_SHUTDOWN
)
Message: %s: Normal shutdown
Error: 1078
SQLSTATE: HY000
(ER_GOT_SIGNAL
)
Message: %s: Got signal %d. Aborting!
Error: 1079
SQLSTATE: HY000
(ER_SHUTDOWN_COMPLETE
)
Message: %s: Shutdown complete
Error: 1080
SQLSTATE: 08S01
(ER_FORCING_CLOSE
)
Message: %s: Forcing close of thread %ld user: '%s'
Error: 1081
SQLSTATE: 08S01
(ER_IPSOCK_ERROR
)
Message: Can't create IP socket
Error: 1082
SQLSTATE: 42S12
(ER_NO_SUCH_INDEX
)
Message: Table '%s' has no index like the one used in CREATE INDEX; recreate the table
Error: 1083
SQLSTATE: 42000
(ER_WRONG_FIELD_TERMINATORS
)
Message: Field separator argument is not what is expected; check the manual
Error: 1084
SQLSTATE: 42000
(ER_BLOBS_AND_NO_TERMINATED
)
Message: You can't use fixed rowlength with BLOBs; please use 'fields terminated by'
Error: 1085
SQLSTATE: HY000
(ER_TEXTFILE_NOT_READABLE
)
Message: The file '%s' must be in the database directory or be readable by all
Error: 1086
SQLSTATE: HY000
(ER_FILE_EXISTS_ERROR
)
Message: File '%s' already exists
Error: 1087
SQLSTATE: HY000
(ER_LOAD_INFO
)
Message: Records: %ld Deleted: %ld Skipped: %ld Warnings: %ld
Error: 1088
SQLSTATE: HY000
(ER_ALTER_INFO
)
Message: Records: %ld Duplicates: %ld
Error: 1089
SQLSTATE: HY000
(ER_WRONG_SUB_KEY
)
Message: Incorrect sub part key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique sub keys
Error: 1090
SQLSTATE: 42000
(ER_CANT_REMOVE_ALL_FIELDS
)
Message: You can't delete all columns with ALTER TABLE; use DROP TABLE instead
Error: 1091
SQLSTATE: 42000
(ER_CANT_DROP_FIELD_OR_KEY
)
Message: Can't DROP '%s'; check that column/key exists
Error: 1092
SQLSTATE: HY000
(ER_INSERT_INFO
)
Message: Records: %ld Duplicates: %ld Warnings: %ld
Error: 1093
SQLSTATE: HY000
(ER_UPDATE_TABLE_USED
)
Message: You can't specify target table '%s' for update in FROM clause
Error: 1094
SQLSTATE: HY000
(ER_NO_SUCH_THREAD
)
Message: Unknown thread id: %lu
Error: 1095
SQLSTATE: HY000
(ER_KILL_DENIED_ERROR
)
Message: You are not owner of thread %lu
Error: 1096
SQLSTATE: HY000
(ER_NO_TABLES_USED
)
Message: No tables used
Error: 1097
SQLSTATE: HY000
(ER_TOO_BIG_SET
)
Message: Too many strings for column %s and SET
Error: 1098
SQLSTATE: HY000
(ER_NO_UNIQUE_LOGFILE
)
Message: Can't generate a unique log-filename %s.(1-999)
Error: 1099
SQLSTATE: HY000
(ER_TABLE_NOT_LOCKED_FOR_WRITE
)
Message: Table '%s' was locked with a READ lock and can't be updated
Error: 1100
SQLSTATE: HY000
(ER_TABLE_NOT_LOCKED
)
Message: Table '%s' was not locked with LOCK TABLES
Error: 1101
SQLSTATE: 42000
(ER_BLOB_CANT_HAVE_DEFAULT
)
Message: BLOB/TEXT column '%s' can't have a default value
Error: 1102
SQLSTATE: 42000
(ER_WRONG_DB_NAME
)
Message: Incorrect database name '%s'
Error: 1103
SQLSTATE: 42000
(ER_WRONG_TABLE_NAME
)
Message: Incorrect table name '%s'
Error: 1104
SQLSTATE: 42000
(ER_TOO_BIG_SELECT
)
Message: The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay
Error: 1105
SQLSTATE: HY000
(ER_UNKNOWN_ERROR
)
Message: Unknown error
Error: 1106
SQLSTATE: 42000
(ER_UNKNOWN_PROCEDURE
)
Message: Unknown procedure '%s'
Error: 1107
SQLSTATE: 42000
(ER_WRONG_PARAMCOUNT_TO_PROCEDURE
)
Message: Incorrect parameter count to procedure '%s'
Error: 1108
SQLSTATE: HY000
(ER_WRONG_PARAMETERS_TO_PROCEDURE
)
Message: Incorrect parameters to procedure '%s'
Error: 1109
SQLSTATE: 42S02
(ER_UNKNOWN_TABLE
)
Message: Unknown table '%s' in %s
Error: 1110
SQLSTATE: 42000
(ER_FIELD_SPECIFIED_TWICE
)
Message: Column '%s' specified twice
Error: 1111
SQLSTATE: HY000
(ER_INVALID_GROUP_FUNC_USE
)
Message: Invalid use of group function
Error: 1112
SQLSTATE: 42000
(ER_UNSUPPORTED_EXTENSION
)
Message: Table '%s' uses an extension that doesn't exist in this MySQL version
Error: 1113
SQLSTATE: 42000
(ER_TABLE_MUST_HAVE_COLUMNS
)
Message: A table must have at least 1 column
Error: 1114
SQLSTATE: HY000
(ER_RECORD_FILE_FULL
)
Message: The table '%s' is full
Error: 1115
SQLSTATE: 42000
(ER_UNKNOWN_CHARACTER_SET
)
Message: Unknown character set: '%s'
Error: 1116
SQLSTATE: HY000
(ER_TOO_MANY_TABLES
)
Message: Too many tables; MySQL can only use %d tables in a join
Error: 1117
SQLSTATE: HY000
(ER_TOO_MANY_FIELDS
)
Message: Too many columns
Error: 1118
SQLSTATE: 42000
(ER_TOO_BIG_ROWSIZE
)
Message: Row size too large. The maximum row size for the used table type, not counting BLOBs, is %ld. You have to change some columns to TEXT or BLOBs
Error: 1119
SQLSTATE: HY000
(ER_STACK_OVERRUN
)
Message: Thread stack overrun: Used: %ld of a %ld stack. Use 'mysqld -O thread_stack=#' to specify a bigger stack if needed
Error: 1120
SQLSTATE: 42000
(ER_WRONG_OUTER_JOIN
)
Message: Cross dependency found in OUTER JOIN; examine your ON conditions
Error: 1121
SQLSTATE: 42000
(ER_NULL_COLUMN_IN_INDEX
)
Message: Column '%s' is used with UNIQUE or INDEX but is not defined as NOT NULL
Error: 1122
SQLSTATE: HY000
(ER_CANT_FIND_UDF
)
Message: Can't load function '%s'
Error: 1123
SQLSTATE: HY000
(ER_CANT_INITIALIZE_UDF
)
Message: Can't initialize function '%s'; %s
Error: 1124
SQLSTATE: HY000
(ER_UDF_NO_PATHS
)
Message: No paths allowed for shared library
Error: 1125
SQLSTATE: HY000
(ER_UDF_EXISTS
)
Message: Function '%s' already exists
Error: 1126
SQLSTATE: HY000
(ER_CANT_OPEN_LIBRARY
)
Message: Can't open shared library '%s' (errno: %d %s)
Error: 1127
SQLSTATE: HY000
(ER_CANT_FIND_DL_ENTRY
)
Message: Can't find function '%s' in library
Error: 1128
SQLSTATE: HY000
(ER_FUNCTION_NOT_DEFINED
)
Message: Function '%s' is not defined
Error: 1129
SQLSTATE: HY000
(ER_HOST_IS_BLOCKED
)
Message: Host '%s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
Error: 1130
SQLSTATE: HY000
(ER_HOST_NOT_PRIVILEGED
)
Message: Host '%s' is not allowed to connect to this MySQL server
Error: 1131
SQLSTATE: 42000
(ER_PASSWORD_ANONYMOUS_USER
)
Message: You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords
Error: 1132
SQLSTATE: 42000
(ER_PASSWORD_NOT_ALLOWED
)
Message: You must have privileges to update tables in the mysql database to be able to change passwords for others
Error: 1133
SQLSTATE: 42000
(ER_PASSWORD_NO_MATCH
)
Message: Can't find any matching row in the user table
Error: 1134
SQLSTATE: HY000
(ER_UPDATE_INFO
)
Message: Rows matched: %ld Changed: %ld Warnings: %ld
Error: 1135
SQLSTATE: HY000
(ER_CANT_CREATE_THREAD
)
Message: Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
Error: 1136
SQLSTATE: 21S01
(ER_WRONG_VALUE_COUNT_ON_ROW
)
Message: Column count doesn't match value count at row %ld
Error: 1137
SQLSTATE: HY000
(ER_CANT_REOPEN_TABLE
)
Message: Can't reopen table: '%s'
Error: 1138
SQLSTATE: 42000
(ER_INVALID_USE_OF_NULL
)
Message: Invalid use of NULL value
Error: 1139
SQLSTATE: 42000
(ER_REGEXP_ERROR
)
Message: Got error '%s' from regexp
Error: 1140
SQLSTATE: 42000
(ER_MIX_OF_GROUP_FUNC_AND_FIELDS
)
Message: Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Error: 1141
SQLSTATE: 42000
(ER_NONEXISTING_GRANT
)
Message: There is no such grant defined for user '%s' on host '%s'
Error: 1142
SQLSTATE: 42000
(ER_TABLEACCESS_DENIED_ERROR
)
Message: %s command denied to user '%s'@'%s' for table '%s'
Error: 1143
SQLSTATE: 42000
(ER_COLUMNACCESS_DENIED_ERROR
)
Message: %s command denied to user '%s'@'%s' for column '%s' in table '%s'
Error: 1144
SQLSTATE: 42000
(ER_ILLEGAL_GRANT_FOR_TABLE
)
Message: Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used
Error: 1145
SQLSTATE: 42000
(ER_GRANT_WRONG_HOST_OR_USER
)
Message: The host or user argument to GRANT is too long
Error: 1146
SQLSTATE: 42S02
(ER_NO_SUCH_TABLE
)
Message: Table '%s.%s' doesn't exist
Error: 1147
SQLSTATE: 42000
(ER_NONEXISTING_TABLE_GRANT
)
Message: There is no such grant defined for user '%s' on host '%s' on table '%s'
Error: 1148
SQLSTATE: 42000
(ER_NOT_ALLOWED_COMMAND
)
Message: The used command is not allowed with this MySQL version
Error: 1149
SQLSTATE: 42000
(ER_SYNTAX_ERROR
)
Message: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use
Error: 1150
SQLSTATE: HY000
(ER_DELAYED_CANT_CHANGE_LOCK
)
Message: Delayed insert thread couldn't get requested lock for table %s
Error: 1151
SQLSTATE: HY000
(ER_TOO_MANY_DELAYED_THREADS
)
Message: Too many delayed threads in use
Error: 1152
SQLSTATE: 08S01
(ER_ABORTING_CONNECTION
)
Message: Aborted connection %ld to db: '%s' user: '%s' (%s)
Error: 1153
SQLSTATE: 08S01
(ER_NET_PACKET_TOO_LARGE
)
Message: Got a packet bigger than 'max_allowed_packet' bytes
Error: 1154
SQLSTATE: 08S01
(ER_NET_READ_ERROR_FROM_PIPE
)
Message: Got a read error from the connection pipe
Error: 1155
SQLSTATE: 08S01
(ER_NET_FCNTL_ERROR
)
Message: Got an error from fcntl()
Error: 1156
SQLSTATE: 08S01
(ER_NET_PACKETS_OUT_OF_ORDER
)
Message: Got packets out of order
Error: 1157
SQLSTATE: 08S01
(ER_NET_UNCOMPRESS_ERROR
)
Message: Couldn't uncompress communication packet
Error: 1158
SQLSTATE: 08S01
(ER_NET_READ_ERROR
)
Message: Got an error reading communication packets
Error: 1159
SQLSTATE: 08S01
(ER_NET_READ_INTERRUPTED
)
Message: Got timeout reading communication packets
Error: 1160
SQLSTATE: 08S01
(ER_NET_ERROR_ON_WRITE
)
Message: Got an error writing communication packets
Error: 1161
SQLSTATE: 08S01
(ER_NET_WRITE_INTERRUPTED
)
Message: Got timeout writing communication packets
Error: 1162
SQLSTATE: 42000
(ER_TOO_LONG_STRING
)
Message: Result string is longer than 'max_allowed_packet' bytes
Error: 1163
SQLSTATE: 42000
(ER_TABLE_CANT_HANDLE_BLOB
)
Message: The used table type doesn't support BLOB/TEXT columns
Error: 1164
SQLSTATE: 42000
(ER_TABLE_CANT_HANDLE_AUTO_INCREMENT
)
Message: The used table type doesn't support AUTO_INCREMENT columns
Error: 1165
SQLSTATE: HY000
(ER_DELAYED_INSERT_TABLE_LOCKED
)
Message: INSERT DELAYED can't be used with table '%s' because it is locked with LOCK TABLES
Error: 1166
SQLSTATE: 42000
(ER_WRONG_COLUMN_NAME
)
Message: Incorrect column name '%s'
Error: 1167
SQLSTATE: 42000
(ER_WRONG_KEY_COLUMN
)
Message: The used storage engine can't index column '%s'
Error: 1168
SQLSTATE: HY000
(ER_WRONG_MRG_TABLE
)
Message: Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist
Error: 1169
SQLSTATE: 23000
(ER_DUP_UNIQUE
)
Message: Can't write, because of unique constraint, to table '%s'
Error: 1170
SQLSTATE: 42000
(ER_BLOB_KEY_WITHOUT_LENGTH
)
Message: BLOB/TEXT column '%s' used in key specification without a key length
Error: 1171
SQLSTATE: 42000
(ER_PRIMARY_CANT_HAVE_NULL
)
Message: All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead
Error: 1172
SQLSTATE: 42000
(ER_TOO_MANY_ROWS
)
Message: Result consisted of more than one row
Error: 1173
SQLSTATE: 42000
(ER_REQUIRES_PRIMARY_KEY
)
Message: This table type requires a primary key
Error: 1174
SQLSTATE: HY000
(ER_NO_RAID_COMPILED
)
Message: This version of MySQL is not compiled with RAID support
Error: 1175
SQLSTATE: HY000
(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE
)
Message: You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column
Error: 1176
SQLSTATE: HY000
(ER_KEY_DOES_NOT_EXITS
)
Message: Key '%s' doesn't exist in table '%s'
Error: 1177
SQLSTATE: 42000
(ER_CHECK_NO_SUCH_TABLE
)
Message: Can't open table
Error: 1178
SQLSTATE: 42000
(ER_CHECK_NOT_IMPLEMENTED
)
Message: The storage engine for the table doesn't support %s
Error: 1179
SQLSTATE: 25000
(ER_CANT_DO_THIS_DURING_AN_TRANSACTION
)
Message: You are not allowed to execute this command in a transaction
Error: 1180
SQLSTATE: HY000
(ER_ERROR_DURING_COMMIT
)
Message: Got error %d during COMMIT
Error: 1181
SQLSTATE: HY000
(ER_ERROR_DURING_ROLLBACK
)
Message: Got error %d during ROLLBACK
Error: 1182
SQLSTATE: HY000
(ER_ERROR_DURING_FLUSH_LOGS
)
Message: Got error %d during FLUSH_LOGS
Error: 1183
SQLSTATE: HY000
(ER_ERROR_DURING_CHECKPOINT
)
Message: Got error %d during CHECKPOINT
Error: 1184
SQLSTATE: 08S01
(ER_NEW_ABORTING_CONNECTION
)
Message: Aborted connection %ld to db: '%s' user: '%s' host: `%s' (%s)
Error: 1185
SQLSTATE: HY000
(ER_DUMP_NOT_IMPLEMENTED
)
Message: The storage engine for the table does not support binary table dump
Error: 1186
SQLSTATE: HY000
(ER_FLUSH_MASTER_BINLOG_CLOSED
)
Message: Binlog closed, cannot RESET MASTER
Error: 1187
SQLSTATE: HY000
(ER_INDEX_REBUILD
)
Message: Failed rebuilding the index of dumped table '%s'
Error: 1188
SQLSTATE: HY000
(ER_MASTER
)
Message: Error from master: '%s'
Error: 1189
SQLSTATE: 08S01
(ER_MASTER_NET_READ
)
Message: Net error reading from master
Error: 1190
SQLSTATE: 08S01
(ER_MASTER_NET_WRITE
)
Message: Net error writing to master
Error: 1191
SQLSTATE: HY000
(ER_FT_MATCHING_KEY_NOT_FOUND
)
Message: Can't find FULLTEXT index matching the column list
Error: 1192
SQLSTATE: HY000
(ER_LOCK_OR_ACTIVE_TRANSACTION
)
Message: Can't execute the given command because you have active locked tables or an active transaction
Error: 1193
SQLSTATE: HY000
(ER_UNKNOWN_SYSTEM_VARIABLE
)
Message: Unknown system variable '%s'
Error: 1194
SQLSTATE: HY000
(ER_CRASHED_ON_USAGE
)
Message: Table '%s' is marked as crashed and should be repaired
Error: 1195
SQLSTATE: HY000
(ER_CRASHED_ON_REPAIR
)
Message: Table '%s' is marked as crashed and last (automatic?) repair failed
Error: 1196
SQLSTATE: HY000
(ER_WARNING_NOT_COMPLETE_ROLLBACK
)
Message: Some non-transactional changed tables couldn't be rolled back
Error: 1197
SQLSTATE: HY000
(ER_TRANS_CACHE_FULL
)
Message: Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
Error: 1198
SQLSTATE: HY000
(ER_SLAVE_MUST_STOP
)
Message: This operation cannot be performed with a running slave; run STOP SLAVE first
Error: 1199
SQLSTATE: HY000
(ER_SLAVE_NOT_RUNNING
)
Message: This operation requires a running slave; configure slave and do START SLAVE
Error: 1200
SQLSTATE: HY000
(ER_BAD_SLAVE
)
Message: The server is not configured as slave; fix in config file or with CHANGE MASTER TO
Error: 1201
SQLSTATE: HY000
(ER_MASTER_INFO
)
Message: Could not initialize master info structure; more error messages can be found in the MySQL error log
Error: 1202
SQLSTATE: HY000
(ER_SLAVE_THREAD
)
Message: Could not create slave thread; check system resources
Error: 1203
SQLSTATE: 42000
(ER_TOO_MANY_USER_CONNECTIONS
)
Message: User %s has already more than 'max_user_connections' active connections
Error: 1204
SQLSTATE: HY000
(ER_SET_CONSTANTS_ONLY
)
Message: You may only use constant expressions with SET
Error: 1205
SQLSTATE: HY000
(ER_LOCK_WAIT_TIMEOUT
)
Message: Lock wait timeout exceeded; try restarting transaction
Error: 1206
SQLSTATE: HY000
(ER_LOCK_TABLE_FULL
)
Message: The total number of locks exceeds the lock table size
Error: 1207
SQLSTATE: 25000
(ER_READ_ONLY_TRANSACTION
)
Message: Update locks cannot be acquired during a READ UNCOMMITTED transaction
Error: 1208
SQLSTATE: HY000
(ER_DROP_DB_WITH_READ_LOCK
)
Message: DROP DATABASE not allowed while thread is holding global read lock
Error: 1209
SQLSTATE: HY000
(ER_CREATE_DB_WITH_READ_LOCK
)
Message: CREATE DATABASE not allowed while thread is holding global read lock
Error: 1210
SQLSTATE: HY000
(ER_WRONG_ARGUMENTS
)
Message: Incorrect arguments to %s
Error: 1211
SQLSTATE: 42000
(ER_NO_PERMISSION_TO_CREATE_USER
)
Message: '%s'@'%s' is not allowed to create new users
Error: 1212
SQLSTATE: HY000
(ER_UNION_TABLES_IN_DIFFERENT_DIR
)
Message: Incorrect table definition; all MERGE tables must be in the same database
Error: 1213
SQLSTATE: 40001
(ER_LOCK_DEADLOCK
)
Message: Deadlock found when trying to get lock; try restarting transaction
Error: 1214
SQLSTATE: HY000
(ER_TABLE_CANT_HANDLE_FT
)
Message: The used table type doesn't support FULLTEXT indexes
Error: 1215
SQLSTATE: HY000
(ER_CANNOT_ADD_FOREIGN
)
Message: Cannot add foreign key constraint
Error: 1216
SQLSTATE: 23000
(ER_NO_REFERENCED_ROW
)
Message: Cannot add or update a child row: a foreign key constraint fails
Error: 1217
SQLSTATE: 23000
(ER_ROW_IS_REFERENCED
)
Message: Cannot delete or update a parent row: a foreign key constraint fails
Error: 1218
SQLSTATE: 08S01
(ER_CONNECT_TO_MASTER
)
Message: Error connecting to master: %s
Error: 1219
SQLSTATE: HY000
(ER_QUERY_ON_MASTER
)
Message: Error running query on master: %s
Error: 1220
SQLSTATE: HY000
(ER_ERROR_WHEN_EXECUTING_COMMAND
)
Message: Error when executing command %s: %s
Error: 1221
SQLSTATE: HY000
(ER_WRONG_USAGE
)
Message: Incorrect usage of %s and %s
Error: 1222
SQLSTATE: 21000
(ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT
)
Message: The used SELECT statements have a different number of columns
Error: 1223
SQLSTATE: HY000
(ER_CANT_UPDATE_WITH_READLOCK
)
Message: Can't execute the query because you have a conflicting read lock
Error: 1224
SQLSTATE: HY000
(ER_MIXING_NOT_ALLOWED
)
Message: Mixing of transactional and non-transactional tables is disabled
Error: 1225
SQLSTATE: HY000
(ER_DUP_ARGUMENT
)
Message: Option '%s' used twice in statement
Error: 1226
SQLSTATE: 42000
(ER_USER_LIMIT_REACHED
)
Message: User '%s' has exceeded the '%s' resource (current value: %ld)
Error: 1227
SQLSTATE: HY000
(ER_SPECIFIC_ACCESS_DENIED_ERROR
)
Message: Access denied; you need the %s privilege for this operation
Error: 1228
SQLSTATE: HY000
(ER_LOCAL_VARIABLE
)
Message: Variable '%s' is a SESSION variable and can't be used with SET GLOBAL
Error: 1229
SQLSTATE: HY000
(ER_GLOBAL_VARIABLE
)
Message: Variable '%s' is a GLOBAL variable and should be set with SET GLOBAL
Error: 1230
SQLSTATE: 42000
(ER_NO_DEFAULT
)
Message: Variable '%s' doesn't have a default value
Error: 1231
SQLSTATE: 42000
(ER_WRONG_VALUE_FOR_VAR
)
Message: Variable '%s' can't be set to the value of '%s'
Error: 1232
SQLSTATE: 42000
(ER_WRONG_TYPE_FOR_VAR
)
Message: Incorrect argument type to variable '%s'
Error: 1233
SQLSTATE: HY000
(ER_VAR_CANT_BE_READ
)
Message: Variable '%s' can only be set, not read
Error: 1234
SQLSTATE: 42000
(ER_CANT_USE_OPTION_HERE
)
Message: Incorrect usage/placement of '%s'
Error: 1235
SQLSTATE: 42000
(ER_NOT_SUPPORTED_YET
)
Message: This version of MySQL doesn't yet support '%s'
Error: 1236
SQLSTATE: HY000
(ER_MASTER_FATAL_ERROR_READING_BINLOG
)
Message: Got fatal error %d: '%s' from master when reading data from binary log
Error: 1237
SQLSTATE: HY000
(ER_SLAVE_IGNORED_TABLE
)
Message: Slave SQL thread ignored the query because of replicate-*-table rules
Error: 1238
SQLSTATE: HY000
(ER_INCORRECT_GLOBAL_LOCAL_VAR
)
Message: Variable '%s' is a %s variable
Error: 1239
SQLSTATE: 42000
(ER_WRONG_FK_DEF
)
Message: Incorrect foreign key definition for '%s': %s
Error: 1240
SQLSTATE: HY000
(ER_KEY_REF_DO_NOT_MATCH_TABLE_REF
)
Message: Key reference and table reference don't match
Error: 1241
SQLSTATE: 21000
(ER_OPERAND_COLUMNS
)
Message: Operand should contain %d column(s)
Error: 1242
SQLSTATE: 21000
(ER_SUBQUERY_NO_1_ROW
)
Message: Subquery returns more than 1 row
Error: 1243
SQLSTATE: HY000
(ER_UNKNOWN_STMT_HANDLER
)
Message: Unknown prepared statement handler (%.*s) given to %s
Error: 1244
SQLSTATE: HY000
(ER_CORRUPT_HELP_DB
)
Message: Help database is corrupt or does not exist
Error: 1245
SQLSTATE: HY000
(ER_CYCLIC_REFERENCE
)
Message: Cyclic reference on subqueries
Error: 1246
SQLSTATE: HY000
(ER_AUTO_CONVERT
)
Message: Converting column '%s' from %s to %s
Error: 1247
SQLSTATE: 42S22
(ER_ILLEGAL_REFERENCE
)
Message: Reference '%s' not supported (%s)
Error: 1248
SQLSTATE: 42000
(ER_DERIVED_MUST_HAVE_ALIAS
)
Message: Every derived table must have its own alias
Error: 1249
SQLSTATE: 01000
(ER_SELECT_REDUCED
)
Message: Select %u was reduced during optimization
Error: 1250
SQLSTATE: 42000
(ER_TABLENAME_NOT_ALLOWED_HERE
)
Message: Table '%s' from one of the SELECTs cannot be used in %s
Error: 1251
SQLSTATE: 08004
(ER_NOT_SUPPORTED_AUTH_MODE
)
Message: Client does not support authentication protocol requested by server; consider upgrading MySQL client
Error: 1252
SQLSTATE: 42000
(ER_SPATIAL_CANT_HAVE_NULL
)
Message: All parts of a SPATIAL index must be NOT NULL
Error: 1253
SQLSTATE: 42000
(ER_COLLATION_CHARSET_MISMATCH
)
Message: COLLATION '%s' is not valid for CHARACTER SET '%s'
Error: 1254
SQLSTATE: HY000
(ER_SLAVE_WAS_RUNNING
)
Message: Slave is already running
Error: 1255
SQLSTATE: HY000
(ER_SLAVE_WAS_NOT_RUNNING
)
Message: Slave has already been stopped
Error: 1256
SQLSTATE: HY000
(ER_TOO_BIG_FOR_UNCOMPRESS
)
Message: Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)
Error: 1257
SQLSTATE: HY000
(ER_ZLIB_Z_MEM_ERROR
)
Message: ZLIB: Not enough memory
Error: 1258
SQLSTATE: HY000
(ER_ZLIB_Z_BUF_ERROR
)
Message: ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)
Error: 1259
SQLSTATE: HY000
(ER_ZLIB_Z_DATA_ERROR
)
Message: ZLIB: Input data corrupted
Error: 1260
SQLSTATE: HY000
(ER_CUT_VALUE_GROUP_CONCAT
)
Message: %d line(s) were cut by GROUP_CONCAT()
Error: 1261
SQLSTATE: 01000
(ER_WARN_TOO_FEW_RECORDS
)
Message: Row %ld doesn't contain data for all columns
Error: 1262
SQLSTATE: 01000
(ER_WARN_TOO_MANY_RECORDS
)
Message: Row %ld was truncated; it contained more data than there were input columns
Error: 1263
SQLSTATE: 01000
(ER_WARN_NULL_TO_NOTNULL
)
Message: Data truncated; NULL supplied to NOT NULL column '%s' at row %ld
Error: 1264
SQLSTATE: 01000
(ER_WARN_DATA_OUT_OF_RANGE
)
Message: Data truncated; out of range for column '%s' at row %ld
Error: 1265
SQLSTATE: 01000
(ER_WARN_DATA_TRUNCATED
)
Message: Data truncated for column '%s' at row %ld
Error: 1266
SQLSTATE: HY000
(ER_WARN_USING_OTHER_HANDLER
)
Message: Using storage engine %s for table '%s'
Error: 1267
SQLSTATE: HY000
(ER_CANT_AGGREGATE_2COLLATIONS
)
Message: Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'
Error: 1268
SQLSTATE: HY000
(ER_DROP_USER
)
Message: Can't drop one or more of the requested users
Error: 1269
SQLSTATE: HY000
(ER_REVOKE_GRANTS
)
Message: Can't revoke all privileges, grant for one or more of the requested users
Error: 1270
SQLSTATE: HY000
(ER_CANT_AGGREGATE_3COLLATIONS
)
Message: Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'
Error: 1271
SQLSTATE: HY000
(ER_CANT_AGGREGATE_NCOLLATIONS
)
Message: Illegal mix of collations for operation '%s'
Error: 1272
SQLSTATE: HY000
(ER_VARIABLE_IS_NOT_STRUCT
)
Message: Variable '%s' is not a variable component (can't be used as XXXX.variable_name)
Error: 1273
SQLSTATE: HY000
(ER_UNKNOWN_COLLATION
)
Message: Unknown collation: '%s'
Error: 1274
SQLSTATE: HY000
(ER_SLAVE_IGNORED_SSL_PARAMS
)
Message: SSL parameters in CHANGE MASTER are ignored because this MySQL slave was compiled without SSL support; they can be used later if MySQL slave with SSL is started
Error: 1275
SQLSTATE: HY000
(ER_SERVER_IS_IN_SECURE_AUTH_MODE
)
Message: Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format
Error: 1276
SQLSTATE: HY000
(ER_WARN_FIELD_RESOLVED
)
Message: Field or reference '%s%s%s%s%s' of SELECT #%d was resolved in SELECT #%d
Error: 1277
SQLSTATE: HY000
(ER_BAD_SLAVE_UNTIL_COND
)
Message: Incorrect parameter or combination of parameters for START SLAVE UNTIL
Error: 1278
SQLSTATE: HY000
(ER_MISSING_SKIP_SLAVE
)
Message: It is recommended to use --skip-slave-start when doing step-by-step replication with START SLAVE UNTIL; otherwise, you will get problems if you get an unexpected slave's mysqld restart
Error: 1279
SQLSTATE: HY000
(ER_UNTIL_COND_IGNORED
)
Message: SQL thread is not to be started so UNTIL options are ignored
Error: 1280
SQLSTATE: 42000
(ER_WRONG_NAME_FOR_INDEX
)
Message: Incorrect index name '%s'
Error: 1281
SQLSTATE: 42000
(ER_WRONG_NAME_FOR_CATALOG
)
Message: Incorrect catalog name '%s'
Error: 1282
SQLSTATE: HY000
(ER_WARN_QC_RESIZE
)
Message: Query cache failed to set size %lu; new query cache size is %lu
Error: 1283
SQLSTATE: HY000
(ER_BAD_FT_COLUMN
)
Message: Column '%s' cannot be part of FULLTEXT index
Error: 1284
SQLSTATE: HY000
(ER_UNKNOWN_KEY_CACHE
)
Message: Unknown key cache '%s'
Error: 1285
SQLSTATE: HY000
(ER_WARN_HOSTNAME_WONT_WORK
)
Message: MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work
Error: 1286
SQLSTATE: 42000
(ER_UNKNOWN_STORAGE_ENGINE
)
Message: Unknown table engine '%s'
Error: 1287
SQLSTATE: HY000
(ER_WARN_DEPRECATED_SYNTAX
)
Message: '%s' is deprecated; use '%s' instead
Error: 1288
SQLSTATE: HY000
(ER_NON_UPDATABLE_TABLE
)
Message: The target table %s of the %s is not updatable
Error: 1289
SQLSTATE: HY000
(ER_FEATURE_DISABLED
)
Message: The '%s' feature is disabled; you need MySQL built with '%s' to have it working
Error: 1290
SQLSTATE: HY000
(ER_OPTION_PREVENTS_STATEMENT
)
Message: The MySQL server is running with the %s option so it cannot execute this statement
Error: 1291
SQLSTATE: HY000
(ER_DUPLICATED_VALUE_IN_TYPE
)
Message: Column '%s' has duplicated value '%s' in %s
Error: 1292
SQLSTATE: HY000
(ER_TRUNCATED_WRONG_VALUE
)
Message: Truncated incorrect %s value: '%s'
Error: 1293
SQLSTATE: HY000
(ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
)
Message: Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
Error: 1294
SQLSTATE: HY000
(ER_INVALID_ON_UPDATE
)
Message: Invalid ON UPDATE clause for '%s' column
Error: 1295
SQLSTATE: HY000
(ER_UNSUPPORTED_PS
)
Message: This command is not supported in the prepared statement protocol yet
Error: 1296
SQLSTATE: HY000
(ER_GET_ERRMSG
)
Message: Got error %d '%s' from %s
Error: 1297
SQLSTATE: HY000
(ER_GET_TEMPORARY_ERRMSG
)
Message: Got temporary error %d '%s' from %s
Error: 1298
SQLSTATE: HY000
(ER_UNKNOWN_TIME_ZONE
)
Message: Unknown or incorrect time zone: '%s'
Error: 1299
SQLSTATE: HY000
(ER_WARN_INVALID_TIMESTAMP
)
Message: Invalid TIMESTAMP value in column '%s' at row %ld
Error: 1300
SQLSTATE: HY000
(ER_INVALID_CHARACTER_STRING
)
Message: Invalid %s character string: '%s'
Error: 1301
SQLSTATE: HY000
(ER_WARN_ALLOWED_PACKET_OVERFLOWED
)
Message: Result of %s() was larger than max_allowed_packet (%ld) - truncated
Error: 1302
SQLSTATE: HY000
(ER_CONFLICTING_DECLARATIONS
)
Message: Conflicting declarations: '%s%s' and '%s%s'
Client error information comes from the following source files:
The Error values and the symbols in parentheses correspond to
definitions in the include/errmsg.h
MySQL
source file.
The Message values correspond to the error messages that are
listed in the libmysql/errmsg.c
file.
%d
and %s
represent
numbers and strings, respectively, that are substituted into
the messages when they are displayed.
Because updates are frequent, it is possible that those files will contain additional error information not listed here.
Error: 2000
(CR_UNKNOWN_ERROR
)
Message: Unknown MySQL error
Error: 2001
(CR_SOCKET_CREATE_ERROR
)
Message: Can't create UNIX socket (%d)
Error: 2002
(CR_CONNECTION_ERROR
)
Message: Can't connect to local MySQL server through socket '%s' (%d)
Error: 2003
(CR_CONN_HOST_ERROR
)
Message: Can't connect to MySQL server on '%s' (%d)
Error: 2004
(CR_IPSOCK_ERROR
)
Message: Can't create TCP/IP socket (%d)
Error: 2005
(CR_UNKNOWN_HOST
)
Message: Unknown MySQL server host '%s' (%d)
Error: 2006
(CR_SERVER_GONE_ERROR
)
Message: MySQL server has gone away
Error: 2007
(CR_VERSION_ERROR
)
Message: Protocol mismatch; server version = %d, client version = %d
Error: 2008
(CR_OUT_OF_MEMORY
)
Message: MySQL client ran out of memory
Error: 2009
(CR_WRONG_HOST_INFO
)
Message: Wrong host info
Error: 2010
(CR_LOCALHOST_CONNECTION
)
Message: Localhost via UNIX socket
Error: 2011
(CR_TCP_CONNECTION
)
Message: %s via TCP/IP
Error: 2012
(CR_SERVER_HANDSHAKE_ERR
)
Message: Error in server handshake
Error: 2013
(CR_SERVER_LOST
)
Message: Lost connection to MySQL server during query
Error: 2014
(CR_COMMANDS_OUT_OF_SYNC
)
Message: Commands out of sync; you can't run this command now
Error: 2015
(CR_NAMEDPIPE_CONNECTION
)
Message: Named pipe: %s
Error: 2016
(CR_NAMEDPIPEWAIT_ERROR
)
Message: Can't wait for named pipe to host: %s pipe: %s (%lu)
Error: 2017
(CR_NAMEDPIPEOPEN_ERROR
)
Message: Can't open named pipe to host: %s pipe: %s (%lu)
Error: 2018
(CR_NAMEDPIPESETSTATE_ERROR
)
Message: Can't set state of named pipe to host: %s pipe: %s (%lu)
Error: 2019
(CR_CANT_READ_CHARSET
)
Message: Can't initialize character set %s (path: %s)
Error: 2020
(CR_NET_PACKET_TOO_LARGE
)
Message: Got packet bigger than 'max_allowed_packet' bytes
Error: 2021
(CR_EMBEDDED_CONNECTION
)
Message: Embedded server
Error: 2022
(CR_PROBE_SLAVE_STATUS
)
Message: Error on SHOW SLAVE STATUS:
Error: 2023
(CR_PROBE_SLAVE_HOSTS
)
Message: Error on SHOW SLAVE HOSTS:
Error: 2024
(CR_PROBE_SLAVE_CONNECT
)
Message: Error connecting to slave:
Error: 2025
(CR_PROBE_MASTER_CONNECT
)
Message: Error connecting to master:
Error: 2026
(CR_SSL_CONNECTION_ERROR
)
Message: SSL connection error
Error: 2027
(CR_MALFORMED_PACKET
)
Message: Malformed packet
Error: 2028
(CR_WRONG_LICENSE
)
Message: This client library is licensed only for use with MySQL servers having '%s' license
Error: 2029
(CR_NULL_POINTER
)
Message: Invalid use of null pointer
Error: 2030
(CR_NO_PREPARE_STMT
)
Message: Statement not prepared
Error: 2031
(CR_PARAMS_NOT_BOUND
)
Message: No data supplied for parameters in prepared statement
Error: 2032
(CR_DATA_TRUNCATED
)
Message: Data truncated
Error: 2033
(CR_NO_PARAMETERS_EXISTS
)
Message: No parameters exist in the statement
Error: 2034
(CR_INVALID_PARAMETER_NO
)
Message: Invalid parameter number
Error: 2035
(CR_INVALID_BUFFER_USE
)
Message: Can't send long data for non-string/non-binary data types (parameter: %d)
Error: 2036
(CR_UNSUPPORTED_PARAM_TYPE
)
Message: Using unsupported buffer type: %d (parameter: %d)
Error: 2037
(CR_SHARED_MEMORY_CONNECTION
)
Message: Shared memory: %s
Error: 2038
(CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR
)
Message: Can't open shared memory; client could not create request event (%lu)
Error: 2039
(CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR
)
Message: Can't open shared memory; no answer event received from server (%lu)
Error: 2040
(CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR
)
Message: Can't open shared memory; server could not allocate file mapping (%lu)
Error: 2041
(CR_SHARED_MEMORY_CONNECT_MAP_ERROR
)
Message: Can't open shared memory; server could not get pointer to file mapping (%lu)
Error: 2042
(CR_SHARED_MEMORY_FILE_MAP_ERROR
)
Message: Can't open shared memory; client could not allocate file mapping (%lu)
Error: 2043
(CR_SHARED_MEMORY_MAP_ERROR
)
Message: Can't open shared memory; client could not get pointer to file mapping (%lu)
Error: 2044
(CR_SHARED_MEMORY_EVENT_ERROR
)
Message: Can't open shared memory; client could not create %s event (%lu)
Error: 2045
(CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR
)
Message: Can't open shared memory; no answer from server (%lu)
Error: 2046
(CR_SHARED_MEMORY_CONNECT_SET_ERROR
)
Message: Can't open shared memory; cannot send request event to server (%lu)
Error: 2047
(CR_CONN_UNKNOW_PROTOCOL
)
Message: Wrong or unknown protocol
Error: 2048
(CR_INVALID_CONN_HANDLE
)
Message: Invalid connection handle
Error: 2049
(CR_SECURE_AUTH
)
Message: Connection using old (pre-4.1.1) authentication protocol refused (client option 'secure_auth' enabled)
Error: 2050
(CR_FETCH_CANCELED
)
Message: Row retrieval was canceled by mysql_stmt_close() call
Error: 2051
(CR_NO_DATA
)
Message: Attempt to read column without prior row fetch
Error: 2052
(CR_NO_STMT_METADATA
)
Message: Prepared statement contains no metadata