黃石做網(wǎng)站的公司網(wǎng)絡(luò)營(yíng)銷實(shí)施計(jì)劃
剛安裝的MySQL使用Navicat操作數(shù)據(jù)庫(kù)遇到的問(wèn)題
- 一、編輯連接保存報(bào)錯(cuò)
- 二、打開(kāi)數(shù)據(jù)表很慢
- 三、MySQL的進(jìn)程出現(xiàn)大量“sleep”狀態(tài)的進(jìn)程
- 四、執(zhí)行sql腳本報(bào)錯(cuò),部分表導(dǎo)不進(jìn)去
- 五、當(dāng)前MySQL配置文件
一、編輯連接保存報(bào)錯(cuò)
連接上了數(shù)據(jù)庫(kù),編輯連接保存報(bào)錯(cuò),如下圖:
解決辦法:
重啟Navicat。
二、打開(kāi)數(shù)據(jù)表很慢
第一次打開(kāi)數(shù)據(jù)表時(shí)速度還能接受,過(guò)幾分鐘再次打開(kāi)就變得很慢很慢,且查詢很少的數(shù)據(jù)都很耗時(shí)。比如我只想查詢用戶表中的十條數(shù)據(jù),竟然查了8秒。
解決辦法:
打開(kāi)關(guān)閉數(shù)據(jù)庫(kù),編輯數(shù)據(jù)庫(kù)連接,默認(rèn)是240秒,我這里改為了30秒,還覺(jué)得慢可以改為0秒。
這樣就會(huì)讓數(shù)據(jù)庫(kù)連接保持隨時(shí)待命的狀態(tài),不會(huì)出現(xiàn)因?yàn)殚g隔幾分鐘沒(méi)有打開(kāi)數(shù)據(jù)表,再次打開(kāi)時(shí)變得很慢很慢了的情況了。
再次查詢用戶表的10條數(shù)據(jù)
三、MySQL的進(jìn)程出現(xiàn)大量“sleep”狀態(tài)的進(jìn)程
這可能是剛安裝的MySQL還沒(méi)有優(yōu)化,查詢MySQL的連接超時(shí)時(shí)間
show variables like 'wait_timeout';
show variables like 'interactive_timeout';
解釋:
wait_timeout:用于指定服務(wù)器等待客戶端發(fā)送命令的時(shí)間的上限。
interactive_timeout:用于指定MySQL服務(wù)器在等待客戶端發(fā)送命令的時(shí)間后關(guān)閉非交互式連接的超時(shí)時(shí)間。
MySQL默認(rèn)的連接超時(shí)時(shí)間是8小時(shí),太長(zhǎng)了,沒(méi)有進(jìn)行數(shù)據(jù)操作的時(shí)候應(yīng)該釋放資源,可以將超時(shí)時(shí)間調(diào)小一些,注意需要上面兩個(gè)參數(shù)同時(shí)設(shè)置才能生效。
打開(kāi)MySQL的配置文件
vim /etc/my.cnf
在“[mysqld]”中加入如下配置
#減少超時(shí)時(shí)間,避免使用“SHOW PROCESSLIST”命令出現(xiàn)很多“sleep”狀態(tài)的進(jìn)程,這里設(shè)置為120秒
wait_timeout=120
interactive_timeout=120
這是我的
然后重啟MySQL
service mysql restart
再次查詢MySQL的進(jìn)程
SHOW PROCESSLIST
可以看到前面的很多“sleep”狀態(tài)的進(jìn)程已經(jīng)不見(jiàn)了。
四、執(zhí)行sql腳本報(bào)錯(cuò),部分表導(dǎo)不進(jìn)去
我的問(wèn)題是這樣的,新安裝的MySQL從Navicat執(zhí)行sql腳本,結(jié)束時(shí)出現(xiàn)失敗的錯(cuò)誤,看一下執(zhí)行結(jié)束后的數(shù)據(jù)庫(kù),大部分表都導(dǎo)入了,只是部分?jǐn)?shù)據(jù)表沒(méi)能導(dǎo)入。
這是導(dǎo)入時(shí)的報(bào)錯(cuò)
一開(kāi)始也沒(méi)看出那里的問(wèn)題,于是將就著用,等項(xiàng)目連接上的時(shí)候報(bào)缺少某個(gè)數(shù)據(jù)表,看了一下數(shù)據(jù)庫(kù)中還真沒(méi)有,就把沒(méi)導(dǎo)入的數(shù)據(jù)表從原數(shù)據(jù)庫(kù)中單獨(dú)導(dǎo)出sql文件,再單獨(dú)導(dǎo)入,結(jié)果也是報(bào)類似的錯(cuò)
看來(lái)導(dǎo)入數(shù)據(jù)庫(kù)的時(shí)候就是這些表出的問(wèn)題了。
然后就想著既然sql腳本有問(wèn)題,那我通過(guò)執(zhí)行sql的形式導(dǎo)入,這些應(yīng)該總行了吧,但是報(bào)如下錯(cuò):
Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
看報(bào)錯(cuò)提示似乎字段的長(zhǎng)度不夠,需要改為“TEXT“或者”BLOB”類型,我直接把我內(nèi)容比較多的字段類型改為“LONGTEXT”,這樣應(yīng)該承得下了把,但執(zhí)行sql時(shí)還是報(bào)這個(gè)錯(cuò)。
后面發(fā)現(xiàn)這是InnoDB 存儲(chǔ)引擎的一個(gè)配置參數(shù)“innodb_strict_mode”,是否采取嚴(yán)格模式的問(wèn)題,只要把它關(guān)了就可以導(dǎo)入了。
解釋:
innodb_strict_mode 是 MySQL 中 InnoDB 存儲(chǔ)引擎的一個(gè)配置參數(shù),它用于控制 InnoDB 存儲(chǔ)引擎在處理某些可能的不規(guī)范或錯(cuò)誤的數(shù)據(jù)時(shí)是否采取嚴(yán)格模式,默認(rèn)是開(kāi)啟。
關(guān)閉采取嚴(yán)格模式的辦法如下:
在“[mysqld]”下加入如下配置
#處理 MySQL導(dǎo)入數(shù)據(jù)庫(kù)1118錯(cuò)誤解決方案[ERR] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB
innodb_strict_mode=0
保存退出,再重啟MySQL
service mysql restart
刪除原來(lái)的數(shù)據(jù)庫(kù),再次導(dǎo)入
成功。
五、當(dāng)前MySQL配置文件
[mysqld]
port=3306
basedir=/usr/local/mysql/mysql-8.0.35 # MySQL根目錄
datadir=/usr/local/mysql/mysql-8.0.35/data/ # MySQL的data目錄
socket=/tmp/mysql.sock
character-set-server=UTF8MB4
symbolic-links=0#配置大小寫(xiě)不敏感,配合初始化mysql時(shí)使用
lower_case_table_names=1#減少超時(shí)時(shí)間,避免使用“SHOW PROCESSLIST”命令出現(xiàn)很多“sleep”狀態(tài)的進(jìn)程,這里設(shè)置為120秒
wait_timeout=120
interactive_timeout=120#解決“java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list,references column”
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'#處理 MySQL導(dǎo)入數(shù)據(jù)庫(kù)1118錯(cuò)誤解決方案[ERR] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB
innodb_strict_mode=0