參考博客:https://www.cnblogs.com/Braveliu/p/11411272.html
使用命令:load data 語法格式爲
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name'
[REPLACE | IGNORE]
INTO TABLE tbl_name
[PARTITION (partition_name,...)]
[CHARACTER SET charset_name]
[{FIELDS | COLUMNS}
[TERMINATED BY 'string']
[[OPTIONALLY] ENCLOSED BY 'char']
[ESCAPED BY 'char']
]
[LINES
[STARTING BY 'string']
[TERMINATED BY 'string']
]
[IGNORE number {LINES | ROWS}]
[(col_name_or_user_var,...)]
[SET col_name = expr,...]
注意load data需要FILE操作權限,如果未授權,會報錯
ERROR 1045 (28000) at line 1: Access denied for user 'root'@'%' (using password: YES)
解決方案:
1.將load data infile 改爲load data local infile;
2.授權
爲當前用戶開通權限。給當前用戶開通FILE Privilege權限時,注意:
FILE權限與SELECE/DELETE/UPDATE等不同,後者是可以具體指定到某個db的某個表的,而FILE則是全局的,
即只能通過grant FILE on *.* to 'abcde'@'%'才能使FILE權限對所有db的所有tables生效。
通過grant all on db.* to 'abcde'@'%'不能使指定的user在指定的db上具有FILE權限。
根據最小權限原則(操作系統安全的概念),這個方法並不安全,故不推薦使用。
3.
非root用戶從client機器load data local infile至remote mysql server時,報錯:
ERROR 1148 (42000): The used command is not allowed with this MySQL version
可能原因(from mysql reference manual):
If LOAD DATA LOCAL is disabled, either in the server or the client, a client that attempts to issue such a statement receives the following error message:
ERROR 1148: The used command is not allowed with this MySQL version
可見,出於安全考慮,默認是不允許從client host遠程通過load data命令導數據的
解決辦法:
For the mysql command-line client, enable LOAD DATA LOCAL by specifying the --local-infile[=1]option, or disable it with the --local-infile=0 option
也即,在需要從client host導人數據的場景下,當登陸mysql時,需用--local-infile[=1]顯式指定參數,典型命令形式爲:
mysql --local-infile -u user -p passwd
登陸成功後,再執行load data infile 'filename' into table即可。
腳本大概長這樣:
#!/bin/bash
hostname=192.0.0.1
user=root
port=3306
pwd=mmmmmmmmm
filename=$1
dbname=$2
tablename=$3
mysql -h $hostname -P$port -u$user -p$pwd $dbname --default-character-set=utf8 -e "load data local infile '${filename}' into table ${tablename} fields terminated by ',';"