The world's most popular open source database
After upgrading a 5.0 installation to 5.0.10 or above, it is necessary to upgrade your grant tables. Otherwise, creating stored procedures and functions might not work. The procedure for doing this is described in Section 4.4.8, “mysql_upgrade — Check Tables for MySQL Upgrade”.
It is good practice to back up your data before installing any new version of software. Although MySQL works very hard to ensure a high level of quality, you should protect your data by making a backup. MySQL recommends that you dump and reload your tables from any previous version to upgrade to 5.1.
In general, you should do the following when upgrading from MySQL 5.0 to 5.1:
Read all the items in the following sections to see whether any of them might affect your applications:
Section 2.11, “Upgrading MySQL”, has general update information.
The items in the change lists found later in this section enable you to identify upgrade issues that apply to your current MySQL installation.
The MySQL 5.1 change history describes significant new features you can use in 5.1 or that differ from those found in MySQL 5.0. Some of these changes may result in incompatibilities. See Section C.1, “Changes in release 5.1.x (Production)”.
Note particularly any changes that are marked Known issue or Incompatible change. These incompatibilities with earlier versions of MySQL may require your attention before you upgrade.
Our aim is to avoid these changes, but occasionally they are
necessary to correct problems that would be worse than an
incompatibility between releases. If any upgrade issue
applicable to your installation involves an incompatibility
that requires special handling, follow the instructions
given in the incompatibility description. Often this will
involve a dump and reload, or use of a statement such as
CHECK TABLE or
REPAIR TABLE.
A dump and reload is done like this:
Any procedure that involves REPAIR
TABLE with the USE_FRM option
must be done before upgrading. Use of
this statement with a version of MySQL different from the
one used to create the table (that is, using it after
upgrading) may damage the table. See
Section 12.5.2.6, “REPAIR TABLE Syntax”.
After you upgrade to a new version of MySQL, run mysql_upgrade (see Section 4.4.8, “mysql_upgrade — Check Tables for MySQL Upgrade”). This program will check your tables, and repair them if necessary. It will also update your grant tables to make sure that they have the current structure so that you can take advantage of any new capabilities. (Some releases of MySQL introduce changes to the structure of the grant tables to add new privileges or features.)
If you are running MySQL Server on Windows, see Section 2.3.14, “Upgrading MySQL on Windows”.
If you are using replication, see Section 16.3.3, “Upgrading a Replication Setup”, for information on upgrading your replication setup.
The following lists describe changes that may affect applications and that you should watch out for when upgrading to MySQL 5.1.
Configuration Changes:
Before MySQL 5.1.11, to build MySQL from source with SSL
support enabled, you would invoke
configure with either the
--with-openssl or
--with-yassl option. In MySQL 5.1.11, those
options both have been replaced by the
--with-ssl option. By default,
--with-ssl causes the bundled yaSSL library
to be used. To select OpenSSL instead, give the option as
--with-ssl=,
where pathpath is the directory where
the OpenSSL header files and libraries are located.
Server Changes:
Known issue: Before MySQL
5.1.30, the CHECK TABLE ... FOR UPGRADE
statement did not check for incompatible collation changes
made in MySQL 5.1.24. (This also affects
mysqlcheck and
mysql_upgrade, which cause that statement
to be executed.)
Prior to the fix made in 5.1.30, a binary upgrade (performed
without dumping tables with mysqldump
before the upgrade and reloading the dump file after the
upgrade) would corrupt tables. After the fix, CHECK
TABLE ... FOR UPGRADE properly detects the problem
and upgrades tables.
However, the fix is not backward compatible and can result in a downgrading problem under these circumstances:
Perform a binary upgrade to a version of MySQL that includes the fix.
Run CHECK TABLE ... FOR UPGRADE (or
mysqlcheck or
mysql_upgrade) to upgrade tables.
Perform a binary downgrade to a version of MySQL that does not include the fix.
The solution is to dump tables with mysqldump before the downgrade and reload the dump file after the downgrade. Alternatively, drop and recreate affected indexes.
Known issue: MySQL
introduces encoding for table names that have non-ASCII
characters (see Section 8.2.3, “Mapping of Identifiers to Filenames”). After
a live upgrade from MySQL 5.0 to 5.1, the server recognizes
names that have non-ASCII characters and adds a
#mysql50# prefix to them. Running
mysqlcheck later (or
mysql_upgrade, which runs
mysqlcheck) to upgrade these names
encodes them with the new format and removes the
#mysql50# prefix. However, although this
is done for tables, it is not done for views. To work around
this problem, drop each affected view and recreate it.
This problem is fixed as of MySQL 5.1.23.
Known issue: When upgrading from MySQL 5.0 to 5.1, running mysqlcheck (or mysql_upgrade, which runs mysqlcheck) to upgrade tables fails for names that must be written as quoted identifiers. To work around this problem, rename each affected table to a name that does not require quoting:
RENAME TABLE `tab``le_a` TO table_a; RENAME TABLE `table b` TO table_b;
After renaming the tables, run the mysql_upgrade program. Then rename the tables back to their original names:
RENAME TABLE table_a TO `tab``le_a`; RENAME TABLE table_b TO `table b`;
This problem is fixed as of MySQL 5.1.23.
Known issue: In connection
with view creation, the server created
arc directories inside database
directories and maintained useless copies of
.frm files there. Creation and renaming
procedures of those copies as well as creation of
arc directories has been discontinued
in MySQL 5.1.29.
This change does cause a problem when downgrading to older server versions which manifests itself under these circumstances:
Create a view v_orig in MySQL 5.1.29
or higher.
Rename the view to v_new and then
back to v_orig.
Downgrade to an older 5.1.x server and run mysql_upgrade.
Try to rename v_orig to
v_new again. This operation fails.
As a workaround to avoid this problem, use either of these approaches:
Dump your data using mysqldump before downgrading and reload the dump file after downgrading.
Instead of renaming a view after the downgrade, drop it and recreate it.
Incompatible change: As of
MySQL 5.1.29, the default binary logging mode has been
changed from MIXED to
STATEMENT for compatibility with MySQL
5.0.
Incompatible change: In
MySQL 5.1.25, a change was made to the way that the server
handles prepared statements. This affects prepared
statements processed at the SQL level (using the
PREPARE
statement) and those processed using the binary
client-server protocol (using the
mysql_stmt_prepare() C API
function).
Previously, changes to metadata of tables or views referred to in a prepared statement could cause a server crash when the statement was next executed, or perhaps an error at execute time with a crash occurring later. For example, this could happen after dropping a table and recreating it with a different definition.
Now metadata changes to tables or views referred to by
prepared statements are detected and cause automatic
repreparation of the statement when it is next executed.
Metadata changes occur for DDL statements such as those that
create, drop, alter, rename, or truncate tables, or that
analyze, optimize, or repair tables. Repreparation also
occurs after referenced tables or views are flushed from the
table definition cache, either implicitly to make room for
new entries in the cache, or explicitly due to
FLUSH
TABLES.
Repreparation is automatic, but to the extent that it occurs, performance of prepared statements is diminished.
Table content changes (for example, with
INSERT or
UPDATE) do not cause
repreparation, nor do SELECT
statements.
An incompatibility with previous versions of MySQL is that a
prepared statement may now return a different set of columns
or different column types from one execution to the next.
For example, if the prepared statement is SELECT *
FROM t1, altering t1 to contain
a different number of columns causes the next execution to
return a number of columns different from the previous
execution.
Older versions of the client library cannot handle this change in behavior. For applications that use prepared statements with the new server, an upgrade to the new client library is strongly recommended.
Along with this change to statement repreparation, the
default value of the
table_definition_cache
system variable has been increased from 128 to 256. The
purpose of this increase is to lessen the chance that
prepared statements will need repreparation due to
referred-to tables/views having been flushed from the cache
to make room for new entries.
A new status variable,
Com_stmt_reprepare, has been introduced
to track the number of repreparations.
Incompatible change: In
MySQL 5.1.24, the utf8_general_ci and
ucs2_general_ci collations were fixed to
sort the letter "U+00DF SHARP S" equal to
's'. As a result of this fix, any indexes
on columns that use these collations (but only columns that
use SHARP S) must be rebuilt when upgrading to 5.1.24 or
higher. To do this, use ALTER
TABLE to drop and re-add the indexes, or
mysqldump to dump the affected tables and
mysql to reload the dump file.
Incompatible change: MySQL
5.1 implements support for a plugin API that
allows the loading and unloading of components at runtime,
without restarting the server. Section 22.2, “The MySQL Plugin Interface”.
The plugin API requires the mysql.plugin
table. After upgrading from an older version of MySQL, you
should run the mysql_upgrade command to
create this table. See Section 4.4.8, “mysql_upgrade — Check Tables for MySQL Upgrade”.
Plugins are installed in the directory named by the
plugin_dir system variable.
This variable also controls the location from which the
server loads user-defined functions (UDFs), which is a
change from earlier versions of MySQL. That is, all UDF
library files now must be installed in the plugin directory.
When upgrading from an older version of MySQL, you must
migrate your UDF files to the plugin directory.
Incompatible change: The
table_cache system variable
has been renamed to
table_open_cache. Any
scripts that refer to
table_cache should be
updated to use the new name.
Incompatible change: Several issues were identified for stored programs (stored functions and procedures, triggers, and events) and views containing non-ASCII symbols. These issues involved conversion errors due to incomplete character set information when translating these objects to and from stored format.
To address these problems, the representation for these
objects was changed in MySQL 5.1.21. However, the fixes
affect all stored programs and views.
(For example, you will see warnings about “no creation
context.”) To avoid warnings from the server about
the use of old definitions from any release prior to 5.1.21,
you should dump stored programs and views with
mysqldump after upgrading to 5.1.21 or
higher, and then reload them to recreate them with new
definitions. Invoke mysqldump with a
--default-character-set option that names
the non-ASCII character set that was used for the
definitions when the objects were originally defined.
Incompatible change: As of
MySQL 5.1.20, mysqld_safe supports error
logging to syslog on systems that support
the logger command. The new
--syslog and --skip-syslog
options can be used instead of the
--log-error option to control logging
behavior, as described in Section 4.3.2, “mysqld_safe — MySQL Server Startup Script”.
In 5.1.21 and up, the default is
--skip-syslog, which is compatible with the
default behavior of writing an error log file for releases
prior to 5.1.20.
In 5.1.20 only,
the following conditions apply: 1) The default is
to use syslog, which is not compatible
with releases prior to 5.1.20. 2) Logging to
syslog may fail to operate correctly in
some cases, so we recommend that you use
--skip-syslog or
--log-error. To maintain the older behavior
if you were using no error-logging option, use
--skip-syslog. If you were using
--log-error, continue to use it.
Incompatible change: As of
MySQL 5.1.15, InnoDB rolls back only the
last statement on a transaction timeout. A new option,
--innodb_rollback_on_timeout, causes
InnoDB to abort and roll back the entire
transaction if a transaction timeout occurs (the same
behavior as in MySQL 4.1).
Incompatible change: As of
MySQL 5.1.15, the following conditions apply to enabling the
read_only system variable:
If you attempt to enable
read_only while you
have any explicit locks (acquired with
LOCK TABLES or have a
pending transaction, an error will occur.
If other clients hold explicit table locks or have
pending transactions, the attempt to enable
read_only blocks until
the locks are released and the transactions end. While
the attempt to enable
read_only is pending,
requests by other clients for table locks or to begin
transactions also block until
read_only has been set.
read_only can be
enabled while you hold a global read lock (acquired with
FLUSH TABLES WITH
READ LOCK) because that does not involve table
locks.
Previously, the attempt to enable
read_only would return
immediately even if explicit locks or transactions were
pending, so some data changes could occur for statements
executing in the server at the same time.
Incompatible change: The
number of function names affected by
IGNORE_SPACE was reduced
significantly in MySQL 5.1.13, from about 200 to about 30.
(For details about
IGNORE_SPACE, see
Section 8.2.4, “Function Name Parsing and Resolution”.) This change improves
the consistency of parser operation. However, it also
introduces the possibility of incompatibility for old SQL
code that relies on the following conditions:
IGNORE_SPACE is
disabled.
The presence or absence of whitespace following a
function name is used to distinguish between a built-in
function and stored function that have the same name
(for example, PI() versus
PI ()).
For functions that are no longer affected by
IGNORE_SPACE as of MySQL
5.1.13, that strategy no longer works. Either of the
following approaches can be used if you have code that is
subject to the preceding incompatibility:
If a stored function has a name that conflicts with a
built-in function, refer to the stored function with a
schema name qualifier, regardless of whether whitespace
is present. For example, write
or schema_name.PI().
schema_name.PI
()
Alternatively, rename the stored function to use a non-conflicting name and change invocations of the function to use the new name.
Incompatible change: For
utf8 columns, the full-text parser
incorrectly considered several non-word punctuation and
whitespace characters as word characters, causing some
searches to return incorrect results. The fix involves a
change to the full-text parser in MySQL 5.1.12, so as of
5.1.12, any tables that have FULLTEXT
indexes on utf8 columns must be repaired
with REPAIR TABLE:
REPAIR TABLE tbl_name QUICK;
Incompatible change:
Storage engines can be pluggable at runtime, so the
distinction between disabled and invalid storage engines no
longer applies. As of MySQL 5.1.12, this affects the
NO_ENGINE_SUBSTITUTION SQL
mode, as described in Section 5.1.7, “Server SQL Modes”.
Incompatible change: The
structure of FULLTEXT indexes has been
changed in MySQL 5.1.6. After upgrading to MySQL 5.1.6 or
greater, use the REPAIR TABLE ... QUICK
statement for each table that contains any
FULLTEXT indexes.
Incompatible change: In
MySQL 5.1.6, when log tables were implemented, the default
log destination for the general query and slow query log was
TABLE. As of MySQL 5.1.21, this default
has been changed to FILE, which is
compatible with MySQL 5.0, but incompatible with earlier
releases of MySQL 5.1 from 5.1.6 to 5.1.20. If you are
upgrading from MySQL 5.0 to this release, no logging option
changes should be necessary. However, if you are upgrading
from 5.1.6 through 5.1.20 to this release and were using
TABLE logging, use the
--log-output=TABLE option explicitly to
preserve your server's table-logging behavior.
Incompatible change: For
ENUM columns that had
enumeration values containing commas, the commas were mapped
to 0xff internally. However, this rendered the commas
indistinguishable from true 0xff characters in the values.
This no longer occurs. However, the fix requires that you
dump and reload any tables that have
ENUM columns containing true
0xff in their values: Dump the tables using
mysqldump with the current server before
upgrading from a version of MySQL 5.1 older than 5.1.15 to
version 5.1.15 or newer.
As of MySQL 5.1.12, the
lc_time_names system
variable specifies the locale that controls the language
used to display day and month names and abbreviations. This
variable affects the output from the
DATE_FORMAT(),
DAYNAME() and
MONTHNAME() functions. See
Section 9.8, “MySQL Server Locale Support”.
As of MySQL 5.1.6, special characters in database and table identifiers are encoded when creating the corresponding directory names and filenames. This relaxes the restrictions on the characters that can appear in identifiers. See Section 8.2.3, “Mapping of Identifiers to Filenames”. To cause database and table names to be updated to the new format should they contain special characters, re-encode them with mysqlcheck. The following command updates all names to the new encoding:
shell> mysqlcheck --check-upgrade --fix-db-names --fix-table-names --all-databases
mysqlcheck cannot fix names that contain
literal instances of the @ character that
is used for encoding special characters. If you have
databases or tables that contain this character, use
mysqldump to dump them before upgrading
to MySQL 5.1.6 or later, and then reload the dump file after
upgrading.
As of MySQL 5.1.9, mysqld_safe no longer
implicitly invokes mysqld-max if it
exists. Instead, it invokes mysqld unless
a --mysqld or
--mysqld-version option is given to specify
another server explicitly. If you previously relied on the
implicit invocation of mysqld-max, you
should use an appropriate option now.
SQL Changes:
Incompatible change:
Multiple-table DELETE
statements containing ambiguous aliases could have
unintended side effects such as deleting rows from the wrong
table. Example:
DELETE FROM t1 AS a2 USING t1 AS a1 INNER JOIN t2 AS a2;
As of MySQL 5.1.23, alias declarations can be declared only
in the table_references part.
Elsewhere in the statement, alias references are allowed but
not alias declarations. Statements containing aliases that
are no longer allowed must be rewritten.
Important note: Prior to MySQL 5.1.17, the parser accepted invalid code in SQL condition handlers, leading to server crashes or unexpected execution behavior in stored programs. Specifically, the parser allowed a condition handler to refer to labels for blocks that enclose the handler declaration. This was incorrect because block label scope does not include the code for handlers declared within the labeled block.
As of 5.1.17, the parser rejects this invalid construct, but if you upgrade in place (without dumping and reloading your databases), existing handlers that contain the construct still are invalid even if they appear to function as you expect and should be rewritten.
To find affected handlers, use mysqldump to dump all stored functions and procedures, triggers, and events. Then attempt to reload them into an upgraded server. Handlers that contain illegal label references will be rejected.
For more information about condition handlers and writing
them to avoid invalid jumps, see
Section 12.8.4.2, “DECLARE for Handlers”.
Incompatible change: The
parser accepted statements that contained /* ...
*/ that were not properly closed with
*/, such as SELECT 1 /* +
2. As of MySQL 5.1.23, statements that contain
unclosed /*-comments now are rejected
with a syntax error.
This fix has the potential to cause incompatibilities.
Because of Bug#26302, which caused the trailing
*/ to be truncated from comments in
views, stored routines, triggers, and events, it is possible
that objects of those types may have been stored with
definitions that now will be rejected as syntactically
invalid. Such objects should be dropped and re-created so
that their definitions do not contain truncated comments.
Incompatible change: As of
MySQL 5.1.8, TYPE =
is still
accepted as a synonym for the engine_nameENGINE =
table
option but generates a warning. You should note that this
option is not available in MySQL 5.1.7, and
is removed altogether as of MySQL
5.2.5 and produces a syntax error.
engine_name
TYPE has been deprecated since MySQL 4.0.
Incompatible change: The
namespace for triggers has changed in MySQL 5.0.10.
Previously, trigger names had to be unique per table. Now
they must be unique within the schema (database). An
implication of this change is that DROP
TRIGGER syntax now uses a schema name instead of a
table name (schema name is optional and, if omitted, the
current schema will be used).
When upgrading from a previous version of MySQL 5 to MySQL
5.0.10 or newer, you must drop all triggers and re-create
them or DROP TRIGGER will not
work after the upgrade. Here is a suggested procedure for
doing this:
Upgrade to MySQL 5.0.10 or later to be able to access
trigger information in the
INFORMATION_SCHEMA.TRIGGERS
table. (It should work even for pre-5.0.10 triggers.)
Dump all trigger definitions using the following
SELECT statement:
SELECT CONCAT('CREATE TRIGGER ', t.TRIGGER_SCHEMA, '.', t.TRIGGER_NAME,
' ', t.ACTION_TIMING, ' ', t.EVENT_MANIPULATION, ' ON ',
t.EVENT_OBJECT_SCHEMA, '.', t.EVENT_OBJECT_TABLE,
' FOR EACH ROW ', t.ACTION_STATEMENT, '//' )
INTO OUTFILE '/tmp/triggers.sql'
FROM INFORMATION_SCHEMA.TRIGGERS AS t;
The statement uses INTO OUTFILE, so
you must have the FILE
privilege. The file will be created on the server host;
use a different filename if you like. To be 100% safe,
inspect the trigger definitions in the
triggers.sql file, and perhaps make
a backup of the file.
Stop the server and drop all triggers by removing all
.TRG files in your database
directories. Change location to your data directory and
issue this command:
shell> rm */*.TRG
Start the server and re-create all triggers using the
triggers.sql file: For example in
my case it was:
mysql>delimiter // ;mysql>source /tmp/triggers.sql //
Check that all triggers were successfully created using
the SHOW TRIGGERS statement.
Incompatible change: MySQL
5.1.6 introduces the TRIGGER
privilege. Previously, the
SUPER privilege was needed to
create or drop triggers. Now those operations require the
TRIGGER privilege. This is a
security improvement because you no longer need to grant
users the SUPER privilege to
enable them to create triggers. However, the requirement
that the account named in a trigger's
DEFINER clause must have the
SUPER privilege has changed
to a requirement for the
TRIGGER privilege. When
upgrading from a previous version of MySQL 5.0 or 5.1 to
MySQL 5.1.6 or newer, be sure to update your grant tables as
described in Section 4.4.8, “mysql_upgrade — Check Tables for MySQL Upgrade”. This process
assigns the TRIGGER privilege
to all accounts that had the
SUPER privilege. If you fail
to update the grant tables, triggers may fail when
activated. (After updating the grant tables, you can revoke
the SUPER privilege from
those accounts that no longer otherwise require it.)
Some keywords are reserved in MySQL 5.1 that were not reserved in MySQL 5.0. See Section 8.3, “Reserved Words”.
The LOAD DATA FROM MASTER and
LOAD TABLE FROM MASTER statements are
deprecated. See Section 12.6.2.2, “LOAD DATA FROM MASTER Syntax”, for
recommended alternatives.
The INSTALL PLUGIN and
UNINSTALL PLUGIN statements
that are used for the plugin API are new. So is the
WITH PARSER clause for
FULLTEXT index creation that associates a
parser plugin with a full-text index.
Section 22.2, “The MySQL Plugin Interface”.
C API Changes:
Incompatible change: As of
MySQL 5.1.7, the
mysql_stmt_attr_get() C API
function returns a boolean rather than an unsigned int for
STMT_ATTR_UPDATE_MAX_LENGTH. (Bug#16144)


User Comments
Add your own comment.