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.
To upgrade to 5.5 from any previous version, MySQL recommends that you dump your tables with mysqldump before upgrading and reload the dump file after upgrading.
In general, you should do the following when upgrading from MySQL 5.1 to 5.5:
Read all the items in the following sections to see whether any of them might affect your applications:
Section 2.13.1, “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.5 change history describes significant new features you can use in 5.5 or that differ from those found in earlier MySQL releases. Some of these changes may result in incompatibilities. See Section D.1, “Changes in Release 5.5.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 dumping and reloading tables, or use of a statement such as
CHECK TABLE
orREPAIR TABLE
.For dump and reload instructions, see Section 2.13.4, “Rebuilding or Repairing Tables or Indexes”. Any procedure that involves
REPAIR TABLE
with theUSE_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.4.2.5, “REPAIR TABLE
Syntax”.Before upgrading to a new version of MySQL, Section 2.13.3, “Checking Whether Tables or Indexes Must Be Rebuilt”, to see whether changes to table formats or to character sets or collations were made between your current version of MySQL and the version to which you are upgrading. If so and these changes result in an incompatibility between MySQL versions, you will need to upgrade the affected tables using the instructions in Section 2.13.4, “Rebuilding or Repairing Tables or Indexes”.
After upgrading to a new version of MySQL, run mysql_upgrade (see Section 4.4.7, “mysql_upgrade — Check Tables for MySQL Upgrade”). This program checks your tables, and attempts to repair them if necessary. It also updates 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.)
mysql_upgrade does not upgrade the contents of the help tables. For upgrade instructions, see Section 5.1.8, “Server-Side Help”.
If you run MySQL Server on Windows, see Section 2.3.7, “Upgrading MySQL on Windows”.
If you use replication, see Section 17.4.3, “Upgrading a Replication Setup”, for information on upgrading your replication setup.
If your MySQL installation contains a large amount of data that
might take a long time to convert after an in-place upgrade, you
might find it useful to create a “dummy” database
instance for assessing what conversions might be needed and the
work involved to perform them. Make a copy of your MySQL
instance that contains a full copy of the
mysql
database, plus all other databases
without data. Run your upgrade procedure on this dummy instance
to see what actions might be needed so that you can better
evaluate the work involved when performing actual data
conversion on your original database instance.
The following lists describe changes that may affect applications and that you should watch out for when upgrading from MySQL 5.1 to 5.5.
Configuration Changes
Incompatible change: The
InnoDB Plugin
is included in MySQL 5.5 releases. It becomes the built-in version ofInnoDB
in MySQL Server, replacing the version previously included as the built-inInnoDB
engine.InnoDB Plugin
is also available in MySQL 5.1 as of 5.1.38, but it is an optional storage engine that must be enabled explicitly using two server options:[mysqld] ignore-builtin-innodb plugin-load=innodb=ha_innodb_plugin.so
If you were using
InnoDB Plugin
in MySQL 5.1 by means of those options, you must remove them after an upgrade to 5.5 or the server will fail to start.In addition, in
InnoDB Plugin
, theinnodb_file_io_threads
system variable has been removed and replaced withinnodb_read_io_threads
andinnodb_write_io_threads
. If you upgrade from MySQL 5.1 to MySQL 5.5 and previously explicitly setinnodb_file_io_threads
at server startup, you must change your configuration. Either remove any reference toinnodb_file_io_threads
or replace it with references toinnodb_read_io_threads
andinnodb_write_io_threads
.Incompatible change: In MySQL 5.5, the server includes a plugin services interface that complements the plugin API. The services interface enables server functionality to be exposed as a “service” that plugins can access through a function-call interface. The
libmysqlservices
library provides access to the available services and dynamic plugins now must be linked against this library (use the-lmysqlservices
flag). For an example showing whatMakefile.am
should look like, see Section 23.2.6, “MySQL Services for Plugins”.
Server Changes
Incompatible change: As of MySQL 5.5.7, the server requires that a new grant table,
proxies_priv
, be present in themysql
database. If you are upgrading to 5.5.7 from a previous MySQL release rather than performing a new installation, the server will find that this table is missing and exit during startup with the following message:Table 'mysql.proxies_priv' doesn't exist
To create the
proxies_priv
table, start the server with the--skip-grant-tables
option to cause it to skip the normal grant table checks, then run mysql_upgrade. For example:shell>
mysqld --skip-grant-tables &
shell>mysql_upgrade
Then stop the server and restart it normally.
You can specify other options on the mysqld command line if necessary. Alternatively, if your installation is configured so that the server normally reads options from an option file, use the
--defaults-file
option to specify the file (enter each command on a single line):shell>
mysqld --defaults-file=/usr/local/mysql/etc/my.cnf
--skip-grant-tables &
shell>mysql_upgrade
With the
--skip-grant-tables
option, the server does no password or privilege checking, so any client can connect and effectively have all privilges. For additional security, use the--skip-networking
option as well to prevent remote clients from connecting.NoteThis problem is fixed in MySQL 5.5.8; the server treats a missing
proxies_priv
table as equivalent to an empty table. However, after starting the server, you should still run mysql_upgrade to create the table.Incompatible change: As of MySQL 5.5.7,
InnoDB
always uses the fast truncation technique, equivalent toDROP TABLE
andCREATE TABLE
. It no longer performs a row-by-row delete for tables with parent-child foreign key relationships.TRUNCATE TABLE
returns an error for such tables. Modify your SQL to issueDELETE FROM
for such tables instead.table_name
Incompatible change: Prior to MySQL 5.5.7, if you flushed the logs using
FLUSH LOGS
or mysqladmin flush-logs and mysqld was writing the error log to a file (for example, if it was started with the--log-error
option), it renames the current log file with the suffix-old
, then created a new empty log file. This had the problem that a second log-flushing operation thus caused the original error log file to be lost unless you saved it under a different name. For example, you could use the following commands to save the file:shell>
mysqladmin flush-logs
shell>mv
host_name
.err-oldbackup-directory
To avoid the preceding file-loss problem, no renaming occurs as of MySQL 5.5.7; the server merely closes and reopens the log file. To rename the file, you can do so manually before flushing. Then flushing the logs reopens a new file with the original file name. For example, you can rename the file and create a new one using the following commands:
shell>
mv
shell>host_name
.errhost_name
.err-oldmysqladmin flush-logs
shell>mv
host_name
.err-oldbackup-directory
Incompatible change: As of MySQL 5.5.6, handling of
CREATE TABLE IF NOT EXISTS ... SELECT
statements has been changed for the case that the destination table already exists:Previously, for
CREATE TABLE IF NOT EXISTS ... SELECT
, MySQL produced a warning that the table exists, but inserted the rows and wrote the statement to the binary log anyway. By contrast,CREATE TABLE ... SELECT
(withoutIF NOT EXISTS
) failed with an error, but MySQL inserted no rows and did not write the statement to the binary log.MySQL now handles both statements the same way when the destination table exists, in that neither statement inserts rows or is written to the binary log. The difference between them is that MySQL produces a warning when
IF NOT EXISTS
is present and an error when it is not.
This change in handling of
IF NOT EXISTS
results in an incompatibility for statement-based replication from a MySQL 5.1 master with the original behavior and a MySQL 5.5 slave with the new behavior. Suppose thatCREATE TABLE IF NOT EXISTS ... SELECT
is executed on the master and the destination table exists. The result is that rows are inserted on the master but not on the slave. (Row-based replication does not have this problem.)To address this issue, statement-based binary logging for
CREATE TABLE IF NOT EXISTS ... SELECT
is changed in MySQL 5.1 as of 5.1.51:If the destination table does not exist, there is no change: The statement is logged as is.
If the destination table does exist, the statement is logged as the equivalent pair of
CREATE TABLE IF NOT EXISTS
andINSERT ... SELECT
statements. (If theSELECT
in the original statement is preceded byIGNORE
orREPLACE
, theINSERT
becomesINSERT IGNORE
orREPLACE
, respectively.)
This change provides forward compatibility for statement-based replication from MySQL 5.1 to 5.5 because when the destination table exists, the rows will be inserted on both the master and slave. To take advantage of this compatibility measure, the 5.1 server must be at least 5.1.51 and the 5.5 server must be at least 5.5.6.
To upgrade an existing 5.1-to-5.5 replication scenario, upgrade the master first to 5.1.51 or higher. Note that this differs from the usual replication upgrade advice of upgrading the slave first.
A workaround for applications that wish to achieve the original effect (rows inserted regardless of whether the destination table exists) is to use
CREATE TABLE IF NOT EXISTS
andINSERT ... SELECT
statements rather thanCREATE TABLE IF NOT EXISTS ... SELECT
statements.Along with the change just described, the following related change was made: Previously, if an existing view was named as the destination table for
CREATE TABLE IF NOT EXISTS ... SELECT
, rows were inserted into the underlying base table and the statement was written to the binary log. As of MySQL 5.1.51 and 5.5.6, nothing is inserted or logged.Incompatible change: Prior to MySQL 5.5.6, if the server was started with
character_set_server
set toutf16
, it crashed during full-text stopword initialization. Now the stopword file is loaded and searched usinglatin1
ifcharacter_set_server
isucs2
,utf16
, orutf32
. If any table was created withFULLTEXT
indexes while the server character set wasucs2
,utf16
, orutf32
, it should be repaired using this statement:REPAIR TABLE
tbl_name
QUICK;Incompatible change: As of MySQL 5.5.5, all numeric operators and functions on integer, floating-point and
DECIMAL
values throw an “out of range” error (ER_DATA_OUT_OF_RANGE
) rather than returning an incorrect value orNULL
, when the result is out of the supported range for the corresponding data type. See Section 10.6, “Out-of-Range and Overflow Handling”.Incompatible change: As of MySQL 5.5.3, the Unicode implementation has been extended to provide support for supplementary characters that lie outside the Basic Multilingual Plane (BMP). Noteworthy features:
utf16
andutf32
character sets have been added. These correspond to the UTF-16 and UTF-32 encodings of the Unicode character set, and they both support supplementary characters.The
utf8mb4
character set has been added. This is similar toutf8
, but its encoding allows up to four bytes per character to enable support for supplementary characters.The
ucs2
character set is essentially unchanged except for the inclusion of some newer BMP characters.
In most respects, upgrading to MySQL 5.5 should present few problems with regard to Unicode usage, although there are some potential areas of incompatibility. These are the primary areas of concern:
For the variable-length character data types (
VARCHAR
and theTEXT
types), the maximum length in characters is less forutf8mb4
columns than forutf8
columns.For all character data types (
CHAR
,VARCHAR
, and theTEXT
types), the maximum number of characters that can be indexed is less forutf8mb4
columns than forutf8
columns.
Consequently, if you want to upgrade tables from
utf8
toutf8mb4
to take advantage of supplementary-character support, it may be necessary to change some column or index definitions.For additional details about the new Unicode character sets and potential incompatibilities, see Section 9.1.10, “Unicode Support”, and Section 9.1.11, “Upgrading from Previous to Current Unicode Support”.
Incompatible change: As of MySQL 5.5.3, the server includes
dtoa
, a library for conversion between strings and numbers by David M. Gay. In MySQL, this library provides the basis for improved conversion between string orDECIMAL
values and approximate-value (FLOAT
/DOUBLE
) numbers.Because the conversions produced by this library differ in some cases from previous results, the potential exists for incompatibilities in applications that rely on previous results. For example, applications that depend on a specific exact result from previous conversions might need adjustment to accommodate additional precision.
For additional information about the properties of
dtoa
conversions, see Section 11.2, “Type Conversion in Expression Evaluation”.Incompatible change: In MySQL 5.5, several changes were made regarding the language and character set of error messages:
The
--language
option for specifying the directory for the error message file is now deprecated. The new--lc-messages-dir
and--lc-messages
options should be used instead, and--language
is handled as an alias for--lc-messages-dir
.The
language
system variable has been removed and replaced with the newlc_messages_dir
andlc_messages
system variables.lc_messages_dir
has only a global value and is read only.lc_messages
has global and session values and can be modified at runtime, so the error message language can be changed while the server is running, and individual clients each can have a different error message language by changing their sessionlc_messages
value to a different locale name.Error messages previously were constructed in a mix of character sets. This issue is resolved by constructing error messages internally within the server using UTF-8 and returning them to the client in the character set specified by the
character_set_results
system variable. The content of error messages therefore may in some cases differ from the messags returned previously.
For more information, see Section 9.2, “Setting the Error Message Language”, and Section 9.1.6, “Character Set for Error Messages”.
SQL Changes
Incompatible change: Previously, the parser accepted an
INTO
clause in nestedSELECT
statements, which is invalid because such statements must return their results to the outer context. As of MySQL 5.5.3, this syntax is no longer permitted and statements that use it must be changed.Incompatible change: In MySQL 5.5.3, several changes were made to alias resolution in multiple-table
DELETE
statements so that it is no longer possible to have inconsistent or ambiguous table aliases.In MySQL 5.1.23, alias declarations outside the
table_references
part of the statement were disallowed for theUSING
variant of multiple-tableDELETE
syntax, to reduce the possibility of ambiguous aliases that could lead to ambiguous statements that have unexpected results such as deleting rows from the wrong table.As of MySQL 5.5.3, alias declarations outside
table_references
are disallowed for all multiple-tableDELETE
statements. Alias declarations are permitted only in thetable_references
part.Incorrect:
DELETE FROM t1 AS a2 USING t1 AS a1 INNER JOIN t2 AS a2; DELETE t1 AS a2 FROM t1 AS a1 INNER JOIN t2 AS a2;
Correct:
DELETE FROM t1 USING t1 AS a1 INNER JOIN t2 AS a2; DELETE t1 FROM t1 AS a1 INNER JOIN t2 AS a2;
Previously, for alias references in the list of tables from which to delete rows in a multiple-table delete, the default database is used unless one is specified explicitly. For example, if the default database is
db1
, the following statement does not work because the unqualified alias referencea2
is interpreted as having a database ofdb1
:DELETE a1, a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2 WHERE a1.id=a2.id;
To correctly match an alias that refers to a table outside the default database, you must explicitly qualify the reference with the name of the proper database:
DELETE a1, db2.a2 FROM db1.t1 AS a1 INNER JOIN db2.t2 AS a2 WHERE a1.id=a2.id;
As of MySQL 5.5.3, alias resolution does not require qualification and alias references should not be qualified with the database name. Qualified names are interpreted as referring to tables, not aliases.
Statements containing alias constructs that are no longer permitted must be rewritten.
Some keywords may be reserved in MySQL 5.5 that were not reserved in MySQL 5.1. See Section 8.3, “Reserved Words”.