MySQL5.6到5.7版本升级采用IN-PLACE的升级方式需要具体关注的地方

一.SQL变更
GET_LOCK()函数行为
MySQL 5.7.5之前GET_LOCK()在执行第二次的额时候会释放前面获得的锁,在此版本以后支持同时获得多个锁,如:

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.33-log |
+------------+
1 row in set (0.00 sec)

mysql> SELECT GET_LOCK(‘lock1‘,10);
+----------------------+
| GET_LOCK(‘lock1‘,10) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT GET_LOCK(‘lock2‘,10);
+----------------------+
| GET_LOCK(‘lock2‘,10) |
+----------------------+
|                    1 |
+----------------------+
1 row in set (0.00 sec)

mysql> SELECT RELEASE_LOCK(‘lock2‘);
+-----------------------+
| RELEASE_LOCK(‘lock2‘) |
+-----------------------+
|                     1 |
+-----------------------+
1 row in set (0.00 sec)

mysql> SELECT RELEASE_LOCK(‘lock1‘);
+-----------------------+
| RELEASE_LOCK(‘lock1‘) |
+-----------------------+
|                  NULL |
+-----------------------+
1 row in set (0.00 sec)

返回null说明此锁已经被释放了

所以依赖于释放任何先前锁的GET_LOCK()的行为的应用程序必须针对新行为进行修改。

二.derived_merge被自动开启

5.7中优化器使用一致的机制处理from语句中的派生表和视图是为了更好地避免不必要的物化并能够通过条件下放产生更有效的执行计划。

但是,对于修改表的语句(例如DELETE或UPDATE),使用先前物化的派生表的合并策略可能会导致ER_UPDATE_TABLE_USED错误:

错误原因:外部查询表和内部更改的表属于同一张表时,如果将派生表合并到外部查询块就会触发此错误(物化方式不会导致此错误,因为实际上,
它将派生表转换为单独的表)

如:

mysql> delete from t1 where id in (select t1.id from t1 inner join t2 using(id) where t2.a1=100);
ERROR 1093 (HY000): You can‘t specify target table ‘t1‘ for update in FROM clause

解决:关闭optimizer_switch的derived_merge选项,此选项默认是打开的

关闭derived_merge

SET optimizer_switch = ‘derived_merge=off‘;

三.关键字和保留字

如果要引用保留字,必须使用反引号括起或跟在限定名称的逗点后,否则报语法错误,如

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘interval (begin INT, end INT)‘ at line 1
mysql> CREATE TABLE `interval` (begin INT, end INT);
Query OK, 0 rows affected (1.14 sec)
mysql> CREATE TABLE test.interval (begin INT, end INT);
Query OK, 0 rows affected (1.84 sec)

MySQL 5.7中有而MySQL 5.6中没有的关键字和保留字;有R标记的为保留字,见如下表格:

ACCOUNT                        ALWAYS                     CHANNEL 
COMPRESSION              ENCRYPTION                 FILE_BLOCK_SIZE 
FILTER                       FOLLOWS                    GENERATED (R) 
GROUP_REPLICATION       INSTANCE                   JSON 
MASTER_TLS_VERSION     NEVER                      OPTIMIZER_COSTS (R) 
PARSE_GCOL_EXPR          PRECEDES                   REPLICATE_DO_DB 
REPLICATE_DO_TABLE     REPLICATE_IGNORE_DB        REPLICATE_IGNORE_TABLE 
REPLICATE_REWRITE_DB REPLICATE_WILD_DO_TABLE    REPLICATE_WILD_IGNORE_TABLE 
ROTATE               STACKED                    STORED (R) 
VALIDATION           VIRTUAL (R)                WITHOUT 
XID

四.表联合查询

使用union连接的单个查询语句中如果有order by或limit关键字需要将此单个语句使用括号引起。如:

mysql> select * from t1 limit 1 union select * from t2 limit 2;
ERROR 1221 (HY000): Incorrect usage of UNION and LIMIT
mysql> (select * from t1 limit 1) union (select * from t2 limit 2);
+------+-------+-------+
| id   | name1 | name2 |
+------+-------+-------+
|    1 | a1    | a2    |
|    1 | 2     | 2     |
|    1 | 1     | 1     |
+------+-------+-------+
3 rows in set (0.00 sec)

