This is the MySQL reference manual; it documents MySQL Version 3.23.37. As MySQL is work in progress, the manual gets updated frequently. There is a very good chance that this version is out of date, unless you are looking at it online. The most recent version of this manual is available at http://www.mysql.com/documentation/ in many different formats. If you have a hard time finding information in the manual, you can try the searchable PHP version at http://www.mysql.com/documentation/manual.php.
MySQL is a very fast, multi-threaded, multi-user, and robust SQL (Structured Query Language) database server.
MySQL is free software. It is licensed with the GNU GENERAL PUBLIC LICENSE http://www.gnu.org/. See section 3 MySQL Licensing and Support.
The MySQL home page provides the latest information about MySQL.
The following list describes some useful sections of the manual:
IMPORTANT:
Reports of errors (often called bugs), as well as questions and comments,
should be sent to the mailing list at mysql@lists.mysql.com.
See section 2.3 How to Report Bugs or Problems.
The mysqlbug script should be used to generate bug reports.
For source distributions, the mysqlbug script can be found in the
`scripts' directory. For binary distributions, mysqlbug can
be found in the `bin' directory. If you have found a sensitive
security bug in MySQL, you should send an email to
security@mysql.com.
If you have any suggestions concerning additions or corrections to this manual, please send them to the manual team at docs@mysql.com.
This is a reference manual; it does not provide general instruction on SQL or relational database concepts. If you want general information about SQL, see section 1.9 General SQL Information and Tutorials. For books that focus more specifically on MySQL, see section 1.5 Books About MySQL.
MySQL, the most popular Open Source SQL database, is provided by MySQL AB. MySQL AB is a commercial company that builds its business providing services around the MySQL database. See section 1.2 What Is MySQL AB.
The official way to pronounce MySQL is ``My Ess Que Ell'' (not MY-SEQUEL). But we try to avoid correcting people who say MY-SEQUEL.
MySQL AB is the Swedish company owned and run by the MySQL founders and main developers. We are dedicated to developing MySQL and spreading our database to new users. MySQL AB owns the copyright to the MySQL server source code and the MySQL trademark. A significant amount of revenues from our services goes to developing MySQL. See section 1.1 What Is MySQL.
MySQL AB has been profitable providing MySQL from the start. We don't get any outside funding, but have earned all our money ourselves.
We are searching after partners that would like to support our development of MySQL so that we could accelerate the development pace. If you are interested in doing this, you can email partner@mysql.com about this!
MySQL AB has currently 20+ people on its payroll and is growing rapidly. http://www.mysql.com/development/team.html.
Our main sources of income are:
The MySQL core values show our dedication to MySQL and Open Source.
We want MySQL to be:
MySQL AB and the people of MySQL AB:
This manual is currently available in Texinfo, plain text, Info, HTML,
PostScript, and PDF versions. The primary document is the Texinfo file.
The HTML version is produced automatically using a modified version of
texi2html. The plain text and Info versions are produced with
makeinfo. The Postscript version is produced using texi2dvi
and dvips. The PDF version is produced with pdftex.
This manual is written and maintained by David Axmark, Michael (Monty) Widenius, Jeremy Cole, and Paul DuBois. For other contributors, see section E Credits.
This manual uses certain typographical conventions:
constant
mysqladmin works, invoke it with the
--help option.''
When commands are shown that are meant to be executed by a particular
program, the program is indicated by a prompt shown before the command. For
example, shell> indicates a command that you execute from your login
shell, and mysql> indicates a command that you execute from the
mysql client program:
shell> type a shell command here mysql> type a mysql command here
Shell commands are shown using Bourne shell syntax. If you are using a
csh-style shell, you may need to issue commands slightly differently.
For example, the sequence to set an environment variable and run a command
looks like this in Bourne shell syntax:
shell> VARNAME=value some_command
For csh, you would execute the sequence like this:
shell> setenv VARNAME value shell> some_command
Often, database, table, and column names must be substituted into commands. To
indicate that such substitution is necessary, this manual uses
db_name, tbl_name and col_name. For example, you might
see a statement like this:
mysql> SELECT col_name FROM db_name.tbl_name;
This means that if you were to enter a similar statement, you would supply your own database, table, and column names, perhaps like this:
mysql> SELECT author_name FROM biblio_db.author_list;
SQL statements may be written in uppercase or lowercase. When this manual
shows a SQL statement, uppercase is used for particular keywords if those
keywords are under discussion (to emphasize them) and lowercase is used for
the rest of the statement. For example, you might see the following in a
discussion of the SELECT statement:
mysql> SELECT count(*) FROM tbl_name;
On the other hand, in a discussion of the COUNT() function, the
same statement would be written like this:
mysql> select COUNT(*) from tbl_name;
If no particular emphasis is intended, all keywords are written uniformly in uppercase.
In syntax descriptions, square brackets (`[' and `]') are used to indicate optional words or clauses:
DROP TABLE [IF EXISTS] tbl_name
When a syntax element consists of a number of alternatives, the alternatives are separated by vertical bars (`|'). When one member from a set of choices may be chosen, the alternatives are listed within square brackets (`[' and `]'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)
When one member from a set of choices must be chosen, the alternatives are listed within braces (`{' and `}'):
{DESCRIBE | DESC} tbl_name {col_name | wild}
We once started out with the intention of using mSQL to connect to our
tables using our own fast low-level (ISAM) routines. However, after some
testing we came to the conclusion that mSQL was not fast enough nor
flexible enough for our needs. This resulted in a new SQL interface to our
database but with almost the same API interface as mSQL. This API was
chosen to ease porting of third-party code.
The derivation of the name MySQL is not perfectly clear. Our base directory and a large number of our libraries and tools have had the prefix ``my'' for well over 10 years. However, Monty's daughter (some years younger) is also named My. Which of the two gave its name to MySQL is still a mystery, even for us.
While this manual is still the right place for up to date technical information, its primary goal is to contain everything there is to know about MySQL. It is sometimes nice to have a bound book to read in bed or while you travel. Here is a list of books about MySQL and related subjects (in English).
By purchasing a book through these hyperlinks provided herein, you are contributing to the development of MySQL.
MySQL
| Available | Barnes and Noble |
| Publisher | New Riders |
| Author | Paul DuBois |
| Pub Date | 1st Edition December 1999 |
| ISBN | 0735709211 |
| Pages | 800 |
| Price | $49.99 US |
| Downloadable examples |
samp_db.tar.gz
|
| Errata | are available here |
Foreword by Michael ``Monty'' Widenius, MySQL Moderator.
In MySQL, Paul DuBois provides you with a comprehensive guide to
one of the most popular relational database systems. Paul has
contributed to the online documentation for MySQL and is an
active member of the MySQL community. The principal MySQL
developer, Monty Widenius, and a network of his fellow developers
reviewed the manuscript, and provided Paul with the kind of insight
no one else could supply.
Instead of merely giving you a general overview of MySQL, Paul
teaches you how to make the most of its capabilities. Through two
sample database applications that run throughout the book, he
gives you solutions to problems you're sure to face. He helps you
integrate MySQL efficiently with third-party tools, such as PHP
and Perl, enabling you to generate dynamic Web pages through
database queries. He teaches you to write programs that access
MySQL databases, and also provides a comprehensive set of
references to column types, operators, functions, SQL syntax,
MySQL programming, C API, Perl DBI, and PHP API.
MySQL simply gives you the kind of information you won't find
anywhere else.
If you use MySQL, this book provides you with:
DBI and PHP APIs for developing
command-line and Web-based applications.
DBI API,
and PHP's MySQL-related functions.
MySQL & mSQL
| Available | Barnes and Noble |
| Publisher | O'Reilly |
| Authors | Randy Jay Yarger, George Reese & Tim King |
| Pub Date | 1st Edition July 1999 |
| ISBN | 1-56592-434-7, Order Number: 4347 |
| Pages | 506 |
| Price | $34.95 |
This book teaches you how to use MySQL and mSQL, two popular
and robust database products that support key subsets of SQL on both Linux
and Unix systems. Anyone who knows basic C, Java, Perl, or Python can
write a program to interact with a database, either as a stand-alone
application or through a Web page. This book takes you through the
whole process, from installation and configuration to programming
interfaces and basic administration. Includes plenty of tutorial
material.
Sams' Teach Yourself MySQL in 21 Days
| Available | Barnes and Noble |
| Publisher | Sams |
| Authors | Mark Maslakowski and Tony Butcher |
| Pub Date | June 2000 |
| ISBN | 0672319144 |
| Pages | 650 |
| Price | $39.99 |
Sams' Teach Yourself MySQL in 21 Days is for intermediate Linux users who want to move into databases. A large share of the audience is Web developers who need a database to store large amounts of information that can be retrieved via the Web.
Sams' Teach Yourself MySQL in 21 Days is a practical, step-by-step
tutorial. The reader will learn to design and employ this open source
database technology into his or her Web site using practical, hands-on
examples to follow.
E-Commerce Solutions with MySQL
| Available | Barnes and Noble |
| Publisher | Prima Communications, Inc. |
| Authors | N/A |
| Pub Date | January 2000 |
| ISBN | 0761524452 |
| Pages | 500 |
| Price | $39.99 |
No description available.
MySQL and PHP from Scratch
| Available | Barnes and Noble |
| Publisher | Que |
| Authors | N/A |
| Pub Date | September 2000 |
| ISBN | 0789724405 |
| Pages | 550 |
| Price | $34.99 |
This book puts together information on installing, setting up, and
troubleshooting Apache, MySQL, PHP3, and IMP into one complete
volume. You also learn how each piece is part of a whole by learning,
step-by-step, how to create a web-based e-mail system. Learn to run
the equivalent of Active Server Pages (ASP) using PHP3, set up an
e-commerce site using a database and the Apache web server, and create
a data entry system (such as sales, product quality tracking, customer
preferences, etc) that no installation in the PC.
Professional MySQL Programming
| Available | Barnes and Noble |
| Publisher | Wrox Press, Inc. |
| Authors | N/A |
| Pub Date | Late 2001 |
| ISBN | 1861005164 |
| Pages | 1000 |
| Price | $49.99 |
No description available.
Professional Linux Programming
| Available | Barnes and Noble |
| Publisher | Wrox Press, Inc. |
| Authors | N/A |
| Pub Date | September 2000 |
| ISBN | 1861003013 |
| Pages | 1155 |
| Price | $47.99 |
In this follow-up to the best-selling Beginning Linux Programming,
you will learn from the authors' real-world knowledge and experience of
developing software for Linux; you'll be taken through the development
of a sample 'DVD Store' application, with 'theme' chapters addressing
different aspects of its implementation. Meanwhile, individual
``take-a-break'' chapters cover important topics that go beyond the
bounds of the central theme. All focus on the practical aspects of
programming, showing how crucial it is to choose the right tools for
the job, use them as they should be used, and get things right first
time.
PHP and MySQL Web Development
| Available | Barnes and Noble |
| Publisher | Sams |
| Authors | Luke Welling, Laura Thomson |
| Pub Date | March 2001 |
| ISBN | 0672317842 |
| Pages | 700 |
| Price | $49.99 |
PHP and MySQL Web Development introduces you to the advantages
of implementing both MySQL and PHP. These advantages are detailed
through the provision of both statistics and several case studies. A
practical web application is developed throughout the book, providing
you with the tools necessary to implement a functional online
database. Each function is developed separately, allowing you the
choice to incorporate only those parts that you would like to
implement. Programming concepts of the PHP language are highlighted,
including functions which tie MySQL support into a PHP script and
advanced topics regarding table manipulation.
Books recommended by the MySQL Developers
SQL-99 Complete, Really
| Available | Barnes and Noble |
| Publisher | CMP Books |
| Authors | Peter Gulutzan, Trudy Pelzer |
| Pub Date | April 1999 |
| ISBN | 0879305681 |
| Pages | 1104 |
| Price | $55.96 |
This book contains complete descriptions of the new standards for
syntax, data structures, and retrieval processes of SQL databases. As
an example-based reference manual, it includes all of the CLI
functions, information, schema tables, and status codes, as well as a
working SQL database provided on the companion disk.
C, A reference manual
| Available | Barnes and Noble |
| Publisher | Prentice Hall |
| Authors | Samuel P. Harbison, Guy L. Steele |
| Pub Date | September 1994 |
| ISBN | 0133262243 |
| Pages | 480 |
| Price | $35.99 |
A new and improved revision of the bestselling C language
reference. This manual introduces the notion of "Clean C", writing C
code that can be compiled as a C++ program, C programming style that
emphasizes correctness, portability, maintainability, and
incorporates the ISO C Amendment 1 (1994) which specifies new
facilities for writing portable, international programs in C.
C++ for Real Programmers
| Available | Barnes and Noble |
| Publisher | Academic Press, Incorporated |
| Authors | Jeff Alger, Jim Keogh |
| Pub Date | February 1998 |
| ISBN | 0120499428 |
| Pages | 388 |
| Price | $39.95 |
C++ For Real Programmers bridges the gap between C++ as described in beginner and intermediate-level books and C++ as it is practiced by experts. Numerous valuable techniques are described, organized into three simple themes: indirection, class hierarchies, and memory management. It also provides in-depth coverage of template creation, exception handling, pointers and optimization techniques. The focus of the book is on ANSI C++ and, as such, is compiler independent.
C++ For Real Programmers is a revision of
Secrets of the C++ Masters and includes a new appendix comparing C++
with Java. The book comes with a 3.5" disk for Windows with source code.
Algorithms in C
| Available | Barnes and Noble |
| Publisher | Addison Wesley Longman, Inc. |
| Authors | Robert Sedgewick |
| Pub Date | April 1990 |
| ISBN | 0201514257 |
| Pages | 648 |
| Price | $45.75 |
Algorithms in C describes a variety of algorithms in a number of
areas of interest, including: sorting, searching, string-processing, and
geometric, graph and mathematical algorithms. The book emphasizes
fundamental techniques, providing readers with the tools to confidently
implement, run, and debug useful algorithms.
Multithreaded Programming with Pthreads
| Available | Barnes and Noble |
| Publisher | Prentice Hall |
| Authors | Bil Lewis, Daniel J. Berg |
| Pub Date | October 1997 |
| ISBN | 0136807291 |
| Pages | 432 |
| Price | $34.95 |
Based on the best-selling Threads Primer,
Multithreaded Programming with Pthreads gives you a solid
understanding of Posix threads: what they are, how they work, when to use
them, and how to optimize them. It retains the clarity and humor of
Threads Primer, but includes expanded comparisons to Win32 and OS/2
implementations. Code examples tested on all of the major UNIX platforms
are featured along with detailed explanations of how and why they use threads.
Programming the PERL DBI: Database Programming with PERL
| Available | Barnes and Noble |
| Publisher | O'Reilly & Associates, Incorporated |
| Authors | Alligator Descartes, Tim Bunce |
| Pub Date | February 2000 |
| ISBN | 1565926994 |
| Pages | 400 |
| Price | $27.96 |
Programming the Perl DBI is coauthored by Alligator Descartes, one of the most active members of the DBI community, and by Tim Bunce, the inventor of DBI. For the uninitiated, the book explains the architecture of DBI and shows you how to write DBI-based programs. For the experienced DBI dabbler, this book explains DBI's nuances and the peculiarities of each individual DBD.
The book includes:
The following list describes some of the important characteristics of MySQL:
FLOAT, DOUBLE, CHAR, VARCHAR,
TEXT, BLOB, DATE, TIME, DATETIME,
TIMESTAMP, YEAR, SET, and ENUM types.
See section 7.3 Column Types.
SELECT and WHERE
parts of queries. For example:
mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name
WHERE income/dependents > 10000 AND age > 30;
GROUP BY and ORDER BY clauses. Support
for group functions (COUNT(), COUNT(DISTINCT ...),
AVG(), STD(), SUM(), MAX() and MIN()).
LEFT OUTER JOIN and RIGHT OUTER JOIN with ANSI
SQL and ODBC syntax.
CHAR or VARCHAR field.
INSERT to insert a
subset of a table's columns; those columns that are not explicitly given
values are set to their default values.
myisamchk, a very fast utility for table checking,
optimization, and repair. All of the functionality of myisamchk
is also available through the SQL interface as well. See section 16 Maintaining a MySQL Installation.
DELETE, INSERT, REPLACE, and UPDATE return
the number of rows that were changed (affected). It is possible to return
the number of rows matched instead by setting a flag when connecting to the
server.
ABS is a valid column name. The only restriction is that for a
function call, no spaces are allowed between the function name and the
`(' that follows it. See section 7.40 Is MySQL Picky About Reserved Words?.
--help or -?
options to obtain online assistance.
SHOW command can be used to retrieve
information about databases, tables, and indexes. The EXPLAIN command
can be used to determine how the optimizer resolves a query.
This section addresses the questions ``How stable is MySQL?'' and ``Can I depend on MySQL in this project?'' We will try to clarify some issues and to answer some of the more important questions that seem to concern many people. This section has been put together from information gathered from the mailing list (which is very active in reporting bugs).
At TcX, MySQL has worked without any problems in our projects since mid-1996. When MySQL was released to a wider public, we noticed that there were some pieces of ``untested code'' that were quickly found by the new users who made queries in a manner different than our own. Each new release has had fewer portability problems than the previous one (even though each has had many new features).
Each release of MySQL has been usable, and there have been problems only when users start to use code from the ``gray zones.'' Naturally, outside users don't know what the gray zones are; this section attempts to indicate those that are currently known. The descriptions deal with Version 3.23 of MySQL. All known and reported bugs are fixed in the latest version, with the exception of the bugs listed in the bugs section, which are things that are design-related. See section G Known errors and design deficiencies in MySQL.
MySQL is written in multiple layers and different independent modules. These modules are listed below with an indication of how well-tested each of them is:
mysql, mysqladmin, mysqlshow,
mysqldump, and mysqlimport.
fcntl()). In these cases, you should run the
MySQL daemon with the --skip-locking flag. Problems are known
to occur on some Linux systems, and on SunOS when using NFS-mounted file
systems.
fcntl() call, which is
fixed by using the --skip-locking option to
mysqld. Some people have reported lockup problems with Version 0.5.
LinuxThreads will need to be recompiled if you plan to use
1000+ concurrent connections. Although it is possible to run that many
connections with the default LinuxThreads (however, you will never go
above 1021), the default stack spacing of 2 MB makes the application
unstable, and we have been able to reproduce a coredump after creating
1021 idle connections. See section 4.12.5 Linux Notes (All Linux Versions).
SELECT statements are usually done in one time frame so there shouldn't
be a mutex locking/thread juggling.
LOAD DATA ..., INSERT ... SELECT -- Stable
ALTER TABLE -- Stable
mysqlaccess -- Stable
GRANT -- Stable
MySQL and is not very tested yet.
MERGE tables is still not that tested. The
other part of the MERGE code is quite well tested.
MySQL AB provides e-mail support for paying customers, but the MySQL mailing list usually provides answers to common questions. Bugs are usually fixed right away with a patch; for serious bugs, there is almost always a new release.
MySQL itself has no problems with Year 2000 (Y2K) compliance:
2069; all 2-digit years are regarded to be in the range
1970 to 2069, which means that if you store 01 in a
year column, MySQL treats it as 2001.
YEAR column type
can store years 0 and 1901 to 2155 in 1 byte and display
them using 2 or 4 digits.
You may run into problems with applications that use MySQL in a
way that is not Y2K-safe. For example, many old applications store
or manipulate years using 2-digit values (which are ambiguous) rather than
4-digit values. This problem may be compounded by applications that use
values such as 00 or 99 as ``missing'' value indicators.
Unfortunately, these problems may be difficult to fix, because different applications may be written by different programmers, each of whom may use a different set of conventions and date-handling functions.
Here is a simple demonstration illustrating that MySQL doesn't have any problems with dates until the year 2030:
mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO y2k VALUES
-> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
-> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
-> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
-> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
-> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
-> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
-> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
-> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
-> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
-> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
-> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
-> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
-> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date | date_time | time_stamp |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)
This shows that the DATE and DATETIME types will not
give any problems with future dates (they handle dates until the year
9999).
The TIMESTAMP type, which is used to store the current time, has a
range up to only 2030-01-01. TIMESTAMP has a range of
1970 to 2030 on 32-bit machines (signed value). On 64-bit
machines it handles times up to 2106 (unsigned value).
Even though MySQL is Y2K-compliant, it is your responsibility to provide unambiguous input. See section 7.3.3.1 Y2K Issues and Date Types for MySQL's rules for dealing with ambiguous date input data (data containing 2-digit year values).
The following book has been recommended by several people on the MySQL mailing list:
Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky The Practical SQL Handbook: Using Structured Query Language Second Edition Addison-Wesley ISBN 0-201-62623-3 http://www.awl.com
The following book has also received some recommendations by MySQL users:
Martin Gruber Understanding SQL ISBN 0-89588-644-8 Publisher Sybex 510 523 8233 Alameda, CA USA
A SQL tutorial is available on the net at http://w3.one.net/~jhoffman/sqltut.htm
Apart from the following links, you can find and download a lot of MySQL programs, tools and APIs from the Contrib directory.
1.10.1 Tutorials and Manuals
mSQL.
mSQL Tcl.
DBI/DBD.
DBI/DBD modules homepage.
There are also many Web pages that use MySQL. See section B Some MySQL Users. Send any additions to this list to webmaster@mysql.com. We now require that you show a MySQL logo somewhere if you wish your site to be added. It is okay to have it on a ``used tools'' page or something similar.
This chapter introduces you to the MySQL mailing lists, and gives some guidelines as to how to use them.
To subscribe to the main MySQL mailing list, send a message to the electronic mail address mysql-subscribe@lists.mysql.com.
To unsubscribe from the main MySQL mailing list, send a message to the electronic mail address mysql-unsubscribe@lists.mysql.com.
Only the address to which you send your messages is significant. The subject line and the body of the message are ignored.
If your reply address is not valid, you can specify your address
explicitly. Adding a hyphen to the subscribe or unsubscribe command
word, followed by your address with the `@' character in your
address replaced by a `='. For example, to subscribe
your_name@host.domain, send a message to
mysql-subscribe-your_name=host.domain@lists.mysql.com.
Mail to mysql-subscribe@lists.mysql.com or mysql-unsubscribe@lists.mysql.com is handled automatically by the ezmlm mailing list processor. Information about ezmlm is available at The ezmlm Website.
To post a message to the list itself, send your message to
mysql@lists.mysql.com. However, please do not send mail about
subscribing or unsubscribing to mysql@lists.mysql.com, because any
mail sent to that address is distributed automatically to thousands of other
users.
Your local site may have many subscribers to mysql@lists.mysql.com.
If so, it may have a local mailing list, so that messages sent from
lists.mysql.com to your site are propagated to the local list. In such
cases, please contact your system administrator to be added to or dropped
from the local MySQL list.
The following MySQL mailing lists exist:
, announce
, mysql
, mysql-digest
mysql list in digest form. That means you get all individual
messages, sent as one large mail message once a day.
, bugs
mysqlbug script (if you are running on Windows, you should
include a description of the operating system and the MySQL version).
Preferably, you should test the problem using the latest stable or development
version of MySQL before posting! Anyone should be able to repeat the
bug by just using mysql test < script on the included test case. All
bugs posted on this list will be corrected or documented in the next
MySQL release! If there are only small code changes involved, we
will also post a patch that fixes the problem.
, bugs-digest
bugs list in digest form.
, developer
, developer-digest
, internals
, internals-digest
, java
, java-digest
java list.
, win32
, win32-digest
win32 list.
, myodbc
, myodbc-digest
myodbc list.
, plusplus
, plusplus-digest
plusplus list.
, msql-mysql-modules
, msql-mysql-modules-digest
msql-mysql-modules list.
You subscribe or unsubscribe to all lists in the same way as described
above. In your subscribe or unsubscribe message, just put the appropriate
mailing list name rather than mysql. For example, to subscribe to or
unsubscribe from the myodbc list, send a message to
myodbc-subscribe@lists.mysql.com or
myodbc-unsubscribe@lists.mysql.com.
There is also a german mailing list. You can find information about this at: http://www.4t2.com/mysql.
Before posting a bug report or question, please do the following:
If you can't find an answer in the manual or the archives, check with your local MySQL expert. If you still can't find an answer to your question, go ahead and read the next section about how to send mail to mysql@lists.mysql.com.
Writing a good bug report takes patience, but doing it right the first time saves time for us and for you. A good bug report containing a full test case for the bug will make it very likely that we will fix it in the next release. This section will help you write your report correctly so that you don't waste your time doing things that may not help us much or at all.
We encourage everyone to use the mysqlbug script to generate a bug
report (or a report about any problem), if possible. mysqlbug can be
found in the `scripts' directory in the source distribution, or, for a
binary distribution, in the `bin' directory under your MySQL
installation directory. If you are unable to use mysqlbug, you should
still include all the necessary information listed in this section.
The mysqlbug script helps you generate a report by determining much
of the following information automatically, but if something important is
missing, please include it with your message! Please read this section
carefully and make sure that all the information described here is included
in your report.
The normal place to report bugs and problems is
mysql@lists.mysql.com. If you can make a test case that clearly
demonstrates the bug, you should post it to the bugs@lists.mysql.com
list. Note that on this list you should only post a full, repeatable bug
report using the mysqlbug script. If you are running on Windows,
you should include a description of the operating system and the
MySQL version. Preferably, you should test the problem using
the latest stable or development version of MySQL before
posting! Anyone should be able to repeat the bug by just using
``mysql test < script'' on the included test case or run the
shell or perl script that is included in the bug report. All bugs
posted on the bugs list will be corrected or documented in the next
MySQL release! If there are only small code changes involved
to correct this problem, we will also post a patch that fixes the
problem.
Remember that it is possible to respond to a message containing too much information, but not to one containing too little. Often people omit facts because they think they know the cause of a problem and assume that some details don't matter. A good principle is: if you are in doubt about stating something, state it! It is a thousand times faster and less troublesome to write a couple of lines more in your report than to be forced to ask again and wait for the answer because you didn't include enough information the first time.
The most common errors are that people don't indicate the version number of the MySQL distribution they are using, or don't indicate what platform they have MySQL installed on (including the platform version number). This is highly relevant information, and in 99 cases out of 100 the bug report is useless without it! Very often we get questions like, ``Why doesn't this work for me?'' then we find that the feature requested wasn't implemented in that MySQL version, or that a bug described in a report has been fixed already in newer MySQL versions. Sometimes the error is platform dependent; in such cases, it is next to impossible to fix anything without knowing the operating system and the version number of the platform.
Remember also to provide information about your compiler, if it is related to the problem. Often people find bugs in compilers and think the problem is MySQL-related. Most compilers are under development all the time and become better version by version. To determine whether or not your problem depends on your compiler, we need to know what compiler is used. Note that every compiling problem should be regarded as a bug report and reported accordingly.
It is most helpful when a good description of the problem is included in the bug report. That is, a good example of all the things you did that led to the problem and the problem itself exactly described. The best reports are those that include a full example showing how to reproduce the bug or problem. See section I.1.5 Making a test case when you experience table corruption.
If a program produces an error message, it is very important to include the message in your report! If we try to search for something from the archives using programs, it is better that the error message reported exactly matches the one that the program produces. (Even the case should be observed!) You should never try to remember what the error message was; instead, copy and paste the entire message into your report!
If you have a problem with MyODBC, you should try to genereate a MyODBC trace file. See section 19.7 Reporting Problems with MyODBC.
Please remember that many of the people who will read your report will
do so using an 80-column display. When generating reports or examples
using the mysql command line tool, you should therefore use
the --vertical option (or the \G statement terminator)
for output that would exceed the available width for such a display
(for example, with the EXPLAIN SELECT statement; see the
example below).
Please include the following information in your report:
mysqladmin version. mysqladmin can be
found in the `bin' directory under your MySQL installation
directory.
uname -a.
mysqld died, you should also report the query that crashed
mysqld. You can usually find this out by running mysqld with
logging enabled. See section I.1.4 Using log files to find cause of errors in mysqld.
mysqldump --no-data db_name tbl_name1 tbl_name2 .... This is very easy
to do and is a powerful way to get information about any table in a database
that will help us create a situation matching the one you have.
SELECT statements, you should
always include the output of EXPLAIN SELECT ..., and at least the
number of rows that the SELECT statement produces. The more
information you give about your situation, the more likely it is that someone
can help you! For example, the following is an example of a very good bug
report (it should of course be posted with the mysqlbug script):
Example run using the mysql command line tool (note the use of the
\G statement terminator for statements whose output width would
otherwise exceed that of an 80-column display device):
mysql> SHOW VARIABLES;
mysql> SHOW COLUMNS FROM ...\G
<output from SHOW COLUMNS>
mysql> EXPLAIN SELECT ...\G
<output from EXPLAIN>
mysql> FLUSH STATUS;
mysql> SELECT ...;
<A short version of the output from SELECT,
including the time taken to run the query>
mysql> SHOW STATUS;
<output from SHOW STATUS>
mysqladmin variables extended-status processlist in your mail to
provide some information of how your system is performing!
mysqldump and create a `README' file
that describes your problem.
Create a compressed archive of your files using
tar and gzip or zip, and use ftp to transfer the
archive to ftp://support.mysql.com/pub/mysql/secret/. Then send a
short description of the problem to bugs@lists.mysql.com.
ftp to transfer it to
ftp://support.mysql.com/pub/mysql/secret/. If the data are really top
secret and you don't want to show them even to us, then go ahead and provide
an example using other names, but please regard this as the last choice.
mysqld
daemon and that you use to run any MySQL client programs. The
options to programs like mysqld and mysql, and to the
configure script, are often keys to answers and are very relevant!
It is never a bad idea to include them anyway! If you use any modules, such
as Perl or PHP, please include the version number(s) of those as well.
mysqlaccess, the output of mysqladmin reload, and all
the error messages you get when trying to connect! When you test your
privileges, you should first run mysqlaccess. After this, execute
mysqladmin reload version and try to connect with the program that
gives you trouble. mysqlaccess can be found in the `bin'
directory under your MySQL installation directory.
parse error, please check your syntax closely! If
you can't find something wrong with it, it's extremely likely that your
current version of MySQL doesn't support the query you are
using. If you are using the current version and the manual at
http://www.mysql.com/documentation/manual.php doesn't cover the
syntax you are using, MySQL doesn't support your query. In this
case, your only options are to implement the syntax yourself or e-mail
mysql-licensing@mysql.com and ask for an offer to implement it!
If the manual covers the syntax you are using, but you have an older version
of MySQL, you should check the MySQL change history to see
when the syntax was implemented. In this case, you have the option of
upgrading to a newer version of MySQL. See section F MySQL change history.
myisamchk or CHECK TABLE and
REPAIR TABLE. See section 16 Maintaining a MySQL Installation.
mysqld should NEVER crash a table if nothing killed it in the
middle of an update! If you can find the cause of mysqld dying,
it's much easier for us to provide you with a fix for the problem!
See section 21.1 How to Determine What Is Causing Problems.
If you are a support customer, please cross-post the bug report to mysql-support@mysql.com for higher priority treatment, as well as to the appropriate mailing list to see if someone else has experienced (and perhaps solved) the problem.
For information on reporting bugs in MyODBC, see section 19.4 How to Report Problems with MyODBC.
For solutions to some common problems, see See section 21 Problems and Common Errors.
When answers are sent to you individually and not to the mailing list, it is considered good etiquette to summarize the answers and send the summary to the mailing list so that others may have the benefit of responses you received that helped you solve your problem!
If you consider your answer to have broad interest, you may want to post it to the mailing list instead of replying directly to the individual who asked. Try to make your answer general enough that people other than the original poster may benefit from it. When you post to the list, please make sure that your answer is not a duplication of a previous answer.
Try to summarize the essential part of the question in your reply; don't feel obliged to quote the entire original message.
Please don't post mail messages from your browser with HTML mode turned on! Many users don't read mail with a browser!
This chapter describes MySQL support and licensing arrangements:
The formal terms of the GPL license can be found at section L GNU General Public License. Basically, our licensing policy and interpretation of the GPL is as follows:
Note that older versions of MySQL are still using a more strict license. See the documentation for that version for more information. If you need a commercial MySQL license, because the GPL license doesn't suit your application, you can buy one at https://order.mysql.com/license.htmy.
For normal internal use, MySQL costs nothing. You do not have to pay us if you do not want to.
A license is required if:
A license is NOT required if:
GNU Library General Public License. The mysql command-line
client includes code from the readline library that is under
the GPL.
For circumstances under which a MySQL license is required, you
need a license per machine that runs the mysqld server. However,
a multiple-CPU machine counts as a single machine, and there is no
restriction on the number of MySQL servers that run on one
machine, or on the number of clients concurrently connected to a server
running on that machine!
If you have any questions as to whether or not a license is required for your particular use of MySQL, please read this again and then contact us. See section 3.4.2 Contact Information.
If you require a MySQL license, the easiest way to pay for it is to use the license form on MySQL's secure server at https://order.mysql.com/license.htmy. Other forms of payment are discussed in section 3.4.1 Payment information.
There are several different copyrights on the MySQL distribution:
mysqlclient library is licensed under the LGPL and
programs in the `client' directory is GPL. Each file has a header
that shows which copyright is used for that file.
getopt) library are covered
by the ``GNU LIBRARY GENERAL PUBLIC LICENSE.'' See section M GNU Library General Public License.
regexp library) are covered
by a Berkeley-style copyright.
readline) library
is covered by the ``GNU GENERAL PUBLIC LICENSE.'' See section L GNU General Public License.
This is also available as the file `COPYING' in the distributions.
One goal is that the SQL client library should be free enough that it is possible to add MySQL support into commercial products without a license. For this reason, we chose the LGPL license for the client code.
This means that you can use MySQL for free with any program that uses any of the free software licenses. MySQL is also free for any end user for his own or company usage.
However, if you use MySQL for something important to you, you may want to help secure its development by purchasing licenses or a support contract. See section 3.5 Types of Commercial Support.
Version 3.22 of MySQL is still using a more strict license. See the documentation for that version for more information.
This section describes some situations illustrating whether or not you must license the MySQL server. Generally these examples involve providing MySQL as an integral part of a product.
Note that a single MySQL license covers any number of CPUs and
mysqld servers on a machine! There is no artificial limit on the
number of clients that connect to the server in any way.
To determine whether or not you need a MySQL license when selling your application, you should ask whether the proper functioning of your application is dependent on the use of MySQL and whether you include the MySQL server with your product. There are several cases to consider:
mysqld server. For example, if you've
designed your application around MySQL, then you've really made
a commercial product that requires the engine, so you need a license.
Internet Service Providers (ISPs) often host MySQL servers for their customers. With the GPL license this does not require a license.
On the other hand, we do encourage people to use ISPs that have MySQL support, as this will give them the confidence that if they have some problem with their MySQL installation, their ISP will be able to solve the problem for them (in some cases with the help from the MySQL development team).
All ISPs that want to keep themselves up-to-date should subscribe
to our announce mailing list so that they can be aware of fatal issues
that may be relevant for their MySQL installations.
Note that if the ISP doesn't have a license for MySQL, it should give its customers at least read access to the source of the MySQL installation so that its customer can verify that it is patched correctly.
If you use MySQL in conjunction with a Web server on Unix, you don't have to pay for a license.
This is true even if you run a commercial Web server that uses MySQL, because you are not selling an embedded MySQL version yourself. However, in this case we would like you to purchase MySQL support, because MySQL is helping your enterprise.
Our current license prices are shown below. These prices are now under review because of the change to a GPL copyright. New prices and terms will be posted on the MySQL web site at http://www.mysql.com/ as soon as they are ready.
All prices are in US Dollars. If you pay by credit card, the currency is EURO (European Union Euro) so the prices will differ slightly.
| Number of licenses | Per copy | Total |
| 1 | 200 EURO | 200 EURO |
| 10 pack | 150 EURO | 1500 EURO |
| 50 pack | 120 EURO | 6000 EURO |
For high volume (OEM) purchases, the following prices apply:
| Number of licenses | Per copy | Minimum | Minimum payment |
| 100-999 | 40 EURO | 100 | 4000 EURO |
| 1000-2499 | 25 EURO | 200 | 5000 EURO |
| 2500-4999 | 20 EURO | 400 | 8000 EURO |
For OEM purchases, you must act as the middle-man for eventual problems or extension requests from your users. We also require that OEM customers have at least an extended e-mail support contract. Note that OEM licenses only apply for products where the user doesn't have direct access to the MySQL server (embedded system). In other words, the MySQL server should only be used with the application that was supplied you.
If you have a low-margin, high-volume product, you can always talk to us about other terms (for example, a percent of the sale price). If you do, please be informative about your product, pricing, market, and any other information that may be relevant.
A full-price license is not a support agreement and includes very minimal support. This means that we try to answer any relevant questions. If the answer is in the documentation, we will direct you to the appropriate section. If you have not purchased a license or support, we probably will not answer at all.
If you discover what we consider a real bug, we are likely to fix it in any case. But if you pay for support we will notify you about the fix status instead of just fixing it in a later release.
More comprehensive support is sold separately. Descriptions of what each level of support includes are given in section 3.5 Types of Commercial Support. Costs for the various types of commercial support are shown below. Support level prices are in EURO (European Union Euro). One EURO is about 1.06 USD.
| Type of support | Cost per year |
| Basic e-mail support. See section 3.5.1 Basic E-mail Support. | EURO 200 |
| Extended e-mail support See section 3.5.2 Extended E-mail Support. | EURO 1000 |
| Login support See section 3.5.3 Login Support. | EURO 2000 |
| Extended login support See section 3.5.4 Extended Login Support. | EURO 5000 |
| Telephone support See section 3.5.5 Telephone Support. | EURO 12000 |
You may upgrade from any lower level of support to a higher level of support for the difference in price between the two support levels.
We do also provide telephone support (mostly emergency support but also 24/7 support). This support option doesn't however have a fixed price but is negotiated for case to case. If you are interested in this option you can email sales@mysql.com and tell us about your needs.
Note that as our sales staff is very busy, it may take some time until your request is handled. Our support staff does however always answer promptly to support questions!
Currently we can take SWIFT payments, checks, or credit cards.
Payment should be made to:
Postgirot Bank AB 105 06 STOCKHOLM, SWEDEN MySQL AB BOX 6434 11382 STOCKHOLM, SWEDEN SWIFT address: PGSI SESS Account number: 96 77 06 - 3
Specify: license and/or support and your name and e-mail address.
In Europe and Japan you can use EuroGiro (that should be less expensive) to the same account.
If you want to pay by check, make it payable to ``MySQL Finland AB'' and mail it to the address below:
MySQL AB BOX 6434, Torsgatan 21 11382 STOCKHOLM, SWEDEN
If you want to pay by credit card over the Internet, you can use MySQL AB's secure license form.
You can also print a copy of the license form, fill it in, and send it by fax to:
+46-8-729 69 05
If you want us to bill you, you can use the license form and write ``bill
us'' in the comment field. You can also mail a message to
sales@mysql.com (not mysql@lists.mysql.com!)
with your company information and ask us to bill you.
For commercial licensing, please contact the MySQL licensing team. The much preferred method is by e-mail to licensing@mysql.com. Fax is also possible but handling of these may take much longer (Fax +46-8-729 69 05).
If you represent a business that is interested in partnering with MySQL, please send e-mail to partner@mysql.com.
For timely, precise answers to technical questions about MySQL you should order one of our support contracts. MySQL support is provided by the MySQL developers so the standard is extremely high.
If you are interested in placing a banner advertisement on our Web site, please send e-mail to advertising@mysql.com.
If you are interested in any of the jobs listed in our jobs section, please send e-mail to jobs@mysql.com.
For general discussion amongst our many users, please direct your attention to the appropriate mailing list.
For general information inquires, please send e-mail to info@mysql.com.
For questions or comments about the workings or content of the Web site, please send e-mail to webmaster@mysql.com.
The following is true of all support options:
Basic e-mail support is a very inexpensive support option and should be thought of more as a way to support our development of MySQL than as a real support option. We at MySQL do give a lot of free support in all the different MySQL lists, and the money we get from basic e-mail support is largely used to make this possible.
At this support level, the MySQL mailing lists are the preferred means of communication. Questions normally should be mailed to the primary mailing list (mysql@lists.mysql.com) or one of the other regular lists (for example, win32@lists.mysql.com for Windows-related MySQL questions), as someone else already may have experienced and solved the problem you have. See section 2.2 Asking Questions or Reporting Bugs.
However, by purchasing basic e-mail support, you also have access to the support address mysql-support@mysql.com, which is not available as part of the minimal support that you get by purchasing a MySQL license. This means that for especially critical questions, you can cross-post your message to mysql-support@mysql.com. (If the message contains sensitive data, you should post only to mysql-support@mysql.com.)
REMEMBER! to ALWAYS include your registration number and expiration date when you send a message to mysql-support@mysql.com.
Note that if you have encountered a critical, repeatable bug, and follow the rules outlined in the manual section of how to report bugs and send it to bugs@lists.mysql.com, we promise to try to fix this as soon as possible, regardless of your support level! See section 2.3 How to Report Bugs or Problems.
Basic e-mail support includes the following types of service:
Extended e-mail support includes everything in basic e-mail support with these additions:
mysqld for your situation.
Login support includes everything in extended e-mail support with these additions:
kill -9 command).
Extended login support includes everything in login support with these additions:
mysql> select MY_FUNC(col1,col2) from table;
Telephone support includes everything in extended login support with these additions:
MySQL developers that you can phone when you have a critical
problem.
MySQL related issues.
To get support for BDB tables, InnoDB tables or
GEMINI tables you have to pay an additional 30% on the standard
support price for each of the table handlers you would like to have
support for.
We at MySQL AB will help you create a proper bug report for the
table handler and submit it to the developers for the specific table
handler. We will also do our best to ensure that you will get a timely
answer or solution from the developers of the table handler.
Even if we are quite confident that we can solve most problems within a timely manner, we can't guarantee a quick solution for any problems you can get with the different table handlers. We will however do our best to help you get the problem solved.
This chapter describes how to obtain and install MySQL:
Check the MySQL home page for information about the current version and for downloading instructions.
Our main download mirror is located at:
http://download.sourceforge.net/mirrors/mysql/
If you are interested in becoming a MySQL mirror site, you may
anonymously rsync with: rsync://download.sourceforge.net/mysql/. Please
send e-mail to webmaster@mysql.com notifying us of your mirror to be
added to the list below.
If you have problems downloading from our main site, try using one of the mirrors listed below.
Please report bad or out-of-date mirrors to webmaster@mysql.com.
Europe:
Austria [Univ. of Technology/Vienna]
WWW
FTP
Bulgaria [online.bg/Sofia]
WWW
FTP
Czech Republic [Masaryk University in Brno]
WWW
FTP
Czech Republic [www.sopik.cz]
WWW
Czech Republic [www.gin.cz]
WWW
FTP
Denmark [Borsen]
WWW
Denmark [SunSITE]
WWW
FTP
Estonia [OKinteractive]
WWW
France [mtesa.net]
WWW
Finland [tonnikala.net]
WWW
Germany [Kernelnotes.de, Bonn]
WWW
FTP
Germany [Wolfenbuettel]
WWW
FTP
Greece [NTUA, Athens]
WWW
FTP
Hungary [Xenia]
WWW
FTP
Iceland [GM]
WWW
FTP
Italy [feelinglinux.com]
WWW
Italy [Teta Srl]
WWW
Italy [tzone.it]
WWW
Ireland [Esat Net]
WWW
FTP
Netherlands [Silverpoint]
WWW
Netherlands [Widexs BV]
WWW
FTP
Netherlands [ProServe]
WWW
Poland [Sunsite]
WWW
FTP
Poland [ncservice.com/Gdansk]
WWW
Portugal [Netc]
WWW
FTP
Romania [roedu.net/Bucharest]
FTP
Russia [DirectNet]
WWW
FTP
Russia [Scientific Center/Chernogolovka]
FTP
Switzerland [Sunsite]
WWW
FTP
UK [Omnipotent/UK]
WWW
FTP
UK [PLiG/UK]
WWW
FTP
UK [Telekon Internet/UK]
FTP
Ukraine [PACO]
WWW
FTP
Ukraine [ISP Alkar Teleport/Dnepropetrovsk]
WWW
North America:
Canada [Tryc]
WWW
USA [Hurricane Electric/San Jose]
WWW
USA [ValueClick, Los Angeles CA]
WWW
FTP
USA [Wisconsin University/Wisconsin]
WWW
FTP
USA [LinuxWired/Scottsdale, AZ]
WWW
FTP
USA [Venoma.Org/Valdosta, GA]
WWW
USA [adgrafix.com/Boston, MA]
WWW
South America:
Asia:
China [Freecode]
WWW
China [linuxforum.net]
WWW
China [ISL/Hong Kong]
WWW
China [xcyber.org/Hong Kong]
WWW
South Korea [Webiiz]
WWW
South Korea [PanworldNet]
WWW
Japan [Soft Agency]
WWW
Japan [u-aizu.ac.jp/Aizu]
FTP
Singapore [HJC]
WWW
FTP
Taiwan [TTN]
WWW
Taiwan [nctu.edu/HsinChu]
WWW
Australia:
Africa:
We use GNU Autoconf, so it is possible to port MySQL to all modern systems with working Posix threads and a C++ compiler. (To compile only the client code, a C++ compiler is required but not threads.) We use and develop the software ourselves primarily on Sun Solaris (Versions 2.5 - 2.7) and SuSE Linux Version 7.x.
Note that for many operating systems, the native thread support works only in the latest versions. MySQL has been reported to compile sucessfully on the following operating system/thread package combinations:
glibc 2.0.7+. See section 4.12.5 Linux Notes (All Linux Versions).
Note that not all platforms are suited equally well for running MySQL. How well a certain platform is suited for a high-load mission critical MySQL server is determined by the following factors:
pthread_mutex_lock() is too anxious to yield CPU, this will hurt
MySQL tremendously. If this issue
is not taken care of, adding extra CPUs will actually make MySQL
slower.
Based on the above criterea, the best platforms for running MySQL at this point are x86 with SuSE Linux 7.1, 2.4 kernel and ReiserFS (or any similar Linux distribution) and Sparc with Solaris 2.7 or 2.8. FreeBSD comes third, but we really hope it will join the top club once the thread library is improved. We also hope that at some point we will be able to include all other platforms on which MySQL compiles, runs ok, but not quite with the same level of stability and performance, into the top category. This will require some effort on our part in cooperation with the developers of the OS/library components MySQL depends upon. If you are interested in making one of those components better, are in a position to influence their development, and need more detailed instructions on what MySQL needs to run better, send an e-mail to internals@lists.mysql.com.
Please note that the comparison above is not to say that one OS is better or worse than the other in general. We are talking about choosing a particular OS for a dedicated purpose - running MySQL, and compare platforms in that regard only. With this in mind, the result of this comparison would be different if we included more issues into it. And in some cases, the reason one OS is better than the other could simply be that we have put forth more effort into testing on and optimizing for that particular platform. We are just stating our observations to help you make a decision on which platform to use MySQL on in your setup.
The first decision to make is whether you want to use the latest development release or the last stable release:
The second decision to make is whether you want to use a source distribution or a binary distribution. In most cases you should probably use a binary distribution, if there exist one for your platform, as this is generally, it will be easier to install than a source distribution.
In the following cases you will probably be better off with a source installation:
MySQL
clients can connect to both MySQL versions.
The extended MySQL binary distribution is marked with the
-max suffix and is configured with the same options as
mysqld-max. See section 15.2 mysqld-max, An extended mysqld server.
If you are want to use the MySQL-Max RPM, you must first
install the standard MySQL RPM.
mysqld with some extra feature that is NOT in
the standard binary distributions. Here is a list of the most common
extra options that you may want to use:
The MySQL naming scheme uses release numbers that consist of three
numbers and a suffix. For example, a release name like
mysql-3.21.17-beta is interpreted like this:
3) describes the file format. All Version 3
releases have the same file format.
21) is the release level. Normally there are two to
choose from. One is the release/stable branch (currently 23) and the
other is the development branch (currently 4.0). Normally both are
stable, but the development version may have quirks, missing documentation on
new features, or may fail to compile on some systems.
17) is the version number within the
release level. This is incremented for each new distribution. Usually you
want the latest version for the release level you have choosen.
beta) indicates the stability level of the release.
The possible suffixes are:
alpha indicates that the release contains some large section of
new code that hasn't been 100% tested. Known bugs (usually there are none)
should be documented in the News section. See section F MySQL change history. There are also new
commands and extensions in most alpha releases. Active development that
may involve major code changes can occur on an alpha release, but everything
will be tested before doing a release. There should be no known bugs in any
MySQL release.
beta means that all new code has been tested. No major new
features that could cause corruption on old code are added. There should
be no known bugs. A version changes from alpha to beta when there
haven't been any reported fatal bugs within an alpha version for at least
a month and we don't plan to add any features that could make any old command
more unreliable.
gamma is a beta that has been around a while and seems to work fine.
Only minor fixes are added. This is what many other companies call a release.
All versions of MySQL are run through our standard tests and benchmarks to ensure that they are relatively safe to use. Because the standard tests are extended over time to check for all previously found bugs, the test suite keeps getting better.
Note that all releases have been tested at least with:
crash-me test
Another test is that we use the newest MySQL version in our internal production environment, on at least one machine. We have more than 100 gigabytes of data to work with.
MySQL is evolving quite rapidly here at MySQL AB and we want to share this with other MySQL users. We try to make a release when we have very useful features that others seem to have a need for.
We also try to help out users who request features that are easy to implement. We take note of what our licensed users want to have, and we especially take note of what our extended e-mail supported customers want and try to help them out.
No one has to download a new release. The News section will tell you if the new release has something you really want. See section F MySQL change history.
We use the following policy when updating MySQL:
The current stable release is Version 3.23; We have already moved active development to Version 4.0. Bugs will still be fixed in the stable version. We don't believe in a complete freeze, as this also leaves out bug fixes and things that ``must be done.'' ``Somewhat frozen'' means that we may add small things that ``almost surely will not affect anything that's already working.''
This section describes the default layout of the directories created by installing binary and source distributions.
A binary distribution is installed by unpacking it at the installation location you choose (typically `/usr/local/mysql') and creates the following directories in that location:
| Directory | Contents of directory |
| `bin' | Client programs and the mysqld server
|
| `data' | Log files, databases |
| `include' | Include (header) files |
| `lib' | Libraries |
| `scripts' | mysql_install_db
|
| `share/mysql' | Error message files |
| `sql-bench' | Benchmarks |
A source distribution is installed after you configure and compile it. By default, the installation step installs files under `/usr/local', in the following subdirectories:
| Directory | Contents of directory |
| `bin' | Client programs and scripts |
| `include/mysql' | Include (header) files |
| `info' | Documentation in Info format |
| `lib/mysql' | Libraries |
| `libexec' | The mysqld server
|
| `share/mysql' | Error message files |
| `sql-bench' | Benchmarks and crash-me test
|
| `var' | Databases and log files |
Within an installation directory, the layout of a source installation differs from that of a binary installation in the following ways:
mysqld server is installed in the `libexec'
directory rather than in the `bin' directory.
mysql_install_db is installed in the `/usr/local/bin' directory
rather than in `/usr/local/mysql/scripts'.
You can create your own binary installation from a compiled source distribution by executing the script `scripts/make_binary_distribution'.
You need the following tools to install a MySQL binary distribution:
gunzip to uncompress the distribution.
tar to unpack the distribution. GNU tar is
known to work. Sun tar is known to have problems.
An alternative installation method under Linux is to use RPM (RedHat Package Manager) distributions. See section 4.6.1 Linux RPM Notes.
If you run into problems, PLEASE ALWAYS USE mysqlbug when
posting questions to mysql@lists.mysql.com. Even if the problem
isn't a bug, mysqlbug gathers system information that will help others
solve your problem. By not using mysqlbug, you lessen the likelihood
of getting a solution to your problem! You will find mysqlbug in the
`bin' directory after you unpack the distribution. See section 2.3 How to Report Bugs or Problems.
The basic commands you must execute to install and use a MySQL binary distribution are:
shell> groupadd mysql shell> useradd -g mysql mysql shell> cd /usr/local shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s mysql-VERSION-OS mysql shell> cd mysql shell> scripts/mysql_install_db shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/data shell> chgrp -R mysql /usr/local/mysql shell> chown -R root /usr/local/mysql/bin/ shell> bin/safe_mysqld --user=mysql &
You can add new users using the bin/mysql_setpermission script if
you install the DBI and Msql-Mysql-modules Perl modules.
A more detailed description follows.
To install a binary distribution, follow the steps below, then proceed to section 4.16 Post-installation Setup and Testing, for post-installation setup and testing:
root.)
tar
archives and have names like `mysql-VERSION-OS.tar.gz', where
VERSION is a number (for example, 3.21.15), and OS
indicates the type of operating system for which the distribution is intended
(for example, pc-linux-gnu-i586).
-max prefix, this
means that the binary has support for transaction safe tables and other
features. See section 15.2 mysqld-max, An extended mysqld server. Note that all binaries are built from
the same MySQL source distribution.
mysqld to run as:
shell> groupadd mysql shell> useradd -g mysql mysqlThese commands add the
mysql group and the mysql user. The
syntax for useradd and groupadd may differ slightly on different
Unixes. They may also be called adduser and addgroup. You may
wish to call the user and group something else instead of mysql.
shell> cd /usr/local
shell> gunzip < /path/to/mysql-VERSION-OS.tar.gz | tar xvf - shell> ln -s mysql-VERSION-OS mysqlThe first command creates a directory named `mysql-VERSION-OS'. The second command makes a symbolic link to that directory. This lets you refer more easily to the installation directory as `/usr/local/mysql'.
shell> cd mysqlYou will find several files and subdirectories in the
mysql directory.
The most important for installation purposes are the `bin' and
`scripts' subdirectories.
PATH environment variable so that your shell finds the MySQL
programs properly. See section A Environment Variables.
mysql_install_db script used to initialize
the server access permissions.
mysqlaccess and have the MySQL
distribution in some non-standard place, you must change the location where
mysqlaccess expects to find the mysql client. Edit the
`bin/mysqlaccess' script at approximately line 18. Search for a line
that looks like this:
$MYSQL = '/usr/local/bin/mysql'; # path to mysql executableChange the path to reflect the location where
mysql actually is
stored on your system. If you do not do this, you will get a Broken
pipe error when you run mysqlaccess.
shell> scripts/mysql_install_dbNote that MySQL versions older than Version 3.22.10 started the MySQL server when you run
mysql_install_db. This is no
longer true!
root and ownership of the data
directory to the user that you will run mysqld as:
shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysqlThe first command changes the
owner attribute of the files to the
root user, the second one changes the owner attribute of the
data directory to the mysql user, and the third one changes the
group attribute to the mysql group.
DBI/DBD interface,
see section 4.11 Perl Installation Comments.
support-files/mysql.server to the location where
your system has its startup files. More information can be found in the
support-files/mysql.server script itself and in
section 4.16.3 Starting and Stopping MySQL Automatically.
After everything has been unpacked and installed, you should initialize and test your distribution.
You can start the MySQL server with the following command:
shell> bin/safe_mysqld --user=mysql &
See section 15.3 safe_mysqld, the wrapper around mysqld.
See section 4.16 Post-installation Setup and Testing.
The recommended way to install MySQL on Linux is by using an RPM
file. The MySQL RPMs are currently being built on a RedHat Version
6.2 system but should work on other versions of Linux that support rpm
and use glibc.
If you have problems with an RPM file, for example, if you receive the error
``Sorry, the host 'xxxx' could not be looked up'', see
section 4.6.3.1 Linux Notes for Binary Distributions.
The RPM files you may want to use are:
MySQL-VERSION.i386.rpm
The MySQL server. You will need this unless you only want to
connect to a MySQL server running on another machine.
MySQL-client-VERSION.i386.rpm
The standard MySQL client programs. You probably always want to
install this package.
MySQL-bench-VERSION.i386.rpm
Tests and benchmarks. Requires Perl and msql-mysql-modules RPMs.
MySQL-devel-VERSION.i386.rpm
Libraries and include files needed if you want to compile other
MySQL clients, such as the Perl modules.
MySQL-VERSION.src.rpm
This contains the source code for all of the above packages. It can also
be used to try to build RPMs for other architectures (for example, Alpha
or SPARC).
To see all files in an RPM package, run:
shell> rpm -qpl MySQL-VERSION.i386.rpm
To perform a standard minimal installation, run:
shell> rpm -i MySQL-VERSION.i386.rpm MySQL-client-VERSION.i386.rpm
To install just the client package, run:
shell> rpm -i MySQL-client-VERSION.i386.rpm
The RPM places data in `/var/lib/mysql'. The RPM also creates the appropriate entries in `/etc/rc.d/' to start the server automatically at boot time. (This means that if you have performed a previous installation, you may want to make a copy of your previously installed MySQL startup file if you made any changes to it, so you don't lose your changes.)
After installing the RPM file(s), the `mysqld' daemon should be running and you should now be able to start using MySQL. See section 4.16 Post-installation Setup and Testing.
If something goes wrong, you can find more information in the binary installation chapter. See section 4.6 Installing a MySQL Binary Distribution.
If you compile MySQL clients that you've written yourself or that
you obtain from a third party, they must be linked using the
-lmysqlclient -lz option on the link command. You may also need to
specify a -L option to tell the linker where to find the library. For
example, if the library is installed in `/usr/local/mysql/lib', use
-L/usr/local/mysql/lib -lmysqlclient -lz on the link command.
For clients that use MySQL header files, you may need to specify a
-I option when you compile them (for example,
-I/usr/local/mysql/include), so the compiler can find the header
files.
The following sections indicate some of the issues that have been observed on particular systems when installing MySQL from a binary distribution.
MySQL needs at least Linux Version 2.0.
The binary release is linked with -static, which means you do not
normally need to worry about which version of the system libraries you
have. You need not install LinuxThreads, either. A program linked with
-static is slightly bigger than a dynamically linked program but
also slightly faster (3-5%). One problem, however, is that you can't use
user-definable functions (UDFs) with a statically linked program. If
you are going to write or use UDF functions (this is something only for
C or C++ programmers), you must compile MySQL yourself, using
dynamic linking.
If you are using a libc-based system (instead of a glibc2
system), you will probably get some problems with hostname resolving and
getpwnam() with the binary release. (This is because glibc
unfortunately depends on some external libraries to resolve hostnames
and getpwent(), even when compiled with -static). In this
case you probably get the following error message when you run
mysql_install_db:
Sorry, the host 'xxxx' could not be looked up
or the following error when you try to run mysqld with the --user
option:
getpwnam: No such file or directory
You can solve this problem in one of the following ways:
tar.gz
distribution) and install this instead.
mysql_install_db --force; This will not execute the
resolveip test in mysql_install_db. The downside is that
you can't use host names in the grant tables; you must use IP numbers
instead (except for localhost). If you are using an old MySQL
release that doesn't support --force, you have to remove the
resolveip test in mysql_install with an editor.
su instead of using --user.
The Linux-Intel binary and RPM releases of MySQL are configured for the highest possible speed. We are always trying to use the fastest stable compiler available.
MySQL Perl support requires Version Perl 5.004_03 or newer.
On some Linux 2.2 versions, you may get the error Resource
temporarily unavailable when you do a lot of new connections to a
mysqld server over TCP/IP.
The problem is that Linux has a delay between when you close a TCP/IP socket and until this is actually freed by the system. As there is only room for a finite number of TCP/IP slots, you will get the above error if you try to do too many new TCP/IP connections during a small time, like when you run the MySQL `test-connect' benchmark over TCP/IP.
We have mailed about this problem a couple of times to different Linux mailing lists but have never been able to resolve this properly.
The only known 'fix' to this problem is to use persistent connections in
your clients or use sockets, if you are running the database server
and clients on the same machine. We hope that the Linux 2.4
kernel will fix this problem in the future.
Some of the binary distributions of MySQL for HP-UX is distributed as an HP depot file and as a tar file. To use the depot file you must be running at least HP-UX 10.x to have access to HP's software depot tools.
The HP version of MySQL was compiled on an HP 9000/8xx server under HP-UX 10.20, and uses MIT-pthreads. It is known to work well under this configuration. MySQL Version 3.22.26 and newer can also be built with HP's native thread package.
Other configurations that may work:
The following configurations almost definitely won't work:
To install the distribution, use one of the commands below, where
/path/to/depot is the full pathname of the depot file:
shell> /usr/sbin/swinstall -s /path/to/depot mysql.full
shell> /usr/sbin/swinstall -s /path/to/depot mysql.server
shell> /usr/sbin/swinstall -s /path/to/depot mysql.client
shell> /usr/sbin/swinstall -s /path/to/depot mysql.developer
The depot places binaries and libraries in `/opt/mysql' and data in
`/var/opt/mysql'. The depot also creates the appropriate entries in
`/etc/init.d' and `/etc/rc2.d' to start the server automatically
at boot time. Obviously, this entails being root to install.
To install the HP-UX tar.gz distribution, you must have a copy of GNU
tar.
Before you proceed with the source installation, check first to see if our binary is available for your platform and if it will work for you. We put in a lot of effort into making sure that our binaries are built with the best possible options.
You need the following tools to build and install MySQL from source:
gunzip to uncompress the distribution.
tar to unpack the distribution. GNU tar is
known to work. Sun tar is known to have problems.
gcc >= 2.8.1, egcs >=
1.0.2, SGI C++, and SunPro C++ are some of the compilers that are known to
work. libg++ is not needed when using gcc. gcc
2.7.x has a bug that makes it impossible to compile some perfectly legal
C++ files, such as `sql/sql_base.cc'. If you only have gcc 2.7.x,
you must upgrade your gcc to be able to compile MySQL.
gcc >= 2.95.2 is recommended when compiling MySQL
Version 3.23.x.
make program. GNU make is always recommended and is
sometimes required. If you have problems, we recommend trying GNU
make 3.75 or newer.
If you are using a recent version of gcc, recent enough to understand
-fno-exceptions option, it is VERY IMPORTANT that you use
it. Otherwise, you may compile a binary that crashes randomly. We also
recommend that you use -felide-contructors and -fno-rtti along
with -fno-exceptions. When in doubt, do the following:
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static
On most systems this will give you a fast and stable binary.
If you run into problems, PLEASE ALWAYS USE mysqlbug when
posting questions to mysql@lists.mysql.com. Even if the problem
isn't a bug, mysqlbug gathers system information that will help others
solve your problem. By not using mysqlbug, you lessen the likelihood
of getting a solution to your problem! You will find mysqlbug in the
`scripts' directory after you unpack the distribution.
See section 2.3 How to Report Bugs or Problems.
The basic commands you must execute to install a MySQL source distribution are:
shell> groupadd mysql shell> useradd -g mysql mysql shell> gunzip < mysql-VERSION.tar.gz | tar -xvf - shell> cd mysql-VERSION shell> ./configure --prefix=/usr/local/mysql shell> make shell> make install shell> scripts/mysql_install_db shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysql shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
If you start from a source RPM, then do the following:
shell> rpm --rebuild MySQL-VERSION.src.rpm
This will make a binary RPM that you can install.
You can add new users using the bin/mysql_setpermission script if
you install the DBI and Msql-Mysql-modules Perl modules.
A more detailed description follows.
To install a source distribution, follow the steps below, then proceed to section 4.16 Post-installation Setup and Testing, for post-installation initialization and testing:
tar
archives and have names like `mysql-VERSION.tar.gz', where
VERSION is a number like 3.23.37.
mysqld to run as:
shell> groupadd mysql shell> useradd -g mysql mysqlThese commands add the
mysql group, and the mysql user. The
syntax for useradd and groupadd may differ slightly on different
Unixes. They may also be called adduser and addgroup. You may
wish to call the user and group something else instead of mysql.
shell> gunzip < /path/to/mysql-VERSION.tar.gz | tar xvf -This command creates a directory named `mysql-VERSION'.
shell> cd mysql-VERSIONNote that currently you must configure and build MySQL from this top-level directory. You can not build it in a different directory.
shell> ./configure --prefix=/usr/local/mysql shell> makeWhen you run
configure, you might want to specify some options.
Run ./configure --help for a list of options.
section 4.7.3 Typical configure Options, discusses some of the
more useful options.
If configure fails, and you are going to send mail to
mysql@lists.mysql.com to ask for assistance, please include any
lines from `config.log' that you think can help solve the problem. Also
include the last couple of lines of output from configure if
configure aborts. Post the bug report using the mysqlbug
script. See section 2.3 How to Report Bugs or Problems.
If the compile fails, see section 4.9 Problems Compiling?, for help with
a number of common problems.
shell> make installYou might need to run this command as
root.
shell> scripts/mysql_install_dbNote that MySQL versions older than Version 3.22.10 started the MySQL server when you run
mysql_install_db. This is no
longer true!
root and ownership of the data
directory to the user that you will run mysqld as:
shell> chown -R root /usr/local/mysql shell> chown -R mysql /usr/local/mysql/var shell> chgrp -R mysql /usr/local/mysqlThe first command changes the
owner attribute of the files to the
root user, the second one changes the owner attribute of the
data directory to the mysql user, and the third one changes the
group attribute to the mysql group.
DBI/DBD interface,
see section 4.11 Perl Installation Comments.
support-files/mysql.server to the location where
your system has its startup files. More information can be found in the
support-files/mysql.server script itself and in
section 4.16.3 Starting and Stopping MySQL Automatically.
After everything has been installed, you should initialize and test your distribution:
shell> /usr/local/mysql/bin/safe_mysqld --user=mysql &
If that command fails immediately with mysqld daemon ended then you can
find some information in the file `mysql-data-directory/'hostname'.err'.
The likely reason is that you already have another mysqld server
running. See section 22.3 Running Multiple MySQL Servers on the Same Machine.
See section 4.16 Post-installation Setup and Testing.
Sometimes patches appear on the mailing list or are placed in the patches area of the MySQL Web site.
To apply a patch from the mailing list, save the message in which the patch appears in a file, change into the top-level directory of your MySQL source tree, and run these commands:
shell> patch -p1 < patch-file-name shell> rm config.cache shell> make clean
Patches from the FTP site are distributed as plain text files or as files
compressed with gzip. Apply a plain patch as shown above for
mailing list patches. To apply a compressed patch, change into the
top-level directory of your MySQL source tree and run these
commands:
shell> gunzip < patch-file-name.gz | patch -p1 shell> rm config.cache shell> make clean
After applying a patch, follow the instructions for a normal source install,
beginning with the ./configure step. After running the make
install step, restart your MySQL server.
You may need to bring down any currently running server before you run
make install. (Use mysqladmin shutdown to do this.) Some
systems do not allow you to install a new version of a program if it replaces
the version that is currently executing.
configure Options
The configure script gives you a great deal of control over how
you configure your MySQL distribution. Typically you do this
using options on the configure command line. You can also affect
configure using certain environment variables. See section A Environment Variables. For a list of options supported by configure, run
this command:
shell> ./configure --help
Some of the more commonly-used configure options are described below:
--without-server option:
shell> ./configure --without-serverIf you don't have a C++ compiler,
mysql will not compile (it is the
one client program that requires C++). In this case,
you can remove the code in configure that tests for the C++ compiler
and then run ./configure with the --without-server option. The
compile step will still try to build mysql, but you can ignore any
warnings about `mysql.cc'. (If make stops, try make -k
to tell it to continue with the rest of the build even if errors occur.)
configure command, something like one
of these:
shell> ./configure --prefix=/usr/local/mysql
shell> ./configure --prefix=/usr/local \
--localstatedir=/usr/local/mysql/data
The first command changes the installation prefix so that everything is
installed under `/usr/local/mysql' rather than the default of
`/usr/local'. The second command preserves the default installation
prefix, but overrides the default location for database directories
(normally `/usr/local/var') and changes it to
/usr/local/mysql/data.
configure command like this:
shell> ./configure --with-unix-socket-path=/usr/local/mysql/tmp/mysql.sockNote that the given file must be an absolute pathname!
configure like this:
shell> ./configure --with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static
gcc and don't have libg++ or libstdc++
installed, you can tell configure to use gcc as your C++
compiler:
shell> CC=gcc CXX=gcc ./configureWhen you use
gcc as your C++ compiler, it will not attempt to link in
libg++ or libstdc++.
Here is some common environment variables to set depending on
the compiler you are using:
| gcc 2.7.2.1 | CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" |
| egcs 1.0.3a | CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" |
| gcc 2.95.2 | CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" |
| pgcc 2.90.29 or newer | CFLAGS="-O3 -mpentiumpro -mstack-align-double" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -mstack-align-double -felide-constructors -fno-exceptions -fno-rtti" |
--prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-staticThe full configure line would in other words be something like the following for all recent gcc versions:
CFLAGS="-O3 -mpentiumpro" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-staticThe binaries we provide on the MySQL Web site at http://www.mysql.com are all compiled with full optimization and should be perfect for most users. See section 4.15 MySQL Binaries. There are some things you can tweak to make an even faster binary, but this is only for advanced users. See section 13.2.1 How Compiling and Linking Affects the Speed of MySQL. If the build fails and produces errors about your compiler or linker not being able to create the shared library `libmysqlclient.so.#' (`#' is a version number), you can work around this problem by giving the
--disable-shared option to configure. In this case,
configure will not build a shared libmysqlclient.so.# library.
DEFAULT column values for
non-NULL columns (that is, columns that are not allowed to be
NULL). This causes INSERT statements to generate an error
unless you explicitly specify values for all columns that require a
non-NULL value. To suppress use of default values, run
configure like this:
shell> CXXFLAGS=-DDONT_USE_DEFAULT_FIELDS ./configure
--with-charset option:
shell> ./configure --with-charset=CHARSET
CHARSET may be one of big5, cp1251, cp1257,
czech, danish, dec8, dos, euc_kr,
gb2312, gbk, german1, hebrew, hp8,
hungarian, koi8_ru, koi8_ukr, latin1,
latin2, sjis, swe7, tis620, ujis,
usa7, or win1251ukr.
See section 10.1.1 The Character Set Used for Data and Sorting.
If you want to convert characters between the server and the client,
you should take a look at the SET OPTION CHARACTER SET command.
See section 7.33 SET Syntax.
Warning: If you change character sets after having created any
tables, you will have to run myisamchk -r -q on every table. Your
indexes may be sorted incorrectly otherwise. (This can happen if you
install MySQL, create some tables, then reconfigure
MySQL to use a different character set and reinstall it.)
--with-debug
option:
shell> ./configure --with-debugThis causes a safe memory allocator to be included that can find some errors and that provides output about what is happening. See section I.1 Debugging a MySQL server.
--with-thread-safe-client configure options. This will create a
libmysqlclient_r library with which you should link your threaded
applications. See section 24.1.5 How to Make a Thread-safe Client.
CAUTION: You should only read this section if you are interested in helping us test our new code. If you just want to get MySQL up and running on your system, you should use either source or binary distribution.
Below are the instructions to obtain our most recent development source tree:
bk clone bk://work.mysql.com:7000 mysql, and
bk clone bk://work.mysql.com:7001 mysql-4.0 for 4.0 branch.
The initial download may take a while, depending on the speed of your
connection.
cd mysql bk -r edit aclocal; autoheader; autoconf; automake; ./configure # Add your favorite options here makeWe have a collection of our standard configure scripts in the `BUILD/' subdirectory. If you are lazy, you can use `BUILD/compile-pentium-debug'. It will actually work on a lot of non-x86 machines despite its name.
make install. Be careful with this on
a production machine - this may overwrite your live release binary. We
recommend that if you have another installation of MySQL that
you ./configure with different values for prefix,
tcp-port, and unix-socket-path.
make test. See section 26.2 MySQL Test Suite.
make stage and it does not compile,
please report it to bugs@lists.mysql.com. If you have
installed the latest version of the required GNU tools, and they crash
trying to process our configuration files, please report it also. However,
if you execute aclocal and get command not found, or a
similar problem, do not report it, make sure all the needed tools are
installed and your PATH variable is set correctly.
bk clone, do bk pull to get the updates.
bk sccstool. If you see some funny diffs or code that you have a
question about, do not hesitate and e-mail internals@lists.mysql.com.
Also if you think you have a better idea on how to do something, send an email
to the same place with a patch. bk diffs will produce a patch for you
after you have made changes to the source. If you do not have the time to code
your idea, just send a description.
bk helptool.
All MySQL programs compile cleanly for us with no warnings on
Solaris using gcc. On other systems, warnings may occur due to
differences in system include files. See section 4.10 MIT-pthreads Notes for warnings
that may occur when using MIT-pthreads. For other problems, check the list
below.
The solution to many problems involves reconfiguring. If you do need to reconfigure, take note of the following:
configure is run after it already has been run, it may use
information that was gathered during its previous invocation. This
information is stored in `config.cache'. When configure starts
up, it looks for that file and reads its contents if it exists, on the
assumption that the information is still correct. That assumption is invalid
when you reconfigure.
configure, you must run make again
to recompile. However, you may want to remove old object files from previous
builds first, because they were compiled using different configuration options.
To prevent old configuration information or object files from being used,
run these commands before rerunning configure:
shell> rm config.cache shell> make clean
Alternatively, you can run make distclean.
The list below describes some of the problems compiling MySQL that have been found to occur most often:
Internal compiler error: program cc1plus got fatal signal 11 or Out of virtual memory or Virtual memory exhaustedThe problem is that
gcc requires huge amounts of memory to compile
`sql_yacc.cc' with inline functions. Try running configure with
the --with-low-memory option:
shell> ./configure --with-low-memoryThis option causes
-fno-inline to be added to the compile line if you
are using gcc and -O0 if you are using something else. You
should try the --with-low-memory option even if you have so much
memory and swap space that you think you can't possibly have run out. This
problem has been observed to occur even on systems with generous hardware
configurations, and the --with-low-memory option usually fixes it.
configure picks c++ as the compiler name and
GNU c++ links with -lg++. If you are using gcc,
that behavior can cause problems during configuration such as this:
configure: error: installation or configuration problem: C++ compiler cannot create executables.You might also observe problems during compilation related to
g++, libg++, or libstdc++.
One cause of these problems is that you may not have g++, or you may
have g++ but not libg++, or libstdc++. Take a look at
the `config.log' file. It should contain the exact reason why your c++
compiler didn't work! To work around these problems, you can use gcc
as your C++ compiler. Try setting the environment variable CXX to
"gcc -O3". For example:
shell> CXX="gcc -O3" ./configureThis works because
gcc compiles C++ sources as well as g++
does, but does not link in libg++ or libstdc++ by default.
Another way to fix these problems, of course, is to install g++,
libg++ and libstdc++.
make to GNU make:
making all in mit-pthreads make: Fatal error in reader: Makefile, line 18: Badly formed macro assignment or make: file `Makefile' line 18: Must be a separator (: or pthread.h: No such file or directorySolaris and FreeBSD are known to have troublesome
make programs.
GNU make Version 3.75 is known to work.
CFLAGS and CXXFLAGS environment
variables. You can also specify the compiler names this way using CC
and CXX. For example:
shell> CC=gcc shell> CFLAGS=-O3 shell> CXX=gcc shell> CXXFLAGS=-O3 shell> export CC CFLAGS CXX CXXFLAGSSee section 4.15 MySQL Binaries, for a list of flag definitions that have been found to be useful on various systems.
gcc compiler:
client/libmysql.c:273: parse error before `__attribute__'
gcc 2.8.1 is known to work, but we recommend using gcc 2.95.2 or
egcs 1.0.3a instead.
mysqld,
configure didn't correctly detect the type of the last argument to
accept(), getsockname(), or getpeername():
cxx: Error: mysqld.cc, line 645: In this statement, the referenced
type of the pointer value "&length" is "unsigned long", which
is not compatible with "int".
new_sock = accept(sock, (struct sockaddr *)&cAddr, &length);
To fix this, edit the `config.h' file (which is generated by
configure). Look for these lines:
/* Define as the base type of the last arg to accept */ #define SOCKET_SIZE_TYPE XXXChange
XXX to size_t or int, depending on your
operating system. (Note that you will have to do this each time you run
configure, because configure regenerates `config.h'.)
"sql_yacc.yy", line xxx fatal: default action causes potential...This is a sign that your version of
yacc is deficient.
You probably need to install bison (the GNU version of yacc)
and use that instead.
mysqld or a MySQL client, run
configure with the --with-debug option, then recompile and
link your clients with the new client library. See section I.2 Debugging a MySQL client.
This section describes some of the issues involved in using MIT-pthreads.
Note that on Linux you should NOT use MIT-pthreads but install LinuxThreads! See section 4.12.5 Linux Notes (All Linux Versions).
If your system does not provide native thread support, you will need to build MySQL using the MIT-pthreads package. This includes older FreeBSD systems, SunOS 4.x, Solaris 2.4 and earlier, and some others. See section 4.2 Operating Systems Supported by MySQL.
configure with the --with-mit-threads option:
shell> ./configure --with-mit-threadsBuilding in a non-source directory is not supported when using MIT-pthreads, because we want to minimize our changes to this code.
--without-server
to build only the client code, clients will not know whether or not
MIT-pthreads is being used and will use Unix socket connections by default.
Because Unix sockets do not work under MIT-pthreads, this means you will need
to use -h or --host when you run client programs.
--use-locking option.
bind() command fails to bind to a socket without
any error message (at least on Solaris). The result is that all connections
to the server fail. For example:
shell> mysqladmin version mysqladmin: connect to server at '' failed; error: 'Can't connect to mysql server on localhost (146)'The solution to this is to kill the
mysqld server and restart it.
This has only happened to us when we have forced the server down and done
a restart immediately.
sleep() system call isn't interruptible with
SIGINT (break). This is only noticeable when you run
mysqladmin --sleep. You must wait for the sleep() call to
terminate before the interrupt is served and the process stops.
ld: warning: symbol `_iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
ld: warning: symbol `__iob' has differing sizes:
(file /my/local/pthreads/lib/libpthread.a(findfp.o) value=0x4;
file /usr/lib/libc.so value=0x140);
/my/local/pthreads/lib/libpthread.a(findfp.o) definition taken
implicit declaration of function `int strtoll(...)' implicit declaration of function `int strtoul(...)'
readline to work with MIT-pthreads. (This isn't
needed, but may be interesting for someone.)
Perl support for MySQL is provided by means of the
DBI/DBD client interface. See section 24.2 MySQL Perl API. The Perl
DBD/DBI client code requires Perl Version 5.004 or later. The
interface will not work if you have an older version of Perl.
MySQL Perl support also requires that you've installed MySQL client programming support. If you installed MySQL from RPM files, client programs are in the client RPM, but client programming support is in the developer RPM. Make sure you've installed the latter RPM.
As of Version 3.22.8, Perl support is distributed separately from the main MySQL distribution. If you want to install Perl support, the files you will need can be obtained from http://www.mysql.com/Downloads/Contrib/.
The Perl distributions are provided as compressed tar archives and
have names like `MODULE-VERSION.tar.gz', where MODULE is the
module name and VERSION is the version number. You should get the
Data-Dumper, DBI, and Msql-Mysql-modules distributions
and install them in that order. The installation procedure is shown below.
The example shown is for the Data-Dumper module, but the procedure is
the same for all three distributions:
shell> gunzip < Data-Dumper-VERSION.tar.gz | tar xvf -This command creates a directory named `Data-Dumper-VERSION'.
shell> cd Data-Dumper-VERSION
shell> perl Makefile.PL shell> make shell> make test shell> make install
The make test command is important because it verifies that the
module is working. Note that when you run that command during the
Msql-Mysql-modules installation to exercise the interface code, the
MySQL server must be running or the test will fail.
It is a good idea to rebuild and reinstall the Msql-Mysql-modules
distribution whenever you install a new release of MySQL,
particularly if you notice symptoms such as all your DBI scripts
dumping core after you upgrade MySQL.
If you don't have the right to install Perl modules in the system directory or if you to install local Perl modules, the following reference may help you:
http://www.iserver.com/support/contrib/perl5/modules.html
Look under the heading
Installing New Modules that Require Locally Installed Modules.
To install the MySQL DBD module with ActiveState Perl on
Windows, you should do the following:
set HTTP_proxy=my.proxy.com:3128
C:\> c:\perl\bin\ppm.pl
DBI:
ppm> install DBI
install ftp://ftp.de.uu.net/pub/CPAN/authors/id/JWIED/DBD-mysql-1.2212.x86.ppd
The above should work at least with ActiveState Perl Version 5.6.
If you can't get the above to work, you should instead install the MyODBC driver and connect to MySQL server through ODBC:
use DBI;
$dbh= DBI->connect("DBI:ODBC:$dsn","$user","$password") ||
die "Got error $DBI::errstr when connecting to $dsn\n";
The MySQL Perl distribution contains DBI,
DBD:MySQL and DBD:ODBC.
C: so that you get a `C:\PERL' directory.
perl works by executing perl -v in a DOS shell.
DBI/DBD InterfaceIf Perl reports that it can't find the `../mysql/mysql.so' module, then the problem is probably that Perl can't locate the shared library `libmysqlclient.so'.
You can fix this by any of the following methods:
Msql-Mysql-modules distribution with perl
Makefile.PL -static -config rather than perl Makefile.PL.
libmysqlclient.so to the directory where your other shared
libraries are located (probably `/usr/lib' or `/lib').
LD_RUN_PATH environment variable.
If you get the following errors from DBD-mysql,
you are probably using gcc (or using an old binary compiled with
gcc):
/usr/bin/perl: can't resolve symbol '__moddi3' /usr/bin/perl: can't resolve symbol '__divdi3'
Add -L/usr/lib/gcc-lib/... -lgcc to the link command when the
`mysql.so' library gets built (check the output from make for
`mysql.so' when you compile the Perl client). The -L option
should specify the pathname of the directory where `libgcc.a' is located
on your system.
Another cause of this problem may be that Perl and MySQL aren't both
compiled with gcc. In this case, you can solve the mismatch by
compiling both with gcc.
If you get the following error from Msql-Mysql-modules
when you run the tests:
t/00base............install_driver(mysql) failed: Can't load '../blib/arch/auto/DBD/mysql/mysql.so' for module DBD::mysql: ../blib/arch/auto/DBD/mysql/mysql.so: undefined symbol: uncompress at /usr/lib/perl5/5.00503/i586-linux/DynaLoader.pm line 169.
it means that you need to include the compression library, -lz, to the link line. This can be doing the following change in the file `lib/DBD/mysql/Install.pm':
$sysliblist .= " -lm"; to $sysliblist .= " -lm -lz";
After this, you MUST run 'make realclean' and then proceed with the installation from the beginning.
If you want to use the Perl module on a system that doesn't support dynamic
linking (like SCO) you can generate a static version of Perl that includes
DBI and DBD-mysql. The way this works is that you generate a
version of Perl with the DBI code linked in and install it on top of
your current Perl. Then you use that to build a version of Perl that
additionally has the DBD code linked in, and install that.
On SCO, you must have the following environment variables set:
shell> LD_LIBRARY_PATH=/lib:/usr/lib:/usr/local/lib:/usr/progressive/lib or shell> LD_LIBRARY_PATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib shell> LIBPATH=/usr/lib:/lib:/usr/local/lib:/usr/ccs/lib:/usr/progressive/lib:/usr/skunk/lib shell> MANPATH=scohelp:/usr/man:/usr/local1/man:/usr/local/man:/usr/skunk/man:
First, create a Perl that includes a statically linked DBI by running
these commands in the directory where your DBI distribution is
located:
shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl
Then you must install the new Perl. The output of make perl will
indicate the exact make command you will need to execute to perform
the installation. On SCO, this is make -f Makefile.aperl inst_perl
MAP_TARGET=perl.
Next, use the just-created Perl to create another Perl that also includes a
statically-linked DBD::mysql by running these commands in the
directory where your Msql-Mysql-modules distribution is located:
shell> perl Makefile.PL -static -config shell> make shell> make install shell> make perl
Finally, you should install this new Perl. Again, the output of make
perl indicates the command to use.
The following sections indicate some of the issues that have been observed to occur on particular systems when installing MySQL from a source distribution.
On Solaris, you may run into trouble even before you get the MySQL
distribution unpacked! Solaris tar can't handle long file names, so
you may see an error like this when you unpack MySQL:
x mysql-3.22.12-beta/bench/Results/ATIS-mysql_odbc-NT_4.0-cmp-db2,informix,ms-sql,mysql,oracle,solid,sybase, 0 bytes, 0 tape blocks tar: directory checksum error
In this case, you must use GNU tar (gtar) to unpack the
distribution. You can find a precompiled copy for Solaris at
http://www.mysql.com/Downloads/.
Sun native threads work only on Solaris 2.5 and higher. For Version 2.4 and earlier, MySQL will automatically use MIT-pthreads. See section 4.10 MIT-pthreads Notes.
If you get the following error from configure:
checking for restartable system calls... configure: error can not run test programs while cross compiling
This means that you have something wrong with your compiler installation! In this case you should upgrade your compiler to a newer version. You may also be able to solve this problem by inserting the following row into the `config.cache' file:
ac_cv_sys_restartable_syscalls=${ac_cv_sys_restartable_syscalls='no'}
If you are using Solaris on a SPARC, the recommended compiler is
gcc 2.95.2. You can find this at http://gcc.gnu.org/.
Note that egs 1.1.1 and gcc 2.8.1 don't work reliably on
SPARC!
The recommended configure line when using gcc 2.95.2 is:
CC=gcc CFLAGS="-O3" \ CXX=gcc CXXFLAGS="-O3 -felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory --enable-assembler
If you have a ultra sparc, you can get 4 % more performance by adding "-mcpu=v8 -Wa,-xarch=v8plusa" to CFLAGS and CXXFLAGS.
If you have the Sun Workshop (SunPro) 4.2 (or newer) compiler, you can
run configure like this:
CC=cc CFLAGS="-Xa -fast -xO4 -native -xstrconst -mt" \ CXX=CC CXXFLAGS="-noex -xO4 -mt" \ ./configure --prefix=/usr/local/mysql --enable-assembler
You may also have to edit the configure script to change this line:
#if !defined(__STDC__) || __STDC__ != 1
to this:
#if !defined(__STDC__)
If you turn on __STDC__ with the -Xc option, the Sun compiler
can't compile with the Solaris `pthread.h' header file. This is a Sun
bug (broken compiler or broken include file).
If mysqld issues the error message shown below when you run it, you have
tried to compile MySQL with the Sun compiler without enabling the
multi-thread option (-mt):
libc internal error: _rmutex_unlock: rmutex not held
Add -mt to CFLAGS and CXXFLAGS and try again.
If you get the following error when compiling MySQL with gcc,
it means that your gcc is not configured for your version of Solaris:
shell> gcc -O3 -g -O2 -DDBUG_OFF -o thr_alarm ... ./thr_alarm.c: In function `signal_hand': ./thr_alarm.c:556: too many arguments to function `sigwait'
The proper thing to do in this case is to get the newest version of
gcc and compile it with your current gcc compiler! At
least for Solaris 2.5, almost all binary versions of gcc have
old, unusable include files that will break all programs that use
threads (and possibly other programs)!
Solaris doesn't provide static versions of all system libraries
(libpthreads and libdl), so you can't compile MySQL
with --static. If you try to do so, you will get the error:
ld: fatal: library -ldl: not found
If too many processes try to connect very rapidly to mysqld, you will
see this error in the MySQL log:
Error in accept: Protocol error
You might try starting the server with the --set-variable back_log=50
option as a workaround for this. See section 4.16.4 mysqld Command-line Options.
If you are linking your own MySQL client, you might get the following error when you try to execute it:
ld.so.1: ./my: fatal: libmysqlclient.so.#: open failed: No such file or directory
The problem can be avoided by one of the following methods:
-Lpath):
-Wl,r/full-path-to-libmysqlclient.so.
LD_RUN_PATH environment variable before running your client.
When using the --with-libwrap configure option, you must also
include the libraries that `libwrap.a' needs:
--with-libwrap="/opt/NUtcpwrapper-7.6/lib/libwrap.a -lnsl -lsocket
If you have problems with configure trying to link with -lz and
you don't have zlib installed, you have two options:
--with-named-z-libs=no.
If you are using gcc and have problems with loading UDF functions
into MySQL, try adding -lgcc to the link line for the
UDF function.
If you would like MySQL to start automatically, you can copy `support-files/mysql.server' to `/etc/init.d' and create a symbolic link to it named `/etc/rc3.d/S99mysql.server'.
You can normally use a Solaris 2.6 binary on Solaris 2.7 and 2.8. Most of the Solaris 2.6 issues also apply for Solaris 2.7 and 2.8.
Note that MySQL Version 3.23.4 and above should be able to autodetect new versions of Solaris and enable workarounds for the following problems!
Solaris 2.7 / 2.8 has some bugs in the include files. You may see the
following error when you use gcc:
/usr/include/widec.h:42: warning: `getwc' redefined /usr/include/wchar.h:326: warning: this is the location of the previous definition
If this occurs, you can do the following to fix the problem:
Copy /usr/include/widec.h to
.../lib/gcc-lib/os/gcc-version/include and change line 41 from:
#if !defined(lint) && !defined(__lint) to #if !defined(lint) && !defined(__lint) && !defined(getwc)
Alternatively, you can edit `/usr/include/widec.h' directly. Either
way, after you make the fix, you should remove `config.cache' and run
configure again!
If you get errors like this when you run make, it's because
configure didn't detect the `curses.h' file (probably
because of the error in `/usr/include/widec.h'):
In file included from mysql.cc:50: /usr/include/term.h:1060: syntax error before `,' /usr/include/term.h:1081: syntax error before `;'
The solution to this is to do one of the following:
CFLAGS=-DHAVE_CURSES_H CXXFLAGS=-DHAVE_CURSES_H ./configure.
#define HAVE_TERM line from `config.h' file and
run make again.
If you get a problem that your linker can't find -lz when linking
your client program, the problem is probably that your `libz.so' file is
installed in `/usr/local/lib'. You can fix this by one of the
following methods:
LD_LIBRARY_PATH.
--with-named-z-libs=no option.
If you are using gcc or egcs on Solaris x86 and you
experience problems with core dumps under load, you should use the
following configure command:
CC=gcc CFLAGS="-O3 -fomit-frame-pointer -DHAVE_CURSES_H" \ CXX=gcc \ CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti -DHAVE_CURSES_H" \ ./configure --prefix=/usr/local/mysql
This will avoid problems with the libstdc++ library and with C++
exceptions.
If this doesn't help, you should compile a debug version and run
it with a trace file or under gdb. See section I.1 Debugging a MySQL server.
On SunOS 4, MIT-pthreads is needed to compile MySQL, which in turn
means you will need GNU make.
Some SunOS 4 systems have problems with dynamic libraries and libtool.
You can use the following configure line to avoid this problem:
shell> ./configure --disable-shared --with-mysqld-ldflags=-all-static
When compiling readline, you may get warnings about duplicate defines.
These may be ignored.
When compiling mysqld, there will be some implicit declaration
of function warnings. These may be ignored.
The notes below regarding glibc apply only to the situation when you build MySQL yourself. If you are running Linux on an x86 machine, in most cases it is much better for you to just use our binary. We link our binaries against the best patched version of glibc we can come up with and with the best compiler options, in an attempt to make it suitable for a high-load server. So if you read the text below, and are in doubt about what you should do, try our binary first to see if it meets your needs, and worry about your own build only after you have discovered that our binary is not good enough. In that case, we would appreciate a note about it, so we can build a better binary next time. For a typical user, even for setups with a lot of concurrent connections and/or tables exceeding 2GB limit, our binary in most cases is the best choice.
MySQL uses LinuxThreads on Linux. If you are using an old
Linux version that doesn't have glibc2, you must install
LinuxThreads before trying to compile MySQL. You can get
LinuxThreads at http://www.mysql.com/Downloads/Linux.
Note that glibc versions before and including Version 2.1.1 have
a fatal bug in pthread_mutex_timedwait handling, which is used
when you do INSERT DELAYED. We recommend you to not use
INSERT DELAYED before upgrading glibc.
If you plan to have 1000+ concurrent connections, you will need to make
some changes to LinuxThreads, recompile it, and relink MySQL against
the new `libpthread.a'. Increase PTHREAD_THREADS_MAX in
`sysdeps/unix/sysv/linux/bits/local_lim.h' to 4096 and decrease
STACK_SIZE in `linuxthreads/internals.h' to 256 KB. The paths are
relative to the root of glibc Note that MySQL will not be
stable with around 600-1000 connections if STACK_SIZE is the default
of 2 MB.
The STACK_SIZE constant in LinuxThreads controls the spacing of thread
stacks in the address space. It needs to be large enough so that there will
be plenty of room for the stack of each individual thread, but small enough
to keep the stack of some thread from running into the global mysqld
data. Unfortunately, the Linux implementation of mmap(), as we have
experimentally discovered, will successfully unmap an already mapped region
if you ask it to map out an address already in use, zeroing out the data
on the entire page, instead of returning an error. So, the safety of
mysqld or any other threaded application depends on the "gentleman"
behaviour of the code that creates threads. The user must take measures to
make sure the number of running threads at any time is sufficiently low for
thread stacks to stay away from the global heap. With mysqld, you
should enforce this "gentleman" behaviour by setting a reasonable value for
the max_connections variable.
If you build MySQL yourself and do not what to mess with patching
LinuxThreads, you should set max_connections to a value no higher
than 500. It should be even less if you have a large key buffer, large
heap tables, or some other things that make mysqld allocate a lot
of memory or if you are running a 2.2 kernel with a 2GB patch. If you are
using our binary or RPM version 3.23.25 or later, you can safely set
max_connections at 1500, assuming no large key buffer or heap tables
with lots of data. The more you reduce STACK_SIZE in LinuxThreads
the more threads you can safely create. We recommend the values between
128K and 256K.
If you use a lot of concurrent connections, you may suffer from a "feature"
in the 2.2 kernel that penalizes a process for forking or cloning a child
in an attempt to prevent a fork bomb attack. This will cause MySQL
not to scale well as you increase the number of concurrent clients. On
single CPU systems, we have seen this manifested in a very slow thread
creation, which means it may take a long time to connect to MySQL
(as long as 1 minute), and it may take just as long to shut it down. On
multiple CPU systems, we have observed a gradual drop in query speed as
the number of clients increases. In the process of trying to find a
solution, we have received a kernel patch from one of our users, who
claimed it made a lot of difference for his site. The patch is available here
(http://www.mysql.com/Downloads/Patches/linux-fork.patch). We have
now done rather extensive testing of this patch on both development and
production systems. It has significantly
improved MySQL performance without causing any problems and we now
recommend it to our users who are still running high-load servers on
2.2 kernels. This issue has been fixed in the 2.4 kernel, so if you are not
satisfied with
the current performance of your system, rather than patching your 2.2 kernel,
it might be easier to just upgrade to 2.4, which will also give you a nice
SMP boost in addition to fixing this fairness bug.
We have tested MySQL on the 2.4 kernel on a 2 CPU machine and
found MySQL scales MUCH better - there was virtually no slowdown
on query throughput all the way up
to 1000 clients, and MySQL scaling factor ( computed as the ratio of
maximum throughput to the throughput with one client) was 180%.
We have observed similar results on a 4-CPU system - virtually no
slowdown as the number of
clients was increased up to 1000, and 300% scaling factor. So for a high-load
SMP server we would definitely recommend the 2.4 kernel at this point. We
have discovered that it is essential to run mysqld process with the
highest possible priority on the 2.4 kernel to achieve maximum performance.
This can be done by adding
renice -20 $$ command to safe_mysqld. In our testing on a
4-CPU machine, increasing the priority gave 60% increase in throughput with
400 clients.
We are currently also trying to collect
more info on how well MySQL performs on 2.4 kernel on 4-way and 8-way
systems. If you have access such a system and have done some benchmarks,
please send a mail to docs@mysql.com with the results - we will
include them in the manual.
There is another issue that greatly hurts MySQL performance, especially on SMP systems. The implementation of mutex in LinuxThreads in glibc-2.1 is very bad for programs with many threads that only hold the mutex for a short time. On an SMP system, ironic as it is, if you link MySQL against unmodified LinuxThreads, removing processors from the machine improves MySQL performance in many cases. We have made a patch available for glibc 2.1.3, linuxthreads-2.1-patch to correct this behaviour.
With glibc-2.2.2
MySQL version 3.23.36 will use the adaptive mutex, which is much
better than even the patched one in glibc-2.1.3. Be warned, however,
that under some conditions, the current mutex code in glibc-2.2.2
overspins, which hurts MySQL performance. The chance of this
condition can be reduced by renicing mysqld process to the highest
priority. We have also been able to correct the overspin behaviour with
a patch, available here. It combines the correction of overspin, maximum number of
threads, and stack spacing all in one. You will need to apply it in the
linuxthreads directory with
patch -p0 </tmp/linuxthreads-2.2.2.patch.
We hope it will be included in
some form in to the future releases of glibc-2.2. In any case, if
you link against glibc-2.2.2 you still need to correct
STACK_SIZE and PTHREAD_THREADS_MAX. We hope that the defaults
will be corrected to some more acceptable values for high-load
MySQL setup in the future, so that your own build can be reduced
to ./configure; make; make install.
We recommend that you use the above patches to build a special static
version of libpthread.a and use it only for statically linking
against MySQL. We know that the patches are safe for MySQL
and significantly improve its performance, but we cannot say anything
about other applications. If you link other applications against the
patched version of the library, or build a patched shared version and
install it on your system, you are doing it at your own risk with regard
to other applications that depend on LinuxThreads.
If you experience any strange problems during the installation of MySQL, or with some common utilties hanging, it is very likely that they are either library or compiler related. If this is the case, using our binary will resolve them.
One known problem with the binary distribution is that with older Linux
systems that use libc (like RedHat 4.x or Slackware), you will get
some non-fatal problems with hostname resolution.
See section 4.6.3.1 Linux Notes for Binary Distributions.
When using LinuxThreads you will see a minimum of three processes running. These are in fact threads. There will be one thread for the LinuxThreads manager, one thread to handle connections, and one thread to handle alarms and signals.
Note that the Linux kernel and the LinuxThread library can by default only have 1024 threads. This means that you can only have up to 1021 connections to MySQL on an unpatched system. The page http://www.volano.com/linuxnotes.html contains information how to go around this limit.
If you see a dead mysqld daemon process with ps, this usually
means that you have found a bug in MySQL or you have a corrupted
table. See section 21.2 What to Do if MySQL Keeps Crashing.
To get a core dump on Linux if mysqld dies with a SIGSEGV
signal, you can start mysqld with the --core-file option. Note
that you also probably need to raise the core file size by adding
ulimit -c 1000000 to safe_mysqld or starting safe_mysqld
with --core-file-sizes=1000000. See section 15.3 safe_mysqld, the wrapper around mysqld.
To get a core dump on Linux if mysqld dies with a SIGSEGV signal, you can
start mysqld with the --core-file option. Note that you also probably
need to raise the core file size by adding ulimit -c 1000000 to
safe_mysqld or starting safe_mysqld with
--core-file-sizes=1000000. See section 15.3 safe_mysqld, the wrapper around mysqld.
If you are linking your own MySQL client and get the error:
ld.so.1: ./my: fatal: libmysqlclient.so.4: open failed: No such file or directory
When executing them, the problem can be avoided by one of the following methods:
-Lpath):
-Wl,r/path-libmysqlclient.so.
libmysqclient.so to `/usr/lib'.
libmysqlclient.so is located
to the LD_RUN_PATH environment variable before running your client.
If you are using the Fujitsu compiler (fcc / FCC) you will have
some problems compiling MySQL because the Linux header files are very
gcc oriented.
The following configure line should work with fcc/FCC:
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE -DCONST=const -DNO_STRTOLL_PROTO" CXX=FCC CXXFLAGS="-O -K fast -K lib -K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE -DCONST=const -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO '-D_EXTERN_INLINE=static __inline'" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-low-memory
MySQL requires libc Version 5.4.12 or newer. It's known to
work with libc 5.4.46. glibc Version 2.0.6 and later should
also work. There have been some problems with the glibc RPMs from
RedHat, so if you have problems, check whether or not there are any updates!
The glibc 2.0.7-19 and 2.0.7-29 RPMs are known to work.
On some older Linux distributions, configure may produce an error
like this:
Syntax error in sched.h. Change _P to __P in the /usr/include/sched.h file. See the Installation chapter in the Reference Manual.
Just do what the error message says and add an extra underscore to the
_P macro that has only one underscore, then try again.
You may get some warnings when compiling; those shown below can be ignored:
mysqld.cc -o objs-thread/mysqld.o mysqld.cc: In function `void init_signals()': mysqld.cc:315: warning: assignment of negative value `-1' to `long unsigned int' mysqld.cc: In function `void * signal_hand(void *)': mysqld.cc:346: warning: assignment of negative value `-1' to `long unsigned int'
In Debian GNU/Linux, if you want MySQL to start automatically when the system boots, do the following:
shell> cp support-files/mysql.server /etc/init.d/mysql.server shell> /usr/sbin/update-rc.d mysql.server defaults 99
mysql.server can be found in the `share/mysql' directory
under the MySQL installation directory or in the
`support-files' directory of the MySQL source tree.
If mysqld always core dumps when it starts up, the problem may be that
you have an old `/lib/libc.a'. Try renaming it, then remove
`sql/mysqld' and do a new make install and try again. This
problem has been reported on some Slackware installations. RedHat Version 5.0
also has a similar problem with some new glibc versions.
See section 4.12.5.2 RedHat Version 5.0 Notes.
If you get the following error when linking mysqld,
it means that your `libg++.a' is not installed correctly:
/usr/lib/libc.a(putc.o): In function `_IO_putc': putc.o(.text+0x0): multiple definition of `_IO_putc'
You can avoid using `libg++.a' by running configure like this:
shell> CXX=gcc ./configure
If you have any problems with MySQL on RedHat, you should start by
upgrading glibc to the newest possible version!
If you install all the official RedHat patches (including
glibc-2.0.7-19 and glibc-devel-2.0.7-19), both the
binary and source distributions of MySQL should work without
any trouble!
The updates are needed because there is a bug in glibc 2.0.5 in how
pthread_key_create variables are freed. With glibc 2.0.5, you
must use a statically linked MySQL binary distribution. If you
want to compile from source, you must install the corrected version of
LinuxThreads from http://www.mysql.com/Downloads/Linux or upgrade your
glibc.
If you have an incorrect version of glibc or LinuxThreads, the symptom
is that mysqld crashes after each connection. For example,
mysqladmin version will crash mysqld when it finishes!
Another symptom of incorrect libraries is that mysqld crashes at
once when it starts. On some Linux systems, this can be fixed by configuring
like this:
shell> ./configure --with-mysqld-ldflags=-all-static
On Redhat Version 5.0, the easy way out is to install the glibc
2.0.7-19 RPM and run configure without the
--with-mysqld-ldflags=-all-static option.
For the source distribution of glibc 2.0.7, a patch that is easy to
apply and is tested with MySQL may be found at:
http://www.mysql.com/Download/Linux/glibc-2.0.7-total-patch.tar.gz
If you experience crashes like these when you build MySQL, you can always download the newest binary version of MySQL. This is statically-linked to avoid library conflicts and should work on all Linux systems!
MySQL comes with an internal debugger that can generate trace files with a lot of information that can be used to find and solve a wide range of different problems. See section I.1 Debugging a MySQL server.
The glibc of RedHat Version 5.1 (glibc 2.0.7-13) has a memory
leak, so to get a stable MySQL version, you must upgrade glibc,
to 2.0.7-19, downgrade glibc or use a binary version of mysqld.
If you don't do this, you will encounter memory problems (out of memory, etc.).
The most common error in this case is:
Can't create a new thread (errno 11). If you are not out of available memory, you can consult the manual for any possible OS dependent bug
After you have upgraded to glibc 2.0.7-19, you can configure
MySQL with dynamic linking (the default), but you cannot
run configure with the --with-mysqld-ldflags=-all-static option
until you have installed glibc 2.0.7-19 from source!
You can check which version of glibc you have with rpm -q glibc.
Another reason for the above error is if you try to use more threads than your Linux kernel is configured for. In this case you should raise the limits in `include/linux/tasks.h' and recompile your kernel!
In some implementations, readdir_r() is broken. The symptom is that
SHOW DATABASES always returns an empty set. This can be fixed by
removing HAVE_READDIR_R from `config.h' after configuring and
before compiling.
Some problems will require patching your Linux installation. The patch can
be found at
http://www.mysql.com/Downloads/patches/Linux-sparc-2.0.30.diff.
This patch is against the Linux distribution `sparclinux-2.0.30.tar.gz'
that is available at vger.rutgers.edu (a version of Linux that was
never merged with the official 2.0.30). You must also install LinuxThreads
Version 0.6 or newer.
MySQL Version 3.23.12 is the first MySQL version that is tested on Linux-Alpha. If you plan to use MySQL on Linux-Alpha, you should ensure that you have this version or newer.
We have tested MySQL on Alpha with our benchmarks and test suite, and it appears to work nicely. The main thing we haven't yet had time to test is how things works with many concurrent users.
When we compiled the standard MySQL binary we are using SuSE 6.4, kernel 2.2.13-SMP, Compaq C compiler (V6.2-504) and Compaq C++ compiler (V6.3-005) on a Comaq DS20 machine with an Alpha EV6 processor.
You can find the above compilers at http://www.support.compaq.com/alpha-tools). By using these compilers, instead of gcc, we get about 9-14 % better performance with MySQL.
Note that the configure line optimized the binary for the current CPU; This means you can only use our binary if you have an Alpha EV6 processor. We also compile statically to avoid library problems.
CC=ccc CFLAGS="-fast" CXX=cxx CXXFLAGS="-fast -noexceptions -nortti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-non_shared --with-client-ldflags=-non_shared
If you want to use egcs the following configure line worked for us:
CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared
Some known problems when running MySQL on Linux-Alpha:
gdb 4.18. You should download and use gdb 5.0 instead!
--with-mysqld-ldflags=-all-static with gcc.
MySQL should work on MkLinux with the newest glibc package
(tested with glibc 2.0.7).
To get MySQL to work on Qube2, (Linux Mips), you need the
newest glibc libraries (glibc-2.0.7-29C2 is known to
work). You must also use the egcs C++ compiler
(egcs-1.0.2-9, gcc 2.95.2 or newer).
To get MySQL to compile on Linux Ia64, we had to do the following (we assume that this will be easier when next gcc version for ia64 is released).
Using gcc-2.9-final:
CFLAGS="-O2" CXX=gcc CXXFLAGS="-O2 -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex
After make you will get an error that sql/opt_range.cc
will not compile (internal compiler error). To fix this, go to the sql
directory and type make again. Copy the compile line, but change
-O2 to -O0. The file should now compile.
Now you can do:
cd .. make make_install
and mysqld should be ready to run.
If you are using egcs 1.1.2 on Digital Unix, you should upgrade to gcc 2.95.2, as egcs on DEC has some serious bugs!
When compiling threaded programs under Digital Unix, the documentation
recommends using the -pthread option for cc and cxx and
the libraries -lmach -lexc (in addition to -lpthread). You
should run configure something like this:
CC="cc -pthread" CXX="cxx -pthread -O" \ ./configure --with-named-thread-libs="-lpthread -lmach -lexc -lc"
When compiling mysqld, you may see a couple of warnings like this:
mysqld.cc: In function void handle_connections()': mysqld.cc:626: passing long unsigned int *' as argument 3 of accept(int,sockadddr *, int *)'
You can safely ignore these warnings. They occur because configure
can detect only errors, not warnings.
If you start the server directly from the command line, you may have problems
with it dying when you log out. (When you log out, your outstanding processes
receive a SIGHUP signal.) If so, try starting the server like this:
shell> nohup mysqld [options] &
nohup causes the command following it to ignore any SIGHUP
signal sent from the terminal. Alternatively, start the server by running
safe_mysqld, which invokes mysqld using nohup for you.
See section 15.3 safe_mysqld, the wrapper around mysqld.
If you get a problem when compiling mysys/get_opt.c, just remove the line #define _NO_PROTO from the start of that file!
If you are using Compac's CC compiler, the following configure line should work:
CC="cc -pthread" CFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host" CXX="cxx -pthread" CXXFLAGS="-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host" export CC CFLAGS CXX CXXFLAGS ./configure \ --prefix=/usr/local/mysql \ --with-low-memory \ --enable-large-files \ --enable-shared=yes \ --with-named-thread-libs="-lpthread -lmach -lexc -lc" gnumake
If you get a problem with libtool, when compiling with shared libraries
as above, when linking mysql, you should be able to get around
this by issuing:
cd mysql /bin/sh ../libtool --mode=link cxx -pthread -O3 -DDBUG_OFF \ -O4 -ansi_alias -ansi_args -fast -inline speed \ -speculate all \ -arch host -DUNDEF_HAVE_GETHOSTBYNAME_R \ -o mysql mysql.o readline.o sql_string.o completion_hash.o \ ../readline/libreadline.a -lcurses \ ../libmysql/.libs/libmysqlclient.so -lm cd .. gnumake gnumake install scripts/mysql_install_db
If you have problems compiling and have DEC CC and gcc
installed, try running configure like this:
CC=cc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
If you get problems with the `c_asm.h' file, you can create and use a 'dummy' `c_asm.h' file with:
touch include/c_asm.h CC=gcc CFLAGS=-I./include \ CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql
Note that the following problems with the ld program can be fixed
by downloading the latest DEC (Compaq) patch kit from:
http://ftp.support.compaq.com/public/unix/.
On OSF1 V4.0D and compiler "DEC C V5.6-071 on Digital Unix V4.0 (Rev. 878)"
the compiler had some strange behavior (undefined asm symbols).
/bin/ld also appears to be broken (problems with _exit
undefined errors occuring while linking mysqld). On this system, we
have managed to compile MySQL with the following configure
line, after replacing /bin/ld with the version from OSF 4.0C:
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql
With the Digital compiler "C++ V6.1-029", the following should work:
CC=cc -pthread CFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host CXX=cxx -pthread CXXFLAGS=-O4 -ansi_alias -ansi_args -fast -inline speed -speculate all -arch host -noexceptions -nortti export CC CFLAGS CXX CXXFLAGS ./configure --prefix=/usr/mysql/mysql --with-mysqld-ldflags=-all-static --disable-shared --with-named-thread-libs="-lmach -lexc -lc"
In some versions of OSF1, the alloca() function is broken. Fix
this by removing the line in `config.h' that defines 'HAVE_ALLOCA'.
The alloca() function also may have an incorrect prototype in
/usr/include/alloca.h. This warning resulting from this can be ignored.
configure will use the following thread libraries automatically:
--with-named-thread-libs="-lpthread -lmach -lexc -lc".
When using gcc, you can also try running configure like this:
shell> CFLAGS=-D_PTHREAD_USE_D4 CXX=gcc CXXFLAGS=-O3 ./configure ....
If you have problems with signals (MySQL dies unexpectedly under high load), you may have found an OS bug with threads and signals. In this case you can tell MySQL not to use signals by configuring with:
shell> CFLAGS=-DDONT_USE_THR_ALARM \
CXXFLAGS=-DDONT_USE_THR_ALARM \
./configure ...
This doesn't affect the performance of MySQL, but has the side
effect that you can't kill clients that are ``sleeping'' on a connection with
mysqladmin kill or mysqladmin shutdown. Instead, the client
will die when it issues its next command.
With gcc 2.95.2, you will probably run into the following compile error:
sql_acl.cc:1456: Internal compiler error in `scan_region', at except.c:2566 Please submit a full bug report.
To fix this you should change to the sql directory and do a ``cut
and paste'' of the last gcc line, but change -O3 to
-O0 (or add -O0 immediately after gcc if you don't
have any -O option on your compile line.) After this is done you
can just change back to the top-level directly and run make
again.
If you are using Irix Version 6.5.3 or newer mysqld will only be able to
create threads if you run it as a user with CAP_SCHED_MGT
privileges (like root) or give the mysqld server this privilege
with the following shell command:
shell> chcap "CAP_SCHED_MGT+epi" /opt/mysql/libexec/mysqld
You may have to undefine some things in `config.h' after running
configure and before compiling.
In some Irix implementations, the alloca() function is broken. If the
mysqld server dies on some SELECT statements, remove the lines
from `config.h' that define HAVE_ALLOC and HAVE_ALLOCA_H.
If mysqladmin create doesn't work, remove the line from `config.h'
that defines HAVE_READDIR_R. You may have to remove the
HAVE_TERM_H line as well.
SGI recommends that you install all of the patches on this page as a set: http://support.sgi.com/surfzone/patches/patchset/6.2_indigo.rps.html
At the very minimum, you should install the latest kernel rollup, the
latest rld rollup, and the latest libc rollup.
You definitely need all the POSIX patches on this page, for pthreads support:
http://support.sgi.com/surfzone/patches/patchset/6.2_posix.rps.html
If you get the something like the following error when compiling `mysql.cc':
"/usr/include/curses.h", line 82: error(1084): invalid combination of type
Type the following in the top-level directory of your MySQL source tree:
shell> extra/replace bool curses_bool < /usr/include/curses.h > include/curses.h shell> make
There have also been reports of scheduling problems. If only one thread is running, things go slow. Avoid this by starting another client. This may lead to a 2-to-10-fold increase in execution speed thereafter for the other thread. This is a poorly understood problem with Irix threads; you may have to improvise to find solutions until this can be fixed.
If you are compiling with gcc, you can use the following
configure command:
CC=gcc CXX=gcc CXXFLAGS=-O3 \ ./configure --prefix=/usr/local/mysql --with-thread-safe-client --with-named-thread-libs=-lpthread
FreeBSD 3.x is recommended for running MySQL since the thread package is much more integrated.
The easiest and therefor the preferred way to install is to use the mysql-server and mysql-client ports available on http://www.freebsd.org.
Using these gives you:
It is reccomended you use MIT-pthreads on FreeBSD 2.x and native threads on Versions 3 and up. It is possible to run with native threads on some late 2.2.x versions but you may encounter problems shutting down mysqld.
The MYSQL Makefiles require GNU make (gmake) to work.
If you want to compile MYSQL you need to install GNU make
first.
Be sure to have your name resolver setup correct. Otherwise you may experience resolver delays or failures when connecting to mysqld.
Make sure that the localhost entry in the `/etc/hosts' file is
correct (otherwise you will have problems connecting to the database). The
`/etc/hosts' file should start with a line:
127.0.0.1 localhost localhost.your.domain
If you notice that configure will use MIT-pthreads, you should read
the MIT-pthreads notes. See section 4.10 MIT-pthreads Notes.
If you get an error from make install that it can't find
`/usr/include/pthreads', configure didn't detect that you need
MIT-pthreads. This is fixed by executing these commands:
shell> rm config.cache shell> ./configure --with-mit-threads
FreeBSD is also known to have a very low default file handle limit. See section 21.12 File Not Found. Uncomment the ulimit -n section in safe_mysqld or raise the limits for the mysqld user in /etc/login.conf (and rebuild it with cap_mkdb /etc/login.conf). Also be sure you set the appropriate class for this user in the password file if you are not using the default (use: chpass mysqld-user-name). See section 15.3 safe_mysqld, the wrapper around mysqld.
If you get problems with the current date in MySQL, setting the
TZ variable will probably help. See section A Environment Variables.
To get a secure and stable system you should only use FreeBSD kernels
that are marked -STABLE.
To compile on NetBSD you need GNU make. Otherwise the compile will
crash when make tries to run lint on C++ files.
On OpenBSD Version 2.5, you can compile MySQL with native threads with the following options:
CFLAGS=-pthread CXXFLAGS=-pthread ./configure --with-mit-threads=no
Our users have reported that OpenBSD 2.8 has a threading bug which causes problems with MySQL. The OpenBSD Developers have fixed the problem, but as of January 25th, 2001, it's only available in the ``-current'' branch. The symptoms of this threading bug are: slow response, high load, high CPU usage, and crashes.
If you get the following error when compiling MySQL, your
ulimit value for virtual memory is too low:
item_func.h: In method `Item_func_ge::Item_func_ge(const Item_func_ge &)': item_func.h:28: virtual memory exhausted make[2]: *** [item_func.o] Error 1
Try using ulimit -v 80000 and run make again. If this
doesn't work and you are using bash, try switching to csh
or sh; some BSDI users have reported problems with bash
and ulimit.
If you are using gcc, you may also use have to use the
--with-low-memory flag for configure to be able to compile
`sql_yacc.cc'.
If you get problems with the current date in MySQL, setting the
TZ variable will probably help. See section A Environment Variables.
Upgrade to BSD/OS Version 3.1. If that is not possible, install BSDIpatch M300-038.
Use the following command when configuring MySQL:
shell> env CXX=shlicc++ CC=shlicc2 \
./configure \
--prefix=/usr/local/mysql \
--localstatedir=/var/mysql \
--without-perl \
--with-unix-socket-path=/var/mysql/mysql.sock
The following is also known to work:
shell> env CC=gcc CXX=gcc CXXFLAGS=-O3 \
./configure \
--prefix=/usr/local/mysql \
--with-unix-socket-path=/var/mysql/mysql.sock
You can change the directory locations if you wish, or just use the defaults by not specifying any locations.
If you have problems with performance under heavy load, try using the
--skip-thread-priority option to mysqld! This will run
all threads with the same priority; on BSDI Version 3.1, this gives better
performance (at least until BSDI fixes their thread scheduler).
If you get the error virtual memory exhausted while compiling,
you should try using ulimit -v 80000 and run make again.
If this doesn't work and you are using bash, try switching to
csh or sh; some BSDI users have reported problems with
bash and ulimit.
BSDI Version 4.x has some thread-related bugs. If you want to use MySQL on this, you should install all thread-related patches. At least M400-023 should be installed.
On some BSDI Version 4.x systems, you may get problems with shared libraries.
The symptom is that you can't execute any client programs, for example,
mysqladmin. In this case you need to reconfigure not to use
shared libraries with the --disable-shared option to configure.
Some customers have had problems on BSDI 4.0.1 that the mysqld
binary after a while can't open tables. This is because some
library/system related bug causes mysqld to change current
directory without asking for this!
The fix is to either upgrade to 3.23.34 or after running configure
remove the line #define HAVE_REALPATH from config.h
before running make.
Note that the above means that you can't symbolic link a database directories to another database directory or symbolic link a table to another database on BSDI! (Making a symbolic link to another disk is ok).
The current port is tested only on a ``sco3.2v5.0.4'' and ``sco3.2v5.0.5'' system. There has also been a lot of progress on a port to ``sco 3.2v4.2''.
For the moment the recommended compiler on OpenServer is gcc 2.95.2. With this you should be able to compile MySQL with just:
CC=gcc CXX=gcc ./configure ... (options)
gcc 2.7.2 in Skunkware 97 does not have
GNU as. You can also use egcs 1.1.2 or newer
http://www.egcs.com/. If you are using egcs 1.1.2 you have
to execute the following command:
shell> cp -p /usr/include/pthread/stdtypes.h /usr/local/lib/gcc-lib/i386-pc-sco3.2v5.0.5/egcs-2.91.66/include/pthread/
./configure in the `threads/src' directory and select
the SCO OpenServer option. This command copies `Makefile.SCO5' to
`Makefile'.
make.
cd to the `thread/src' directory, and run make
install.
make when making MySQL.
safe_mysqld as root, you probably will get only the
default 110 open files per process. mysqld will write a note about this
in the log file.
configure command should work:
shell> ./configure --prefix=/usr/local/mysql --disable-shared
configure command should work:
shell> CFLAGS="-D_XOPEN_XPG4" CXX=gcc CXXFLAGS="-D_XOPEN_XPG4" \
./configure \
--with-debug --prefix=/usr/local/mysql \
--with-named-thread-libs="-lgthreads -lsocket -lgen -lgthreads" \
--with-named-curses-libs="-lcurses"
You may get some problems with some include files. In this case, you can
find new SCO-specific include files at
http://www.mysql.com/Downloads/SCO/SCO-3.2v4.2-includes.tar.gz.
You should unpack this file in the `include' directory of your
MySQL source tree.
SCO development notes:
mysqld
with -lgthreads -lsocket -lgthreads.
malloc. If you encounter problems with memory usage,
make sure that `gmalloc.o' is included in `libgthreads.a' and
`libgthreads.so'.
read(),
write(), getmsg(), connect(), accept(),
select(), and wait().
If you want to install DBI on SCO, you have to edit the `Makefile' in DBI-xxx and each subdirectory.
Note that the following assumes gcc 2.95.2 or newer:
OLD: NEW: CC = cc CC = gcc CCCDLFLAGS = -KPIC -W1,-Bexport CCCDLFLAGS = -fpic CCDLFLAGS = -wl,-Bexport CCDLFLAGS = LD = ld LD = gcc -G -fpic LDDLFLAGS = -G -L/usr/local/lib LDDLFLAGS = -L/usr/local/lib LDFLAGS = -belf -L/usr/local/lib LDFLAGS = -L/usr/local/lib LD = ld LD = gcc -G -fpic OPTIMISE = -Od OPTIMISE = -O1 OLD: CCCFLAGS = -belf -dy -w0 -U M_XENIX -DPERL_SCO5 -I/usr/local/include NEW: CCFLAGS = -U M_XENIX -DPERL_SCO5 -I/usr/local/include
This is because the Perl dynaloader will not load the DBI modules
if they were compiled with icc or cc.
Perl works best when compiled with cc.
You must use a version of MySQL at least as recent as Version 3.22.13 because that version fixes some portability problems under Unixware.
We have been able to compile MySQL with the following configure
command on Unixware Version 7.0.1:
CC=cc CXX=CC ./configure --prefix=/usr/local/mysql
If you want to use gcc, you must use gcc 2.95.2 or newer.
Automatic detection of xlC is missing from Autoconf, so a
configure command something like this is needed when compiling
MySQL (This example uses the IBM compiler):
export CC="xlc_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192 " export CXX="xlC_r -ma -O3 -qstrict -qoptimize=3 -qmaxmem=8192" export CFLAGS="-I /usr/local/include" export LDLFAGS="-L /usr/local/lib" export CPPFLAGS=$CFLAGS export CXXFLAGS=$CFLAGS ./configure --prefix=/usr/local \ --localstatedir=/var/mysql \ --sysconfdir=/etc/mysql \ --sbindir='/usr/local/bin' \ --libexecdir='/usr/local/bin' \ --enable-thread-safe-client \ --enable-large-files
Above are the options used to compile the MySQL distribution that can be found at http://www-frec.bull.com/.
If you change the -O3 to -O2 in the above configure line,
you must also remove the -qstrict option (this is a limitation in
the IBM C compiler).
If you are using gcc or egcs to compile MySQL, you
MUST use the -fno-exceptions flag, as the exception
handling in gcc/egcs is not thread safe! (This is tested with
egcs 1.1.). There are also some known problems with IBM's assembler,
which may cause it to generate bad code when used with gcc.
We recommend the following configure line with egcs and
gcc 2.95 on AIX:
CC="gcc -pipe -mcpu=power2 -Wa,-many" \ CXX="gcc -pipe -mcpu=power2 -Wa,-many" \ CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti" \ ./configure --prefix=/usr/local/mysql --with-low-memory
The -Wa,-many is necessary for the compile to be successful. IBM is
aware of this problem but is in to hurry to fix it because of the workaround
available. We don't know if the -fno-exceptions is required with
gcc 2.95, but as MySQL doesn't use exceptions and the above
option generates faster code, we recommend that you should always use this
option with egcs / gcc.
If you have problems with signals (MySQL dies unexpectedly under high load) you may have found an OS bug with threads and signals. In this case you can tell MySQL not to use signals by configuring with:
shell> CFLAGS=-DDONT_USE_THR_ALARM CXX=gcc \
CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -DDONT_USE_THR_ALARM" \
./configure --prefix=/usr/local/mysql --with-debug --with-low-memory
This doesn't affect the performance of MySQL, but has the side
effect that you can't kill clients that are ``sleeping'' on a connection with
mysqladmin kill or mysqladmin shutdown. Instead, the client
will die when it issues its next command.
On some versions of AIX, linking with libbind.a makes
getservbyname core dump. This is an AIX bug and should be reported
to IBM.
There are a couple of small problems when compiling MySQL on
HP-UX. We recommend that you use gcc instead of the HP-UX native
compiler, because gcc produces better code!
We recommend using gcc 2.95 on HP-UX. Don't use high optimization flags (like -O6) as this may not be safe on HP-UX.
Note that MIT-pthreads can't be compiled with the HP-UX compiler
because it can't compile .S (assembler) files.
The following configure line should work:
CFLAGS="-DHPUX -I/opt/dce/include" CXXFLAGS="-DHPUX -I/opt/dce/include -felide-constructors -fno-exceptions -fno-rtti" CXX=gcc ./configure --with-pthread --with-named-thread-libs='-ldce' --prefix=/usr/local/mysql --disable-shared
If you are compiling gcc 2.95 yourself, you should NOT link it with
the DCE libraries (libdce.a or libcma.a) if you want to compile
MySQL with MIT-pthreads. If you mix the DCE and MIT-pthreads
packages you will get a mysqld to which you cannot connect. Remove
the DCE libraries while you compile gcc 2.95!
For HPUX Version 11.x we recommend MySQL Version 3.23.15 or later.
Because of some critical bugs in the standard HPUX libraries, one should install the following patches before trying to run MySQL on HPUX 11.0:
PHKL_22840 Streams cumulative PHNE_22397 ARPA cumulative
This will solve a problem that one gets EWOULDBLOCK from recv()
and EBADF from accept() in threaded applications.
If you are using gcc 2.95.1 on an unpatched HPUX 11.x system,
you will get the error:
In file included from /usr/include/unistd.h:11,
from ../include/global.h:125,
from mysql_priv.h:15,
from item.cc:19:
/usr/include/sys/unistd.h:184: declaration of C function ...
/usr/include/sys/pthread.h:440: previous declaration ...
In file included from item.h:306,
from mysql_priv.h:158,
from item.cc:19:
The problem is that HP-UX doesn't define pthreads_atfork() consistently.
It has conflicting prototypes in
`/usr/include/sys/unistd.h':184 and
`/usr/include/sys/pthread.h':440 (details below).
One solution is to copy `/usr/include/sys/unistd.h' into `mysql/include' and edit `unistd.h' and change it to match the definition in `pthread.h'. Here's the diff:
183,184c183,184 < extern int pthread_atfork(void (*prepare)(), void (*parent)(), < void (*child)()); --- > extern int pthread_atfork(void (*prepare)(void), void (*parent)(void), > void (*child)(void));
After this, the following configure line should work:
CFLAGS="-fomit-frame-pointer -O3 -fpic" CXX=gcc CXXFLAGS="-felide-constructors -fno-exceptions -fno-rtti -O3" ./configure --prefix=/usr/local/mysql --disable-shared
Here is some information that a HPUX Version 11.x user sent us about compiling MySQL with HPUX:x compiler:
Environment:
proper compilers.
setenv CC cc
setenv CXX aCC
flags
setenv CFLAGS -D_REENTRANT
setenv CXXFLAGS -D_REENTRANT
setenv CPPFLAGS -D_REENTRANT
% aCC -V
aCC: HP ANSI C++ B3910B X.03.14.06
% cc -V /tmp/empty.c
cpp.ansi: HP92453-01 A.11.02.00 HP C Preprocessor (ANSI)
ccom: HP92453-01 A.11.01.00 HP C Compiler
cc: "/tmp/empty.c", line 1: warning 501: Empty source file.
configuration:
./configure --with-pthread \
--prefix=/source-control/mysql \
--with-named-thread-libs=-lpthread \
--with-low-memory
added '#define _CTYPE_INCLUDED' to include/m_ctype.h. This
symbol is the one defined in HP's /usr/include/ctype.h:
/* Don't include std ctype.h when this is included */
#define _CTYPE_H
#define __CTYPE_INCLUDED
#define _CTYPE_INCLUDED
#define _CTYPE_USING /* Don't put names in global namespace. */
-D_REENTRANT to get the compiler
to recognize the prototype for localtime_r. Alternatively I could have
supplied the prototype for localtime_r. But I wanted to catch other
bugs without needing to run into them. I wasn't sure where I needed it, so I
added it to all flags.
MySQL should work without any problems on Mac OS X Public Beta (Darwin). You don't need the pthread patches for this OS!
Before trying to configure MySQL on Mac OS X server you must first install the pthread package from http://www.prnet.de/RegEx/mysql.html.
Our binary for Mac OS X is compiled on Rhapsody 5.5 with the following configure line:
CC=gcc CFLAGS="-O2 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O2 -fomit-frame-pointer" ./configure --prefix=/usr/local/mysql "--with-comment=Official MySQL binary" --with-extra-charsets=complex --disable-shared
You might want to also add aliases to your shell's resource file to
access mysql and mysqladmin from the command line:
alias mysql '/usr/local/mysql/bin/mysql' alias mysqladmin '/usr/local/mysql/bin/mysqladmin'
We are really interested in getting MySQL to work on BeOS, but unfortunately we don't have any person who knows BeOS or has time to do a port.
We are interested in finding someone to do a port, and we will help them with any technical questions they may have while doing the port.
We have previously talked with some BeOS developers that have said that MySQL is 80% ported to BeOS, but we haven't heard from these in a while.
This section describes installation and use of MySQL on Windows. This is also described in the `README' file that comes with the MySQL Windows distribution.
If you don't have a copy of the MySQL distribution, you should first download one from http://www.mysql.com/.
If you plan to connect to MySQL from some other program, you will probably also need the MyODBC driver. You can find this at the MyODBC download page (http://www.mysql.com/downloads/api-myodbc.html).
To install either distribution, unzip it in some empty directory and run the
Setup.exe program.
By default, MySQL-Windows is configured to be installed in
`C:\mysql'. If you want to install MySQL elsewhere, install it
in `C:\mysql', then move the installation to where you want it. If you
do move MySQL, you must tell mysqld where everything is by
supplying options to mysqld. Use C:\mysql\bin\mysqld --help to
display all options! For example, if you have moved the MySQL
distribution to `D:\programs\mysql', you must start mysqld with:
D:\programs\mysql\bin\mysqld --basedir D:\programs\mysql
With all newer MySQL versions, you can also create a `C:\my.cnf' file that holds any default options for the MySQL server. Copy the file `\mysql\my-xxxxx.cnf' to `C:\my.cnf' and edit this to suit your setup. Note that you should specify all paths with `/' instead of `\'. If you use `\', you need to specify this twice, as `\' is the escape character in MySQL. See section 4.16.5 Option Files.
MySQL uses TCP/IP to connect a client to a server. (This will allow any machine on your network to connect to your MySQL server.) Because of this, you must install TCP/IP on your machine before starting MySQL. You can find TCP/IP on your Windows CD-ROM.
Note that if you are using an old Win95 release (for example OSR2), it's likely that you have an old Winsock package! MySQL requires Winsock 2! You can get the newest Winsock from http://www.microsoft.com/. Win98 has the new Winsock 2 library, so the above doesn't apply for Win98.
There are 2 different MySQL servers you can use:
mysqld | Compiled with full debugging and automatic memory allocation checking |
mysqld-opt | Optimized for a Pentium processor. |
Both of the above should work on any Intel processor >= i386.
To start the mysqld server, you should start an MS-DOS window and type:
C:\mysql\bin\mysqld
This will start mysqld in the background without a window.
You can kill the MySQL server by executing:
C:\mysql\bin\mysqladmin -u root shutdown
Note that Win95/Win98 don't support creation of named pipes. On Win95/Win98, you can only use named pipes to connect to a remote MySQL running on an NT server.
If mysqld doesn't start, please check whether or not the
`\mysql\mysql.err' file contains any reason for this. You can also
try to start it with mysqld --standalone; In this case you may
get some useful information on the screen that may help solve this.
The last option is to start mysqld with --debug. In this
case mysqld will write a log file in `\mysqld.trace'
that should contain the reason why mysqld doesn't start. If you
make a bug report about this, please only send the lines to the mailing list
where something seems to go wrong!
The Win95/Win98 section also applies to MySQL on NT/Win2000, with the following differences:
To get MySQL to work with TCP/IP on NT, you must install service pack 3 (or newer)!
Note that everything in the following that applies for NT also applies for Win2000!
For NT/Win2000, the server name is mysqld-nt. Normally you
should install MySQL as a service on NT/Win2000:
C:\mysql\bin\mysqld-nt --install
(You could use the mysqld or mysqld-opt servers on NT,
but those cannot be started as a service or use named pipes.)
You can start and stop the MySQL service with:
NET START mysql NET STOP mysql
Note that in this case you can't use any other options for mysqld-nt!
You can also run mysqld-nt as a stand-alone program on NT if you need
to start mysqld-nt with any options! If you start mysqld-nt
without options on NT, mysqld-nt tries to starts itself as a service
with the default service options. If you have stopped mysqld-nt, you
have to start it with NET START mysql.
The service is installed with the name MySQL. Once installed, it must
be started using the Services Control Manager (SCM) Utility (found in Control
Panel) or by using the NET START MySQL command. If any options are
desired, they must be specified as "Startup parameters" in the SCM utility
before you start the MySQL service. Once running, mysqld-nt
can be stopped using mysqladmin or from the SCM utility or by using
the command NET STOP MySQL. If you use SCM to stop mysqld-nt,
there is a strange message from SCM about mysqld shutdown normally.
When run as a service, mysqld-nt has no access to a console and so no
messages can be seen.
On NT you can get the following service error messages:
| Permission Denied | Means that it cannot find mysqld-nt.exe.
|
| Cannot Register | Means that the path is incorrect. |
| Failed to install service. | Means that the service is already installed or that the Service Control Manager is in bad state. |
If you have problems installing mysqld-nt as a service, try starting
it with the full path:
C:\mysql\bin\mysqld-nt --install
If this doesn't work, you can get mysqld-nt to start properly by fixing
the path in the registry!
If you don't want to start mysqld-nt as a service, you can start it as
follows:
C:\mysql\bin\mysqld-nt --standalone
or
C:\mysql\bin\mysqld --standalone --debug
The last version gives you a debug trace in `C:\mysqld.trace'.
MySQL supports TCP/IP on all Windows platforms and named pipes on NT. The default is to use named pipes for local connections on NT and TCP/IP for all other cases if the client has TCP/IP installed. The host name specifies which protocol is used:
| Protocol | |
| NULL (none) | On NT, try named pipes first; if that doesn't work, use TCP/IP. On Win95/Win98, TCP/IP is used. |
| . | Named pipes |
| localhost | TCP/IP to current host |
| hostname | TCP/IP |
You can force a MySQL client to use named pipes by specifying the
--pipe option or by specifying . as the host name. Use the
--socket option to specify the name of the pipe.
You can test whether or not MySQL is working by executing the following commands:
C:\mysql\bin\mysqlshow C:\mysql\bin\mysqlshow -u root mysql C:\mysql\bin\mysqladmin version status proc C:\mysql\bin\mysql test
If mysqld is slow to answer to connections on Win95/Win98, there is
probably a problem with your DNS. In this case, start mysqld with
--skip-name-resolve and use only localhost and IP numbers in
the MySQL grant tables. You can also avoid DNS when connecting to a
mysqld-nt MySQL server running on NT by using the
--pipe argument to specify use of named pipes. This works for most
MySQL clients.
There are two versions of the MySQL command-line tool:
mysql | Compiled on native Windows, which offers very limited text editing capabilities. |
mysqlc | Compiled with the Cygnus GNU compiler and libraries, which offers readline editing.
|
If you want to use mysqlc.exe, you must copy
`C:\mysql\lib\cygwinb19.dll' to `\windows\system' (or similar
place).
The default privileges on Windows give all local users full privileges
to all databases. To make MySQL more secure, you
should set a password for all users and remove the row in the
mysql.user table that has Host='localhost' and
User=''.
You should also add a password for the root user. (The following
example starts by removing the anonymous user, that allows anyone to access
the 'test' database.):
C:\mysql\bin\mysql mysql mysql> DELETE FROM user WHERE Host='localhost' AND User=''; mysql> QUIT C:\mysql\bin\mysqladmin reload C:\mysql\bin\mysqladmin -u root password your_password
After you've set the password, if you want to take down the mysqld
server, you can do so using this command:
mysqladmin --user=root --password=your_password shutdown
If you are using the old shareware version of MySQL Version 3.21
under Windows, the above command will fail with an error: parse error
near 'SET OPTION password'. This is because the old shareware version,
which is based on MySQL Version 3.21, doesn't have the
SET PASSWORD command. The fix is in this case to upgrade to
the Version 3.22 shareware.
With the newer MySQL versions you can easily add new users
and change privileges with GRANT and REVOKE commands.
See section 7.35 GRANT and REVOKE Syntax.
Here is a note about how to connect to get a secure connection to remote MySQL server with SSH (by David Carlson dcarlson@mplcomm.com):
SecureCRT from http://www.vandyke.com/.
Another option is f-secure from http://www.f-secure.com/. You
can also find some free ones on Google at
http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/Clients/Windows/.
Host_Name = yourmysqlserver_URL_or_IP.
Set userid=your_userid to log in to your server (probably not the same
as your MySQL login/password.
local_port: 3306, remote_host: yourmysqlservername_or_ip, remote_port: 3306 )
or a local forward (Set port: 3306, host: localhost, remote port: 3306).
localhost for the MySQL host server - not yourmysqlservername.
You should now have your ODBC connection to MySQL encrypted using SSH.
On windows MySQL Version 3.23.16 and above is compiled with the
-DUSE_SYMDIR option. This allows you to put a database on
different disk by adding a symbolic link to it (in a similar manner that
symbolic links works on Unix).
On windows you make a symbolic link to a database by creating a file that contains the path to the destination directory and saving this in the `mysql_data' directory under the filename `database.sym'. Note that the symbolic link will only be used if the directory `mysql_data_dir\database' doesn't exist.
For example, if you want to have database foo on `D:\data\foo', you
should create the file `C:\mysql\data\foo.sym' that contains the
text D:\data\foo. After this, all tables created in the database
foo will be created in `D:\data\foo'.
In your source files, you should include `windows.h' before you include
mysql.h:
#if defined(_WIN32) || defined(_WIN64) #include <windows.h> #endif #include <mysql.h>
You can either link your code with the dynamic `libmysql.lib' library, which is just a wrapper to load in `libmysql.dll' on demand, or link with the static `mysqlclient.lib' library.
Note that as the mysqlclient libraries are compiled as threaded libraries, you should also compile your code to be multi-threaded!
We will shortly do a full test on the new BDB interface on Windows. When this is done we will start to release binary distributions (for Windows and Unix) of MySQL that will include support for BDB tables.
MySQL-Windows has by now proven itself to be very stable. This version of MySQL has the same features as the corresponding Unix version with the following exceptions:
mysqld for an extended time on Win95 if
you do many connections, because each connection in MySQL creates
a new thread! WinNT and Win98 don't suffer from this bug.
pread() and pwrite() calls to be
able to mix INSERT and SELECT. Currently we use mutexes
to emulate pread()/pwrite(). We will, in the long run,
replace the file level interface with a virtual interface so that we can
use the readfile()/writefile() interface on NT to get more speed.
The current implementation will however limit the number of open files
MySQL can use to 1024, which means that you will not be able to
run as many concurrent threads on NT as on Unix.
mysqladmin kill will not work on a sleeping connection.
mysqladmin shutdown can't abort as long as there are sleeping
connections.
DROP DATABASE
mysqladmin shutdown.
LOAD
DATA INFILE or SELECT ... INTO OUTFILE, you must double the `\'
character or use Unix style filenames `/' characters:
LOAD DATA INFILE "C:\\tmp\\skr.txt" INTO TABLE skr; SELECT * INTO OUTFILE 'C:/tmp/skr.txt' FROM skr;
Can't open named pipe error
error 2017: can't open named pipe to host: . pipe...This is because the release version of MySQL uses named pipes on NT by default. You can avoid this error by using the
--host=localhost
option to the new MySQL clients or create a file `C:\my.cnf'
that contains the following information:
[client] host = localhost
Access denied for user error
Access denied for user: 'some-user@unknown'
to database 'mysql' when accessing a MySQL server on the same
machine, this means that MySQL can't resolve your host name
properly.
To fix this, you should create a file `\windows\hosts' with the
following information:
127.0.0.1 localhost
ALTER TABLE
ALTER TABLE the table is locked from usage
by other threads. This has to do with the fact that you on Windows can't
delete a file that is in use by another threads. (We may in the future
find some way to go around this problem.)
DROP TABLE on a table that is in use by a MERGE table will not work.
MERGE handler does it table mapping hidden from MySQL.
Because Windows doesn't allow one to drop files that are open, you have
to first flush all MERGE tables (with FLUSH TABLES) or drop the
MERGE table before droping the table. We will fix this at the same
time we introduce VIEWs.
Here are some open issues for anyone who might want to help us with the Windows release:
MYSQL.DLL server. This should include everything in
a standard MySQL server, except thread creation. This will make
MySQL much easier to use in applications that don't need a true
client/server and don't need to access the server from other hosts.
mysqld as a service with --install (on NT)
it would be nice if you could also add default options on the command line.
For the moment, the workaround is to update the `C:\my.cnf' file
instead.
mysqld daemon doesn't
accept new connections when the laptop is resumed. We don't know if this
is a problem with Win95, TCP/IP, or MySQL.
mysqld from the task manager.
For the moment, you must use mysqladmin shutdown.
readline to Windows for use in the mysql command line tool.
mysql,
mysqlshow, mysqladmin, and mysqldump) would be nice.
mysqladmin kill on Windows.
mysqld always starts in the "C" locale and not in the default locale.
We would like to have mysqld use the current locale for the sort order.
.DLLs.
Other Windows-specific issues are described in the `README' file that comes with the MySQL-Windows distribution.
MySQL uses quite a few open files. Because of this, you should add something like the following to your `CONFIG.SYS' file:
SET EMXOPT=-c -n -h1024
If you don't do this, you will probably run into the following error:
File 'xxxx' not found (Errcode: 24)
When using MySQL with OS/2 Warp 3, FixPack 29 or above is required. With OS/2 Warp 4, FixPack 4 or above is required. This is a requirement of the Pthreads library. MySQL must be installed in a partition that supports long filenames such as HPFS, FAT32, etc.
The `INSTALL.CMD' script must be run from OS/2's own `CMD.EXE' and may not work with replacement shells such as `4OS2.EXE'.
The `scripts/mysql-install-db' script has been renamed. It is now called `install.cmd' and is a REXX script, which will set up the default MySQL security settings and create the WorkPlace Shell icons for MySQL.
Dynamic module support is compiled in but not fully tested. Dynamic modules should be compiled using the Pthreads run-time library.
gcc -Zdll -Zmt -Zcrtdll=pthrdrtl -I../include -I../regex -I.. \
-o example udf_example.cc -L../lib -lmysqlclient udf_example.def
mv example.dll example.udf
Note: Due to limitations in OS/2, UDF module name stems must not
exceed 8 characters. Modules are stored in the `/mysql2/udf'
directory; the safe-mysqld.cmd script will put this directory in
the BEGINLIBPATH environment variable. When using UDF modules,
specified extensions are ignored -- it is assumed to be `.udf'.
For example, in Unix, the shared module might be named `example.so'
and you would load a function from it like this:
CREATE FUNCTION metaphon RETURNS STRING SONAME "example.so";
Is OS/2, the module would be named `example.udf', but you would not specify the module extension:
CREATE FUNCTION metaphon RETURNS STRING SONAME "example";
As a service, we at MySQL AB provide a set of binary distributions of MySQL that are compiled at our site or at sites where customers kindly have given us access to their machines.
These distributions are generated with scripts/make_binary_distribution
and are configured with the following compilers and options:
gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS="-O3 -felide-constructors" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex --enable-assembler
egcs 1.0.3a
CC=gcc CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
egcs 2.90.27
CC=gcc CFLAGS="-O3 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
gcc 2.8.1
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
pgcc 2.90.29 (egcs 1.0.3a)
CFLAGS="-O3 -mpentium -mstack-align-double -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -mpentium -mstack-align-double -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=complex
gcc 2.95.2
CFLAGS="-O3 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O3 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charset=complex
gcc 2.7-95q4
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc 2.7.2.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc 2.8.1
CC=gcc CFLAGS=-O CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-low-memory --with-extra-charsets=complex
gcc 2.8.0
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc 2.7.2.1
CC=gcc CXX=gcc CXXFLAGS=-O ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
gcc 2.7.2
CC=gcc CXX=gcc CXXFLAGS=-O3 ./configure --prefix=/usr/local/mysql --with-extra-charsets=complex
Anyone who has more optimal options for any of the configurations listed above can always mail them to the developer's mailing list at internals@lists.mysql.com.
RPM distributions prior to MySQL Version 3.22 are user-contributed. Beginning with Version 3.22, the RPMs are generated by us at MySQL AB.
If you want to compile a debug version of MySQL, you should add
--with-debug or --with-debug=full to the above configure lines
and remove any -fomit-frame-pointer options.
Once you've installed MySQL (from either a binary or source distribution), you need to initialize the grant tables, start the server, and make sure that the server works okay. You may also wish to arrange for the server to be started and stopped automatically when your system starts up and shuts down.
Normally you install the grant tables and start the server like this for installation from a source distribution:
shell> ./scripts/mysql_install_db shell> cd mysql_installation_directory shell> ./bin/safe_mysqld --user=mysql &
For a binary distribution, do this:
shell> cd mysql_installation_directory shell> ./bin/mysql_install_db shell> ./bin/safe_mysqld --user=mysql &
This creates the mysql database which will hold all database
privileges, the test database which you can use to test
MySQL and also privilege entries for the user that run
mysql_install_db and a root user (without any passwords).
This also starts the mysqld server.
mysql_install_db will not overwrite any old privilege tables, so
it should be safe to run in any circumstances. If you don't want to
have the test database you can remove it with mysqladmin -u
root drop test.
Testing is most easily done from the top-level directory of the MySQL distribution. For a binary distribution, this is your installation directory (typically something like `/usr/local/mysql'). For a source distribution, this is the main directory of your MySQL source tree.
In the commands shown below in this section and in the following
subsections, BINDIR is the path to the location in which programs
like mysqladmin and safe_mysqld are installed. For a
binary distribution, this is the `bin' directory within the
distribution. For a source distribution, BINDIR is probably
`/usr/local/bin', unless you specified an installation directory
other than `/usr/local' when you ran configure.
EXECDIR is the location in which the mysqld server is
installed. For a binary distribution, this is the same as
BINDIR. For a source distribution, EXECDIR is probably
`/usr/local/libexec'.
Testing is described in detail below:
mysqld server and set up the initial
MySQL grant tables containing the privileges that determine how
users are allowed to connect to the server. This is normally done with the
mysql_install_db script:
shell> scripts/mysql_install_dbTypically,
mysql_install_db needs to be run only the first time you
install MySQL. Therefore, if you are upgrading an existing
installation, you can skip this step. (However, mysql_install_db is
quite safe to use and will not update any tables that already exist, so if
you are unsure of what to do, you can always run mysql_install_db.)
mysql_install_db creates six tables (user, db,
host, tables_priv, columns_priv, and func) in the
mysql database. A description of the initial privileges is given in
section 6.13 Setting Up the Initial MySQL Privileges. Briefly, these privileges allow the MySQL
root user to do anything, and allow anybody to create or use databases
with a name of 'test' or starting with 'test_'.
If you don't set up the grant tables, the following error will appear in the
log file when you start the server:
mysqld: Can't find file: 'host.frm'The above may also happen with a binary MySQL distribution if you don't start MySQL by executing exactly
./bin/safe_mysqld!
See section 15.3 safe_mysqld, the wrapper around mysqld.
You might need to run mysql_install_db as root. However,
if you prefer, you can run the MySQL server as an unprivileged
(non-root) user, provided that user can read and write files in
the database directory. Instructions for running MySQL as an
unprivileged user are given in section 21.9 How to Run MySQL As a Normal User.
If you have problems with mysql_install_db, see
section 4.16.1 Problems Running mysql_install_db.
There are some alternatives to running the mysql_install_db
script as it is provided in the MySQL distribution:
mysql_install_db before running it, to change
the initial privileges that are installed into the grant tables. This is
useful if you want to install MySQL on a lot of machines with the
same privileges. In this case you probably should need only to add a few
extra INSERT statements to the mysql.user and mysql.db
tables!
mysql_install_db, then use mysql -u root mysql to
connect to the grant tables as the MySQL root user and issue
SQL statements to modify the grant tables directly.
mysql_install_db.
shell> cd mysql_installation_directory shell> bin/safe_mysqld &If you have problems starting the server, see section 4.16.2 Problems Starting the MySQL Server.
mysqladmin to verify that the server is running. The following
commands provide a simple test to check that the server is up and responding
to connections:
shell> BINDIR/mysqladmin version shell> BINDIR/mysqladmin variablesThe output from
mysqladmin version varies slightly depending on your
platform and version of MySQL, but should be similar to that shown
below:
shell> BINDIR/mysqladmin version mysqladmin Ver 8.14 Distrib 3.23.32, for linux on i586 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version 3.23.32-debug Protocol version 10 Connection Localhost via Unix socket TCP port 3306 UNIX socket /tmp/mysql.sock Uptime: 16 sec Threads: 1 Questions: 9 Slow queries: 0 Opens: 7 Flush tables: 2 Open tables: 0 Queries per second avg: 0.000 Memory in use: 132K Max memory used: 16773KTo get a feeling for what else you can do with
BINDIR/mysqladmin,
invoke it with the --help option.
shell> BINDIR/mysqladmin -u root shutdown
safe_mysqld or
by invoking mysqld directly. For example:
shell> BINDIR/safe_mysqld --log &If
safe_mysqld fails, try running it from the MySQL
installation directory (if you are not already there). If that doesn't work,
see section 4.16.2 Problems Starting the MySQL Server.
shell> BINDIR/mysqlshow +-----------+ | Databases | +-----------+ | mysql | +-----------+ shell> BINDIR/mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ shell> BINDIR/mysql -e "select host,db,user from db" mysql +------+--------+------+ | host | db | user | +------+--------+------+ | % | test | | | % | test_% | | +------+--------+------+There is also a benchmark suite in the `sql-bench' directory (under the MySQL installation directory) that you can use to compare how MySQL performs on different platforms. The `sql-bench/Results' directory contains the results from many runs against different databases and platforms. To run all tests, execute these commands:
shell> cd sql-bench shell> run-all-testsIf you don't have the `sql-bench' directory, you are probably using an RPM for a binary distribution. (Source distribution RPMs include the benchmark directory.) In this case, you must first install the benchmark suite before you can use it. Beginning with MySQL Version 3.22, there are benchmark RPM files named `mysql-bench-VERSION-i386.rpm' that contain benchmark code and data. If you have a source distribution, you can also run the tests in the `tests' subdirectory. For example, to run `auto_increment.tst', do this:
shell> BINDIR/mysql -vvf test < ./tests/auto_increment.tstThe expected results are shown in the `./tests/auto_increment.res' file.
mysql_install_db
The purpose of the mysql_install_db script is to generate new
MySQL privilege tables. It will not affect any other data!
It will also not do anything if you already have MySQL privilege
tables installed!
If you want to re-create your privilege tables, you should take down the mysqld server, if it's running, and then do something like:
mv mysql-data-directory/mysql mysql-data-directory/mysql-old mysql_install_db
This section lists problems you might encounter when you run
mysql_install_db:
mysql_install_db doesn't install the grant tables
mysql_install_db fails to install the grant
tables and terminates after displaying the following messages:
starting mysqld daemon with databases from XXXXXX mysql daemon endedIn this case, you should examine the log file very carefully! The log should be located in the directory `XXXXXX' named by the error message, and should indicate why
mysqld didn't start. If you don't understand
what happened, include the log when you post a bug report using
mysqlbug!
See section 2.3 How to Report Bugs or Problems.
mysqld daemon running
mysql_install_db at
all. You have to run mysql_install_db only once, when you install
MySQL the first time.
mysqld daemon doesn't work when one daemon is running
Can't start server: Bind on
TCP/IP port: Address already in use or Can't start server : Bind on
unix socket.... See section 4.17 Installing Many Servers on the Same Machine.
mysql_install_db or when
starting or using mysqld.
You can specify a different socket and temporary directory as follows:
shell> TMPDIR=/some_tmp_dir/ shell> MYSQL_UNIX_PORT=/some_tmp_dir/mysqld.sock shell> export TMPDIR MYSQL_UNIX_PORT`some_tmp_dir' should be the path to some directory for which you have write permission. See section A Environment Variables. After this you should be able to run
mysql_install_db and start
the server with these commands:
shell> scripts/mysql_install_db shell> BINDIR/safe_mysqld &
mysqld crashes immediately
glibc older than
2.0.7-5, you should make sure you have installed all glibc patches!
There is a lot of information about this in the MySQL mail
archives. Links to the mail archives are available online at
http://www.mysql.com/documentation/.
Also, see section 4.12.5 Linux Notes (All Linux Versions).
You can also start mysqld manually using the --skip-grant-tables
option and add the privilege information yourself using mysql:
shell> BINDIR/safe_mysqld --skip-grant-tables & shell> BINDIR/mysql -u root mysqlFrom
mysql, manually execute the SQL commands in
mysql_install_db. Make sure you run mysqladmin
flush-privileges or mysqladmin reload afterward to tell the server to
reload the grant tables.
Generally, you start the mysqld server in one of three ways:
mysql.server. This script is used primarily at
system startup and shutdown, and is described more fully in
section 4.16.3 Starting and Stopping MySQL Automatically.
safe_mysqld, which tries to determine the proper options
for mysqld and then runs it with those options. See section 15.3 safe_mysqld, the wrapper around mysqld.
mysqld as a service as follows:
bin\mysqld-nt --install # Install MySQL as a serviceYou can now start/stop
mysqld as follows:
NET START mysql NET STOP mysqlNote that in this case you can't use any other options for
mysqld!
You can remove the service as follows:
bin\mysqld-nt --remove # remove MySQL as a service
mysqld directly.
When the mysqld daemon starts up, it changes directory to the
data directory. This is where it expects to write log files and the pid
(process ID) file, and where it expects to find databases.
The data directory location is hardwired in when the distribution is
compiled. However, if mysqld expects to find the data directory
somewhere other than where it really is on your system, it will not work
properly. If you have problems with incorrect paths, you can find out
what options mysqld allows and what the default path settings are by
invoking mysqld with the --help option. You can override the
defaults by specifying the correct pathnames as command-line arguments to
mysqld. (These options can be used with safe_mysqld as well.)
Normally you should need to tell mysqld only the base directory under
which MySQL is installed. You can do this with the --basedir
option. You can also use --help to check the effect of changing path
options (note that --help must be the final option of the
mysqld command). For example:
shell> EXECDIR/mysqld --basedir=/usr/local --help
Once you determine the path settings you want, start the server without
the --help option.
Whichever method you use to start the server, if it fails to start up
correctly, check the log file to see if you can find out why. Log files
are located in the data directory (typically
`/usr/local/mysql/data' for a binary distribution,
`/usr/local/var' for a source distribution,
`\mysql\mysql.err' on Windows.) Look in the data directory for
files with names of the form `host_name.err' and
`host_name.log' where host_name is the name of your server
host. Then check the last few lines of these files:
shell> tail host_name.err shell> tail host_name.log
If you find something like the following in the log file:
000729 14:50:10 bdb: Recovery function for LSN 1 27595 failed 000729 14:50:10 bdb: warning: ./test/t1.db: No such file or directory 000729 14:50:10 Can't init databases
This means that you didn't start mysqld with --bdb-no-recover
and Berkeley DB found something wrong with its log files when it
tried to recover your databases. To be able to continue, you should
move away the old Berkeley DB log file from the database directory to
some other place, where you can later examine these. The log files are
named `log.0000000001', where the number will increase over time.
If you are running mysqld with BDB table support and mysqld core
dumps at start this could be because of some problems with the BDB
recover log. In this case you can try starting mysqld with
--bdb-no-recover. If this helps, then you should remove all
`log.*' files from the data directory and try starting mysqld
again.
If you get the following error, it means that some other program (or another
mysqld server) is already using the TCP/IP port or socket
mysqld is trying to use:
Can't start server: Bind on TCP/IP port: Address already in use or Can't start server : Bind on unix socket...
Use ps to make sure that you don't have another mysqld server
running. If you can't find another server running, you can try to execute
the command telnet your-host-name tcp-ip-port-number and press
RETURN a couple of times. If you don't get an error message like
telnet: Unable to connect to remote host: Connection refused,
something is using the TCP/IP port mysqld is trying to use.
See section 4.16.1 Problems Running mysql_install_db and section 22.3 Running Multiple MySQL Servers on the Same Machine.
If mysqld is currently running, you can find out what path settings
it is using by executing this command:
shell> mysqladmin variables or shell> mysqladmin -h 'your-host-name' variables
If safe_mysqld starts the server but you can't connect to it,
you should make sure you have an entry in `/etc/hosts' that looks like
this:
127.0.0.1 localhost
This problem occurs only on systems that don't have a working thread library and for which MySQL must be configured to use MIT-pthreads.
On Windows, you can try to start mysqld as follows:
C:\mysql\bin\mysqld --standalone --debug
This will not run in the background and it should also write a trace in `\mysqld.trace', which may help you determine the source of your problems. See section 4.13 Windows Notes.
If you are using BDB (Berkeley DB) tables, you should familiarize yourself with the different BDB specific startup options. See section 8.5.3 BDB startup options.
If you are using Gemini tables, refer to the Gemini-specific startup options. See section 8.6.2 GEMINI startup options.
If you are using Innodb tables, refer to the Innodb-specific startup options. See section 8.7.2 InnoDB startup options.
The mysql.server script can be used to start or stop the server
by invoking it with start or stop arguments:
shell> mysql.server start shell> mysql.server stop
mysql.server can be found in the `share/mysql' directory
under the MySQL installation directory or in the `support-files'
directory of the MySQL source tree.
Before mysql.server starts the server, it changes directory to
the MySQL installation directory, then invokes safe_mysqld.
You might need to edit mysql.server if you have a binary distribution
that you've installed in a non-standard location. Modify it to cd
into the proper directory before it runs safe_mysqld. If you want the
server to run as some specific user, you can change the
mysql_daemon_user=root line to use another user. You can also modify
mysql.server to pass other options to safe_mysqld.
mysql.server stop brings down the server by sending a signal to it.
You can take down the server manually by executing mysqladmin shutdown.
You might want to add these start and stop commands to the appropriate places
in your `/etc/rc*' files when you start using MySQL for
production applications. Note that if you modify mysql.server, then
upgrade MySQL sometime, your modified version will be overwritten,
so you should make a copy of your edited version that you can reinstall.
If your system uses `/etc/rc.local' to start external scripts, you should append the following to it:
/bin/sh -c 'cd /usr/local/mysql ; ./bin/safe_mysqld --user=mysql &'
You can also add options for mysql.server in a global
`/etc/my.cnf' file. A typical `/etc/my.cnf' file might look like
this:
[mysqld] datadir=/usr/local/mysql/var socket=/tmp/mysqld.sock port=3306 [mysql.server] user=mysql basedir=/usr/local/mysql
The mysql.server script uses the following variables:
user, datadir, basedir, bindir, and
pid-file.
The following table shows which option sections each of the startup script uses:
mysqld | mysqld and server
|
mysql.server | mysql.server, mysqld and server
|
safe_mysqld | mysql.server, mysqld and server
|
See section 4.16.5 Option Files.
mysqld accepts the following command-line options:
--ansi
-b, --basedir=path
--big-tables
--bind-address=IP
--character-sets-dir=path
--chroot=path
LOAD DATA INFILE and SELECT ... INTO OUTFILE
though.
-h, --datadir=path
--default-character-set=charset
--default-table-type=type
--debug[...]=
--with-debug, you can use this
option to get a trace file of what mysqld is doing.
See section I.3 The DBUG package..
--delay-key-write-for-all-tables
MyISAM table.
See section 13.2.3 Tuning Server Parameters.
--enable-locking
-T, --exit-info
--flush
-?, --help
--init-file=file
-L, --language=...
-l, --log[=file]
--log-isam[=file]
--log-slow-queries[=file]
long_query_time seconds to
execute to file. See section 23.5 The Slow Query Log.
--log-update[=file]
file.# where # is a unique number if not given.
See section 23.3 The Update Log.
--log-long-format
--log-slow-queries then queries that are not using indexes are logged
to the slow query log.
--low-priority-updates
INSERT/DELETE/UPDATE)
will have lower priority than selects. It can also be done via
{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ... to lower
the priority of only one query, or by
SET OPTION SQL_LOW_PRIORITY_UPDATES=1 to change the priority in one
thread. See section 13.2.9 Table Locking Issues.
--memlock
mysqld process in memory. This works only if your system
supports the mlockall() system call. This may help if you have
a problem where the operating system is causing mysqld to swap on disk.
--myisam-recover [=option[,option...]]] where option is one of DEFAULT, BACKUP, FORCE or QUICK.
mysqld will on open check if the table is
marked as crashed or if if the table wasn't closed properly. (The last
option only works if you are running with --skip-locking). If this
is the case mysqld will run check on the table. If the table was corrupted,
mysqld will attempt to repair it.
The following options affects how the repair works.
| DEFAULT | The same as not giving any option to
--myisam-recover.
|
| BACKUP | If the data table was changed during recover, save a backup of the `table_name.MYD' data file as `table_name-datetime.BAK'. |
| FORCE | Run recover even if we will loose more than one row from the .MYD file. |
| QUICK | Don't check the rows in the table if there isn't any delete blocks. |
BACKUP,FORCE. This will force a repair of a table even if some rows
would be deleted, but it will keep the old data file as a backup so that
you can later examine what happened.
--pid-file=path
safe_mysqld.
-P, --port=...
-o, --old-protocol
--one-thread
-O, --set-variable var=option
--help lists variables. You can find a full
description for all variables in the SHOW VARIABLES section in this
manual. See section 7.28.4 SHOW VARIABLES. The tuning server parameters section includes
information of how to optimize these. See section 13.2.3 Tuning Server Parameters.
--safe-mode
--skip-delay-key-write.
--safe-show-database
--secure
gethostbyname() system call are
checked to make sure they resolve back to the original hostname. This
makes it harder for someone on the outside to get access by pretending
to be another host. This option also adds some sanity checks of
hostnames. The option is turned off by default in MySQL Version 3.21
because sometimes it takes a long time to perform backward resolutions.
MySQL Version 3.22 caches hostnames (unless --skip-host-cache
is used) and has this option enabled by default.
--skip-concurrent-insert
MyISAM
tables. (This is only to be used if you think you have found a bug in this
feature).
--skip-delay-key-write
delay_key_write option for all tables.
See section 13.2.3 Tuning Server Parameters.
-Sg, --skip-grant-tables
mysqladmin
flush-privileges or mysqladmin reload.)
--skip-locking
isamchk or myisamchk you must
shut down the server. See section 1.7 How Stable Is MySQL?. Note that in MySQL Version
3.23 you can use REPAIR and CHECK to repair/check MyISAM
tables.
--skip-name-resolve
Host column values in the grant tables
must be IP numbers or localhost. See section 13.2.10 How MySQL uses DNS.
--skip-networking
mysqld must be made via Unix sockets. This option is highly
recommended for systems where only local requests are allowed. See section 13.2.10 How MySQL uses DNS.
--skip-host-cache
--skip-new
--skip-delay-key-write.
This will also set default table type to ISAM. See section 8.3 ISAM Tables.
--skip-safemalloc
--with-debug=full, all programs
will check the memory for overruns for every memory allocation and memory
freeing. As this checking is very slow, you can avoid this, when you don't
need memory checking, by using this option.
--skip-show-database
--skip-thread-priority
--socket=path
/tmp/mysql.sock.
transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE }
SET TRANSACTION Syntax.
-t, --tmpdir=path
/tmp
directory resides on a partition too small to hold temporary tables.
-u, --user=user_name
mysqld daemon as user user_name. This option is
mandatory when starting mysqld as root.
-V, --version
MySQL can, since Version 3.22, read default startup options for the server and for clients from option files.
MySQL reads default options from the following files on Unix:
| Filename | Purpose |
/etc/my.cnf | Global options |
DATADIR/my.cnf | Server-specific options |
defaults-extra-file | The file specified with --defaults-extra-file=# |
~/.my.cnf | User-specific options |
DATADIR is the MySQL data directory (typically
`/usr/local/mysql/data' for a binary installation or
`/usr/local/var' for a source installation). Note that this is the
directory that was specified at configuration time, not the one specified
with --datadir when mysqld starts up! (--datadir has no
effect on where the server looks for option files, because it looks for them
before it processes any command-line arguments.)
MySQL reads default options from the following files on Windows:
| Filename | Purpose |
windows-system-directory\my.ini | Global options |
C:\my.cnf | Global options |
C:\mysql\data\my.cnf | Server-specific options |
Note that on Windows, you should specify all paths with / instead of
\. If you use \, you need to specify this twice, as
\ is the escape character in MySQL.
MySQL tries to read option files in the order listed above. If multiple option files exist, an option specified in a file read later takes precedence over the same option specified in a file read earlier. Options specified on the command line take precedence over options specified in any option file. Some options can be specified using environment variables. Options specified on the command line or in option files take precedence over environment variable values. See section A Environment Variables.
The following programs support option files: mysql,
mysqladmin, mysqld, mysqldump, mysqlimport,
mysql.server, myisamchk, and myisampack.
You can use option files to specify any long option that a program supports!
Run the program with --help to get a list of available options.
An option file can contain lines of the following forms:
#comment
[group]
group is the name of the program or group for which you want to set
options. After a group line, any option or set-variable lines
apply to the named group until the end of the option file or another group
line is given.
option
--option on the command line.
option=value
--option=value on the command line.
set-variable = variable=value
--set-variable variable=value on the command line.
This syntax must be used to set a mysqld variable.
The client group allows you to specify options that apply to all
MySQL clients (not mysqld). This is the perfect group to use
to specify the password you use to connect to the server. (But make
sure the option file is readable and writable only by yourself.)
Note that for options and values, all leading and trailing blanks are automatically deleted. You may use the escape sequences `\b', `\t', `\n', `\r', `\\', and `\s' in your value string (`\s' == blank).
Here is a typical global option file:
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick
Here is typical user option file:
[client] # The following password will be sent to all standard MySQL clients password=my_password [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysql-hot-copy] interactive-timeout
If you have a source distribution, you will find sample configuration
files named `my-xxxx.cnf' in the `support-files' directory.
If you have a binary distribution, look in the `DIR/share/mysql'
directory, where DIR is the pathname to the MySQL
installation directory (typically `/usr/local/mysql'). Currently
there are sample configuration files for small, medium, large, and very
large systems. You can copy `my-xxxx.cnf' to your home directory
(rename the copy to `.my.cnf') to experiment with this.
All MySQL clients that support option files support the following options:
| --no-defaults | Don't read any option files. |
| --print-defaults | Print the program name and all options that it will get. |
| --defaults-file=full-path-to-default-file | Only use the given configuration file. |
| --defaults-extra-file=full-path-to-default-file | Read this configuration file after the global configuration file but before the user configuration file. |
Note that the above options must be first on the command line to work!
--print-defaults may however be used directly after the
--defaults-xxx-file commands.
Note for developers: Option file handling is implemented simply by processing all matching options (that is, options in the appropriate group) before any command-line arguments. This works nicely for programs that use the last instance of an option that is specified multiple times. If you have an old program that handles multiply-specified options this way but doesn't read option files, you need add only two lines to give it that capability. Check the source code of any of the standard MySQL clients to see how to do this.
In shell scripts you can use the `my_print_defaults' command to parse the config files:
shell> my_print_defaults client mysql --port=3306 --socket=/tmp/mysql.sock --no-auto-rehash
The above output contains all options for the groups 'client' and 'mysql'.
In some cases you may want to have many different mysqld daemons
(servers) running on the same machine. You may for example want to run
a new version of MySQL for testing together with an old version
that is in production. Another case is when you want to give different
users access to different mysqld servers that they manage themselves.
One way to get a new server running is by starting it with a different socket and port as follows:
shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock shell> MYSQL_TCP_PORT=3307 shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT shell> scripts/mysql_install_db shell> bin/safe_mysqld &
The environment variables appendix includes a list of other environment
variables you can use to affect mysqld. See section A Environment Variables.
The above is the quick and dirty way that one commonly uses for testing. The nice thing with this is that all connections you do in the above shell will automatically be directed to the new running server!
If you need to do this more permanently, you should create an own option file for each server. See section 4.16.5 Option Files. In your startup script that is executed at boot time (mysql.server?) you should specify for both servers:
safe_mysqld --default-file=path-to-option-file
At least the following options should be different per server:
port=#
socket=path
pid-file=path
The following options should be different, if they are used:
log=path
log-bin=path
log-update=path
log-isam=path
bdb-logdir=path
If you want more performance, you can also specify the following differently:
tmpdir=path
bdb-tmpdir=path
See section 4.16.4 mysqld Command-line Options.
If you are installing binary MySQL versions (.tar files) and
start them with ./bin/safe_mysqld then in most cases the only
option you need to add/change is the socket and port
argument to safe_mysqld.
You can always move the MySQL form and data files between
different versions on the same architecture as long as you have the same
base version of MySQL. The current base version is
3. If you change the character set when running MySQL (which may
also change the sort order), you must run myisamchk -r -q on all
tables. Otherwise your indexes may not be ordered correctly.
If you are afraid of new versions, you can always rename your old
mysqld to something like mysqld-'old-version-number'. If
your new mysqld then does something unexpected, you can simply shut it
down and restart with your old mysqld!
When you do an upgrade you should also back up your old databases, of course.
If after an upgrade, you experience problems with recompiled client programs,
like Commands out of sync or unexpected core dumps, you probably have
used an old header or library file when compiling your programs. In this
case you should check the date for your `mysql.h' file and
`libmysqlclient.a' library to verify that they are from the new
MySQL distribution. If not, please recompile your programs!
If you get some problems that the new mysqld server doesn't want to
start or that you can't connect without a password, check that you don't
have some old `my.cnf' file from your old installation! You can
check this with: program-name --print-defaults. If this outputs
anything other than the program name, you have an active my.cnf
file that will affect things!
It is a good idea to rebuild and reinstall the Msql-Mysql-modules
distribution whenever you install a new release of MySQL,
particularly if you notice symptoms such as all your DBI scripts
dumping core after you upgrade MySQL.
MySQL Version 3.23 supports tables of the new MyISAM type and
the old ISAM type. You don't have to convert your old tables to
use these with Version 3.23. By default, all new tables will be created with
type MyISAM (unless you start mysqld with the
--default-table-type=isam option). You can change an ISAM
table to a MyISAM table with ALTER TABLE or the Perl script
mysql_convert_table_format.
Version 3.22 and 3.21 clients will work without any problems with a Version 3.23 server.
The following lists tell what you have to watch out for when upgrading to Version 3.23:
tis620 character set must be fixed
with myisamchk -r or REPAIR TABLE.
DROP DATABASE on a symbolic linked database, both the
link and the original database is deleted. (This didn't happen in 3.22
because configure didn't detect the readlink system call).
OPTIMIZE TABLE now only works for MyISAM tables.
For other table types, you can use ALTER TABLE to optimize the table.
During OPTIMIZE TABLE the table is now locked from other threads.
mysql is now by default started with the
option --no-named-commands (-g). This option can be disabled with
--enable-named-commands (-G). This may cause incompatibility problems in
some cases, for example in SQL scripts that use named commands without a
semicolon! Long format commands still work from the first line.
german character sort order, you must repair
all your tables with isamchk -r, as we have made some changes in
the sort order!
IF will now depend on both arguments
and not only the first argument.
AUTO_INCREMENT will not work with negative numbers. The reason
for this is that negative numbers caused problems when wrapping from -1 to 0.
AUTO_INCREMENT is now for MyISAM tables handled at a lower level and
is much faster than before. For MyISAM tables old numbers are also not reused
anymore, even if you delete some rows from the table.
CASE, DELAYED, ELSE, END, FULLTEXT, INNER, RIGHT, THEN and WHEN are now reserved words.
FLOAT(X) is now a true floating-point type and not a value with
a fixed number of decimals.
DECIMAL(length,dec) the length argument no
longer includes a place for the sign or the decimal point.
TIME string must now be of one of the following formats:
[[[DAYS] [H]H:]MM:]SS[.fraction] or
[[[[[H]H]H]H]MM]SS[.fraction]
LIKE now compares strings using the same character
comparison rules as '='. If you require the old behavior, you
can compile MySQL with the CXXFLAGS=-DLIKE_CMP_TOUPPER
flag.
REGEXP is now case insensitive for normal (not binary) strings.
CHECK TABLE
or myisamchk for MyISAM tables (.MYI) and
isamchk for ISAM (.ISM) tables.
mysqldump files to be compatible between
MySQL Version 3.22 and Version 3.23, you should not use the
--opt or --full option to mysqldump.
DATE_FORMAT() to make sure there is a
`%' before each format character. (Later MySQL Version 3.22
did allow this syntax.)
mysql_fetch_fields_direct is now a function (it was a macro) and
it returns a pointer to a MYSQL_FIELD instead of a
MYSQL_FIELD.
mysql_num_fields() can no longer be used on a MYSQL* object (it's
now a function that takes MYSQL_RES* as an argument. You should now
use mysql_field_count() instead.
SELECT DISTINCT ... was
almost always sorted. In Version 3.23, you must use GROUP BY or
ORDER BY to obtain sorted output.
SUM() now returns NULL, instead of 0, if there is no matching
rows. This is according to ANSI SQL.
AND or OR with NULL values will now return
NULL instead of 0. This mostly affects queries that use NOT
on an AND/OR expression as NOT NULL = NULL.
LPAD() and RPAD() will shorten the result string if it's longer
than the length argument.
Nothing that affects compatibility has changed between Version 3.21 and 3.22.
The only pitfall is that new tables that are created with DATE type
columns will use the new way to store the date. You can't access these new
fields from an old version of mysqld.
After installing MySQL Version 3.22, you should start the new server
and then run the mysql_fix_privilege_tables script. This will add the
new privileges that you need to use the GRANT command. If you forget
this, you will get Access denied when you try to use ALTER
TABLE, CREATE INDEX, or DROP INDEX. If your MySQL root
user requires a password, you should give this as an argument to
mysql_fix_privilege_tables.
The C API interface to mysql_real_connect() has changed. If you have
an old client program that calls this function, you must place a 0 for
the new db argument (or recode the client to send the db
element for faster connections). You must also call mysql_init()
before calling mysql_real_connect()! This change was done to allow
the new mysql_options() function to save options in the MYSQL
handler structure.
The mysqld variable key_buffer has changed names to
key_buffer_size, but you can still use the old name in your
startup files.
If you are running a version older than Version 3.20.28 and want to switch to Version 3.21, you need to do the following:
You can start the mysqld Version 3.21 server with safe_mysqld
--old-protocol to use it with clients from a Version 3.20 distribution.
In this case, the new client function mysql_errno() will not
return any server error, only CR_UNKNOWN_ERROR (but it
works for client errors), and the server uses the old password()
checking rather than the new one.
If you are NOT using the --old-protocol option to
mysqld, you will need to make the following changes:
scripts/add_long_password must be run to convert the
Password field in the mysql.user table to CHAR(16).
mysql.user table (to get 62-bit
rather than 31-bit passwords).
MySQL Version 3.20.28 and above can handle the new user table
format without affecting clients. If you have a MySQL version earlier
than Version 3.20.28, passwords will no longer work with it if you convert the
user table. So to be safe, you should first upgrade to at least Version
3.20.28 and then upgrade to Version 3.21.
The new client code works with a 3.20.x mysqld server, so
if you experience problems with 3.21.x, you can use the old 3.20.x server
without having to recompile the clients again.
If you are not using the --old-protocol option to mysqld,
old clients will issue the error message:
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
The new Perl DBI/DBD interface also supports the old
mysqlperl interface. The only change you have to make if you use
mysqlperl is to change the arguments to the connect() function.
The new arguments are: host, database, user,
password (the user and password arguments have changed
places).
See section 24.2.2 The DBI Interface.
The following changes may affect queries in old applications:
HAVING must now be specified before any ORDER BY clause.
LOCATE() have been swapped.
DATE,
TIME, and TIMESTAMP.
If you are using MySQL Version 3.23, you can copy the .frm,
.MYI, and .MYD files between different architectures that
support the same floating-point format. (MySQL takes care of any
byte swapping issues.)
The MySQL ISAM data and index files (`.ISD' and
`*.ISM', respectively) are architecture-dependent and in some cases
OS-dependent. If you want to move your applications to another machine
that has a different architecture or OS than your current machine, you
should not try to move a database by simply copying the files to the
other machine. Use mysqldump instead.
By default, mysqldump will create a file full of SQL statements.
You can then transfer the file to the other machine and feed it as input
to the mysql client.
Try mysqldump --help to see what options are available.
If you are moving the data to a newer version of MySQL, you should use
mysqldump --opt with the newer version to get a fast, compact dump.
The easiest (although not the fastest) way to move a database between two machines is to run the following commands on the machine on which the database is located:
shell> mysqladmin -h 'other hostname' create db_name
shell> mysqldump --opt db_name \
| mysql -h 'other hostname' db_name
If you want to copy a database from a remote machine over a slow network, you can use:
shell> mysqladmin create db_name
shell> mysqldump -h 'other hostname' --opt --compress db_name \
| mysql db_name
You can also store the result in a file, then transfer the file to the target machine and load the file into the database there. For example, you can dump a database to a file on the source machine like this:
shell> mysqldump --quick db_name | gzip > db_name.contents.gz
(The file created in this example is compressed.) Transfer the file containing the database contents to the target machine and run these commands there:
shell> mysqladmin create db_name shell> gunzip < db_name.contents.gz | mysql db_name
You can also use mysqldump and mysqlimport to accomplish
the database transfer.
For big tables, this is much faster than simply using mysqldump.
In the commands shown below, DUMPDIR represents the full pathname
of the directory you use to store the output from mysqldump.
First, create the directory for the output files and dump the database:
shell> mkdir DUMPDIR shell> mysqldump --tab=DUMPDIR db_name
Then transfer the files in the DUMPDIR directory to some corresponding
directory on the target machine and load the files into MySQL
there:
shell> mysqladmin create db_name # create database shell> cat DUMPDIR/*.sql | mysql db_name # create tables in database shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables
Also, don't forget to copy the mysql database, because that's where the
grant tables (user, db, host) are stored. You may have
to run commands as the MySQL root user on the new machine
until you have the mysql database in place.
After you import the mysql database on the new machine, execute
mysqladmin flush-privileges so that the server reloads the grant table
information.
This chapter describes how MySQL relates to the ANSI SQL standards. MySQL has many extensions to the ANSI SQL standards, and here you will find out what they are, and how to use them. You will also find information about functionality missing from MySQL, and how to work around some differences.
MySQL includes some extensions that you probably will not find in
other SQL databases. Be warned that if you use them, your code will not be
portable to other SQL servers. In some cases, you can write code that
includes MySQL extensions, but is still portable, by using comments
of the form /*! ... */. In this case, MySQL will parse and
execute the code within the comment as it would any other MySQL
statement, but other SQL servers will ignore the extensions. For example:
SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...
If you add a version number after the '!', the syntax will only be
executed if the MySQL version is equal to or newer than the used
version number:
CREATE /*!32302 TEMPORARY */ TABLE (a int);
The above means that if you have Version 3.23.02 or newer, then MySQL
will use the TEMPORARY keyword.
MySQL extensions are listed below:
MEDIUMINT, SET, ENUM, and the
different BLOB and TEXT types.
AUTO_INCREMENT, BINARY, NULL,
UNSIGNED, and ZEROFILL.
BINARY attribute or use the BINARY cast, which causes
comparisons to be done according to the ASCII order used on the
MySQL server host.
db_name.tbl_name syntax. Some SQL servers provide
the same functionality but call this User space.
MySQL doesn't support tablespaces as in:
create table ralph.my_table...IN my_tablespace.
LIKE is allowed on numeric columns.
INTO OUTFILE and STRAIGHT_JOIN in a SELECT
statement. See section 7.19 SELECT Syntax.
SQL_SMALL_RESULT option in a SELECT statement.
EXPLAIN SELECT to get a description on how tables are joined.
INDEX or KEY in a CREATE TABLE
statement. See section 7.7 CREATE TABLE Syntax.
TEMPORARY or IF NOT EXISTS with CREATE TABLE.
COUNT(DISTINCT list) where 'list' is more than one element.
CHANGE col_name, DROP col_name, or DROP
INDEX, IGNORE or RENAME in an ALTER TABLE
statement. See section 7.8 ALTER TABLE Syntax.
RENAME TABLE. See section 7.9 RENAME TABLE Syntax.
ADD, ALTER, DROP, or CHANGE
clauses in an ALTER TABLE statement.
DROP TABLE with the keywords IF EXISTS.
DROP TABLE statement.
LIMIT clause of the DELETE statement.
DELAYED clause of the INSERT and REPLACE
statements.
LOW_PRIORITY clause of the INSERT, REPLACE,
DELETE, and UPDATE statements.
LOAD DATA INFILE. In many cases, this syntax is compatible with
Oracle's LOAD DATA INFILE. See section 7.23 LOAD DATA INFILE Syntax.
ANALYZE TABLE, CHECK TABLE, OPTIMIZE TABLE, and
REPAIR TABLE statements.
SHOW statement.
See section 7.28 SHOW Syntax.
SET OPTION statement. See section 7.33 SET Syntax.
GROUP BY part.
This gives better performance for some very specific, but quite normal
queries.
See section 7.4.13 Functions for Use with GROUP BY Clauses.
ASC and DESC with GROUP BY.
|| and && operators to mean
logical OR and AND, as in the C programming language. In MySQL,
|| and OR are synonyms, as are && and AND.
Because of this nice syntax, MySQL doesn't support
the ANSI SQL || operator for string concatenation; use
CONCAT() instead. Because CONCAT() takes any number
of arguments, it's easy to convert use of the || operator to
MySQL.
CREATE DATABASE or DROP DATABASE.
See section 7.5 CREATE DATABASE Syntax.
% operator is a synonym for MOD(). That is,
N % M is equivalent to MOD(N,M). % is supported
for C programmers and for compatibility with PostgreSQL.
=, <>, <= ,<, >=,>,
<<, >>, <=>, AND, OR, or LIKE
operators may be used in column comparisons to the left of the
FROM in SELECT statements. For example:
mysql> SELECT col1=1 AND col2=2 FROM tbl_name;
LAST_INSERT_ID() function.
See section 24.1.3.126 mysql_insert_id().
REGEXP and NOT REGEXP extended regular expression
operators.
CONCAT() or CHAR() with one argument or more than two
arguments. (In MySQL, these functions can take any number of
arguments.)
BIT_COUNT(), CASE, ELT(),
FROM_DAYS(), FORMAT(), IF(), PASSWORD(),
ENCRYPT(), md5(), ENCODE(), DECODE(),
PERIOD_ADD(), PERIOD_DIFF(), TO_DAYS(), or
WEEKDAY() functions.
TRIM() to trim substrings. ANSI SQL only supports removal
of single characters.
GROUP BY functions STD(), BIT_OR(), and
BIT_AND().
REPLACE instead of DELETE + INSERT.
See section 7.22 REPLACE Syntax.
FLUSH flush_option statement.
:=:
SELECT @a:=SUM(total),@b=COUNT(*),@a/@b AS avg FROM test_table; SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
If you start mysqld with the --ansi option, the following behavior
of MySQL changes:
|| is string concatenation instead of OR.
REAL will be a synonym for FLOAT instead of a synonym of
DOUBLE.
SERIALIZABLE.
See section 7.34 SET TRANSACTION Syntax.
We try to make MySQL follow the ANSI SQL standard and the ODBC SQL standard, but in some cases MySQL does some things differently:
-- is only a comment if followed by a white space. See section 5.4.7 `--' as the Start of a Comment.
VARCHAR columns, trailing spaces are removed when the value is
stored. See section G Known errors and design deficiencies in MySQL.
CHAR columns are silently changed to VARCHAR
columns. See section 7.7.1 Silent Column Specification Changes.
REVOKE to revoke privileges for
a table. See section 7.35 GRANT and REVOKE Syntax.
NULL AND FALSE will evaluate to NULL and not to FALSE.
This is because we don't think it's good to have to evaluate a lot of
extra conditions in this case.
The following functionality is missing in the current version of MySQL. For a prioritized list indicating when new extensions may be added to MySQL, you should consult the online MySQL TODO list. That is the latest version of the TODO list in this manual. See section H MySQL and the future (The TODO).
The following will not yet work in MySQL:
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2); SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2); SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.id);
However, in many cases you can rewrite the query without a sub-select:
SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id; SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id where table2.id IS NULL
For more complicated subqueries you can often create temporary tables
to hold the subquery. In some cases, however this option will not
work. The most frequently encountered of these cases arises with
DELETE statements, for which standard SQL does not support joins
(except in sub-selects). For this situation there are two options
available until subqueries are supported by MySQL.
The first option is to use a procedural programming language (such as
Perl or PHP) to submit a SELECT query to obtain the primary keys
for the records to be deleted, and then use these values to construct
the DELETE statement (DELETE FROM ... WHERE ... IN (key1,
key2, ...)).
The second option is to use interactive SQL to contruct a set of
DELETE statements automatically, using the MySQL
extension CONCAT() (in lieu of the standard || operator).
For example:
SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', tab1.pkid, ';')
FROM tab1, tab2
WHERE tab1.col1 = tab2.col2;
You can place this query in a script file and redirect input from it to
the mysql command-line interpreter, piping its output back to a
second instance of the interpreter:
prompt> mysql --skip-column-names mydb < myscript.sql | mysql mydb
MySQL only supports INSERT ... SELECT ... and
REPLACE ... SELECT ... Independent sub-selects will probably
be available in Version 4.0. You can now use the function IN() in
other contexts, however.
SELECT INTO TABLE
MySQL doesn't yet support the Oracle SQL extension:
SELECT ... INTO TABLE .... MySQL supports instead the
ANSI SQL syntax INSERT INTO ... SELECT ..., which is basically
the same thing. See section 7.21.1 INSERT ... SELECT Syntax.
INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;
Alternatively, you can use SELECT INTO OUTFILE... or CREATE
TABLE ... SELECT to solve your problem.
As MySQL does nowadays support transactions, the following
discussion is only valid if you are only using the non-transaction-safe
table types. See section 7.31 BEGIN/COMMIT/ROLLBACK Syntax.
The question is often asked, by the curious and the critical, ``Why is MySQL not a transactional database?'' or ``Why does MySQL not support transactions?''
MySQL has made a conscious decision to support another paradigm for data integrity, ``atomic operations.'' It is our thinking and experience that atomic operations offer equal or even better integrity with much better performance. We, nonetheless, appreciate and understand the transactional database paradigm and plan, within the next few releases, to introduce transaction-safe tables on a per table basis. We will be giving our users the possibility to decide if they need the speed of atomic operations or if they need to use transactional features in their applications.
How does one use the features of MySQL to maintain rigorous integrity and how do these features compare with the transactional paradigm?
First, in the transactional paradigm, if your applications are written in a way that is dependent on the calling of ``rollback'' instead of ``commit'' in critical situations, then transactions are more convenient. Moreover, transactions ensure that unfinished updates or corrupting activities are not committed to the database; the server is given the opportunity to do an automatic rollback and your database is saved.
MySQL, in almost all cases, allows you to solve for potential problems by including simple checks before updates and by running simple scripts that check the databases for inconsistencies and automatically repair or warn if such occurs. Note that just by using the MySQL log or even adding one extra log, one can normally fix tables perfectly with no data integrity loss.
Moreover, fatal transactional updates can be rewritten to be
atomic. In fact,we will go so far as to say that all integrity problems
that transactions solve can be done with LOCK TABLES or atomic updates,
ensuring that you never will get an automatic abort from the database,
which is a common problem with transactional databases.
Not even transactions can prevent all loss if the server goes down. In such cases even a transactional system can lose data. The difference between different systems lies in just how small the time-lap is where they could lose data. No system is 100% secure, only ``secure enough.'' Even Oracle, reputed to be the safest of transactional databases, is reported to sometimes lose data in such situations.
To be safe with MySQL, you only need to have backups and have the update logging turned on. With this you can recover from any situation that you could with any transactional database. It is, of course, always good to have backups, independent of which database you use.
The transactional paradigm has its benefits and its drawbacks. Many users and application developers depend on the ease with which they can code around problems where an abort appears to be, or is necessary, and they may have to do a little more work with MySQL to either think differently or write more. If you are new to the atomic operations paradigm, or more familiar or more comfortable with transactions, do not jump to the conclusion that MySQL has not addressed these issues. Reliability and integrity are foremost in our minds. Recent estimates indicate that there are more than 1,000,000 mysqld servers currently running, many of which are in production environments. We hear very, very seldom from our users that they have lost any data, and in almost all of those cases user error is involved. This is, in our opinion, the best proof of MySQL's stability and reliability.
Lastly, in situations where integrity is of highest importance,
MySQL's current features allow for transaction-level or better
reliability and integrity. If you lock tables with LOCK TABLES, all
updates will stall until any integrity checks are made. If you only obtain
a read lock (as opposed to a write lock), then reads and inserts are
still allowed to happen. The new inserted records will not be seen by
any of the clients that have a READ lock until they release their read
locks. With INSERT DELAYED you can queue inserts into a local queue,
until the locks are released, without having the client wait for the insert
to complete. See section 7.21.2 INSERT DELAYED syntax.
``Atomic,'' in the sense that we mean it, is nothing magical. It only means
that you can be sure that while each specific update is running, no other
user can interfere with it, and there will never be an automatic
rollback (which can happen on transaction based systems if you are not
very careful). MySQL also guarantees that there will not be
any dirty reads. You can find some example of how to write atomic updates
in the commit-rollback section. See section 5.6 How to Cope Without COMMIT/ROLLBACK.
We have thought quite a bit about integrity and performance, and we believe that our atomic operations paradigm allows for both high reliability and extremely high performance, on the order of three to five times the speed of the fastest and most optimally tuned of transactional databases. We didn't leave out transactions because they are hard to do. The main reason we went with atomic operations as opposed to transactions is that by doing this we could apply many speed optimizations that would not otherwise have been possible.
Many of our users who have speed foremost in their minds are not at all
concerned about transactions. For them transactions are not an
issue. For those of our users who are concerned with or have wondered
about transactions vis-a-vis MySQL, there is a ``MySQL
way'' as we have outlined above. For those where safety is more
important than speed, we recommend them to use the BDB,
GEMINI or InnoDB tables for all their critical
data. See section 8 MySQL Table Types.
One final note: We are currently working on a safe replication schema that we believe to be better than any commercial replication system we know of. This system will work most reliably under the atomic operations, non-transactional, paradigm. Stay tuned.
A stored procedure is a set of SQL commands that can be compiled and stored in the server. Once this has been done, clients don't need to keep reissuing the entire query but can refer to the stored procedure. This provides better performance because the query has to be parsed only once, and less information needs to be sent between the server and the client. You can also raise the conceptual level by having libraries of functions in the server.
A trigger is a stored procedure that is invoked when a particular event occurs. For example, you can install a stored procedure that is triggered each time a record is deleted from a transaction table and that automatically deletes the corresponding customer from a customer table when all his transactions are deleted.
The planned update language will be able to handle stored procedures, but without triggers. Triggers usually slow down everything, even queries for which they are not needed.
To see when MySQL might get stored procedures, see section H MySQL and the future (The TODO).
Note that foreign keys in SQL are not used to join tables, but are used
mostly for checking referential integrity (foreign key constraints). If
you want to get results from multiple tables from a SELECT
statement, you do this by joining tables:
SELECT * from table1,table2 where table1.id = table2.id;
See section 7.20 JOIN Syntax. See section 9.5.6 Using Foreign Keys.
The FOREIGN KEY syntax in MySQL exists only for compatibility
with other SQL vendors' CREATE TABLE commands; it doesn't do
anything. The FOREIGN KEY syntax without ON DELETE ... is
mostly used for documentation purposes. Some ODBC applications may use this
to produce automatic WHERE clauses, but this is usually easy to
override. FOREIGN KEY is sometimes used as a constraint check, but
this check is unnecessary in practice if rows are inserted into the tables in
the right order. MySQL only supports these clauses because some
applications require them to exist (regardless of whether or not they
work).
In MySQL, you can work around the problem of ON DELETE
... not being implemented by adding the appropriate DELETE statement to
an application when you delete records from a table that has a foreign key.
In practice this is as quick (in some cases quicker) and much more portable
than using foreign keys.
In the near future we will extend the FOREIGN KEY implementation so
that at least the information will be saved in the table specification file
and may be retrieved by mysqldump and ODBC. At a later stage we will
implement the foreign key constraints for application that can't easily be
coded to avoid them.
There are so many problems with foreign key constraints that we don't know where to start:
INSERT and UPDATE
statements, and in this case almost all FOREIGN KEY constraint
checks are useless because you usually insert records in the right
tables in the right order, anyway.
FOREIGN KEY ... ON DELETE rules when
one codes an application. It's not unusual that one loses a lot of
important information just because a wrong or misused ON DELETE rule.
The only nice aspect of FOREIGN KEY is that it gives ODBC and some
other client programs the ability to see how a table is connected and to use
this to show connection diagrams and to help in building applications.
MySQL will soon store FOREIGN KEY definitions so that a
client can ask for and receive an answer about how the original
connection was made. The current `.frm' file format does not have
any place for it. At a later stage we will implement the foreign key
constraints for application that can't easily be coded to avoid them.
MySQL doesn't yet support views, but we plan to implement these to about 4.1.
Views are mostly useful for letting users access a set of relations as one table (in read-only mode). Many SQL databases don't allow one to update any rows in a view, but you have to do the updates in the separate tables.
As MySQL is mostly used in applications and on web system where the application writer has full control on the database usage, most of our users haven't regarded views to be very important. (At least no one has been interested enough in this to be prepared to finance the implementation of views).
One doesn't need views in MySQL to restrict access to columns as MySQL has a very sophisticated privilege system. See section 6 The MySQL Access Privilege System.
Some other SQL databases use `--' to start comments. MySQL
has `#' as the start comment character, even if the mysql
command-line tool removes all lines that start with `--'.
You can also use the C comment style /* this is a comment */ with
MySQL.
See section 7.38 Comment Syntax.
MySQL Version 3.23.3 and above supports the `--' comment style
only if the comment is followed by a space. This is because this
degenerate comment style has caused many problems with automatically
generated SQL queries that have used something like the following code,
where we automatically insert the value of the payment for
!payment!:
UPDATE tbl_name SET credit=credit-!payment!
What do you think will happen when the value of payment is negative?
Because 1--1 is legal in SQL, we think it is terrible that
`--' means start comment.
In MySQL Version 3.23 you can, however, use:
1-- This is a comment
The following discussion only concerns you if you are running a MySQL version earlier than Version 3.23:
If you have a SQL program in a text file that contains `--' comments you should use:
shell> replace " --" " #" < text-file-with-funny-comments.sql \
| mysql database
instead of the usual:
shell> mysql database < text-file-with-funny-comments.sql
You can also edit the command file ``in place'' to change the `--' comments to `#' comments:
shell> replace " --" " #" -- text-file-with-funny-comments.sql
Change them back with this command:
shell> replace " #" " --" -- text-file-with-funny-comments.sql
Entry level SQL92. ODBC levels 0-2.
COMMIT/ROLLBACK
The following mostly applies only for ISAM, MyISAM, and
HEAP tables. If you only use transaction-safe tables (BDB,
GEMINI or InnoDB tables) in an an update, you can do
COMMIT and ROLLBACK also with MySQL.
See section 7.31 BEGIN/COMMIT/ROLLBACK Syntax.
The problem with handling COMMIT-ROLLBACK efficiently with
the above table types would require a completely different table layout
than MySQL uses today. The table type would also need extra
threads that do automatic cleanups on the tables, and the disk usage
would be much higher. This would make these table types about 2-4 times
slower than they are today.
For the moment, we prefer implementing the SQL server language (something
like stored procedures). With this you would very seldom really need
COMMIT-ROLLBACK. This would also give much better performance.
Loops that need transactions normally can be coded with the help of
LOCK TABLES, and you don't need cursors when you can update records
on the fly.
We at TcX had a greater need for a real fast database than a 100% general database. Whenever we find a way to implement these features without any speed loss, we will probably do it. For the moment, there are many more important things to do. Check the TODO for how we prioritize things at the moment. (Customers with higher levels of support can alter this, so things may be reprioritized.)
The current problem is actually ROLLBACK. Without
ROLLBACK, you can do any kind of COMMIT action with
LOCK TABLES. To support ROLLBACK with the above table
types, MySQL would have to be changed to store all old records
that were updated and revert everything back to the starting point if
ROLLBACK was issued. For simple cases, this isn't that hard to do
(the current isamlog could be used for this purpose), but it
would be much more difficult to implement ROLLBACK for
ALTER/DROP/CREATE TABLE.
To avoid using ROLLBACK, you can use the following strategy:
LOCK TABLES ... to lock all the tables you want to access.
UNLOCK TABLES to release your locks.
This is usually a much faster method than using transactions with possible
ROLLBACKs, although not always. The only situation this solution
doesn't handle is when someone kills the threads in the middle of an
update. In this case, all locks will be released but some of the updates may
not have been executed.
You can also use functions to update records in a single operation. You can get a very efficient application by using the following techniques:
For example, when we are doing updates to some customer information, we
update only the customer data that has changed and test only that none of
the changed data, or data that depend on the changed data, has changed
compared to the original row. The test for changed data is done with the
WHERE clause in the UPDATE statement. If the record wasn't
updated, we give the client a message: "Some of the data you have changed
have been changed by another user". Then we show the old row versus the new
row in a window, so the user can decide which version of the customer record
he should use.
This gives us something that is similar to column locking but is actually
even better, because we only update some of the columns, using values that
are relative to their current values. This means that typical UPDATE
statements look something like these:
UPDATE tablename SET pay_back=pay_back+'relative change';
UPDATE customer
SET
customer_date='current_date',
address='new address',
phone='new phone',
money_he_owes_us=money_he_owes_us+'new_money'
WHERE
customer_id=id AND address='old address' AND phone='old phone';
As you can see, this is very efficient and works even if another client has
changed the values in the pay_back or money_he_owes_us columns.
In many cases, users have wanted ROLLBACK and/or LOCK
TABLES for the purpose of managing unique identifiers for some tables. This
can be handled much more efficiently by using an AUTO_INCREMENT column
and either the SQL function LAST_INSERT_ID() or the C API function
mysql_insert_id(). See section 24.1.3.126 mysql_insert_id().
At MySQL AB, we have never had any need for row-level locking because we have always been able to code around it. Some cases really need row locking, but they are very few. If you want row-level locking, you can use a flag column in the table and do something like this:
UPDATE tbl_name SET row_flag=1 WHERE id=ID;
MySQL returns 1 for the number of affected rows if the row was
found and row_flag wasn't already 1 in the original row.
You can think of it as MySQL changed the above query to:
UPDATE tbl_name SET row_flag=1 WHERE id=ID and row_flag <> 1;
MySQL has an advanced but non-standard security/privilege system. This section describes how it works.
Anyone using MySQL on a computer connected to the Internet should read this section to avoid the most common security mistakes.
In discussing security, we emphasize the necessity of fully protecting the entire server host (not simply the MySQL server) against all types of applicable attacks: eavesdropping, altering, playback, and denial of service. We do not cover all aspects of availability and fault tolerance here.
MySQL uses security based on Access Control Lists (ACLs) for all connections, queries, and other operations that a user may attempt to perform. There is also some support for SSL-encrypted connections between MySQL clients and servers. Many of the concepts discussed here are not specific to MySQL at all; the same general ideas apply to almost all applications.
When running MySQL, follow these guidelines whenever possible:
GRANT and
REVOKE commands are used for controlling access to MySQL. Do
not grant any more privileges than necessary. Never grant privileges to all
hosts.
Checklist:
mysql -u root. If you are able to connect successfully to the
server without being asked for a password, you have problems. Anyone
can connect to your MySQL server as the MySQL
root user with full privileges!
Review the MySQL installation instructions, paying particular
attention to the item about setting a root password.
SHOW GRANTS and check to see who has access to
what. Remove those privileges that are not necessary using the REVOKE
command.
MD5() or another one-way
hashing function.
nmap. MySQL uses port 3306 by default. This port should
be inaccessible from untrusted hosts. Another simple way to check whether or
not your MySQL port is open is to type telnet
server_host 3306 from some remote machine, where
server_host is the hostname of your MySQL
server. If you get a connection and some garbage characters, the port is
open, and should be closed on your firewall or router, unless you really
have a good reason to keep it open. If telnet just hangs or the
connection is refused, everything is OK; the port is blocked.
; DROP
DATABASE mysql;''. This is an extreme example, but large security leaks
and data loss may occur as a result of hackers using similar techniques,
if you do not prepare for them.
Also remember to check numeric data. A common mistake is to protect only
strings. Sometimes people think that if a database contains only publicly
available data that it need not be protected. This is incorrect. At least
denial-of-service type attacks can be performed on such
databases. The simplest way to protect from this type of attack is to use
apostrophes around the numeric constants: SELECT * FROM table
WHERE ID='234' rather than SELECT * FROM table WHERE ID=234.
MySQL automatically converts this string to a number and
strips all non-numeric symbols from it.
Checklist:
%22 (`"'), %23
(`#'), and %27 (`'') in the URL.
addslashes() function.
mysql_escape() API call.
escape and quote modifiers for query streams.
quote() method or use placeholders.
tcpdump and strings utilities. For most cases,
you can check whether or not MySQL data streams are unencrypted
by issuing a command like the following:
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings(This works under Linux and should work with small modifications under other systems). Warning: If you do not see data this doesn't always actually mean that it is encrypted. If you need high security, you should consult with a security expert.
When you connect to a MySQL server, you normally should use a password. The password is not transmitted in clear text over the connection, however the encryption algorithm is not very strong, and with some effort a clever attacker can crack the password if he is able to sniff the traffic between the client and the server. If the connection between the client and the server goes through an untrusted network, you should use an SSH tunnel to encrypt the communication.
All other information is transferred as text that can be read by anyone
who is able to watch the connection. If you are concerned about this,
you can use the compressed protocol (in MySQL Version 3.22 and above)
to make things much harder. To make things even more secure you should
use ssh (see http://www.cs.hut.fi/ssh). With this, you
can get an encrypted TCP/IP connection between a MySQL server
and a MySQL client.
To make a MySQL system secure, you should strongly consider the following suggestions:
mysql -u other_user db_name if
other_user has no password. It is common behavior with client/server
applications that the client may specify any user name. You can change the
password of all users by editing the mysql_install_db script before
you run it, or only the password for the MySQL root user like
this:
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;
root user.
It is very dangerous as any user with FILE privileges will be able to
create files
as root (for example, ~root/.bashrc). To prevent this
mysqld will refuse to run as root unless it is specified
directly via --user=root option.
mysqld can be run as any user instead. You can also create a new
Unix user mysql to make everything even more secure. If you run
mysqld as another Unix user, you don't need to change the
root user name in the user table, because MySQL
user names have nothing to do with Unix user names. You can edit the
mysql.server script to start mysqld as another Unix user.
Normally this is done with the su command. For more details, see
section 21.9 How to Run MySQL As a Normal User.
root user in the mysql.server
script, make sure this script is readable only by root.
mysqld runs as is the only user with
read/write privileges in the database directories.
mysqld as root unless you really
need to. Consider creating a user named mysql for that purpose.
mysqladmin processlist shows the text of the currently executing
queries, so any user who is allowed to execute that command might be able to
see if another user issues an UPDATE user SET
password=PASSWORD('not_secure') query.
mysqld reserves an extra connection for users who have the
process privilege, so that a MySQL root user can log
in and check things even if all normal connections are in use.
mysqld daemon! To make this a bit safer, all files generated with
SELECT ... INTO OUTFILE are readable to everyone, and you cannot
overwrite existing files.
The file privilege may also be used to read any file accessible
to the Unix user that the server runs as. This could be abused, for example,
by using LOAD DATA to load `/etc/passwd' into a table, which
can then be read with SELECT.
--secure option to
mysqld should make hostnames safe. In any case, you should be very
careful about creating grant table entries using hostname values that
contain wild cards!
max_user_connections variable in
mysqld.
mysqld Concerning Security
The following mysqld options affect networking security:
--secure
gethostbyname() system call are
checked to make sure they resolve back to the original hostname. This
makes it harder for someone on the outside to get access by pretending
to be another host. This option also adds some sanity checks of
hostnames. The option is turned off by default in MySQL Version
3.21 because sometimes it takes a long time to perform backward resolutions.
MySQL Version 3.22 caches hostnames and has this option enabled by
default.
--skip-grant-tables
mysqladmin
flush-privileges or mysqladmin reload.)
--skip-name-resolve
Host column values in the grant
tables must be IP numbers or localhost.
--skip-networking
mysqld must be made via Unix sockets. This option is unsuitable for
systems that use MIT-pthreads, because the MIT-pthreads package doesn't
support Unix sockets.
--skip-show-database
SHOW DATABASES statement doesn't return anything.
--safe-show-database
SHOW DATABASES returns only those databases for which the user has
some kind of privilege.
The primary function of the MySQL privilege system is to authenticate a user connecting from a given host, and to associate that user with privileges on a database such as select, insert, update and delete.
Additional functionality includes the ability to have an anonymous user and
to grant privileges for MySQL-specific functions such as LOAD
DATA INFILE and administrative operations.
There are several distinctions between the way user names and passwords are used by MySQL and the way they are used by Unix or Windows:
-u or
--user options. This means that you can't make a database secure in
any way unless all MySQL user names have passwords. Anyone may
attempt to connect to the server using any name, and they will succeed if
they specify any name that doesn't have a password.
PASSWORD() and ENCRYPT() functions in section 7.4.12 Miscellaneous Functions. Note that even if the password is stored 'scrambled', and
knowing your 'scrambled' password is enough to be able to connect to
the MySQL server!
MySQL client programs generally require that you specify connection
parameters when you want to access a MySQL server: the host you want
to connect to, your user name, and your password. For example, the
mysql client can be started like this (optional arguments are enclosed
between `[' and `]'):
shell> mysql [-h host_name] [-u user_name] [-pyour_pass]
Alternate forms of the -h, -u, and -p options are
--host=host_name, --user=user_name, and
--password=your_pass. Note that there is no space between
-p or --password= and the password following it.
NOTE: Specifying a password on the command line is not secure!
Any user on your system may then find out your password by typing a command
like: ps auxww. See section 4.16.5 Option Files.
mysql uses default values for connection parameters that are missing
from the command line:
localhost.
-p is missing.
Thus, for a Unix user joe, the following commands are equivalent:
shell> mysql -h localhost -u joe shell> mysql -h localhost shell> mysql -u joe shell> mysql
Other MySQL clients behave similarly.
On Unix systems, you can specify different default values to be used when you make a connection, so that you need not enter them on the command line each time you invoke a client program. This can be done in a couple of ways:
[client] section of the
`.my.cnf' configuration file in your home directory. The relevant
section of the file might look like this:
[client] host=host_name user=user_name password=your_passSee section 4.16.5 Option Files.
mysql using MYSQL_HOST. The
MySQL user name can be specified using USER (this is for
Windows only). The password can be specified using MYSQL_PWD
(but this is insecure; see the next section). See section A Environment Variables.
It is inadvisable to specify your password in a way that exposes it to discovery by other users. The methods you can use to specify your password when you run client programs are listed below, along with an assessment of the risks of each method:
mysql.user table. Knowing
the encrypted password for a user makes it possible to login as this
user. The passwords are only scrambled so that one shouldn't be able to
see the real password you used (if you happen to use a similar password
with your other applications).
-pyour_pass or --password=your_pass option on the command
line. This is convenient but insecure, because your password becomes visible
to system status programs (such as ps) that may be invoked by other
users to display command lines. (MySQL clients typically overwrite
the command-line argument with zeroes during their initialization sequence,
but there is still a brief interval during which the value is visible.)
-p or --password option (with no your_pass value
specified). In this case, the client program solicits the password from
the terminal:
shell> mysql -u user_name -p Enter password: ********The `*' characters represent your password. It is more secure to enter your password this way than to specify it on the command line because it is not visible to other users. However, this method of entering a password is suitable only for programs that you run interactively. If you want to invoke a client from a script that runs non-interactively, there is no opportunity to enter the password from the terminal. On some systems, you may even find that the first line of your script is read and interpreted (incorrectly) as your password!
[client] section of the `.my.cnf' file in your
home directory:
[client] password=your_passIf you store your password in `.my.cnf', the file should not be group or world readable or writable. Make sure the file's access mode is
400
or 600.
See section 4.16.5 Option Files.
MYSQL_PWD environment variable, but
this method must be considered extremely insecure and should not be used.
Some versions of ps include an option to display the environment of
running processes; your password will be in plain sight for all to see if
you set MYSQL_PWD. Even on systems without such a version of
ps, it is unwise to assume there is no other method to observe process
environments. See section A Environment Variables.
All in all, the safest methods are to have the client program prompt for the password or to specify the password in a properly protected `.my.cnf' file.
Information about user privileges is stored in the user, db,
host, tables_priv, and columns_priv tables in the
mysql database (that is, in the database named mysql). The
MySQL server reads the contents of these tables when it starts up
and under the circumstances indicated in section 6.12 When Privilege Changes Take Effect.
The names used in this manual to refer to the privileges provided by MySQL are shown below, along with the table column name associated with each privilege in the grant tables and the context in which the privilege applies:
| Privilege | Column | Context |
| select | Select_priv | tables |
| insert | Insert_priv | tables |
| update | Update_priv | tables |
| delete | Delete_priv | tables |
| index | Index_priv | tables |
| alter | Alter_priv | tables |
| create | Create_priv | databases, tables, or indexes |
| drop | Drop_priv | databases or tables |
| grant | Grant_priv | databases or tables |
| references | References_priv | databases or tables |
| reload | Reload_priv | server administration |
| shutdown | Shutdown_priv | server administration |
| process | Process_priv | server administration |
| file | File_priv | file access on server |
The select, insert, update, and delete privileges allow you to perform operations on rows in existing tables in a database.
SELECT statements require the select privilege only if they
actually retrieve rows from a table. You can execute certain SELECT
statements even without permission to access any of the databases on the
server. For example, you could use the mysql client as a simple
calculator:
mysql> SELECT 1+1; mysql> SELECT PI()*2;
The index privilege allows you to create or drop (remove) indexes.
The alter privilege allows you to use ALTER TABLE.
The create and drop privileges allow you to create new databases and tables, or to drop (remove) existing databases and tables.
Note that if you grant the drop privilege for the mysql
database to a user, that user can drop the database in which the
MySQL access privileges are stored!
The grant privilege allows you to give to other users those privileges you yourself possess.
The file privilege gives you permission to read and write files on
the server using the LOAD DATA INFILE and SELECT ... INTO
OUTFILE statements. Any user to whom this privilege is granted can read or
write any file that the MySQL server can read or write.
The remaining privileges are used for administrative operations, which are
performed using the mysqladmin program. The table below shows which
mysqladmin commands each administrative privilege allows you to
execute:
| Privilege | Commands permitted to privilege holders |
| reload | reload, refresh,
flush-privileges, flush-hosts, flush-logs, and
flush-tables
|
| shutdown | shutdown
|
| process | processlist, kill
|
The reload command tells the server to re-read the grant tables. The
refresh command flushes all tables and opens and closes the log
files. flush-privileges is a synonym for reload. The other
flush-* commands perform functions similar to refresh but are
more limited in scope, and may be preferable in some instances. For example,
if you want to flush just the log files, flush-logs is a better choice
than refresh.
The shutdown command shuts down the server.
The processlist command displays information about the threads
executing within the server. The kill command kills server threads.
You can always display or kill your own threads, but you need the
process privilege to display or kill threads initiated by other
users. See section 7.27 KILL Syntax.
It is a good idea in general to grant privileges only to those users who need them, but you should exercise particular caution in granting certain privileges:
SELECT. This includes the contents of all databases
hosted by the server!
mysql database can be used to change passwords
and other access privilege information. (Passwords are stored
encrypted, so a malicious user cannot simply read them to know the plain
text password). If they can access the mysql.user password
column, they can use it to log into the MySQL server
for the given user. (With sufficient privileges, the same user can
replace a password with a different one.)
There are some things that you cannot do with the MySQL privilege system:
The MySQL privilege system ensures that all users may do exactly the things that they are supposed to be allowed to do. When you connect to a MySQL server, your identity is determined by the host from which you connect and the user name you specify. The system grants privileges according to your identity and what you want to do.
MySQL considers both your hostname and user name in identifying you
because there is little reason to assume that a given user name belongs to
the same person everywhere on the Internet. For example, the user
bill who connects from whitehouse.gov need not be the same
person as the user bill who connects from microsoft.com.
MySQL handles this by allowing you to distinguish users on different
hosts that happen to have the same name: you can grant bill one set
of privileges for connections from whitehouse.gov, and a different set
of privileges for connections from microsoft.com.
MySQL access control involves two stages:
The server uses the user, db, and host tables in the
mysql database at both stages of access control. The fields in these
grant tables are shown below:
| Table name | user | db | host
|
| Scope fields | Host | Host | Host
|
User | Db | Db
| |
Password | User | ||
| Privilege fields | Select_priv | Select_priv | Select_priv
|
Insert_priv | Insert_priv | Insert_priv
| |
Update_priv | Update_priv | Update_priv
| |
Delete_priv | Delete_priv | Delete_priv
| |
Index_priv | Index_priv | Index_priv
| |
Alter_priv | Alter_priv | Alter_priv
| |
Create_priv | Create_priv | Create_priv
| |
Drop_priv | Drop_priv | Drop_priv
| |
Grant_priv | Grant_priv | Grant_priv
| |
References_priv | |||
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv |
For the second stage of access control (request verification), the server
may, if the request involves tables, additionally consult the
tables_priv and columns_priv tables. The fields in these
tables are shown below:
| Table name | tables_priv | columns_priv
|
| Scope fields | Host | Host
|
Db | Db
| |
User | User
| |
Table_name | Table_name
| |
Column_name
| ||
| Privilege fields | Table_priv | Column_priv
|
Column_priv | ||
| Other fields | Timestamp | Timestamp
|
Grantor |
Each grant table contains scope fields and privilege fields.
Scope fields determine the scope of each entry in the tables, that is, the
context in which the entry applies. For example, a user table entry
with Host and User values of 'thomas.loc.gov' and
'bob' would be used for authenticating connections made to the server
by bob from the host thomas.loc.gov. Similarly, a db
table entry with Host, User, and Db fields of
'thomas.loc.gov', 'bob' and 'reports' would be used when
bob connects from the host thomas.loc.gov to access the
reports database. The tables_priv and columns_priv
tables contain scope fields indicating tables or table/column combinations
to which each entry applies.
For access-checking purposes, comparisons of Host values are
case insensitive. User, Password, Db, and
Table_name values are case sensitive.
Column_name values are case insensitive in MySQL Version
3.22.12 or later.
Privilege fields indicate the privileges granted by a table entry, that is, what operations can be performed. The server combines the information in the various grant tables to form a complete description of a user's privileges. The rules used to do this are described in section 6.11 Access Control, Stage 2: Request Verification.
Scope fields are strings, declared as shown below; the default value for each is the empty string:
| Field name | Type | |
Host | CHAR(60)
| |
User | CHAR(16)
| |
Password | CHAR(16)
| |
Db | CHAR(64) | (CHAR(60) for the
tables_priv and columns_priv tables)
|
Table_name | CHAR(60)
| |
Column_name | CHAR(60)
|
In the user, db and host tables,
all privilege fields are declared as ENUM('N','Y') -- each can have a
value of 'N' or 'Y', and the default value is 'N'.
In the tables_priv and columns_priv tables, the privilege
fields are declared as SET fields:
| Table name | Field name | Possible set elements |
tables_priv | Table_priv | 'Select', 'Insert',
'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'
|
tables_priv | Column_priv | 'Select', 'Insert',
'Update', 'References'
|
columns_priv | Column_priv | 'Select', 'Insert',
'Update', 'References'
|
Briefly, the server uses the grant tables like this:
user table scope fields determine whether to allow or reject
incoming connections. For allowed connections, any privileges granted in
the user table indicate the user's global (superuser) privileges.
These privileges apply to all databases on the server.
db and host tables are used together:
db table scope fields determine which users can access which
databases from which hosts. The privilege fields determine which operations
are allowed.
host table is used as an extension of the db table when you
want a given db table entry to apply to several hosts. For example,
if you want a user to be able to use a database from several hosts in
your network, leave the Host value empty in the user's db table
entry, then populate the host table with an entry for each of those
hosts. This mechanism is described more detail in section 6.11 Access Control, Stage 2: Request Verification.
tables_priv and columns_priv tables are similar to
the db table, but are more fine-grained: they apply at the
table and column levels rather than at the database level.
Note that administrative privileges (reload, shutdown,
etc.) are specified only in the user table. This is because
administrative operations are operations on the server itself and are not
database-specific, so there is no reason to list such privileges in the
other grant tables. In fact, only the user table need
be consulted to determine whether or not you can perform an administrative
operation.
The file privilege is specified only in the user table, too.
It is not an administrative privilege as such, but your ability to read or
write files on the server host is independent of the database you are
accessing.
The mysqld server reads the contents of the grant tables once, when it
starts up. Changes to the grant tables take effect as indicated in
section 6.12 When Privilege Changes Take Effect.
When you modify the contents of the grant tables, it is a good idea to make
sure that your changes set up privileges the way you want. For help in
diagnosing problems, see section 6.16 Causes of Access denied Errors. For advice on security issues,
see section 6.2 How to Make MySQL Secure Against Crackers.
A useful
diagnostic tool is the mysqlaccess script, which Yves Carlier has
provided for the MySQL distribution. Invoke mysqlaccess with
the --help option to find out how it works.
Note that mysqlaccess checks access using only the user,
db and host tables. It does not check table- or column-level
privileges.
When you attempt to connect to a MySQL server, the server accepts or rejects the connection based on your identity and whether or not you can verify your identity by supplying the correct password. If not, the server denies access to you completely. Otherwise, the server accepts the connection, then enters Stage 2 and waits for requests.
Your identity is based on two pieces of information:
Identity checking is performed using the three user table scope fields
(Host, User, and Password). The server accepts the
connection only if a user table entry matches your hostname and user
name, and you supply the correct password.
Values in the user table scope fields may be specified as follows:
Host value may be a hostname or an IP number, or 'localhost'
to indicate the local host.
Host
field.
Host value of '%' matches any hostname.
Host value means that the privilege should be anded
with the entry in the host table that matches the given host name.
You can find more information about this in the next chapter.
Host values specified as
IP numbers, you can specify a netmask indicating how many address bits to
use for the network number. For example:
GRANT ALL PRIVILEGES on db.* to david@'192.58.197.0/255.255.255.0';This will allow everyone to connect from an IP where the following is true:
user_ip & netmask = host_ip.In the above example all IP:s in the interval 192.58.197.0 - 192.58.197.255 can connect to the MySQL server.
User field, but you can
specify a blank value, which matches any name. If the user table
entry that matches an incoming connection has a blank user name, the user is
considered to be the anonymous user (the user with no name), rather than the
name that the client actually specified. This means that a blank user name
is used for all further access checking for the duration of the connection
(that is, during Stage 2).
Password field can be blank. This does not mean that any password
matches, it means the user must connect without specifying a password.
Non-blank Password values represent encrypted passwords.
MySQL does not store passwords in plaintext form for anyone to
see. Rather, the password supplied by a user who is attempting to
connect is encrypted (using the PASSWORD() function). The
encrypted password is then used when the client/server is checking if
the password is correct (This is done without the encrypted password
ever traveling over the connection.) Note that from MySQL's
point of view the encrypted password is the REAL password, so you should
not give anyone access to it! In particular, don't give normal users
read access to the tables in the mysql database!
The examples below show how various combinations of Host and
User values in user table entries apply to incoming
connections:
Host value | User value | Connections matched by entry |
'thomas.loc.gov' | 'fred' | fred, connecting from thomas.loc.gov
|
'thomas.loc.gov' | '' | Any user, connecting from thomas.loc.gov
|
'%' | 'fred' | fred, connecting from any host
|
'%' | '' | Any user, connecting from any host |
'%.loc.gov' | 'fred' | fred, connecting from any host in the loc.gov domain
|
'x.y.%' | 'fred' | fred, connecting from x.y.net, x.y.com,x.y.edu, etc. (this is probably not useful)
|
'144.155.166.177' | 'fred' | fred, connecting from the host with IP address 144.155.166.177
|
'144.155.166.%' | 'fred' | fred, connecting from any host in the 144.155.166 class C subnet
|
'144.155.166.0/255.255.255.0' | 'fred' | Same as previous example |
Because you can use IP wild-card values in the Host field (for example,
'144.155.166.%' to match every host on a subnet), there is the
possibility that someone might try to exploit this capability by naming a
host 144.155.166.somewhere.com. To foil such attempts, MySQL
disallows matching on hostnames that start with digits and a dot. Thus, if
you have a host named something like 1.2.foo.com, its name will never
match the Host column of the grant tables. Only an IP number can
match an IP wild-card value.
An incoming connection may be matched by more than one entry in the
user table. For example, a connection from thomas.loc.gov by
fred would be matched by several of the entries just shown above. How
does the server choose which entry to use if more than one matches? The
server resolves this question by sorting the user table after reading
it at startup time, then looking through the entries in sorted order when a
user attempts to connect. The first matching entry is the one that is used.
user table sorting works as follows. Suppose the user table
looks like this:
+-----------+----------+- | Host | User | ... +-----------+----------+- | % | root | ... | % | jeffrey | ... | localhost | root | ... | localhost | | ... +-----------+----------+-
When the server reads in the table, it orders the entries with the
most-specific Host values first ('%' in the Host column
means ``any host'' and is least specific). Entries with the same Host
value are ordered with the most-specific User values first (a blank
User value means ``any user'' and is least specific). The resulting
sorted user table looks like this:
+-----------+----------+- | Host | User | ... +-----------+----------+- | localhost | root | ... | localhost | | ... | % | jeffrey | ... | % | root | ... +-----------+----------+-
When a connection is attempted, the server looks through the sorted entries
and uses the first match found. For a connection from localhost by
jeffrey, the entries with 'localhost' in the Host column
match first. Of those, the entry with the blank user name matches both the
connecting hostname and user name. (The '%'/'jeffrey' entry would
have matched, too, but it is not the first match in the table.)
Here is another example. Suppose the user table looks like this:
+----------------+----------+- | Host | User | ... +----------------+----------+- | % | jeffrey | ... | thomas.loc.gov | | ... +----------------+----------+-
The sorted table looks like this:
+----------------+----------+- | Host | User | ... +----------------+----------+- | thomas.loc.gov | | ... | % | jeffrey | ... +----------------+----------+-
A connection from thomas.loc.gov by jeffrey is matched by the
first entry, whereas a connection from whitehouse.gov by
jeffrey is matched by the second.
A common misconception is to think that for a given user name, all entries
that explicitly name that user will be used first when the server attempts to
find a match for the connection. This is simply not true. The previous
example illustrates this, where a connection from thomas.loc.gov by
jeffrey is first matched not by the entry containing 'jeffrey'
as the User field value, but by the entry with no user name!
If you have problems connecting to the server, print out the user
table and sort it by hand to see where the first match is being made.
Once you establish a connection, the server enters Stage 2. For each request
that comes in on the connection, the server checks whether you have
sufficient privileges to perform it, based on the type of operation you wish
to perform. This is where the privilege fields in the grant tables come into
play. These privileges can come from any of the user, db,
host, tables_priv, or columns_priv tables. The grant
tables are manipulated with GRANT and REVOKE commands.
See section 7.35 GRANT and REVOKE Syntax. (You may find it helpful to refer to
section 6.9 How the Privilege System Works, which lists the fields present in each of the grant
tables.)
The user table grants privileges that are assigned to you on a global
basis and that apply no matter what the current database is. For example, if
the user table grants you the delete privilege, you can
delete rows from any database on the server host! In other words,
user table privileges are superuser privileges. It is wise to grant
privileges in the user table only to superusers such as server or
database administrators. For other users, you should leave the privileges
in the user table set to 'N' and grant privileges on a
database-specific basis only, using the db and host tables.
The db and host tables grant database-specific privileges.
Values in the scope fields may be specified as follows:
Host
and Db fields of either table.
'%' Host value in the db table means ``any host.'' A
blank Host value in the db table means ``consult the
host table for further information.''
'%' or blank Host value in the host table means ``any
host.''
'%' or blank Db value in either table means ``any database.''
User value in either table matches the anonymous user.
The db and host tables are read in and sorted when the server
starts up (at the same time that it reads the user table). The
db table is sorted on the Host, Db, and User scope
fields, and the host table is sorted on the Host and Db
scope fields. As with the user table, sorting puts the most-specific
values first and least-specific values last, and when the server looks for
matching entries, it uses the first match that it finds.
The tables_priv and columns_priv tables grant table- and
column-specific privileges. Values in the scope fields may be specified as
follows:
Host field of either table.
'%' or blank Host value in either table means ``any host.''
Db, Table_name and Column_name fields cannot contain
wild cards or be blank in either table.
The tables_priv and columns_priv tables are sorted on
the Host, Db, and User fields. This is similar to
db table sorting, although the sorting is simpler because
only the Host field may contain wild cards.
The request verification process is described below. (If you are familiar with the access-checking source code, you will notice that the description here differs slightly from the algorithm used in the code. The description is equivalent to what the code actually does; it differs only to make the explanation simpler.)
For administrative requests (shutdown, reload, etc.), the
server checks only the user table entry, because that is the only table
that specifies administrative privileges. Access is granted if the entry
allows the requested operation and denied otherwise. For example, if you
want to execute mysqladmin shutdown but your user table entry
doesn't grant the shutdown privilege to you, access is denied
without even checking the db or host tables. (They
contain no Shutdown_priv column, so there is no need to do so.)
For database-related requests (insert, update, etc.), the
server first checks the user's global (superuser) privileges by looking in
the user table entry. If the entry allows the requested operation,
access is granted. If the global privileges in the user table are
insufficient, the server determines the user's database-specific privileges
by checking the db and host tables:
db table for a match on the Host,
Db, and User fields. The Host and User fields are
matched to the connecting user's hostname and MySQL user name. The
Db field is matched to the database the user wants to access. If
there is no entry for the Host and User, access is denied.
db table entry and its Host field is
not blank, that entry defines the user's database-specific privileges.
db table entry's Host field is blank, it
signifies that the host table enumerates which hosts should be allowed
access to the database. In this case, a further lookup is done in the
host table to find a match on the Host and Db fields.
If no host table entry matches, access is denied. If there is a
match, the user's database-specific privileges are computed as the
intersection (not the union!) of the privileges in the db and
host table entries, that is, the privileges that are 'Y' in both
entries. (This way you can grant general privileges in the db table
entry and then selectively restrict them on a host-by-host basis using the
host table entries.)
After determining the database-specific privileges granted by the db
and host table entries, the server adds them to the global privileges
granted by the user table. If the result allows the requested
operation, access is granted. Otherwise, the server checks the user's
table and column privileges in the tables_priv and columns_priv
tables and adds those to the user's privileges. Access is allowed or denied
based on the result.
Expressed in boolean terms, the preceding description of how a user's privileges are calculated may be summarized like this:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
It may not be apparent why, if the global user entry privileges are
initially found to be insufficient for the requested operation, the server
adds those privileges to the database-, table-, and column-specific privileges
later. The reason is that a request might require more than one type of
privilege. For example, if you execute an INSERT ... SELECT
statement, you need both insert and select privileges.
Your privileges might be such that the user table entry grants one
privilege and the db table entry grants the other. In this case, you
have the necessary privileges to perform the request, but the server cannot
tell that from either table by itself; the privileges granted by the entries
in both tables must be combined.
The host table can be used to maintain a list of secure servers.
At TcX, the host table contains a list of all machines on the local
network. These are granted all privileges.
You can also use the host table to indicate hosts that are not
secure. Suppose you have a machine public.your.domain that is located
in a public area that you do not consider secure. You can allow access to
all hosts on your network except that machine by using host table
entries
like this:
+--------------------+----+- | Host | Db | ... +--------------------+----+- | public.your.domain | % | ... (all privileges set to 'N') | %.your.domain | % | ... (all privileges set to 'Y') +--------------------+----+-
Naturally, you should always test your entries in the grant tables (for
example, using mysqlaccess) to make sure your access privileges are
actually set up the way you think they are.
When mysqld starts, all grant table contents are read into memory and
become effective at that point.
Modifications to the grant tables that you perform using GRANT,
REVOKE, or SET PASSWORD are noticed by the server immediately.
If you modify the grant tables manually (using INSERT, UPDATE,
etc.), you should execute a FLUSH PRIVILEGES statement or run
mysqladmin flush-privileges or mysqladmin reload to tell the
server to reload the grant tables. Otherwise your changes will have no
effect until you restart the server. If you change the grant tables manually
but forget to reload the privileges, you will be wondering why your changes
don't seem to make any difference!
When the server notices that the grant tables have been changed, existing client connections are affected as follows:
USE db_name
command.
Global privilege changes and password changes take effect the next time the client connects.
After installing MySQL, you set up the initial access privileges by
running scripts/mysql_install_db.
See section 4.7.1 Quick Installation Overview.
The mysql_install_db script starts up the mysqld
server, then initializes the grant tables to contain the following set
of privileges:
root user is created as a superuser who can do
anything. Connections must be made from the local host.
NOTE:
The initial root password is empty, so anyone can connect as root
without a password and be granted all privileges.
'test' or starting with 'test_'. Connections must be
made from the local host. This means any local user can connect without a
password and be treated as the anonymous user.
mysqladmin shutdown or mysqladmin processlist.
NOTE: The default privileges are different for Windows. See section 4.13.4 Running MySQL on Windows.
Because your installation is initially wide open, one of the first things you
should do is specify a password for the MySQL
root user. You can do this as follows (note that you specify the
password using the PASSWORD() function):
shell> mysql -u root mysql
mysql> UPDATE user SET Password=PASSWORD('new_password')
WHERE user='root';
mysql> FLUSH PRIVILEGES;
You can, in MySQL Version 3.22 and above, use the SET PASSWORD
statement:
shell> mysql -u root mysql
mysql> SET PASSWORD FOR root=PASSWORD('new_password');
Another way to set the password is by using the mysqladmin command:
shell> mysqladmin -u root password new_password
Only users with write/update access to the mysql database can change the
password for others users. All normal users (not anonymous ones) can only
change their own password with either of the above commands or with
SET PASSWORD=PASSWORD('new password').
Note that if you update the password in the user table directly using
the first method, you must tell the server to re-read the grant tables (with
FLUSH PRIVILEGES), because the change will go unnoticed otherwise.
Once the root password has been set, thereafter you must supply that
password when you connect to the server as root.
You may wish to leave the root password blank so that you don't need
to specify it while you perform additional setup or testing. However, be sure
to set it before using your installation for any real production work.
See the scripts/mysql_install_db script to see how it sets up
the default privileges. You can use this as a basis to see how to
add other users.
If you want the initial privileges to be different than those just described
above, you can modify mysql_install_db before you run it.
To re-create the grant tables completely, remove all the `.frm',
`.MYI', and `.MYD' files in the directory containing the
mysql database. (This is the directory named `mysql' under
the database directory, which is listed when you run mysqld
--help.) Then run the mysql_install_db script, possibly after
editing it first to have the privileges you want.
NOTE: For MySQL versions older than Version 3.22.10,
you should NOT delete the `.frm' files. If you accidentally do this,
you should copy them back from your MySQL distribution before
running mysql_install_db.
You can add users two different ways: by using GRANT statements
or by manipulating the MySQL grant tables directly. The
preferred method is to use GRANT statements, because they are
more concise and less error-prone.
The examples below show how to use the mysql client to set up new
users. These examples assume that privileges are set up according to the
defaults described in the previous section. This means that to make changes,
you must be on the same machine where mysqld is running, you must
connect as the MySQL root user, and the root user must
have the insert privilege for the mysql database and the
reload administrative privilege. Also, if you have changed the
root user password, you must specify it for the mysql commands
below.
You can add new users by issuing GRANT statements:
shell> mysql --user=root mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"
IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
mysql> GRANT USAGE ON *.* TO dummy@localhost;
These GRANT statements set up three new users:
monty
'some_pass' to do so. Note that we must issue
GRANT statements for both monty@localhost and
monty@"%". If we don't add the entry with localhost, the
anonymous user entry for localhost that is created by
mysql_install_db will take precedence when we connect from the local
host, because it has a more specific Host field value and thus comes
earlier in the user table sort order.
admin
localhost without a password and who is
granted the reload and process administrative privileges.
This allows the user to execute the mysqladmin reload,
mysqladmin refresh, and mysqladmin flush-* commands, as well as
mysqladmin processlist . No database-related privileges are granted.
(They can be granted later by issuing additional GRANT statements.)
dummy
'N' -- the USAGE privilege
type allows you to create a user with no privileges. It is assumed that you
will grant database-specific privileges later.
You can also add the same user access information directly by issuing
INSERT statements and then telling the server to reload the grant
tables:
shell> mysql --user=root mysql
mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'),
'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;
Depending on your MySQL version, you may have to use a different
number of 'Y' values above (versions prior to Version 3.22.11 had fewer
privilege columns). For the admin user, the more readable extended
INSERT syntax that is available starting with Version 3.22.11 is used.
Note that to set up a superuser, you need only create a user table
entry with the privilege fields set to 'Y'. No db or
host table entries are necessary.
The privilege columns in the user table were not set explicitly in the
last INSERT statement (for the dummy user), so those columns
are assigned the default value of 'N'. This is the same thing that
GRANT USAGE does.
The following example adds a user custom who can connect from hosts
localhost, server.domain, and whitehouse.gov. He wants
to access the bankaccount database only from localhost,
the expenses database only from whitehouse.gov, and
the customer database from all three hosts. He wants
to use the password stupid from all three hosts.
To set up this user's privileges using GRANT statements, run these
commands:
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON bankaccount.*
TO custom@localhost
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON expenses.*
TO custom@whitehouse.gov
IDENTIFIED BY 'stupid';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
ON customer.*
TO custom@'%'
IDENTIFIED BY 'stupid';
To set up the user's privileges by modifying the grant tables directly,
run these commands (note the FLUSH PRIVILEGES at the end):
shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('localhost','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('server.domain','custom',PASSWORD('stupid'));
mysql> INSERT INTO user (Host,User,Password)
VALUES('whitehouse.gov','custom',PASSWORD('stupid'));
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES
('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
(Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,
Create_priv,Drop_priv)
VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;
The first three INSERT statements add user table entries that
allow user custom to connect from the various hosts with the given
password, but grant no permissions to him (all privileges are set to the
default value of 'N'). The next three INSERT statements add
db table entries that grant privileges to custom for the
bankaccount, expenses, and customer databases, but only
when accessed from the proper hosts. As usual, when the grant tables are
modified directly, the server must be told to reload them (with
FLUSH PRIVILEGES) so that the privilege changes take effect.
If you want to give a specific user access from any machine in a given
domain, you can issue a GRANT statement like the following:
mysql> GRANT ...
ON *.*
TO myusername@"%.mydomainname.com"
IDENTIFIED BY 'mypassword';
To do the same thing by modifying the grant tables directly, do this:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername',
PASSWORD('mypassword'),...);
mysql> FLUSH PRIVILEGES;
You can also use xmysqladmin, mysql_webadmin, and even
xmysql to insert, change, and update values in the grant tables.
You can find these utilities in the
Contrib directory of the MySQL
Website.
In most cases you should use GRANT to set up your users/passwords,
so the following only applies for advanced users. See section 7.35 GRANT and REVOKE Syntax.
The examples in the preceding sections illustrate an important principle:
when you store a non-empty password using INSERT or UPDATE
statements, you must use the PASSWORD() function to encrypt it. This
is because the user table stores passwords in encrypted form, not as
plaintext. If you forget that fact, you are likely to attempt to set
passwords like this:
shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;
The result is that the plaintext value 'biscuit' is stored as the
password in the user table. When the user jeffrey attempts to
connect to the server using this password, the mysql client encrypts
it with PASSWORD() and sends the result to the server. The server
compares the value in the user table (the encrypted value of
'biscuit') to the encrypted password (which is not
'biscuit'). The comparison fails and the server rejects the
connection:
shell> mysql -u jeffrey -pbiscuit test Access denied
Passwords must be encrypted when they are inserted in the user
table, so the INSERT statement should have been specified like this
instead:
mysql> INSERT INTO user (Host,User,Password)
VALUES('%','jeffrey',PASSWORD('biscuit'));
You must also use the PASSWORD() function when you use SET
PASSWORD statements:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
If you set passwords using the GRANT ... IDENTIFIED BY statement
or the mysqladmin password command, the PASSWORD() function
is unnecessary. They both take care of encrypting the password for you,
so you would specify a password of 'biscuit' like this:
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
or
shell> mysqladmin -u jeffrey password biscuit
NOTE: PASSWORD() does not perform password encryption in the
same way that Unix passwords are encrypted. You should not assume that if
your Unix password and your MySQL password are the same, that
PASSWORD() will result in the same encrypted value as is stored in the
Unix password file. See section 6.5 MySQL User Names and Passwords.
Access denied Errors
If you encounter Access denied errors when you try to connect to the
MySQL server, the list below indicates some courses of
action you can take to correct the problem:
mysql_install_db
script to set up the initial grant table contents? If not, do so.
See section 6.13 Setting Up the Initial MySQL Privileges. Test the initial privileges by executing
this command:
shell> mysql -u root testThe server should let you connect without error. You should also make sure you have a file `user.MYD' in the MySQL database directory. Ordinarily, this is `PATH/var/mysql/user.MYD', where
PATH is the
pathname to the MySQL installation root.
shell> mysql -u root mysqlThe server should let you connect because the MySQL
root user
has no password initially. That is also a security risk, so setting the
root password is something you should do while you're setting up
your other MySQL users.
If you try to connect as root and get this error:
Access denied for user: '@unknown' to database mysqlthis means that you don't have an entry in the
user table with a
User column value of 'root' and that mysqld cannot
resolve the hostname for your client. In this case, you must restart the
server with the --skip-grant-tables option and edit your
`/etc/hosts' or `\windows\hosts' file to add an entry for your
host.
shell> mysqladmin -u root -pxxxx ver Access denied for user: 'root@localhost' (Using password: YES)It means that you are using a wrong password. See section 6.15 Setting Up Passwords. If you have forgot the root password, you can restart
mysqld with
--skip-grant-tables to change the password. You can find more
about this option later on in this manual section.
If you get the above error even if you haven't specified a password,
this means that you a wrong password in some my.ini
file. See section 4.16.5 Option Files. You can avoid using option files with the --no-defaults option, as follows:
shell> mysqladmin --no-defaults -u root ver
mysql_fix_privilege_tables script? If not, do so. The structure of
the grant tables changed with MySQL Version 3.22.11 when the
GRANT statement became functional.
PASSWORD() function if you set the password with the
INSERT, UPDATE, or SET PASSWORD statements. The
PASSWORD() function is unnecessary if you specify the password using
the GRANT ... INDENTIFIED BY statement or the mysqladmin
password command.
See section 6.15 Setting Up Passwords.
localhost is a synonym for your local hostname, and is also the
default host to which clients try to connect if you specify no host
explicitly. However, connections to localhost do not work if you are
running on a system that uses MIT-pthreads (localhost connections are
made using Unix sockets, which are not supported by MIT-pthreads). To avoid
this problem on such systems, you should use the --host option to name
the server host explicitly. This will make a TCP/IP connection to the
mysqld server. In this case, you must have your real hostname in
user table entries on the server host. (This is true even if you are
running a client program on the same host as the server.)
Access denied error when trying to connect to the
database with mysql -u user_name db_name, you may have a problem
with the user table. Check this by executing mysql -u root
mysql and issuing this SQL statement:
mysql> SELECT * FROM user;The result should include an entry with the
Host and User
columns matching your computer's hostname and your MySQL user name.
Access denied error message will tell you who you are trying
to log in as, the host from which you are trying to connect, and whether
or not you were using a password. Normally, you should have one entry in
the user table that exactly matches the hostname and user name
that were given in the error message. For example if you get an error
message that contains Using password: NO, this means that you
tried to login without an password.
user table that matches that host:
Host ... is not allowed to connect to this MySQL serverYou can fix this by using the command-line tool
mysql (on the
server host!) to add a row to the user, db, or host
table for the user/hostname combination from which you are trying to
connect and then execute mysqladmin flush-privileges. If you are
not running MySQL Version 3.22 and you don't know the IP number or
hostname of the machine from which you are connecting, you should put an
entry with '%' as the Host column value in the user
table and restart mysqld with the --log option on the
server machine. After trying to connect from the client machine, the
information in the MySQL log will indicate how you really did
connect. (Then replace the '%' in the user table entry
with the actual hostname that shows up in the log. Otherwise, you'll
have a system that is insecure.)
Another reason for this error on Linux is that you are using a binary
MySQL version that is compiled with a different glibc version
than the one you are using. In this case you should either upgrade your
OS/glibc or download