专栏首页DBA随笔MySQL之load data和select into outfile

MySQL之load data和select into outfile

MySQL之load data和select into outfile
select into outfile

今天上午,帮助业务方解决了一个问题,过程大概是这样的。业务方有一个需求是要实现在客户端的应用服务器使用select into outfile的方法导出一个文件。这个需求之前也做过,就是简单的开通一下file的权限就可以了,这里需要注意的是,开通file的权限,需要使用*.*,而不能指定数据库进行操作,如下:

mysql:devopsdb ::>>grant file on devopsdb.* to 'dba_yeyz'@'192.168.18.%'   ;
ERROR  (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
mysql:devopsdb ::>>grant file on *.* to 'dba_yeyz'@'192.168.18.%'   ;        
Query OK,  rows affected (0.05 sec)

可以看到,当我们指定数据库去分配file权限的时候,系统提示报错,如果使用*.*的时候,则是可以成功分配权限的,所以在使用file权限的时候,还需要大家指定所有的数据库。

然后我帮业务方的账号开通了file权限,他反应能够进行select into outfile的操作,但是在指定的目录里面找不到保存的文件!!!也就是说使用了:

select * from test into outfile "/tmp/a.sql"

之后,显示执行成功,但是在/tmp目录下面找不到a.sql文件。这还奇了怪了,我以为是他的操作错误,然后就过去看了看,发现真的是这样的,于是我想到是不是直接将文件保存到了MySQL服务器上,回来一看,果然有。

说明了一个问题,当客户端和服务器不在一台机器上的时候,使用select into outfile会将结果文件保存在服务器上的对应目录,而不会下载到客户端本地。

官方文件对于这个的语法的解释是:

The SELECT ... INTO OUTFILE 'file_name' form of SELECT writes the selected rows to a file. The file is created on the server host, so you must have the FILE privilege to use this syntax. file_name cannot be an existing file, which among other things prevents files such as /etc/passwd and database tables from being destroyed. Thecharacter_set_filesystem system variable controls the interpretation of the file name.

If you want to create the resulting file on some other host than the server host, you normally cannot use SELECT ... INTO OUTFILE since there is no way to write a path to the file relative to the server host's file system.

However, if the MySQL client software is installed on the remote machine, you can instead use a client command such as mysql -e "SELECT ..." > file_name to generate the file on the client host.

上面的文字说的比较清楚了,这个select into outfile的方法是只能将文件生成在服务器上,而不能生成在客户端上,通常我们没有办法直接生成在客户端上,但是可以使用mysql -e “select”> /tmp/file这种重定向的方法,将文件生成在客户端上,有了这个提示,当然,我们可以使用concat等一系列函数来拼接一些逗号之类的表达式,这样就可以得到我们想要的结果,实际上我也是这么给业务方操作的。

load data

load data这个语法是select into outfile的反义词,它是从外部将数据导入到MySQL服务器,它比select into outfile好一些,它提供了一些可选项,例如local选项,所以分为:

load data local infile

load data infile

两种语法,这两种语法不一样的地方在于,如果你使用了load data infile,则你load的文件必须位于MySQL服务器上;如果你使用了load data local infile,则你的load 的文件必须存在于客户端上,该语句将从客户端将文件读取并发送到服务器上。

简单总结:

也就是说,load data的方法是可以load一个本地的文件的,只要你带了local参数,如果没有带,则只能load一个服务器上的文件;

而select into outfile的方法只能将文件指定在服务器上,不过我们可以用Linux中的重定向的方法来使我们select的内容保存在本地。

这两个语句都需要有对应账号的file权限才可以执行。

本文分享自微信公众号 - DBA随笔(gh_acc2bbc0d447),作者:AsiaYe

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 外键的一些注意事项

    首先需要了解的是,InnoDB是目前唯一支持外键的内置存储引擎。使用外键是有一定成本的。这里讨论一下外键的优劣势:

    AsiaYe
  • 利用MySQL二进制包进行版本升级

    线上有个数据库主从环境的MySQL版本是5.5.19版本的,由于5.5.19环境的MySQL在运维侧的支持不太好,例如:不能动态修改buffer_pool...

    AsiaYe
  • Linux中的防火墙简介

    Linux防火墙这块儿的内容比较多,一直以来,都是一个使用者的角色,最近在看一些防火墙相关的知识,简单列一下,大家也可以了解一下。

    AsiaYe
  • Dubbo集群容错模式之Failover实现 原

                                                         图1 Dubbo的FailoverClusterInv...

    克虏伯
  • 跟我一起学docker(16)--单节点mesos集群

    IT故事会
  • python -服务器与客户端断电续传程序详细介绍

    可以先新建好这三个文件夹,也可以用os.path.exists(path)判断路径来生成

    小小咸鱼YwY
  • 再次针对中国?美国新规限制AI软件出口,周一生效

    路透社最新消息,美国将于1月6日,也就是明天,专门针对AI软件出口进行新的管制。没错,这次针对的还是中国。

    镁客网
  • 【IFE】Day 1 – 百度前端技术学院 基础学院 学习笔记(一)

    Hyejeong小DD
  • 爬虫篇——基础知识介绍爬虫步骤内容请求网页(requests库)html页面解析网页

    前言: 爬虫是信息和数据获取的一种手段,写此文一方面梳理一下自己学习知识的思路,如果再能帮到一些人就更好了。 爬虫步骤 爬虫的步骤一般类似,步骤如下: ...

    DC童生
  • python开发_fileinput

    Hongten

扫码关注云+社区

领取腾讯云代金券