mysql大小寫敏感導(dǎo)致程序無(wú)法啟動(dòng)的問(wèn)題
mysql大小寫敏感導(dǎo)致程序無(wú)法啟動(dòng)
將數(shù)據(jù)庫(kù)轉(zhuǎn)移到centos服務(wù)器上之后,項(xiàng)目啟動(dòng)一直報(bào)找不到XXX Table,但是數(shù)據(jù)庫(kù)中存在這個(gè)表,對(duì)比了一下發(fā)現(xiàn)報(bào)錯(cuò)信息的表名發(fā)現(xiàn)是大寫字母,就考慮到了可能換了環(huán)境,區(qū)分大小寫了,于是更改了mysql的配置文件
1.先找到配置文件的位置
2.進(jìn)入該目錄,編輯該配置文件
3.加上這樣一句話,1表示不區(qū)分,0表示區(qū)分
lower_case_table_names=1
再次啟動(dòng)項(xiàng)目,啟動(dòng)成功!
mysql表大小寫敏感規(guī)則引發(fā)的問(wèn)題
踩坑原因
在部署一個(gè)工作流項(xiàng)目(flowable)時(shí),該項(xiàng)目用到了自動(dòng)創(chuàng)建表的一個(gè)機(jī)制,沒看源代碼但是大體意思就是檢測(cè)不到數(shù)據(jù)庫(kù)中有表的存在程序就自己創(chuàng)建。
windows下沒有問(wèn)題,linux下報(bào)一些奇怪的錯(cuò)誤。
排查
描述問(wèn)題前先描述一下項(xiàng)目的關(guān)系因?yàn)榈拇_有點(diǎn)亂 。
flowable 項(xiàng)目是要搭建的項(xiàng)目在gitee上托管,我們暫時(shí)稱之為f1然后這個(gè)項(xiàng)目又是基于github上的一個(gè)項(xiàng)目改的,這個(gè)項(xiàng)目我們暫時(shí)稱為f2。
程序自動(dòng)建表如果完成的很好那當(dāng)然是大吉大利。自動(dòng)建表操作是f2來(lái)做的,它所建的表都是些核心表,表名為大寫。前面說(shuō)了f1 是在f2 上面擴(kuò)展的那必然就會(huì)有自己的表。只依靠f2自動(dòng)建表是不行的,項(xiàng)目根本跑不起來(lái)。f1提供了initsql,sql中包含了所有的表,有自己的還有f2的那些核心表,表名均為小寫。
部署過(guò)程先把服務(wù)器上的數(shù)據(jù)庫(kù)建好然后導(dǎo)入數(shù)據(jù),一切正常數(shù)據(jù)庫(kù)出現(xiàn)了一堆小寫的表。運(yùn)行f1程序,報(bào)錯(cuò)信息是一些表外建重復(fù)定義之類的。這時(shí)再看數(shù)據(jù)庫(kù)出現(xiàn)了很多大寫的表名。和小寫表名重復(fù)的。比如 act_ru_job ACT_RU_JOB。第一次看到有點(diǎn)懵。為什么windwos下沒有問(wèn)題,到linux下就又問(wèn)題了。把windows下的程序數(shù)據(jù)庫(kù)連接換為L(zhǎng)inux的一樣報(bào)錯(cuò)。這下明白肯定是操作系統(tǒng)間不同的機(jī)制導(dǎo)致出的幺蛾子。
瘋狂google了一番找到了相關(guān)信息。
在mysql中執(zhí)行下面語(yǔ)句
show variables like '%lower_case_table_names%';
表現(xiàn)的值有三種 0 1 2。
- 0 linux 下默認(rèn)規(guī)則,表名區(qū)分大小寫。
- 1 windows 下默認(rèn)規(guī)則,表名存儲(chǔ)在磁盤是小寫的,但是比較的時(shí)候是不區(qū)分大小寫。
- 2 macos,下默認(rèn)規(guī)則,表名存儲(chǔ)為給定的大小寫但是比較的時(shí)候是小寫的
這下才明白,程序?yàn)樯兑恢睓z測(cè)不到表存在,然后自己創(chuàng)建。原因就是linux下大小寫嚴(yán)格區(qū)分的,改為和windwos下的值一樣就可以了。事情不會(huì)那么簡(jiǎn)單。
限制
找到my.conf在[mysqld] 下添加 lower_case_table_names=1,保存重啟。mysql跑不起來(lái),官方文檔上寫這個(gè)參數(shù)只能在數(shù)據(jù)庫(kù)初始化操作之前添加,如果數(shù)據(jù)庫(kù)已經(jīng)初始化完成了就不能再添加了,那么怎么辦呢?
如果沒有重要數(shù)據(jù)直接刪除數(shù)據(jù)目錄,執(zhí)行 mysqld --initialize --user=mysql --lower-case-table-names=1 要加上–user=mysql。不然數(shù)據(jù)目錄所有者是root啟動(dòng)時(shí)會(huì)報(bào)權(quán)限錯(cuò)誤。
有數(shù)據(jù)的話先導(dǎo)出設(shè)置好后再導(dǎo)入。
心得:
因?yàn)檫@個(gè)破問(wèn)題搞了好幾個(gè)小時(shí),實(shí)屬惡心。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn)
這篇文章主要介紹了mysql split函數(shù)用逗號(hào)分隔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10MySQL啟動(dòng)報(bào)錯(cuò)問(wèn)題InnoDB:Unable to lock/ibdata1 error
這篇文章主要介紹了MySQL啟動(dòng)報(bào)錯(cuò)問(wèn)題InnoDB:Unable to lock/ibdata1 error,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作實(shí)例分析
這篇文章主要介紹了mysql觸發(fā)器之創(chuàng)建多個(gè)觸發(fā)器操作,結(jié)合實(shí)例形式分析了mysql創(chuàng)建及使用多個(gè)觸發(fā)器的相關(guān)操作技巧,需要的朋友可以參考下2019-12-12Mysql:The user specified as a definer (''xxx@''%'') does not
今天小編就為大家分享一篇關(guān)于Mysql:The user specified as a definer ('xxx@'%') does not exist的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12Navicat Premium遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了Navicat Premium遠(yuǎn)程連接MySQL數(shù)據(jù)庫(kù)的方法,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12mysql limit分頁(yè)優(yōu)化詳細(xì)介紹
MySQL最常用也最需要優(yōu)化的就是limit,MySQL的limit給分頁(yè)帶來(lái)了極大的方便,但數(shù)據(jù)量一大的時(shí)候,limit的性能就急劇下降,需要的朋友可以參考下2016-12-12MySQL中使用load data命令實(shí)現(xiàn)數(shù)據(jù)導(dǎo)入的方法
MySQL支持load data命令的數(shù)據(jù)導(dǎo)入,該方式比直接的insert的效率要高,按照官方的說(shuō)法是要比insert語(yǔ)句快上20倍2013-10-10