Mysql 命令 load data infile 权限问题
【1】Mysql命令load data infile 执行权限问题
工作中,经常会遇到往线上环境mysql数据库批量导入源数据的场景。
针对这个场景问题,mysql有一个很高效的命令:load data infile
通过load data infile命令将data_file文件数据导入表中。
当然,因为mysql数据库权限限制的问题,分为以下几种情况:
(1)root用户(特指mysql的root,非Linux系统的root)
在mysql server部署机器通过load data infile命令导入数据时,只要文件路径指定正确,一般不会有问题。
如果导入失败,请参见随笔《Mysql 导入文件提示 --secure-file-priv option 问题》
(2)非root用户在mysql server部署机器通过load data infile命令导入数据时,报错:
ERROR 1045 (28000): Access denied for user 'xxx'@'xxx' (using password: YES)
这个错误一般是因为非root用户没有FILE Privilege权限,查询当前用户权限可参见随笔《Mysql 用户及权限》
两种解决方案:
[1] 命令加local参数。用load data local infile 'filename' into table 来导入数据(强烈推荐使用)
[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即可。
Good Good Study, Day Day Up.
顺序 选择 循环 总结