MySQL into outfile secure-file-priv

/ Database / 没有评论 / 60浏览

MySQL可以使用 into outfile 做文件的直接倒出,但是,数据库默认这个服务是没有开启的,直接运行select * from XXX into outfile ‘xxx.xlsx’;,则会报如下错误:

[HY000][1290] The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

show global variables like '%secure_file_priv%'; secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。

secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。 secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。 secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。 因为 secure_file_priv 参数是只读参数,不能使用set global命令修改

解决方法

打开my.cnfmy.ini,加入以下语句后重启mysql。

secure_file_priv=''
service mysql restart

此时再执行:

select a.权益名称,a.销售品NBR from `权益相关销售品(0103)` a into outfile '/data/mysql/20200610Data.xlsx';

倒出成功。 注意: 倒出的路径必须存在,且为当前MySQL安装的环境下的路径,比如是linux的,则路径为linux的,否则会报路径找不到的错误。 倒出成功后,在该路径下可以看到该倒出文件。 [root@VM_0_11_centos mysql]# ll total 1173996 -rw-rw-rw- 1 mysql mysql 1577 Jun 10 11:41 20200610Data.xlsx

使用MySQL into outfile 倒出成功。

但是列名却没有,但是却可以通过修改sql语句的方法加上表头,具体实现方法是在查找数据的时候并上列名: select * from 权益相关销售品(0103) a into outfile '/data/mysql/20200610Data.xlsx' fields terminated by '\t' OPTIONALLY ENCLOSED BY '"' lines terminated by '\n' from (select '权益名称','销售品NBR' union select 权益名称,销售品NBR from table) b;

还有,MySQL支持直接导入文件 load data infile xxx into Table ‘zxzcd’; 不推荐使用SQL进行文件数据的导入,因为,一不小心就是坑~~