01 背景
select into outfile无论对于开发或DBA来说,都是一个爱不释手的导出数据的方式。相比mysqldump,它能够对需要导出的字段做限制,很好的满足了某些不需要导出主键字段的场景或分库分表的环境下数据的重新导入。且与load data infile配合起来,无疑是一款数据导入导出的利器。最近,开发小伙伴在测试环境使用select into file进行数据导出时,碰到了一个问题,觉得很有必要跟大家分享一下。
02 问题概述
客户某系统(以下简称ebank)开发小伙伴报告说自己的一个脚本使用了select into outfile对数据进行导出。然而数据无法导出。以下是该问题的排查过程。
03 排查过程及思路
1.查看数据库用户是否具有file权限
首先通过show grants命令查看ebank用户是否具有导出数据的file权限,如下代码所示:
mysql> show grants for ebank@"%";
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for ebank@% |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'ebank'@'%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `test`.* TO 'ebank'@'%' |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
由于该用户不具有file权限,因此第一步首先为该用户赋予file权限,由于file权限属于全局权限,因此为ebank用户赋予file权限时不必指明该权限专门赋予哪一个schema,若指明schema,则会报错。
mysql> grant file on test.* to "ebank"@"%";
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
若在赋予file权限时不对schema作限制,则可以赋权成功。