剛裝的ubuntu,裝好mysql后想用load data infile命令導入數據到表中,產生下面錯誤”ERROR 29 (HY000):File ‘/home/bioinformation/Downloads/data.txt’ not found (Errcode: 13)”,
然后查了一下load data語法:
- LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt'
- [REPLACE | IGNORE]
- INTO TABLE tbl_name
- [FIELDS
- [TERMINATED BY 'string']
- [[OPTIONALLY] ENCLOSED BY 'char']
- [ESCAPED BY 'char' ]
- ]
- [LINES
- [STARTING BY 'string']
- [TERMINATED BY 'string']
- ]
- [IGNORE number LINES]
- [(col_name_or_user_var,...)]
- [SET col_name = expr,...]]
LOAD DATA INFILE 語句以很高的速度從一個文本文件中讀取行到一個表中,文件名必須是一個文字字符串.
發現沒有問題,這時我就眾權限來入手了將mysql用戶改為”root”后還是不行,后來上網查了一下,要么不知所云,要么是覺得方法太復雜,而是想,這個錯誤的意思是找不到文件,那把這個文件復制到mysql數據庫所在的文件不就行了,在安裝mysql的時候沒有注意,不知道mysql安裝在哪里,如是想與其自己找,不如讓它自己告訴我,而是load時用了個相對路徑,代碼如下:
”load data infile ‘data.txt’ into table table_name”,
果然mysql報錯時就顯示了” Can’t get stat of ‘/var/lib/mysql/test/data.txt’ (Errcode: 2)”,而是用“/home/bioinformation/Downloads/data.txt”復制為“/var/lib/mysql/test/data.txt”,結果發現用戶沒有權限,果斷用”sudo su”切換到root用戶,OK后,再運行,代碼如下:
”load data infile ‘data.txt”
果然成功了,顯示“Query OK,……”,再將用戶切換到正常用戶就行了,現總結如下,很簡單,先用root用戶將用戶復制到mysql數據庫所在文件夾,運用相對路徑“load data infile ‘data.txt’ into table table_name”就可以了.
如何提高mysql load data infile的速度
測試數據2.5G,共有數據9427567條,用的mysql的large服務器的配置.
load一次需要大概10分鐘左右.
建的表用的是MYISAM,調整了幾個session的參數值,代碼如下:
SET SESSION BULK_INSERT_BUFFER_SIZE=256217728;
SET SESSION MYISAM_SORT_BUFFER_SIZE=256217728;
運行結果如下:
Query OK, 9427567 rows affected, 1558 warnings (3 min 55.21 sec)
Records: 9427567 Deleted: 0 Skipped: 0 Warnings: 0
google到的還可以,代碼如下:
set global KEY_BUFFER_SIZE=256217728;
alter table tablename disable keys;
如何load不同編碼的數據
原來用的4.X的mysql,我是select INTO OUTFILE,只后用iconv,或者其他軟件來做。可以參考這里,但是由于這次數據大,用ultraedit等軟件打開都要半天,好在新版的mysql可以增加一個新的參數:CHARACTER SET gbk
我的文本數據是GBK的編碼,數據表是utf8的,用這種方法測試成功.
如何load的時候只insert特定的列
比如表里面有比元數據多的列,可以在load的時候指定要插入的字段名字,示例的代碼如下:
- LOAD DATA INFILE '~/data.txt'
- INTO TABLE fb0505 --Vevb.com
- CHARACTER SET gbk
- FIELDS TERMINATED BY 't' ENCLOSED BY '' ESCAPED BY ''
- LINES TERMINATED BY 'n' STARTING BY ''
- (seller_id,fb_type,fb_date,item_url);
其中表fb0505里面還有一列是id.
新聞熱點
疑難解答