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)
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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2143562/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【資料庫】mysql5.6升級至5.7(物理方式)資料庫MySql
- centos7 mysql5.6升級5.7CentOSMySql
- MySQL 5.7 升級到 8.0MySql
- 應用升級SpringCloud版本時的注意事項(Dalston升級到Edgware)SpringGCCloud
- PHP study 升級預設的MYSQL版本 為5.7PHPMySql
- 不可不知的 MySQL 升級利器及 5.7 升級到 8.0 的注意事項MySql
- Cocospod 升級到指定版本
- MySQL:5.6 升級 5.7MySql
- macOS版本大升級,這幾項的細節值得你關注Mac
- Mac 升級 PHP 到 7.4 版本MacPHP
- mysql 5.6 升級 到 5.7 的二進位制升級方法 另一個簡便思路.MySql
- PHP版本升級:從php7.1升級到php7.2PHP
- GitHub是怎樣把MySQL 5.7升級到8.0的?GithubMySql
- Redis的跨版本升級Redis
- 升級mac的PHP版本MacPHP
- 如何升級fedora的版本
- Win10怎麼升級版本 Win10升級版本的方法Win10
- JavaFX桌面應用-版本升級Java
- NiFi版本升級Nifi
- gcc版本升級GC
- node 版本升級
- python版本升級Python
- 如何將 Ubuntu 版本升級到新版本Ubuntu
- 【MSSQL】MSSQL 從Express版本升級到Enterprise版本SQLExpress
- oracle 10 rac 升級 10.2.0.1升級到10.2.0.5Oracle
- Centos7 升級openssh到最高版本CentOS
- CentOS 6下gcc升級的操作記錄(由預設的4.4.7升級到6.4.0版本)CentOSGC
- Homestead 升級PHP版本PHP
- GitLab跨版本升級Gitlab
- AWS RDS強制升級的應對之道——版本升級的最佳實踐
- MySQL5.6升級5.7時,出現主從延遲問題排查過程MySql
- Laravel 5.5.* 升級到 5.7.* 問題記錄Laravel
- Docker升級MySQL版本的快速方法DockerMySql
- 有關 TiDB 升級的二三事——教你如何快樂升級TiDB
- mongodb單機從3.2升級到4.0.4升級MongoDB
- 有關伺服器升級需要注意的點伺服器
- Centos 7 升級通過 yum 安裝的 MySQL 5.7 到 MySQL 8.0CentOSMySql
- weblogic版本升級遷移需要注意事項Web
- 從CentOS 7.0升級到7.7版本CentOS