Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法

文章目录

  • 关于参数 secure_file_priv
  • 按默认参数设定导出表数据到文本文件中
  • 自定义分隔符,将表数据导出到 txt 文件中
  • 自定义分隔符,将表数据导出到 csv 文件中
  • 导出数据时,提示“拒绝访问”
  • 总结
    • 确保 Linux 用户 mysql 对导出的目标目录拥有写入和执行两种权限
    • 将数据导出到 /tmp 目录下
    • 在导出数据时不指定目标文件的绝对路径

操作系统的版本是:CentOS Linux release 8.2.2004 (Core)
数据库的版本是:mysql Ver 14.14 Distrib 5.7.31, for Linux (x86_64) using EditLine wrapper

关于参数 secure_file_priv

在文件 /etc/my.cnf 中,有一个参数叫 secure_file_priv,这个参数的主要目的就是限制 LOAD DATA INFILESELECT INTO OUTFILE语句的导入导出的目录位置。登录数据库后,可以执行下面的命令语句查看该参数的值:

mysql> select @@secure_file_priv;
+--------------------+
| @@secure_file_priv |
+--------------------+
| /                  |
+--------------------+
1 row in set (0.00 sec)

从结果可以看到参数 secure_file_priv 的值是 /,表示可以在根目录下,即可以在任何目录下导入和导出,实际测试中发现可以在任何目录导入数据,但是根本无法在任何目录下导出数据,只能在目录 /tmp 下导出数据,其它目录则不行。

按默认参数设定导出表数据到文本文件中

数据表 student 存储的数据如下:

mysql> select * from student;
+----------------------+--------------+------+-------+----------+---------------------+
| id                   | name         | age  | score | birthday | insert_time         |
+----------------------+--------------+------+-------+----------+---------------------+
| 00000000000000000001 | liaowenxiong |   18 |  NULL | NULL     | 2021-09-25 10:40:51 |
| 00000000000000000002 | liudehua     |   28 |  NULL | NULL     | 2021-09-25 10:40:51 |
| 00000000000000000003 | zhangxueyou  |   38 |  NULL | NULL     | 2021-09-25 10:40:51 |
+----------------------+--------------+------+-------+----------+---------------------+
3 rows in set (0.00 sec)

将数据表 student 的数据导出到文件 /tmp/student.txt 中:

mysql> select * from student into outfile '/tmp/student.txt';

在命令终端中查看该文件的内容如下:

[root@htlwk0001host ~]# cat /tmp/student.txt
00000000000000000001	liaowenxiong	18	\N	\N	2021-09-25 10:40:51
00000000000000000002	liudehua	28	\N	\N	2021-09-25 10:40:51
00000000000000000003	zhangxueyou	38	\N	\N	2021-09-25 10:40:51

注:\N 表示空值。

使用图形化编辑器打开文件 /tmp/student.txt 看下:
在这里插入图片描述

自定义分隔符,将表数据导出到 txt 文件中

用以下命令把 student 表的数据导出到 /tmp/student.txt

mysql> select * from student into outfile '/tmp/student.txt' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';
Query OK, 3 rows affected (0.00 sec)

参数说明:

into outfile – 指定导出的目录和文件名
fields terminated by – 指定字段间分隔符,即定义字段间的分隔符
optionally enclosed by – 指定字段包围符,即定义包围字段的字符,而参数optionally表示数值型字段无效,即数值类型的值不要加包围符
lines terminated by – 指定行间分隔符,即定义每行的分隔符

使用命令查看文件 /tmp/student.txt 的内容:

[root@htlwk0001host ~]# cat /tmp/student.txt;
00000000000000000001,"liaowenxiong",18,\N,\N,"2021-09-25 10:40:51"
00000000000000000002,"liudehua",28,\N,\N,"2021-09-25 10:40:51"
00000000000000000003,"zhangxueyou",38,\N,\N,"2021-09-25 10:40:51"

查看输出结果可以看到,数据类型没有添加双引号,字符串和日期类型的数据有加双引号。

使用图形化编辑器打开文件 student.txt:
在这里插入图片描述
如果把参数 optionally 去掉再导出数据:

mysql> select * from student into outfile '/tmp/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';
Query OK, 3 rows affected (0.00 sec)

你可以看到如下的导出结果:

[root@htlwk0001host ~]# cat /tmp/student.txt
"00000000000000000001","liaowenxiong","18",\N,\N,"2021-09-25 10:40:51"
"00000000000000000002","liudehua","28",\N,\N,"2021-09-25 10:40:51"
"00000000000000000003","zhangxueyou","38",\N,\N,"2021-09-25 10:40:51"

不加参数 optionally,那么所有的字段值都会加上双引号。

自定义分隔符,将表数据导出到 csv 文件中

用以下命令把 student 表的数据导出到 /tmp/student.csv

select * from student into outfile '/tmp/student.csv' fields terminated by ',' optionally enclosed by '"' lines terminated by '\n';

