剛裝的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 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。