网上很普通的方案,核心都是使用INTO OUTFILE关健字语句来达成。如何玩出花来?因为有可能mysql是别人运维,而自己只有一个普通的mysql用户登陆,哪能办?不同的mysql版本,操作方式还是不一样的,关键看show global variables like '%secure_file_priv%';命令输出
零,一些说法
select * from user into outfile '/tmp/user.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\r\n';
以上命令在mysql5.6下运行没有问题,但在mysql5.7下运行则出现了以下错误。
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
查看官方文档,secure_file_priv参数用于限制LOAD DATA, SELECT …OUTFILE, LOAD_FILE()传到哪个指定目录。
secure_file_priv 为 NULL 时,表示限制mysqld不允许导入或导出。
secure_file_priv 为 /tmp 时,表示限制mysqld只能在/tmp目录中执行导入导出,其他目录不能执行。
secure_file_priv 没有值时,表示不限制mysqld在任意目录的导入导出。
一,更改mysql配置并重启
命令show global variables like '%secure_file_priv%';
输出如下:
mysql> show global variables like '%secure_file_priv%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | NULL |
+------------------+-------+
1 row in set (0.00 sec)
打开my.cnf 或 my.ini,加入以下语句后重启mysql,具体位置百度吧,我没有使用此方式,没有root管理和启停权限呀。
secure_file_priv=''
二,导出csv文件到指定位置
最新版本的mysql 5.7.31,就有一个默认的配置位置。
命令show global variables like '%secure_file_priv%';
输出如下:
mysql> show global variables like '%secure_file_priv%';
+------------------+-----------------------+
| Variable_name | Value |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.01 sec)
三,我的mysql的csv导出语句
还带了个联表查询,对于我这样的生手,不容易咯~~
SELECT d.version, d.env, a.name, d.cmdb, d.add_date from deployhistory d JOIN App a on d.app_id=a.id WHERE d.env = 'PRD' and d.add_date >'2020-10-17' INTO OUTFILE '/var/lib/mysql-files/tmp2020.csv' fields TERMINATED BY ',' LINES TERMINATED BY '\r\n';
网友评论