`

select into outfile access deny问题

阅读更多
本文转自:http://hatemysql.com/2010/06/29/select-into-outfile-access-deny%E9%97%AE%E9%A2%98/

为应用建立了rnd的帐号,专门为他们查询线上数据库用的,当然,只有他们上了生产网络以后才能连上数据库,安全方面我们还是很注意的,呵呵。
授权的语句如下:
grant select on armory.* to rnd;
flush privileges;

select查询数据没有问题,但是有的用户有了更多的需求,他想把数据导出来,简单的处理的话,可以用select into outfile导出来。自己指定字段的分隔,行分隔等等。
但是用户一查询就报:access deny的错误,权限不对。
rnd@localhost : armory 09:26:31> select * into outfile ‘/tmp/1.txt’ from os limit 5;
ERROR 1045 (28000): Access denied for user ‘rnd’@'%’ (using password: NO)
郁闷的是MySQL没有说缺少了那个权限。

在本机测试了一下,
grant all on armory.* to rnd;
flush privileges;
给rnd所有的权限以后,还是报权限错误。这个就奇怪了,所有的权限都给它了,还报错?不可理喻阿。
实在搞不定,最后让用户:
mysql -urnd -p -e ‘select * from os limit 5;’ >1.txt
的变通方法。

一直被这个纠结着,突然后来有一天,查询了一下MySQL的文档,找到是file的权限没有加上去,但是当时MySQL对应的库的所有权限我都加上去了阿。灵光一闪,file是全局的权限,在MySQL中对单个库是没有这个权限概念的,所以就算我把库上的所有权限给了rnd,file的权限其实还是没有附权给它的。不信的话,我们这就试试:
root@localhost : (none) 09:55:14> grant file on armory.* to rnd;
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
果然,File权限是GLOBAL权限,不能附权给数据库。
GLOBAL FILE附权以后
root@localhost : mysql 09:58:21> grant file on *.* to rnd;
Query OK, 0 rows affected (0.00 sec)
select查询就可以执行了:
rnd@localhost : armory 10:00:42> select * into outfile ‘/tmp/1.txt’ from os limit 5;
Query OK, 5 rows affected (0.00 sec)

其实MySQL的权限可能比较拗,让我们一下子适应不过来。MySQL的权限可以精细到列,权限判断是根据GLOBAL,DB,TABLE,COLUMN来授权的,可以简单的理解为他们对应到mysql库中的四个表:user,db,tables_priv,columns_priv这几个表。当然,MySQL没有这么简单拉。有兴趣的话可以好好看一下MySQL的reference或者其他介绍。举个例子:
rnd@localhost : armory 10:00:43> show grants for rnd;
+————————————————-+
| Grants for rnd@%                                |
+————————————————-+
| GRANT FILE ON *.* TO ‘rnd’@'%’                  |
| GRANT ALL PRIVILEGES ON `armory`.* TO ‘rnd’@'%’ |
+————————————————-+
2 rows in set (0.00 sec)
grant对同一个用户就分了两行,分别对应着user和db里面的两行:


补充一下:

导出数据格式

字段之间的分隔字符,转义字符,包括字符,及记录行分隔字符。列在下面:
FIELDS
TERMINATED BY '\t'
[OPTIONALLY] ENCLOSED BY ''
ESCAPED BY '\\'
LINES
TERMINATED BY '\n'

TERMINATED 表示字段分隔
[OPTIONALLY] ENCLOSED 表示字段用什么字符包括起来,
如果使用了OPTIONALLY则只有CHAR和VERCHAR被包括 ESCAPED 表示当需要转义时用什么作为转义字符
LINES TERMINATED 表示每行记录之间用什么分隔

分享到:
评论

相关推荐

    用SELECT… INTO OUTFILE语句导出MySQL数据的教程

    在MySQL中,SELECT… INTO OUTFILE语句是一个非常实用的功能,用于将查询结果直接导出到服务器主机上的文件。这个语句将数据以特定的格式保存,方便进行数据备份、迁移或者进一步处理。以下是关于使用SELECT… INTO ...

    用SELECT... INTO OUTFILE语句导出MySQL数据的教程

    INTO OUTFILE`语句是MySQL提供的一种便捷方式,允许用户将查询结果直接导出到服务器主机上的文本文件。这个功能对于数据库管理员和数据分析师来说非常实用,因为它简化了数据提取的过程。 使用`SELECT... INTO ...

    MySQL查询结果导出到文件的另类方法.txt

    本文将深入探讨一种另类但实用的方法,即利用MySQL的`SELECT INTO OUTFILE`命令以及结合系统命令行工具如`cat`和`vim`来实现这一目标。这种方法不仅能够有效避免文件覆盖问题,还能进行数据对比,为数据管理和分析...

    MySQL数据库备份与恢复.pdf

    其中一种方法是使用 SELECT INTO OUTFILE 语句将数据备份到一个文件中。这种方法可以将选择的行写入到一个文件中,文件在服务器主机上被创建,并且不能是已经存在的。 SELECT INTO OUTFILE 语句 SELECT INTO ...

    SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解(SQL数据库和Oracle数据库的区别)

    在MySQL中,如果你想将数据导出到文件,可以使用`SELECT INTO OUTFILE`。例如: ```sql SELECT column1, column2, ... INTO OUTFILE '/tmp/result.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES ...

    Mysql注入中的outfile、dumpfile、load_file函数详解

    SELECT * FROM test INTO OUTFILE '/tmp/test.txt' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; ``` 这样的命令可以指定字段间的分隔符、字段值的包裹符以及每行数据之间的...

    MySQL数据导入导出.pdf

    本文主要介绍两种常见的MySQL数据导入导出方法:`SELECT INTO OUTFILE`语句和`mysqldump`实用程序。 1. **使用 `SELECT INTO OUTFILE` 语句** - **基本语法**:`SELECT * FROM table INTO OUTFILE 'filename'` - ...

    实验4 数据库备份与恢复实验.docx

    该语句的格式为select * into outfile '/path/to/file' from departments;其中,/path/to/file是文件的路径。 Knowledge Point 2:使用select…into…outfile语句对数据库employees的表salaries进行数据导出,并...

    MySQL+数据导入导出+实用技巧

    本文将详细介绍 MySQL 中数据导入导出的方法,包括 `SELECT INTO OUTFILE` 和 `LOAD DATA INFILE` 的使用,并提供一些实用技巧。 #### 二、数据导出:SELECT INTO OUTFILE ##### 2.1 基本概念 `SELECT INTO ...

    MySQL数据库:数据库的备份与恢复语句.pptx

    例如,使用`SELECT INTO OUTFILE`或`DUMPFILE`语句将数据导出到文本文件,这样在需要时可以通过`LOAD DATA INFILE`将数据重新导入到数据库中。但是,这种方式仅能备份数据,不包括表结构,所以表结构的备份需要额外...

    Mysql数据导出成Excel方法

    在 MySQL 中,我们可以使用 SELECT INTO OUTFILE 语句来将数据导出成文本文件,然后再将其转换成 Excel 格式。以下是一个示例命令: `SELECT * INTO OUTFILE '/tmp/test.xls' FROM tb1 WHERE 1 ORDER BY id DESC ...

    Sql 转换为access数据库

    1. **数据导出**:从SQL数据库中导出数据,这可以通过SQL的内置功能,如`SELECT INTO OUTFILE`(MySQL)或`BCP`命令(SQL Server)来实现,生成CSV或XML格式的文件。 2. **数据清洗**:确保数据符合Access的字段...

    MySQL数据导入导出

    通过SELECT INTO OUTFILE导出数据时,可以指定字段分隔符、行分隔符、字符包围符和转义字符等参数,以便生成的文件符合特定的需求。例如,可以指定字段分割字符为逗号、包围字符为双引号、行分隔符为回车换行符等。 ...

    备份和恢复MYSQL数据表

    如果使用了 `SELECT INTO OUTFILE` 备份数据,则可以使用 `LOAD DATA INFILE` 将数据重新加载回数据库。基本语法如下: ```sql LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE '文件路径' [REPLACE | IGNORE] INTO TABLE...

    MySQL数据导入与导出

    `SELECT INTO OUTFILE`是MySQL提供的一种简单有效的数据导出方法,可以直接将查询结果写入到指定的文件中。例如: ```sql USE phptest; SELECT * FROM driver INTO OUTFILE 'a.txt'; ``` 执行上述SQL语句后,查询...

    Access数据库表与Sql数据库表转换

    你可以利用SQL Server的“SELECT INTO OUTFILE”语句导出数据为文本文件,然后在Access中导入。另一种方法是使用SSIS(SQL Server Integration Services)或编写自定义的SQL脚本,将数据导出为CSV格式,再通过Access...

    Access、SQLServer、Excel三者之间实现导入与导出

    5. SQL Server到Excel导出:利用SSIS包或T-SQL的SELECT INTO OUTFILE命令生成CSV文件,然后在Excel中打开。 6. SQL Server与Access的数据交换:通过OLEDB或ODBC连接,在VBA中编写SQL语句执行查询,然后处理返回的...

    MySQL数据库备份与恢复[参考].pdf

    `SELECT INTO OUTFILE`用于备份数据,而`LOAD DATA INFILE`用于恢复数据。例如,可以使用以下命令备份表`tbl_name`: ```sql SELECT * INTO OUTFILE 'tbl_name.bak' FROM tbl_name; ``` 然后,通过`LOAD DATA IN...

Global site tag (gtag.js) - Google Analytics