MySql升級5.7.x後出現的問題記錄

項目的mysql數據庫版本由5.1.x更換爲5.7.x後出現了一些問題,現將其中的一些問題記錄一下

其中大部分問題都需要修改數據庫的配置文件進行解決,所以先將如何找到mysql配置文件記錄下來,如下

  1. 執行 which mysql 命令,通過此命令找到mysql的安裝位置
  	 比如:/usr/bin/mysql
  	 
  2. 執行 /usr/bin/mysql --verbose --help | grep -A 1 'Default options' 命令
  	(其中“/usr/bin/mysql”爲上一步中找到的路徑),結果類似如下信息:
  	Default options are read from the following files in the given order:
  	/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf   	
  	** 這個信息的意思是: 服務器首先讀取的是/etc/mysql/my.cnf文件,如果前一個文件不存在
 	則繼續讀/etc/my.cnf文件,如若還不存在便會去讀~/.my.cnf文件
  
  3. 根據上邊的提示,找到對應的配置文件,執行 vim /***/my.cnf 即可進入修改

問題1:項目啓動後,一些sql語句報如下錯誤:

### Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 
'xxx.db.xxxxx' which is not functionally dependent on columns in GROUP BY 
clause; this is incompatible with sql_mode=only_full_group_by

錯誤原因爲:
MySQL 5.7.5及以上功能依賴檢測功能。如果啓用了ONLY_FULL_GROUP_BY SQL模式(默認情況下),MySQL將拒絕選擇列表,HAVING條件或ORDER BY列表的查詢引用在GROUP BY子句中既未命名的非集合列,也不在功能上依賴於它們。
解決辦法:
① 執行查詢 (可在mysql命令行中執行或者通過navcat等工具執行)

select @@global.sql_mode

結果如下:

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

② 修改mysql配置文件,在配置文件中增加如下配置:

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服務即可

service mysql restart

問題二:格式化後的時間比當前時間晚8個小時

問題描述:
代碼中用了System.currentTimeMillis()這種方法,前端格式化時間後,顯示的時間比當前時間晚8個小時
錯誤原因:
數據庫版本不同,默認使用的時區不同導致的
解決辦法:
① 執行查詢,查看當前數據庫使用的時區:

SHOW VARIABLES LIKE ‘%time_zone%’;

類似結果如下:
在這裏插入圖片描述
② 執行設置,將mysql全局時區修改爲北京時間,即我們所在的東8區:

set global time_zone = ‘+8:00’; ##設置
flush privileges; ##使設置生效

注意 此方法修改只是臨時起作用,數據庫服務重啓後會失效

可通過修改數據庫配置使設置永久生效,修改數據庫配置文件,在配置文件中添加如下內容即可:

default-time_zone = ‘+8:00’

修改後重啓數據庫服務,時間問題解決

問題三:啓動服務時報由於許多連接錯誤而被阻止

問題描述:
啓動後臺服務,日誌中報如下錯誤:

ERROR c.a.d.p.DruidDataSource - [run,2471] - create connection SQLException, 
url: jdbc:mysql://192.168.x.xxx:3306/xxx-db?useUnicode=true&characterEncoding=utf8
&zeroDateTimeBehavior=convertToNull&useSSL=false, errorCode 1129, state HY000
java.sql.SQLException: null,  
message from server: "Host '192.168.x.xxx' is blocked because of many connection errors; 
unblock with 'mysqladmin flush-hosts'"

錯誤原因:
同一個ip在短時間內產生太多(超過mysql數據庫max_connect_errors的最大值)中斷的數據庫連接而導致的阻塞
解決辦法:
① 最直接快速的辦法是,執行以下命令將max_connect_errors的計數器值清零:

flush hosts ##執行此命令後即可解決以上問題

② 可查看當前數據庫max_connect_errors的值,一般默認值是10,如果過小,可以將其設置大:

show variables like ‘max_connect_errors’; ##查詢max_connect_errors值
set global max_connect_errors = 100; ##設置 max_connect_errors值(100可以是任意整數,默認值爲10)

問題四:啓動服務時報某數據庫表找不到(區分了表名的大小寫)

問題描述:
啓動後臺服務,日誌中報如下錯誤:

ERROR o.s.s.q.LocalDataSourceJobStore - [manage,3926] - ClusterManager: 
Error managing cluster: Failure obtaining db row lock: Table 'xxx-db.AAA_TAB' 
doesn't exist
org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock:
 Table 'xxx-db.AAA_TAB' doesn't exist

其中xxx-db.AAA_TAB是你對應數據庫中的某個表,不過這個表名實際爲小寫(xxx-db.aaa_tab)

錯誤原因:
數據庫在磁盤中存儲的表名爲小寫,比較的時候區分了大小寫

解決辦法:
① 先查看當前的讀取策略:

SHOW VARIABLES LIKE ‘%case%’; ##執行此查詢,根據結果進行查看

lower_case_table_names = 1 表名存儲在磁盤是小寫的,但是比較的時候不區分大小寫
lower_case_table_names = 0 表名存儲在磁盤可以是大小寫,但是比較的時候區分大小寫
lower_case_table_names = 2 表名存儲在磁盤可以是大小寫,但是比較的時候是小寫的

② 修改數據庫配置文件,在配置文件中添加 lower_case_table_names=1的配置即可:

lower_case_table_names=1

其他問題待發現後更新…

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章