使用命令查看文件 /tmp/student.csv 的内容:

[root@htlwk0001host ~]# cat /tmp/student.csv;
00000000000000000001,"liaowenxiong",18,\N,\N,"2021-09-25 10:40:51"
00000000000000000002,"liudehua",28,\N,\N,"2021-09-25 10:40:51"
00000000000000000003,"zhangxueyou",38,\N,\N,"2021-09-25 10:40:51"

我们再使用图形化编辑器打开 csv 文件看下:
在这里插入图片描述

导出数据时,提示“拒绝访问”

以 root(这是Linux系统的用户)登录 Linux 系统,再以 root(这是数据库的用户) 登录数据库,再将数据库 test 中的表 student 导出到目录 /root/test 下的文件 student.txt 中

导出结果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';
ERROR 1 (HY000): Can't create/write to file '/root/test/student.txt' (Errcode: 13 - Permission denied)

把目录 /root/test 的权限改成 777,再以导出到目录 /root/test 下的文件 student.txt 中

导出结果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';    
Query OK, 3 rows affected (0.00 sec)

居然导出成功了。

把 /root/test 目录的权限该 744

切换成 mysql(这是Linux系统的用户)登录 Linux 系统,将 /root/test 的拥有者和所属用户组改成 mysql,并且把权限改成 755,再以 root(这是数据库的用户) 登录数据库,再将数据库 test 中的表 student 导出到目录 /root/test 下的文件 student.txt 中。

[root@htlwk0001host ~]# chown -R mysql:mysql /root/test # 将/root/test的拥有者和所属用户组改成mysql
[root@htlwk0001host ~]# ls -l /root
总用量 1284288
...
drwxrwxrwx 3 mysql mysql        272 929 11:02 test
...
[root@htlwk0001host ~]# chmod 755 /root/test # 将/root/test的权限改成所有者7,所属用户组5,其它用户5
[root@htlwk0001host ~]# ls -l /root
总用量 1284288
...
drwxr-xr-x 3 mysql mysql        272 929 11:02 test
...

导出结果:

mysql> select * from student into outfile '/root/test/student.txt' fields terminated by ',' enclosed by '"' lines terminated by '\n';
Query OK, 3 rows affected (0.00 sec)

居然可以成功导出数据。

总结

确保 Linux 用户 mysql 对导出的目标目录拥有写入和执行两种权限

1.以 mysql 身份登录 Linux 系统,不论目标目录的拥有者是不是用户 mysql,只要用户 mysql 对输出的目标目录有写入和执行的权限,就可以将数据库的数据导出到目标目录下的文件中。
2.以 root 身份登录 Linux 系统,不论 root 对目标目标有没有写入和执行的权限,只要目标目录的 other 的权限没有写入和执行,则无法将数据库的数据导出到目标目录下的文件中。

以上两点证明了一件事,登录 MySQL 数据库使用 SELECT INTO OUTFILE 语句导出数据库的数据,在往硬盘写入数据时,使用的是 mysql 用户身份来执行底层的写入数据的命令,所以只要确保 Linux 用户 mysql 对目标目录有写入和执行两种权限就可以正常导出数据了。

而这个 mysql 用户是在安装数据库时自动创建的一个 Linux 操作系统的用户,默认没有 shell 登录权限,需要在文件 /etc/passwd 或者使用命令 usermod 改成允许登录。

将数据导出到 /tmp 目录下

mysql 用户默认拥有 /tmp 目录的写入和执行的权限,所以只要把数据导出在该目录下即可。

在导出数据时不指定目标文件的绝对路径

在写入的时候不指定绝对路径,这样文件默认会写入 /etc/my.cnf 中参数 datadir 所指定的目录下。默认目录为 /var/lib/mysql。然后移动写入的文件到指定目录下即可。

看下文件 /etc/my.cnf 中的参数 datadir 的值:

mysql> select @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.00 sec)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333101.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

java cxfJava 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间。 这是一段漫长的旅程,但是在那里,所以发生了什么变化? 这是一个很好的问题,答案并不明显和直接。 总的来说, 拼图项目是一种颠覆性的变化&am…

MySQL数据字典

数据字典就类似于系统编目或花名册,它保存数据库服务器上的元数据信息(数据库的整体属性信息)。 元数据信息包括:数据库的属性信息、数据表的属性信息、字段的属性信息、视图的属性信息、用户信息、统计类信息等。 MySQL 保存元…

Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

Mybatis映射文件SQL语句模糊查询 1. “%”#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. ‘%${value}%’ 在参数中不需要添加 %_ 3. #{abc} 在参数中添加 %_ #和$的区别和注意事项 ${}直接拼接 ,不会转换类型 如果是简单类型,必须写${…

启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...

