ZERO
????持續(xù)更新 請(qǐng)關(guān)注:https://zorkelvll.cn/blogs/zorkelvll/articles/2018/11/14/1542126258699
背景
??本文主要是介紹在MySQL使用運(yùn)維過(guò)程中所遇到的一些坑爹的地方,予自己以做記錄!
前言
??因操作系統(tǒng)重裝之后,安裝了mysql5.7,而由此帶來(lái)了一系列的問(wèn)題,現(xiàn)將解決這些mysql坑的過(guò)程中一些解決辦法記錄下來(lái),既是為自己后續(xù)查找問(wèn)題提供方便,也是希望能夠給各位猿友減少一些踩坑的過(guò)程!
正記二
-
數(shù)據(jù)庫(kù)中的datetime數(shù)據(jù)顯示與實(shí)際時(shí)間相差14個(gè)小時(shí),而通過(guò)java應(yīng)用插入和查詢的同一條記錄,實(shí)際顯示的是正確的時(shí)間 => 因此,是mysql相關(guān)配置的問(wèn)題
vim /etc/my.cnf
default-time-zone = '+8:00' #在 [mysqld] 之下
systemtcl restart mysqld #重啟mysql
正記一
ERROR-1
????for error : max_allowed_packet
【ANSWER FOR ERROR-1】:
** (1)在mysql-cmd模式下,執(zhí)行SQL命令“set global max_allowed_packet = 2*1024*102410;”;*
** (2)并且重啟mysql服務(wù)(windows下win+R -> services.msc找到MySQL重啟即可;linux下執(zhí)行shell命令“service mysqld restart”)**
ERROR-2
????for error: Incorrect string value: '\xF0\x9F...' for column 'XXX' at row
【ANSWER FOR ERROR-2】:
** (1)這是由于linux下mysql執(zhí)行create table建表命令時(shí)默認(rèn)采用的時(shí)latin1字符集建表的,導(dǎo)致一些中文字符的寫入而出現(xiàn)的異常信息;但是在windows下,mysql默認(rèn)所建的表字符是utf8的,這也是為何相同的SQL語(yǔ)句由windows->linux下mysql中運(yùn)行拋出該異常的原因**
** (2)解決該問(wèn)題的是需要養(yǎng)成一個(gè)習(xí)慣,也即無(wú)論是什么時(shí)候什么環(huán)境下執(zhí)行create table創(chuàng)建mysql數(shù)據(jù)庫(kù)表時(shí),務(wù)必指定特定的字符集和引擎,如SQL命令(含ENGINE=InnoDB DEFAULT CHARSET=utf8)**
DROP TABLE IF EXISTS `db_test`;
CREATE TABLE `db_test` (
`db_test_id` VARCHAR(100) NOT NULL COMMENT '測(cè)試Id',
`db_test_text` VARCHAR(255) NOT NULL COMMENT '測(cè)試文本',
`status` VARCHAR(2) DEFAULT '1' COMMENT '狀態(tài),1啟用(默認(rèn)),-1禁用',
`update_time` datetime DEFAULT NULL COMMENT '更新時(shí)間',
`create_time` datetime NOT NULL COMMENT '創(chuàng)建時(shí)間',
PRIMARY KEY (`db_test_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='測(cè)試表';
ERROR-3
????詭異描述(其實(shí)是自我錯(cuò)覺(jué))之“在Springboot+Mybatis+MySQL系統(tǒng)架構(gòu)下,某個(gè)接口的一條查詢語(yǔ)句預(yù)期正常情況下是可以成功查詢到1條返回結(jié)果的,但是只要在sql-where條件中對(duì)某個(gè)字段INDUSTRIENAME進(jìn)行篩選時(shí)查詢過(guò)來(lái)的結(jié)果總是0條數(shù)據(jù),并且在navicat下手動(dòng)執(zhí)行該一模一樣SQL語(yǔ)句及where條件是有1條結(jié)果的”
????=》 經(jīng)過(guò)一整天的折騰:從懷疑SQL的正確性,將SQL不斷拆分 -> 去除各種where條件查詢均可以有結(jié)果且只要加上該字段的篩選就是0條 -> 懷疑mybatis的配置有問(wèn)題 -> 結(jié)果返回java對(duì)象的映射有問(wèn)題->連接的數(shù)據(jù)庫(kù)地址不正確->poatman傳過(guò)來(lái)的數(shù)據(jù)不是預(yù)期的那個(gè)條件值->應(yīng)用控制臺(tái)將SQL語(yǔ)句以及條件值打印出來(lái)->重啟IDE、重啟mysql、重啟電腦->……歷經(jīng)了一整天的崩潰過(guò)程,一度懷疑人生一度懷疑自己的程序猿生涯之路將就此終結(jié),萬(wàn)萬(wàn)沒(méi)有想到的是自己并沒(méi)有錯(cuò),錯(cuò)的居然是因?yàn)椴樵兊臈l件傳過(guò)來(lái)的值是中文,,,注意是中文、中文、中文,重要的事情強(qiáng)調(diào)三遍 -> 于是在建立數(shù)據(jù)源連接的地方,指定字符集utf8方解決這折騰了自己一整整天的“詭異”問(wèn)題,歸根結(jié)底還是自己定位查問(wèn)題的方式需要優(yōu)化,如果能夠直接去查看mysql的log將問(wèn)題很快就會(huì)被發(fā)現(xiàn)和解決!!
【ANSWER FOR ERROR-3】:
** (0)留個(gè)心眼----尤其是MySQL數(shù)據(jù)庫(kù)版本更新以及自主安裝的MySQL中,特別注意當(dāng)前出現(xiàn)的問(wèn)題或者異常中有沒(méi)有環(huán)節(jié)中是有中文、中文、中文的?。。?!**
** (1)養(yǎng)成良好的msyql數(shù)據(jù)源配置習(xí)慣,如:**
jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8
????另外,需要注意的是數(shù)據(jù)源連接配置的幾個(gè)選項(xiàng)“&autoReconnect=true&useSSL=true&useUnicode=true”等的含義及引發(fā)的問(wèn)題;同時(shí),若是中文在數(shù)據(jù)庫(kù)中顯示是“?”或者更新中文文字到數(shù)據(jù)庫(kù)中出現(xiàn)異常,則是數(shù)據(jù)庫(kù)的默認(rèn)字符集問(wèn)題,可通過(guò)SQL命令“show VARIABLES LIKE '%character%'”查看當(dāng)前character-set-server的值
** (2)不僅僅要開啟的是應(yīng)用的SQL-log日志,更需要去開啟mysql自身log以實(shí)時(shí)查看或者落日志文件,保證能夠查看到最終mysql中是實(shí)際執(zhí)行的SQL語(yǔ)句,如果這個(gè)LOG開啟了,只要一查看該log就能夠知道該問(wèn)題是由于java-mysql連接數(shù)據(jù)源的時(shí)候未指定字符集而導(dǎo)致的針對(duì)中文字符串為值得查詢條件時(shí),實(shí)際執(zhí)行的查詢語(yǔ)句并非是預(yù)期的那個(gè)中文字符串而是亂碼(未設(shè)置utf8導(dǎo)致的mysql實(shí)際接收到是亂碼)**
**#Issue 1:
????InnoDB: The innodb_system data file 'ibdata1' must be writable**
????按照菜鳥教程上的MySQL教程,在CentOS7上利用RPM包安裝好MySQL后第一次啟動(dòng)服務(wù):
systemctl start mysqld.service
結(jié)果啟動(dòng)失敗,查看mysql服務(wù)的啟動(dòng)日志:
日志位置:var/log/mysqld.log
2018-07-10T03:28:38.289394Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.11) starting as process 10959
2018-07-10T03:28:38.502207Z 1 [ERROR] [MY-012271] [InnoDB] InnoDB: The innodb_system data file 'ibdata1' must be writable
2018-07-10T03:28:38.502279Z 1 [ERROR] [MY-012278] [InnoDB] InnoDB: The innodb_system data file 'ibdata1' must be writable
2018-07-10T03:28:38.502331Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine
2018-07-10T03:28:38.502619Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed.
2018-07-10T03:28:38.502667Z 0 [ERROR] [MY-010119] [Server] Aborting
2018-07-10T03:28:38.521513Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.11) MySQL Community Server - GPL.
注意到第一個(gè)Error:[InnoDB] InnoDB: The innodb_system data file 'ibdata1' must be writable,可能是權(quán)限不夠的原因,于是修改'ibdata1'所在文件夾的權(quán)限:
MySQL data默認(rèn)路徑:/var/lib/mysql
chmod -R 777 /var/lib/mysql
再次啟動(dòng)服務(wù),終于啟動(dòng)成功。