介绍升级MySQL安装的步骤。
升级是一个常见的过程,因为可以在同一个MySQL版本系列中修复错误,或者在主要MySQL版本之间修复重要功能。
可以首先在一些测试系统上执行此过程,以确保一切正常工作,然后在生产系统上执行此过程。
注意
在下面的讨论中,必须使用具有管理权限的MySQL帐户运行的MySQL命令在命令行中包含-u root以指定MySQL root用户。
需要root用户密码的命令还包括-p选项。
一、写在开始之前
升级前请查看本节中的信息。执行任何建议的操作。
•通过创建备份来保护数据。备份应该包括mysql系统数据库,其中包含mysql系统表。
•查看发行说明以获取有关修复、更改和新功能的信息。
•升级过程因平台和初始安装的执行方式而异。使用适用于当前MySQL安装的过程:
•有关在非Windows平台上基于二进制和包的安装,请参阅MySQL官方文档第2.11.4节“在Unix/Linux上升级MySQL二进制或基于包的安装”。
注意
对于受支持的Linux发行版,升级基于包的安装的首选方法是使用MySQL软件存储库(MySQL Yum存储库、MySQL APT存储库和MySQL SLES存储库)。
•有关使用MySQL-Yum存储库在企业Linux平台或Fedora上的安装,请参阅MySQL官方文档第2.11.5节“使用MySQL-Yum存储库升级MySQL”。
•有关使用MySQL APT repository在Ubuntu上的安装,请参阅MySQL官方文档第2.11.6节“使用MySQL APT repository升级MySQL”。
•有关使用MySQL SLES存储库在SLES上的安装,请参阅MySQL官方文档第2.11.7节“使用MySQL SLES存储库升级MySQL”。
•有关使用Docker执行的安装,请参阅MySQL官方文档第2.11.9节“升级MySQL的Docker安装”。
•有关Windows上的安装,请参阅MySQL官方文档第2.11.8节“在Windows上升级MySQL”。
•如果您的MySQL安装包含大量数据,在in-place升级后转换可能需要很长时间,
那么创建一个测试实例来评估所需的转换以及执行转换所需的工作会是有必要的。要创建测试实例,
•在安装或升级到新版本的MySQL时,建议重新构建和重新安装MySQL语言接口。这适用于MySQL接口,如PHP MySQL扩展和Perl DBD::MySQL模块。
二、升级说明
•仅在一般可用性(GA)版本之间支持升级。
•支持从MySQL 5.6升级到5.7。建议在升级到下一版本之前先升级到最新版本。例如,在升级到MySQL 5.7之前,请先升级到最新的MySQL 5.6版本。
•不支持跳过版本的升级。例如,不支持直接从MySQL 5.5升级到5.7。
•支持在发行版系列中升级。例如,支持从MySQL 5.7.x升级到5.7.y。还支持跳过发布。例如,支持从MySQL 5.7.x升级到5.7.z。
三、MySQL 5.7中的更改
在升级到MySQL 5.7之前,请查看文描述的更改,以确定适用于当前MySQL安装和应用程序的更改。执行任何建议的操作。
标记为不兼容更改的指与早期版本的MySQL不兼容,升级前可能需要注意。目标是避免这些更改,但有时它们是必要的,可以纠正比版本之间比不兼容更糟糕的问题。
如果适用于当前安装的升级问题涉及不兼容,请按照说明进行操作。有时这涉及转储和重新加载表,或使用诸如CHECK TABLE或REPAIR TABLE之类的语句。
1> 配置更改
•不兼容的更改:从MySQL 5.7.12开始,默认的——--early-plugin-load为空。若要加载keyring_file插件,必须使用带有非空值的显式--early-plugin-load选项。
在MySQL 5.7.11中,默认的——-early-plugin-load值是keyring_file插件库文件的名称,因此默认情况下加载了该插件。InnoDB表空间加密要求在InnoDB初始化之前加载keyring_file插件,
因此这个默认值的改变——-early-plugin-load值引入了从5.7.11升级到5.7.12或更高版本的不兼容性。
加密了InnoDB表空间的管理员必须采取显式操作,以确保继续加载keyring_file插件:使用--early plugin load选项启动服务器,该选项命名插件库文件。
•不兼容的更改:INFORMATION_SCHEMA有包含系统和状态变量信息的表以及会话状态表)。从MySQL 5.7.6开始,Performance Schema还包含系统和状态变量表。
Performance Schema旨在替换INFORMATION_Schema表,从MySQL 5.7.6开始,INFORMATION_Schema表已被弃用,并将在以后的MySQL版本中删除。
有关从INFORMATION_SCHEMA迁移到Performance Schema tables的建议,为了帮助迁移,可以使用show_compatibility_56系统变量,
该变量将影响information_SCHEMA和Performance SCHEMA表以及show VARIABLES和show status语句如何提供系统和状态变量信息。
show_compatibility_56在5.7.6和5.7.7中默认启用,在MySQL 5.7.8中默认禁用。
•不兼容的更改:从MySQL 5.7.6开始,数据目录初始化只创建一个根帐户“root”@“localhost”。尝试连接到主机127.0.0.1通常会解析为本地主机帐户。但是,如果服务器在启用跳过名称解析的情况下运行,则此操作将失败。
如果打算这样做,请确保存在一个可以接受连接的帐户。例如,要能够使用--host=127.0.0.1或--host=::1以根用户身份连接,请创建以下帐户:
1 CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY 'root-password';
2
3 CREATE USER 'root'@'::1' IDENTIFIED BY 'root-password';
•不兼容的更改:从MySQL 5.7.6开始,对于某些Linux平台,当MySQL使用RPM和Debian包安装时,服务器的启动和关闭是使用systemd而不是mysqld-safe来管理的,mysqld-safe没有安装。
这可能需要对指定服务器选项的方式进行一些调整。
•不兼容的更改:在MySQL 5.7.5中,MySQL_install_db的可执行二进制版本位于bin安装目录中,而Perl版本位于scripts安装目录中。要从旧版本的MySQL升级,可以在两个目录中找到一个版本。
为了避免混淆,请删除脚本目录中的版本。对于新安装的MySQL 5.7.5或更高版本,MySQL_install_db只在bin目录中找到,而scripts目录不再存在。希望在脚本目录中找到mysql_install_db的应用程序应该更新为在bin目录中查找。
从mysql 5.7.6开始,mysql_install_db的位置就变得不那么重要了,因为在该版本中,mysqld--initialize(或mysqld--initialize unsecure)被弃用。
•不兼容的更改:在MySQL 5.7.5中,对SQL模式进行了以下更改:
•事务性存储引擎(Strict_TRANS_TABLES)的严格SQL模式现在默认启用。
•通过SQL模式实现的ONLY_FULL_GROUP_by变得更加复杂,不再拒绝以前被拒绝的确定性查询。因此默认情况下启用了ONLY_FULL_GROUP_BY,以禁止包含不能保证在组内唯一确定的表达式的不确定查询。
•对默认SQL模式的更改将导致启用以下模式时的默认SQL模式系统变量值:仅“完全”分组方式、“严格”传输表、无“引擎”替换。
•现在,ANSI-SQL模式中也包含了唯一的完整组模式。
2> 系统表更改
•不兼容的更改:mysql 5.7.6中删除了mysql.user系统表的Password列。所有凭据都存储在“authentication_string”列中,包括以前存储在“Password"列中的凭据。如果执行MySQL 5.7.6或更高版本的in-place升级,
按照升级过程的指示运行MySQL_upgrade,将密码列内容迁移到authentication_string列。
如果使用MySQL 5.7.6之前版本安装的MySQL dump转储文件执行逻辑升级,则必须遵守以下条件,才能使用mysqldump命令生成转储文件:
•必须包含--add drop table选项
•不能包含--flush特权选项
如逻辑升级过程中所述,在运行mysql_upgrade之前,将5.7.6之前的转储文件加载到5.7.6(或更高版本)服务器中。
3> 服务器更改
•不兼容的更改:从MySQL 5.7.5开始,不再支持使用旧的pre-4.1密码散列格式的密码,
•不兼容的更改:从MySQL 5.7.2开始,服务器需要MySQL.user中的帐户系统表具有非空的插件列值并禁用具有空值的帐户。
这需要升级mysql.user表以填充所有插件值。从MySQL 5.7.6开始,使用以下步骤:
如果计划使用现有MySQL安装中的数据目录进行升级:
1.停止旧的(MySQL 5.6)服务器
2.通过用新的二进制文件替换旧的二进制文件来升级MySQL二进制文件
3.正常启动MySQL 5.7服务器(无特殊选项)
4.运行mysql_upgrade以升级系统表
5.重启MySQL 5.7服务器
如果计划通过重新加载从现有MySQL安装生成的转储文件来升级:
1.要生成转储文件,请使用--add drop table选项运行mysqldump,而不使用--flush privileges选项
2.停止旧的(MySQL 5.6)服务器
3.升级MySQL二进制文件(用新二进制文件替换旧二进制文件)
4.正常启动MySQL 5.7服务器(无特殊选项)
5.重新加载转储文件(mysql
6.运行mysql_upgrade以升级系统表
7.重启MySQL 5.7服务器
在MySQL5.7.6之前,程序更为复杂:
如果计划使用现有MySQL安装中的数据目录进行升级:
1.停止旧的(MySQL 5.6)服务器
2.就地升级MySQL二进制文件(用新二进制文件替换旧二进制文件)
3.使用--skip grant tables选项重新启动服务器以禁用权限检查
4.运行mysql_upgrade以升级系统表
5.正常重新启动服务器(不带--跳过授予表)
如果计划通过重新加载从现有MySQL安装生成的转储文件来升级:
1.要生成转储文件,请在不使用--flush privileges选项的情况下运行mysqldump
2.停止旧的(MySQL 5.6)服务器
3.就地升级MySQL二进制文件(用新二进制文件替换旧二进制文件)
4.使用--skip grant tables选项重新启动服务器以禁用权限检查
5.重新加载转储文件(mysql
6.运行mysql_upgrade以升级系统表
7.正常重新启动服务器(不带--跳过授予表)
mysql_upgrade默认作为mysql root用户运行。对于前面的过程,如果密码已过期运行mysql_upgrade时,将看到一条消息,表明您的密码已过期,
因此mysql_upgrade失败。要更正此问题,请将根密码重置为未过期,然后再次运行mysql_upgrade:
1 shell> mysql -u root -p
2
3 Enter password: ****
4
5 mysql> ALTER USER USER() IDENTIFIED BY 'root-password'; # MySQL 5.7.6 and up
6
7 mysql> SET PASSWORD = PASSWORD('root-password'); # Before MySQL 5.7.6
8
9 mysql> quit
10
11 shell> mysql_upgrade -p
12
13 Enter password: ****
如果服务器是用--skip grant-tables启动的,则密码重置语句通常不起作用,但是第一次调用mysql_upgrade会刷新权限,因此当您运行mysql时,该语句将被接受。
如果mysql_upgrade本身使root 密码过期,则需要以相同的方式重新设置密码。
遵循上述说明后,建议DBA也将使用mysql_old_password authentication plugin的帐户转换为使用mysql_native_password,因为已删除对mysql_old_password的支持。
•不兼容的更改:在表创建时,列默认值可能对sql_mode值有效,但在插入或更新行时对sql_mode值无效。例子:
1 SET sql_mode = '';
2
3 CREATE TABLE t (d DATE DEFAULT 0);
4
5 SET sql_mode = 'NO_ZERO_DATE,STRICT_ALL_TABLES';
6
7 INSERT INTO t (d) VALUES(DEFAULT);
在这种情况下,对于CREATE表应该接受0,但是对于INSERT应该拒绝0。但是,以前服务器不会根据当前的sql模式计算用于插入或更新的默认值。在本例中,插入成功,并将“0000-00-00”插入“日期”列。
从MySQL 5.7.2开始,服务器应使用适当的sql_mode检查在插入或更新时生成警告或错误。
如果使用(binlog_format=statement),则复制的不兼容性是,如果slave升级,则未升级的master将毫无错误地执行前面的示例,而slave上的插入将失败,复制将停止。
要处理这个问题,请停止主节点上的所有新语句,并等待从节点赶上。然后升级slave,然后升级master。或者,如果无法停止新语句,则临时更改为(binlog_format=row),
并等待所有从服务器处理到该更改点为止生成的所有二进制日志。然后升级从服务器,然后升级主服务器,并将主服务器改回binlog_format=statement。
•不兼容的更改:为了更好地与Oracle audit Vault兼容,对审计日志插件进行了一些更改。为了升级,审计日志文件的默认格式已更改:以前使用属性编写的元素中的信息现在使用子元素编写。
旧格式的示例:
TIMESTAMP="2013-04-15T15:27:27"
NAME="Query"
CONNECTION_ID="3"
STATUS="0"
SQLTEXT="SELECT 1"
/>
新格式示例:
2013-04-15T15:27:27 UTC
3998_2013-04-15T15:27:27
Query
3
0
0
root[root] @ localhost [127.0.0.1]
localhost
127.0.0.1
select
SELECT 1
如果以前使用审计日志插件的旧版本,则使用此过程避免向包含旧格式条目的现有日志文件写入新格式的日志条目:
1.停止服务器。
2.手动重命名当前审核日志文件。此文件将只包含旧格式的日志项。
3.更新服务器并重新启动。审核日志插件将创建一个新的日志文件,其中只包含新的格式日志条目。
•从MySQL 5.7.7开始,复制从属服务器的默认连接超时从3600秒(1小时)更改为60秒(1分钟)。当没有设置slave_net_timeout系统变量的slave升级到MySQL 5.7时,
将应用新的默认值。heartbeat interval的默认设置是slave_net_timeout值的一半。心跳间隔记录在slave(mysql.slave_master_info表或master.info文件)中,
当从机网络超时的值或默认设置更改时,心跳间隔不会自动更改。使用默认连接超时和心跳间隔,然后升级到MySQL 5.7,因此心跳间隔比连接超时长得多。
如果主服务器上的活动水平是这样的,对二进制日志的更新至少每60秒发送一次给从服务器,那么这种情况就不是问题。但是,如果没有从主服务器接收到数据,因为没有发送心跳,连接超时就会过期。
因此,从服务器认为到主服务器的连接已经丢失,并进行多次重新连接尝试(由MASTER_CONNECT_RETRY和MASTER_RETRY_COUNT设置控制,这也可以在主服务器信息日志中看到)。
重连接尝试会产生大量的zombie dump线程,主线程必须杀死这些线程,从而导致主的错误日志包含遇到错误er_rpl_zombie_ENCOUNTERED。
为了避免这个问题,在将一个slave升级到MySQL 5.7之前,检查slave_net_timeout系统变量是否使用了默认设置。如果是这样,将MASTER改为MASTER_HEARTBEAT_PERIOD选项,并将心跳间隔设置为30秒,
这样它就可以使用升级后应用的新连接超时60秒。
4> InnoDB变更
•从MySQL 5.7.24开始,与MySQL绑定的zlib库版本从1.2.3版本提升到1.2.11版本。zlib 1.2.11中的zlib compressBound()函数返回的缓冲区大小估计值略高于zlib 1.2.3版本中的值。
如果已经用大行压缩了InnoDB表,建议在升级之前在MySQL 5.7测试实例上测试压缩表CREATE table语句。
•不兼容的更改:为了在崩溃恢复期间简化InnoDB表空间,MySQL 5.7.5引入了新的重做日志记录类型。此增强更改重做日志格式。在执行in-place升级之前,使用innodb_fast_shutdown设置0或1执行完全关闭。
建议使用innodb_fast_shutdown=0缓慢关机,这是in-place升级的一个步骤。
•不兼容的更改:MySQL 5.7.8和5.7.9撤消日志可能包含的空间列信息不足,这可能导致升级失败(Bug#2150858582)。在执行从MySQL 5.7.8或5.7.9到5.7.10或更高版本的就地升级之前,
使用innodb_fast_shutdown=0来清除撤销日志,执行一个缓慢的关闭。建议使用innodb_fast_shutdown=0缓慢关机。
•不兼容的更改:从MySQL 5.7.9开始,第一个重做日志文件(ib_logfile0)的重做日志头包含一个格式版本标识符和一个文本字符串,用于标识创建重做日志文件的MySQL版本。
此增强更改重做日志格式,要求在执行MySQL 5.7.9或更高版本的in-place升级之前,使用innodb快速关闭设置0或1彻底关闭MySQL。建议使用innodb_fast_shutdown=0缓慢关机,。
•在MySQL 5.7.9中,DYNAMIC将COMPACT替换为InnoDB表的隐式默认行格式。新的配置选项innodb_default_row_format指定默认的innodb row format。允许的值包括动态(默认)、压缩和冗余。
升级到5.7.9之后,创建的任何新表都将使用innodb_default_row_format除非明确定义行格式(row_format)。
对于没有显式定义ROW_FORMAT选项或使用ROW_FORMAT选项的现有表ROW_FORMAT=DEFAULT,任何重新构建表的操作都会悄悄地将表的行格式更改为innodb_default_row_format定义的格式。
•从MySQL 5.7.6开始,InnoDB存储引擎为使用InnoDB创建的任何新分区表使用自己的内置(“本机”)分区处理程序。在MySQL的早期版本中创建的分区InnoDB表不会自动升级。
可以使用以下任一方法轻松地将这些表升级为使用MySQL 5.7.9或更高版本中的InnoDB native partitioning:
•若要将单个表从通用分区处理程序升级为YNODB本机分区,请执行语句ALTALTABLE表名升级分区。
•要升级所有使用通用分区处理程序的InnoDB表以使用本机分区处理程序,请运行mysql_upgrade。
5> SQL更改
•不兼容的更改:GET_LOCK()函数在MySQL 5.7.5中使用元数据锁定(MDL)子系统重新实现,其功能已经扩展:
•以前,GETSyLink()允许一次只获取一个命名锁,而另一个GETSyLoCK()调用释放任何现有的锁。现在,GETSyLoCK()允许获取一个以上的同时命名的锁,并且不释放现有的锁。
依赖于GET_LOCK()释放任何先前锁的行为的应用程序必须针对新行为进行修改。
•获取多个锁的能力引入了客户端之间死锁的可能性。MDL子系统检测到死锁,并在发生此情况时返回ER_USER_LOCK_deadlock错误。
•MDL子系统对锁名施加64个字符的限制,所以这个限制现在也适用于命名锁。以前没有执行长度限制。
•使用GET_LOCK()获取的锁现在显示在Performance Schema metadata_locks表中。OBJECT_TYPE列表示用户级锁,OBJECT_NAME列表示锁名称。
•一个新函数RELEASE_ALL_LOCKS()允许一次释放所有获取的命名锁。
•优化器现在以一致的方式处理FROM子句中的派生表和视图,以更好地避免不必要的物化,并允许使用下推条件来生成更高效的执行计划。但是,对于修改表的DELETE或UPDATE等语句,
对以前具体化的派生表使用合并策略可能会导致ER_UPDATE_table_USED错误:
1 mysql> DELETE FROM t1
2 -> WHERE id IN (SELECT id
3 -> FROM (SELECT t1.id
4 -> FROM t1 INNER JOIN t2 USING (id)
5 -> WHERE t2.status = 0) AS t);
6
7 ERROR 1093 (HY000): You can't specify target table 't1'
8 for update in FROM clause
当将派生表合并到外部查询块时,如果语句同时选择和修改表,则会发生此错误。(具体化不会导致此问题,因为它实际上会将派生表转换为单独的表。)
若要避免此错误,请在执行语句之前禁用优化器开关系统变量的派生合并标志:
1 SET optimizer_switch = 'derived_merge=off';
派生的“合并”标志控制优化器是否尝试将FROM子句中的子查询和视图合并到外部查询块中,前提是没有其他规则阻止合并。默认情况下,标志处于启用状态以启用合并。
将标志设置为off可防止合并并避免刚才描述的错误。
•MySQL 5.7中可能保留了一些MySQL 5.6中没有保留的关键字。这可能会导致以前用作标识符的单词变为非法。要修复受影响的语句,请使用标识符引号。
•升级后,建议测试应用程序代码中指定的优化器提示,以确保仍然需要这些提示才能实现所需的优化策略。优化器增强有时会使某些优化器提示变得不必要。在某些情况下,不必要的优化器提示甚至可能适得其反。
•在UNION语句中,要对单个SELECT应用ORDER BY或LIMIT,请将子句放在包含SELECT的括号内:
1 (SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
2 UNION
3 (SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
以前版本的MySQL可能允许这样的语句不带括号。在MySQL 5.7中,对括号的要求是强制的。
四、在Unix/Linux上升级基于MySQL二进制或包的安装
本节介绍如何在Unix/Linux上升级MySQL二进制和基于包的安装。描述了in-place升级和逻辑升级的方法。
In-Place 升级
一个in-place升级包括关闭旧的MySQL服务器,用新的MySQL二进制文件或包替换新的MySQL二进制文件,在现有的数据目录上重新启动MySQL,并升级需要升级的现有安装的任何剩余部分。
注意
如果升级最初通过安装多个RPM软件包生成的安装,请升级所有软件包,而不仅仅是部分软件包。例如,如果以前安装了服务器和客户端RPM,则不要仅升级服务器RPM。
对于某些Linux平台,从RPM或Debian软件包安装MySQL包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,未安装mysqld_safe。在这种情况下,请使用systemd来启动和关闭服务器,
而不要使用以下说明中使用的方法。
要执行就in-place升级,请执行以下操作:
1.如果对InnoDB使用XA事务,在升级之前运行XA RECOVER以检查未提交的XA事务。如果返回结果,则通过发出XA commit或XA rollback语句来提交或回滚XA事务。
2.通过将innodb_fast_shutdown设置为0。例如:
1 mysql -u root -p --execute="SET GLOBAL innodb_fast_shutdown=0"
在缓慢关闭的情况下,InnoDB会在关闭之前执行完全清除和更改缓冲区合并,以确保数据文件在不同版本之间的文件格式差异时完全准备好。
3.关闭旧的MySQL服务器。例如:
1 mysqladmin -u root -p shutdown
4.升级MySQL二进制安装或包。如果升级二进制安装,请解压缩新的MySQL二进制分发包。请参阅获取和解压缩分发。对于基于包的安装,请安装新的包。
5.启动MySQL 5.7服务器,使用现有的数据目录。例如:
1 mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
6.运行mysql_升级。例如:
1 mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的mysql不兼容。mysql_upgrade还升级mysql系统数据库,以便可以利用新的特权或功能。
注意
mysql_upgrade不升级时区表或帮助表的内容。
7.关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。例如:
1 mysqladmin -u root -p shutdown
2 mysqld_safe --user=mysql --datadir=/path/to/existing-datadir &
Logical Upgrade
逻辑升级包括使用备份或导出实用程序(如mysqldump或mysqlpump)从旧的MySQL实例导出SQL,安装新的MySQL服务器,并将SQL应用于新的MySQL实例。
注意
对于某些Linux平台,从RPM或Debian软件包安装MySQL包括用于管理MySQL服务器启动和关闭的systemd支持。在这些平台上,未安装mysqld_safe。在这种情况下,
请使用systemd来启动和关闭服务器,而不要使用以下说明中使用的方法。
执行逻辑升级:
1.复习“开始前”中的信息。
2.从以前的MySQL安装导出您现有的数据:
注意
如果数据库中包含存储程序,请将--routines和--events选项与mysqldump一起使用(如上所示)。--all databases选项包括转储中的所有数据库,包括保存系统表的mysql数据库。
如果有包含生成列的表,请使用mysqldump
MySQL 5.7.9或更高版本提供的创建转储文件的实用工具。早期版本中提供的mysqldump实用程序对生成的列定义使用了不正确的语法(Bug #20769542)。你可以使用
INFORMATION_SCHEMA,用于用生成的列标识表。
3.关闭旧的MySQL服务器。例如:
1 mysqladmin -u root -p shutdown
4.安装MySQL 5.7。
5.初始化一个新的数据目录,
1 mysqld --initialize --datadir=/path/to/5.7-datadir
复制显示在屏幕上或写入错误日志供以后使用的临时“root”@“localhost”密码。
6.使用新的数据目录启动MySQL 5.7服务器。例如:
1 mysqld_safe --user=mysql --datadir=/path/to/5.7-datadir &
7. 重置根密码:
1 mysql> ALTER USER USER() IDENTIFIED BY 'your new password';
8.将先前创建的转储文件加载到新的MySQL服务器中。例如:
1 mysql -u root -p --force < data-for-upgrade.sql
注意
如果转储文件包含系统表,建议不要在服务器上启用gtid(gtid_mode=on)时加载转储文件。mysqldump为使用非事务性MyISAM存储引擎的系统表发出DML指令,并且在启用gtid时不允许这种组合。
还要注意,将转储文件从启用了GTIDs的服务器加载到启用了GTIDs的另一个服务器会导致生成不同的事务标识符。
9.运行mysql_升级。例如:
1 mysql_upgrade -u root -p
mysql_upgrade检查所有数据库中的所有表是否与当前版本的mysql不兼容。mysql_upgrade还升级mysql系统数据库,以便可以利用新的特权或功能。
注意
mysql_upgrade不升级时区表或帮助表的内容。
10.关闭并重新启动MySQL服务器,以确保对系统表所做的任何更改生效。例如:
1 mysqladmin -u root -p shutdown
2 mysqld_safe --user=mysql --datadir=/path/to/5.7-datadir &
五、使用MySQL-Yum存储库升级MySQL(详见MySQL官方文档)
六、使用MySQL APT存储库升级MySQL(详见MySQL官方文档)
七、使用MySQL SLES存储库升级MySQL(详见MySQL官方文档)
八、在Windows上升级MySQL(详见MySQL官方文档)
九、升级MySQL的Docker安装(详见MySQL官方文档)
十、使用直接下载的RPM包升级MySQL(详见MySQL官方文档)
十一、升级疑难解答
•如果出现问题,例如新的mysqld服务器没有启动,请验证以前安装的旧my.cnf文件。可以使用--print defaults选项(例如,mysqld--print defaults)对此进行检查。
如果此命令显示程序名以外的任何内容,则说明有一个活动的my.cnf文件,该文件会影响服务器或客户端的操作。
•如果在升级之后,遇到编译的客户机程序的问题,例如命令不同步或意外的核心转储,可能在以下情况下使用了旧的头文件或库文件
编译程序。在本例中,检查mysql.h文件和libmysqlclient.a的日期库来验证它们是否来自新的MySQL发行版。如果不是,用新的头和库重新编译程序。对于已编译的程序,
如果库主版本号已更改可能还需要重新编译(例如libmysqlclient.so.15 to libmysqlclient.so.16)
十二、重建或修复表或索引
本节介绍如何重建或修复表或索引,这可能是由以下原因造成的:
•更改MySQL处理数据类型或字符集的方式。例如,排序规则中的错误可能已被更正,需要重新生成表以更新使用排序规则的字符列的索引。
•由CHECK table、mysqlcheck或mysql_upgrade报告的必需表修复或升级。重建表的方法包括:
1> 卸载和重新加载方法
如果正在重建表,因为在二进制升级或降级之后,不同版本的MySQL将无法处理它们,则必须使用dump和reload方法。在转储表之前使用MySQL的原始版本升级或降级。然后在升级或降级后重新加载表。
如果只为了重建索引而使用重建表的dump和reload方法,则可以在升级或降级之前或之后执行转储。之后还必须重新加载。
如果需要重建InnoDB表,因为CHECK table操作表明需要升级表,那么可以使用mysql dump创建转储文件,使用mysql重新加载文件。
要通过转储和重新加载重建表,请使用mysql dump创建转储文件,使用mysql重新加载文件:
1 mysqldump db_name t1 > dump.sql
2 mysql db_name < dump.sql
要重建单个数据库中的所有表,请指定不带以下任何表名的数据库名称:
1 mysqldump db_name > dump.sql
2 mysql db_name < dump.sql
要重建所有数据库中的所有表,请使用--all databases选项:
1 mysqldump --all-databases > dump.sql
2 mysql < dump.sql
3
2> 更改表方法
若要使用ALTER table重新生成表,请使用“null”变更;也就是说,ALTER TABLE语句使用它已有的存储引擎的表。例如,如果t1是一个InnoDB表,那么使用以下语句:
1 ALTER TABLE t1 ENGINE = InnoDB;
2 ALTER TABLE t1 ENGINE=InnoDB;
如果不确定要在ALTER TABLE语句中指定哪个存储引擎,请使用SHOW CREATE TABLE来显示表定义。
3> 修复表方法
REPAIR TABLE方法仅适用于MyISAM、ARCHIVE和CSV表。
如果表检查操作指示存在损坏或需要升级,则可以使用修复表。例如,要修复MyISAM表,请使用以下语句:
1 REPAIR TABLE t1;
mysqlcheck--repair提供对repair TABLE语句的命令行访问。这是一种更方便的修复表的方法,因为可以使用--databases或--all-databases选项分别修复特定数据库或所有数据库中的所有表:
1 mysqlcheck --repair --databases db_name ...
2 mysqlcheck --repair --all-databases
十三、将MySQL数据库复制到另一台计算机
在需要在不同体系结构之间传输数据库的情况下,可以使用mysqldump创建包含SQL语句的文件。然后可以将文件传输到另一台计算机,并将其作为输入馈送到mysql客户端。
使用mysqldump--help查看可用的选项。
在两台计算机之间移动数据库的最简单(虽然不是最快)方法是在数据库所在的计算机上运行以下命令:
1 mysqladmin -h 'other_hostname' create db_name
2 mysqldump db_name | mysql -h 'other_hostname' db_name
如果要通过慢速网络从远程计算机复制数据库,可以使用以下命令:
1 mysqladmin create db_name
2 mysqldump -h 'other_hostname' --compress db_name | mysql db_name
还可以将转储文件存储在文件中,将文件传输到目标计算机,然后将文件加载到数据库中。例如,可以将数据库转储到源计算机上的压缩文件,如下所示:
1 mysqldump --quick db_name | gzip > db_name.gz
将包含数据库内容的文件传输到目标计算机,并在那里运行以下命令:
1 mysqladmin create db_name
2 gunzip < db_name.gz | mysql db_name
还可以使用mysqldump和mysqlimport来传输数据库。对于大型表,这比简单地使用mysqldump快得多。在以下命令中,DUMPDIR表示用于存储mysqldump输出的目录的完整路径名。
首先,创建输出文件的目录并转储数据库:
1 mkdir DUMPDIR
2 mysqldump --tab=DUMPDIR db_name
然后将DUMPDIR目录中的文件传输到目标机器上的某个对应目录中,并在那里将文件加载到MySQL中:
1 mysqladmin create db_name # create database
2 cat DUMPDIR/*.sql | mysql db_name # create tables in database
3 mysqlimport db_name DUMPDIR/*.txt # load data into tables
不要忘记复制mysql数据库,因为这是存储grant表的地方。在MySQL数据库就位之前,必须作为MySQL root用户在新机器上运行命令。
在新机器上导入mysql数据库后,执行mysqladmin flush权限以便服务器重新加载授权表信息。
注意
可以在支持相同浮点格式的不同体系结构之间复制MyISAM表的.frm、.MYI和.MYD文件。