原文地址:https://www.cnblogs.com/zb347954263/p/8352648.html

时间: 2024-11-01 19:30:10

MySQL5.6到5.7版本升级采用IN-PLACE的升级方式需要具体关注的地方的相关文章

Android版本升级同时Sqlite数据库的升级及之前数据的保留

http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid=166052 做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已

【转】Android版本升级同时Sqlite数据库的升级及之前数据的保留

做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段.并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;2 ALTER TABLE Sub

PHP中多级查询采用递归和循环的方式详解

现在的商城类app或者是购物网站一般除了购物外,还起到了推广,宣传和分销的作用,多级查询一般采用递归和循环的方式.不过很多初学者都是不清楚如何实现的,下面就以20级为例,编写的代码和运行效果如下:1.Php查询每级人数.php代码如下:$aim["prevtel"] = $tel; $n=0; $array_co = array(); while ( $n< 10) { $users=M('user')->where($aim)->getField('tel',tru

mysql 之 版本升级,从5.5升级到5.7

阿里云的centos6.3 64位操作系统,默认mysql版本是5.5 ,开发人员需要用到5.7版本,因此进行升级操作: 1.下载Linux的5.7版本 wget http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.11-1.el6.x86_64.rpm-bundle.tar 下载完成后,解压 2.备份数据库文件 mysqldump -uxxx -pxx databasename > databasename.sql 3.停止mysql服务 s

svm 中采用自动搜索参数的方式获得参数值

载时自http://blog.csdn.net/u011177305/article/details/46458801?locationNum=1 OpenCV中SVM类是提供了优化参数值功能的,下面讲讲具体的做法. 要让svm自动优化参数,那么训练时就不能再用train函数了,而应该用train_auto函数.下面是train_auto的函数原型 C++: bool CvSVM:: train_auto (const Mat & trainData , const Mat & respo

有内核造成的nginx启动异常

CentOS5.4之nginx启动异常 ###安装Nginx### [[email protected]_Mysql ~]#yum -y install nginx ###启动Nginx### [[email protected]_Mysql ~]#service nginx start -->无任何启动输出信息,当时可郁闷 ###查看端口###  [[email protected]_Mysql ~]# ss -tanlp | grep nginx   -->端口正常,郁闷消除 0     

如何让您的php也支持pthreads多线程

我们常常会碰到这样一种情况,开发环境在windows下开发,而生产环境确是linux.windows下能正常运行,上传到linux后却无法好好地玩耍了.然后开始了一轮尼玛式的疯狂的查找原因,最后发现是服务器环境问题.这时只能默默地爆一句shit.最近在用php多线程开发一个小功能也碰到类似的问题,在此记录一下. 1.查找资料发现php5.3或以上,且线程安全版本,才支持多线程.于是通过phpinfo()查看,发现php版本过低且为非线程安全版本.因而首先需要升级php版本,由于采用了集成式的wd

MySQL5.6.25升级MySQL5.7.15

MySQL5.6升级MySQL5.7 环境介绍 Part1:写在最前 提到MySQL升级,网上文章数之不尽,但大多数为老的版本,诸如5.1升级到5.5.5.5升级到5.6,今天给大家介绍下MySQL5.6升级到MySQL5.7版本的方法和注意事项. Part2:升级方法 升级的方法一般有两类: 1.利用mysqldump来直接导出sql文件,导入到新库中,这种方法是最省事儿的,也是最保险的,缺点的话,也显而易见,大库的mysqldump费时费力. 2.直接替换掉mysql的安装目录和my.cnf

RedHat6.6上安装MySQL5.7.13

由于公司需要更换新的架构,将采用MySQL5.7作为数据库的主要版本,下面将全面介绍在RedHat6.6上二进制安装MySQL5.7.13.后期也将依次介绍在MySQL5.7上的运维管理及优化. 1.下载MySQL5.7.13安装包 下载地址如下,现在的MySQL5.7稳定版已更新到5.7.14 http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.14-linux-glibc2.5-x86_64.tar.gz 2.新建MySQL用户和组