参考博客: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 ',';"