启动php-fpm服务器从无服务器开始时,您很快就会学习/听到有关函数冷启动的信息(我相信无服务器云功能 API )。 首次调用云功能时或长时间不调用后会发生冷启动。 基本上,服务器(是的,有服务器!&…

声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?

我们写 SQL 的时候,MySQL 怎么判断 SQL 是否已经结束了,可以去执行了? 需要一个结束符,当 MySQL 看到这个结束符的时候,表示可以执行前面的语句了,MySQL 默认以分号为结束符。 当我们创建存储过程或者自定…

istio api_Istio的网络API解释了

istio apiIstio 1.0版附带一个网络API,该API包含许多功能并涵盖了各种场景。 联网API在最近几个月中得到了发展,并且可能不会立即说明。 该API的概念和构建块是什么,以及如何使用各个Istio资源类型来通过我们的服务网格路由流量? …

MySQL命令之mysqldump的选项详解

文章目录--opt--skip-opt--add-drop-table--add-locks--skip-add-locks--allow-keywords--all-databases,-A--comments--skip-comments--compact--complete-insert,-c--compress,-C--events,-E--compatible--skip-disable-keys,-K--skip-add-drop-table--quick,-q--skip-quick-…

网关限流(令牌桶算法)

一、需求&#xff1a; 每个ip地址1秒内只能发送1次请求&#xff0c;多出来的请求返回429错误。 二、引入依赖 spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖 <!--redis--> <dependency><groupId&g…

openapi_MicroProfile OpenAPI上的Swagger UI

openapiMicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger- 批注 &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&am…

MySQL的用户表(user)

文章目录字段 host 中的特殊值介绍user 字段中的特殊值介绍我们查看下这张表的字段 host 和 user&#xff0c;如下所示&#xff1a; mysql> select host,user from user; ----------------------------- | host | user | ----------------------------- |…

BCrypt管理员登录密码验证

一、简单入门测试 BCrypt不支持反运算&#xff0c;只支持密码校验 package com.william.test;import org.springframework.security.crypto.bcrypt.BCrypt;/*** author &#xff1a;lijunxuan* date &#xff1a;Created in 2019/7/11 11:34* description &#xff1a;* ver…

通用数据库管理工具_了解为什么这个直观的工具是您团队的通用团队管理工具...

通用数据库管理工具每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看到的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;…

MySQL查询结果纵向输出标识符\G

\G 这个 G 是 group 的首字母&#xff0c;表示每行记录分组显示。 默认情况下&#xff0c;表数据的查询结果是横向输出的&#xff0c;如下所示&#xff1a; mysql> select * from student; ----------------------------------------------------------------------------…

用jackson转json_用Jackson编写大JSON文件

用jackson转json有时您需要将大量数据导出到JSON到文件中。 也许是“将所有数据导出到JSON”&#xff0c;或者是GDPR“可移植性的权利”&#xff0c;您实际上需要这样做。 与任何大型数据集一样&#xff0c;您不能只将其全部容纳在内存中并将其写入文件。 这需要一段时间&…

JWT 实现微服务鉴权

一、JWT JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 一个JWT实际上就是一个字符串&#xff0c;它由三部分组成&#xff0c;头部、载荷与签名。 头部&#xff08;Header&#xff09; 头…

MySQL查看数据库系统正在运行的进程

在 MySQL 5.6 以前&#xff0c;我们通过 show processlist 命令查看系统中正在运行的所有进程&#xff1a; mysql> show processlist; ------------------------------------------------------------------------------------------------ | Id | User | Host …

oauth2.0授权码_OAUTH 2.0授权码授予

oauth2.0授权码OAuth 2.0提供了许多安全流程&#xff08;或授权类型&#xff09;&#xff0c;以允许一个应用程序访问另一个应用程序中的用户数据。 在此博客中&#xff0c;我们将介绍OAuth 2.0授权&#xff1a;授权代码授权。 首先&#xff0c;有许多定义&#xff1a; 客户…

JJWT签发与验证token

JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License&#xff0c;版本2.0)&#xff0c;JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面&#xff0c;隐藏了它的大部分复杂性。 官方文档&#xff1a; https://github.com/jwtk/jjwt 一、…

MySQL数据库创建用户_修改用户_删除用户_设置用户

文章目录创建新用户使用 CREATE USER 语句创建用户创建新用户&#xff0c;并且使用哈希值设置密码创建一个只能在数据库所在主机访问数据库的用户创建一个只能从指定 IP 连接数据库的用户创建一个可以从任意 IP 连接数据库的用户创建一个没有密码的用户在 mysql.user 表中添加用…

ide 日志 乱码_IDE日志分析方法pt。 2

ide 日志 乱码介绍 在第一部分中&#xff0c;我解释了测井分析的理论方法&#xff0c;我认为这对维持工程师是最好的。 该工程师不需要在日志出现时立即对其进行分析&#xff0c;而是专注于对复杂问题的深入分析。 在第二部分中&#xff0c;我将展示一个复杂的模板可以涵盖许多…