http://blog.csdn.net/shaochenshuo/article/details/52596589
那些被标记为"Known issue"和"Incompatible change"的变化,是同之前的mysql版本不兼容的,你需要特别关注。我们的目标是尽量避免两个版本之间出现这种不兼容的变化,但是有的时候我们为了解决某个严重的问题,会带来这种变化(当然这个问题肯定比两个版本间的不兼容更槽糕)。如果你在升级的过程中遇到一些不兼容问题需要特别处理时,请参照本节的不兼容说明进行处理。有时候这些处理涉及到对表进行dump然后重新导入,或者对表执行check table和repair table命令。
恢复表结构的命令,必须在upgrade之前执行。如果创建表和repair table table_name USE_FRM;两个操作在不同的数据库版本下进行的(即在upgrade后执行repair操作),可能会损坏表。
对于Mysql 5.7.12 --early-plugin-load参数(server command)默认值为空,如果想加载keyring_file插件你需要使用--early-plugin-load在mysql实例启动时进行指定
Mysql 5.7.11中--early-plugin-load默认值为keyring_file,所以默认是可以使用该插件的。如果需要对innodb 表空间进行加密,需要在innodb初始化之前加载keyring_file插件。这个默认值的变化就导致了从5.7.11 升级到5.7.12或者更高版本的时候可能会出现不兼容的现象。如果你在5.7.11使用了innodb 表空间加密,那么升级时要注意指定--early-plugin-load=keyring_file来启动高版本实例。更多信息请参考Section 7.5.3.1, “Keyring Plugin Installation”。
##NOTE: Mysql 5.6 升级到5.7 不需要注意该变化,因为5.6中没有引入--early-plugin-load server command
information_schema 数据库中包含了system variables和 status信息(保存在如下表中GLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUS)。到了Mysql 5.7.6中performance_schema数据库中也包含了如下信息。Mysql准备使用performance_schema中的表替换information_schema中的表,并且information_schema中的表在后面的版本中会被去除。
在Mysql 5.7.6中引入了show_compatibility_56参数(但是该参数在5.7.6在后面的版本中会被去掉,因为后面的版本会删除information_schema中的system variables和status相关表)。我们把该参数设置为on,那么同Mysql 5.6兼容,可以通过查看information_schema中相关表或者通过 show variables和show status(信息来源于information_schema中相关表)获得 variables和status信息。如果把该参数设置为off,那么可以通过查询performance_schema中相关表或者通过show variables和show status(信息来源于performance_schema中相关表)获得 variables和status信息,此时查询information_schema中的GLOBAL_VARIABLES,SESSION_VARIABLES,GLOBAL_STATUS,SESSION_STATUS表时会报错。
关于show_compatibility_56详细信息请见Section 6.1.5, “Server System Variables”,为了更好的理解,建议阅读下面几部分内容
如果你在linux系统上使用rpm包安装了Mysql 5.7.6,那么mysql的启停都是使用 systemd来控制而不是mysqld_safe,并且mysqld_safe不会被安装。这就需要你在管理数据库的时候做出一些变化,详细信息请见Section 2.5.10, “Managing MySQL Server with systemd”。
在Mysql 5.7.5中mysql_install_db被放在了安装目录的bin目录下(Mysql 5.6时放在scripts目录下),而Perl version被放在scripts目录下。这样如果使用in-place方式从老版本升级到Mysql 5.7.5,我们会发现bin目录和scripts目录下都存在mysql_install_db可执行文件,为了避免造成混乱,最好删除scripts目录中的mysql_install_db文件。如果需要使用mysql_install_db 文件,使用bin目录下的文件。
5.7.6及以后的版本中mysql_install_db位置已经不是很重要了,因为已经使用mysqld --initialize或者mysqld --initialize-insecure来对数据库进行初始化。
到了Mysql 5.7.5版本,sql_mode发生了如下变化
如果你发现因为启用ONLY_FULL_GROUP_BY导致某些应用语句出错,你可以考虑使用如下方法进行处理:
mysql> SELECT name, address, MAX(age) FROM t GROUP BY name;
ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP
BY clause and contains nonaggregated column 'mydb.t.address' which
is not functionally dependent on columns in GROUP BY clause; this
is incompatible with sql_mode=only_full_group_by
## 因为启用了only_full_group_by,所以上面的查询报错,我们可以把语句改写成如下两种方式,来解决
SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
或者
SELECT name, address, MAX(age) FROM t GROUP BY name,address;
logical upgrade procedure中已经说明,先导入老版本的dump文件,然后执行mysql_upgrade。
|
Value Password Hashing Method Associated |
Authentication Plugin |
|
0 MySQL 4.1 native hashing |
mysql_native_password |
|
1 Pre-4.1 (“old”) hashing |
mysql_old_password |
|
2 SHA-256 hashing |
sha256_password |
在Mysql 5.6.6时 YEAR(2)日期类型已经被弃用。到了Mysql 5.7.5时 YEAR(2)日期类型已经不被支持了。如果你打算把你的低版本数据库升级到Mysql 5.7.5及更高版本,那么旧版本中所有的YEAR(2)类型的列都必须要转成YEAR(4)类型。执行mysql_upgrade可以完成这种转换,关于转换的详细情况请见“YEAR(2) Limitations and Migrating to YEAR(4)”. Running mysql_upgrade after upgrading is one of the possible conversion strategies.
到了Mysql 5.7.2 要求mysql.user表中每条记录的plugin列都不能为空,如果为空,如果为空,就无法使用该用户登录数据库。如果你的旧版本数据库mysql.user表中存在这样的记录,就需要进行处理。(其实也不需要我们特别处理,因为在升级过程中的当我们执行mysql_upgrade时就处理了该问题)。
当你准备升级到5.7.6及更高版本时,可以通过如下方法处理mysql.user plugin列为空的记录:
使用in-place方式升级时处理方法如下:
使用逻辑方式升级时处理方法如下:
当你准备升级到5.7.6以下的5.7版本时(如果Mysql 5.7.2),可以通过如下方法处理mysql.user plugin列为空的记录:
使用in-place方式升级时处理方法如下:
使用逻辑方式升级时处理方法如下:
mysql_upgrade 默认是使用Mysql实例的root用户运行的,如果mysql root账户过期,那么mysql_upgrade执行会失败。我们需要先重置root账户密码然后再次执行mysql_upgrade。
shell> mysql -u root -p
Enter password: **** <- enter root password here
mysql> ALTER USER
USER() IDENTIFIED BY 'root-password'; # MySQL 5.7.6 and up
mysql> SET PASSWORD
= PASSWORD('root-password'); # Before MySQL
5.7.6
mysql> quit
shell> mysql_upgrade -p
Enter password: **** <- enter root password here
如果我们使用了--skip-grant-tables启动mysql实例,那么修改的密码是不会立即生效的,但是当你运行过mysql_upgrade后却发现可以用修改后的密码登录数据库,这是因为mysql_upgrde处理过程中执行了flush_privileges操作。
生产环境中可能会出现这样的情况,在建表的时候使用某个默认值是合法的,但是在插入的时候确变成不合法的了。例子如下:(例子中在建表前把sql_mod设置为空,建表成功,然后在插入前重新设置了sql_mode,所以插入失败,当然这个是针对mysql 5.7.2以上的版本来说)
SET sql_mode =
'';
CREATE TABLE t (d DATE DEFAULT 0);
SET sql_mode = 'NO_ZERO_DATE,STRICT_ALL_TABLES';
INSERT INTO t (d) VALUES(DEFAULT);
为了使audit log plugin 更好的和Oracle Audit Vault兼容,我们对audit log plugin进行了几处改动。对于升级我们需要注意的是audit log记录格式发生了变化。下面列出了升级前后audit log格式
<AUDIT_RECORD
TIMESTAMP="2013-04-15T15:27:27"
NAME="Query"
CONNECTION_ID="3"
STATUS="0"
SQLTEXT="SELECT 1"
/>
如果你的数据库使用了审计,那么避免新老格式的审计日志写进同一个文件,你可以进行如下处理:
为了使innodb的崩溃恢复更高效,Mysql 5.7.5 引入了新的格式的redo log。因此如果你进行in-place upgrade,在关闭数据库实例的时候,要指定innodb_fast_shutdown为0或者1.在"Performing an In-Place Upgrade"中建议指定innodb_fast_shutdown=0,然后关闭数据库实例(当然这种关闭实例的方式,可能耗时比较长)。
在Mysql 5.7.8和Mysql 5.7.9中 undo log中有关spatial columns列的信息不足(同更高版本相比),这个变化可能会导致升级失败。所以在准备使用in-place 方式升级5.7.8 或者5.7.9 到Mysql 5.7.10 及更高版本时,关闭数据库实例时innodb_fast_shutdown=0 ,清理undo logs。
在Mysql 5.7.8 中undo log中有关virtual columns and virtual column indexes的信息不足(同更高版本相比),这个变化可能会导致升级失败。所以在准备使用 in-place方式升级5.7.8升级到Mysql 5.7.9或者更高版本时,关闭数据库实例时指定innodb_fast_shutdown=0 ,清理undo logs。
在Mysql 5.7.9及之后版本,在创建redo log文件时,会在第一个日志文件(ib_logfile0)中会包format version identifier和 identifies the MySQL version(text 字符串)相关信息。这个变化要求我们在准备使用in-place方式升级到Mysql 5.7.9及更高版本时,关闭数据库实例时指定innodb_fast_shutdown=0或者1.
在Mysql 5.7.9中innodb 表的默认 row format为DYNAMIC(之前版本默认格式是COMPACT)。我们可以通过5.7.9中引入的参数innodb_default_row_format来指定默认row format格式,该参数可选值为DYNAMIC (the default), COMPACT, and REDUNDANT
对于升级前就存在的表可能它们的row format还是为之之前版本默认的COMPACT,当我们对这些进行任何会引起rebuild table的操作时,这些表的row format会修改为此当时innodb_default_row_format指定的值。在没有对这些表进行rebulid操作之前,这些表会一直使用之前的row format。
在Mysql 5.7.5 通过使用metadata locking subsystem对GET_LOCK()进行了重新实现,他的功能也得到了扩展
在升级数据库之前那些使用了GET_LOCK() 只能同时持有一个锁,会自动释放已经存在锁功能的应用必须做出相应的修改。
mysql> DELETE FROM t1
-> WHERE id IN (SELECT id
-> FROM (SELECT t1.id
-> FROM t1 INNER JOIN t2 USING
(id)
-> WHERE t2.status = 0) AS t);
ERROR 1093 (HY000): You can't specify target table 't1'
for update in FROM clause
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/807718/viewspace-2151741/ ,如需转载,请注明出处,否则将追究法律责任。