天天看點

MySQL生産問題實踐總結

【1】Error:MySQL server has gone away

背景:将外部sql檔案導入資料庫。

解決辦法:

Linux下修改my.conf;Windows下修改my-default.ini。

添加(修改)如下配置:

wait_timeout=2880000 

interactive_timeout = 2880000 

max_allowed_packet = 256M      
MySQL生産問題實踐總結

如果使用指令方式,隻在目前會話有效,建議修改配置:

show global variables like 'max_allowed_packet';

set global max_allowed_packet=268435456;

set global max_allowed_packet=1024*1024*256;      

使用set global指令修改 max_allowed_packet 的值,重新開機mysql後會失效,還原為預設值。

如果不知道如何修改MySQL配置檔案,在運作sql檔案時,可以使用指令方式。

MySQL生産問題實踐總結

【2】Packet for query is too large

異常如下所示:

Packet for query is too large (1238 > 1024). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3683) ~[mysql-connector-java-5.1.47.jar:5.1.47]      

解決方案

Linux下修改my.cnf檔案在[mysqld]下添加如下配置:

max_allowed_packet = 100M      

如果是windows下則修改my.ini檔案。

【3】sql_mode為ONLY_FULL_GROUP_BY的問題

In aggregated query without GROUP BY, expression #32 of SELECT list contains nonaggregated columnXXXXX ' this is incompatible with sql_mode=only_full_group_by      

這種模式的官方解釋:​

​ONLY_FULL_GROUP_BY​

​是MySQL資料庫提供的一個sql_mode, 通過這個 sql_mode 來保證, SQL語句 “分組求最值” 合法性的檢查. 這種模式采用了與 Oracle、DB2 等資料庫的處理方式。即不允許 select target list 中出現語義不明确的列。

對于用到 GROUP BY 的 select 語句, 查出來的列必須是 group by 後面聲明的列, 或者是聚合函數裡面的列有這樣一個資料庫的表。

臨時方案-會話有效

set @@GLOBAL.sql_mode='';
set sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';      
sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"      

繼續閱讀