MySQL 5.7
MacOS Sirrea 10.12.1
前言
很簡(jiǎn)單,我得文件里面20w數(shù)據(jù),導(dǎo)入MySQL后只剩下16w條數(shù)據(jù),無(wú)Deleted無(wú)Skipped
排查方法
既然數(shù)據(jù)丟失了,那把成表后的數(shù)據(jù)全部導(dǎo)出,然后和原始的數(shù)據(jù)進(jìn)行對(duì)比驗(yàn)證
select * from db.table INTO OUTFILE '/usr/local/mysql-5.7.18-macos10.12-x86_64/output/all'
如果無(wú)法導(dǎo)出permission denly ,這里有一組解決方案
檢查 mysql secure_file_priv mysql 是否為None,如果為none,則需要改寫(xiě)配置文件
mysql> SELECT @@secure_file_priv;
+---------------------------------------------------+
| @@secure_file_priv |
+---------------------------------------------------+
| None |
+---------------------------------------------------+
1 row in set (0.00 sec)
- 停止mysql服務(wù)
- 修改my.cnf文件,追加
secure-file-priv="/usr/local/mysql/output",當(dāng)然最后的output是我自己創(chuàng)建的文件夾,如果沒(méi)有my.cnf文件,請(qǐng)看下面排查問(wèn)題這里 - 重啟mysql服務(wù),進(jìn)入sql環(huán)境
mysql> SELECT @@secure_file_priv;
+---------------------------------------------------+
| @@secure_file_priv |
+---------------------------------------------------+
| /usr/local/mysql-5.7.18-macos10.12-x86_64/output/ |
+---------------------------------------------------+
1 row in set (0.00 sec)
# 測(cè)試
#select xx from xx INTO OUTFILE '/usr/local/mysql-5.7.18-macos10.12-x86_64/output/xx.csv'
如果還是出現(xiàn)問(wèn)題
Can't create/write to file 'xxxxxx' (Errcode: 13 - Permission denied)
解決方案:給自己的路徑增加權(quán)限: sudo chmod 777 dirpath
參考:Can't create/write to file '/tmp/#sql_xxxx.MYI' (Errcode: 13)
如過(guò)還是遇到問(wèn)題:
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
排查原因
可能是單個(gè)數(shù)據(jù)太大,導(dǎo)致導(dǎo)入失敗
因?yàn)镸ySQL對(duì)單個(gè)package是有限制的,所以如果大于默認(rèn)值的文件導(dǎo)入會(huì)失敗,但是我這并沒(méi)有報(bào)錯(cuò),抱著試一試的心態(tài),,,,果然沒(méi)有效果呢
- 修改my.cnf文件,如果是mac環(huán)境:解決:Mac下mysql配置文件沒(méi)有my-default.cnf,無(wú)法配置my.cnf
max_allowed_packet=500M
- 改之后保存文件并且重啟MySQL服務(wù),可以命令行查看下修改的值是否生效

可能是字段內(nèi)特殊符號(hào)
- 根據(jù)對(duì)照原始數(shù)據(jù),很容易發(fā)現(xiàn)那里缺失斷層了,抽出原始字段類(lèi)型字段類(lèi)型如下
37388xxx|8|在哪裡跌倒,就坐在哪裡玩!"|北京市|東城區(qū)|None|None|60|81|40|http://music.163.com/user/fans?id=373xxx
- 以下是數(shù)據(jù)導(dǎo)入的方式
LOAD DATA LOCAL INFILE 'xxxxfile' INTO TABLE db.table
FIELDS TERMINATED BY '|' //行內(nèi)文本分隔符
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'; //行結(jié)束符
ENCLOSED BY "" //字段閉合標(biāo)簽,例如ENCLOSED BY ' " ',則字段以雙引號(hào)”“閉合,在雙引號(hào)內(nèi)部的字段分隔符都會(huì)被忽略
<font color=red>簡(jiǎn)直了?。?!這是何等的我曹,這么說(shuō)來(lái),如果我的其中一個(gè)字段中只有一個(gè)" ,那我特么以后的分隔符都沒(méi)用啦!要等到下一個(gè) " 才能進(jìn)行分,中間全部被包裹!</font>
- 解決方案:把字符串中"的地方都替換掉,或者設(shè)置OPTIONALLY ENCLOSED BY ''
多謝→_→LOAD DATA INFILE語(yǔ)句導(dǎo)入數(shù)據(jù)進(jìn)入MySQL的一些注意事項(xiàng)
最后
差不多花了半天才找到問(wèn)題所在,剛開(kāi)始以為是超出限制了,所以沒(méi)有導(dǎo)入成功,之后導(dǎo)出數(shù)據(jù)的時(shí)候由是一堆錯(cuò)誤,心塞,還好一一解決,這次遇到了數(shù)據(jù)清洗的問(wèn)題了,上游數(shù)據(jù)如果不經(jīng)過(guò)清洗直接導(dǎo)入數(shù)據(jù)庫(kù),這會(huì)對(duì)下游數(shù)據(jù)產(chǎn)生很大的影響,切記切記,最后還是要耐心,善用搜索引擎!
致謝
LOAD DATA INFILE語(yǔ)句導(dǎo)入數(shù)據(jù)進(jìn)入MySQL的一些注意事項(xiàng)
解決:Mac下mysql配置文件沒(méi)有my-default.cnf,無(wú)法配置my.cnf
修改MySQL導(dǎo)入數(shù)據(jù)文件大小限制的方案