MySQL運(yùn)維踩坑

image

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ò)程!

正記二

  1. 數(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)成功。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 看到直線,知道我被屏蔽了,心,涼冰冰的…… 如果,如果這次只是一個(gè)小脾氣,小插曲,我很懷疑之後的復(fù)原,還能沒(méi)有芥蒂...
    帶風(fēng)走路deFENG閱讀 367評(píng)論 0 1
  • 1. 又是一個(gè)灰蒙蒙的雨天,航班緩緩降落在巴黎機(jī)場(chǎng),張子豪走出艙門抬頭看了一眼,烏云翻卷著堆積了厚厚一層,看不到晴...
    一句情話去旅行閱讀 2,810評(píng)論 52 78
  • 去年,我搬到新家后,發(fā)現(xiàn)樓下向東300米,有一家“白味書屋”,白老太是那書屋的主人。 這是一個(gè)看上去很普通的老太太...
    莫小談閱讀 726評(píng)論 22 18

友情鏈接更多精彩內(nèi)容