secure_file_priv对读写文件的影响
在对mysql数据进行导入和导出之前需要查看secure_file_priv(文件安全权限)参数的设置是否允许我们进行数据导入导出处理,可以通过
1 | mysql> show global variables like '%secure_file_priv%'; |
来进行从查看,不同的查询结果value值有不同的含义:
- 如果查询出的value=NULL,则说明当前mysql不允许进行数据导入导出
- 如果查询出的value是一个路径值,比如D:/mysqlUpload/,说明导入导出行为只能在该文件夹下进行,子文件都不允许
- 如果查询出的value是一个空串,说明导入导出动作可以在任何文件夹下进行
由于我没有设置过这个值,所以去查询该值的时候显示为NULL,应该是默认值。如果在value=NULL的状态下去执行LOAD DATA INFILE…INTO TABLE 和 SELECT … FROM … INTO OUTFILE的话,会出现报错:
1 | ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement |
设置secure_file_priv
- windows下:修改my.ini 在[mysqld]内加入secure_file_priv并设置想要进行导入导出的工作路径或者使用空串来取消限制
- linux下:修改my.cnf 在[mysqld]内加入secure_file_priv,赋值方式和在windows相同
由于我本地环境为windows且没有找到my.ini文件,所以就重新创建了一个,从网上找到默认配置后再进行修改的,也是可行的。修改完成后重启mysql服务就生效了。
进行数据的导入
1 | mysql > LOAD DATA LOCAL INFILE 'D:/mysqlUpload/pet.txt' INTO TABLE pet FIELDS TERMINATED BY ',' |
参数说明:
- LOAD DATA LOCAL INFILE [filepath] INTO TABLE [table]:将某个路径下的数据导入到某张表中
- FIELDS TERMINATED BY:文件中每一行数据的各个字段的数据是由什么分隔符分割的,如果不写默认为TAB
- LINES TERMINATED BY:每行之间的换行符,不同系统之间换行符是不同的,上述为windows下的
进行数据的导出
1 | mysql > SELECT * FROM pet INTO OUTFILE "D:/mysqlUpload/pet.txt" |
参数说明:
- INTO OUTFILE [filepath]:将查询的数据导出到某个路径的文件中
- FIELDS TERMINATED BY: 同数据的导入一样
- OPTIONALLY ENCLOSED BY:输出的字段数据用什么包围,这里定义的是使用引号包围