阿里云rds mysql导出.csv文件的时候遇到一些问题,记录下坑和解决方法。

一、 普通mysql库导出方法

1. SELECT ... INTO OUTFILE

-- 注意INTO OUTFILE路径必须有权限
SELECT * FROM dmptest 
INTO OUTFILE '/tmp/dmptest.csv'
FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n';

rds表导出时报错如下

SELECT * FROM dmptest 
    -> INTO OUTFILE 'dmptest.csv'
    -> FIELDS TERMINATED BY ',' 
    -> OPTIONALLY ENCLOSED BY '"' 
    -> LINES TERMINATED BY '\n';
ERROR 1045 (28000): Access denied for user 'root'@'%' (using password: YES)

2. mysqldump导出csv文件

mysqldump -uroot -p -h连接串 dmpdb dmptest -t -T /tmp/dmptest.csv --fields-terminated-by=','

rds表导出时报错如下,可以看到其实它还是利用select into outfile来执行的

mysqldump -uroot -p -h连接串 dmpdb dmptest -t -T /tmp/dmptest.csv --fields-terminated-by=','
Enter password: 
...
mysqldump: Got error: 1045: Access denied for user 'root'@'%' (using password: YES) when executing 'SELECT INTO OUTFILE'

3. select into outfile需要的权限

既然一直报错没有权限,查了一下文档执行该命令需要一个叫FILE的权限,这是个全局权限,不能授予单个库,只能给整个实例。授权语句如下:

GRANT FILE ON *.* TO 'dmpuser'@'localhost' IDENTIFIED BY 'xxxx';

另外mysql还有一个secure-file-priv参数,用于限制LOAD DATA INFILE或SELECT INTO OUTFILE的文件目录位置。可以使用SELECT @@global.secure_file_priv;查看当前设置的路径,为null则可在所有mysql可读写目录导入导出。

阿里云rds的高权限用户权限如下,可以看到它没有file权限

show grants for 'root'@'%';

输出:
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, PROCESS, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD 'xxxx' WITH GRANT OPTION

二、 解决方法

法1: 利用阿里云DMS工具导出

阿里云提供一个叫dms的客户端工具,可以直接在里面执行sql语句,也提供数据导出成各种格式的功能。但是注意单次最多只能导出3000行,如果需要导出更多,需要点击右下方的“创建导出工单”

创建导出工单后会自动审批,并进行导出

法2:导出文本文件然后将空格替换为逗号

但是如果文本中本身有逗号,这种方法就不太适用。

vi dmptest.sql
# 输入待导出sql语句

#导出为普通文本格式
mysql -uroot -p -h连接串 < dmptest.sql> dmptest.txt

#将空格替换为逗号,利用%s/ /,/g
vi dmptest.txt

法3: 利用拼接sql语句导出

同样如果文本中本身有逗号,这种方法就不太适用。以具体例子说明该方法,表结构如下:

  • CUST_NAME    varchar(10)
  • ID_TYP              varchar(5)
  • ID_NO                varchar(20)
  • ROLE_TYP        varchar(10)

vi dmptest.sql,拼接sql语句如下:

SELECT CONCAT('"',CUST_NAME,'","',ID_TYP,'","',ID_NO,'","',ROLE_TYP,'"') AS CUST_NAME,ID_TYP,ID_NO,ROLE_TYP FROM dmpdb.test_table;

将sql语句保存为文件,调用命令导出csv文件(其实就是把前面的空格转换在sql里提前做了)

mysql -uroot -p -h连接串 < dmptest.sql> dmptest.csv

参考

http://www.9enjoy.com/mysql-priv-file/

关于Mysql中select into outfile权限的探讨_clumsy_geek的博客-CSDN博客_mysql select intofile 权限

阿里云RDS导出csv文件_test-abc的博客-CSDN博客_rds文件变csv

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