操作系統:Ubuntu 18.04 64位
MySQL版本:MySQL 5.7
一、問題描述
在本次發現的這個問題中,其原因是業務系統在對某張數據庫表進行查詢的時候,對查詢結果做了group by操作,並且根據業務數據的記錄創建時間進行了排序。
在執行查詢的時候,MySQL就會拋出一條錯誤:
this is incompatible with sql_mode=only_full_group_by
由於在大部分業務系統中,對記錄的創建時間排序是非常常見的操作方式,但是很少會將記錄的創建時間放入group by子句中,這樣group by就失去了意義。所以我們不能選擇修改SQL查詢語句來解決這一問題。
二、問題原因
引發這一問題的原因非常簡單,由於在MySQL5.7及以上版本,默認在數據庫服務的sql_mode設置中,增加了以下配置:
ONLY_FULL_GROUP_BY
就是這一設置導致了問題的發生。在MySQL5.7及以上版本中,當數據庫安裝完成後,sql_mode的這一設置就默認生效了。我們可以通過以下差需語句來確認自己當前數據庫中的sql_mode配置:
select @@GLOBAL.sql_mode;
查詢的結果如下所示,這是已經完成了修改後的配置,其中已經看不到ONL_FULL_GROUP_BY的配置項了。:
三、解決辦法
3.1修改my.cnf配置文件
在Linux環境下,my.cnf配置文件位於系統etc目錄下:
在上圖的示例中,“my.cnf“被指向了位於目錄“/etc/alternatives”下的同名文件,因此我們需要轉到該目錄下,並打開該文件:
然後在文件的末尾,輸入以下內容:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
如下圖所示:
最後,重新啓動MySQL服務即可。
傳送門:在Ubuntu/Linux環境下使用MySQL:啓動和關閉MySQL服務
注意:在修改my.cnf文件前,請將它妥善備份。如果修改完畢後,無法正常啓動MySQL服務,請恢復該文件後重新嘗試。