文章目录

  • 关于参数 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 9月  29 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 9月  29 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)

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

  1. Linux系统下MySQL的导入数据的命令语句Load Data InFile的用法详解

    文章目录 语法格式 LOW_PRIORITY CONCURRENT LOCAL REPLACE 或 IGNORE PARTITION CHARACTER SET 对导入文件的字段进行格式描述 指定行的 ...

  2. mysql中文问号 linux,解决Linux系统下Mysql数据库中文显示成问号的问题

    Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 (需暂停服务的方式) Linux系统下 MYSQL数据库中的数据库文件在本机内迁移 本机采用Ubuntu16.04系统,tar方式安装My ...

  3. linux 6.4简单使用mysql,Linux系统下Mysql使用简单教程(一)

    如果你会查询这些相关的问题,说明你是一个正在或者准备从事IT的程序猿,对于一个程序猿而言,不会使用linux系统的程序猿不是一好的程序猿哦!因为windows有时候真的让人很抓狂,而本人也相信没有什么 ...

  4. python在windows和linux系统下批量读取grib2数据

    python在windows系统和linux系统读取grib或者grib2数据所用的库不一样,下面分别细说. 1.python在linux系统下批量读取grib或grib2数据 linux系统对pyt ...

  5. Linux系统下MySQL导出数据库和导入数据库的命令

    一.MySQL导出数据库用mysqldump命令 注意mysql的安装路径,即此命令的路径,如果你只要查询mysql的运行文件所在地址,直接用下面的命令就可以了,再切换到mysql的运行文件的路径 w ...

  6. Linux系统下MYSQL主从同步

    [以下操作使用root用户进行] 一.主从库系统环境 1.主库系统:CentOS Linux release 7.6.1810 (Core) 2.从库系统:Ubuntu 18.04.3 LTS 二.主 ...

  7. Linux系统下MySQL设置忽略大小写

    在linux系统,默认设置下: 数据库名与表名是严格区分大小写的: 列名与列的别名在所有的情况下均是忽略大小写的: 变量名也是严格区分大小写的: 在windows系统,默认设置下: 都不区分大小写 查 ...

  8. Ubuntu系统下MySQL读取文件数据ERROR解决

    博文链接:http://haoyuanliu.github.io/2016/04/29/mysql/ 对,我是来骗访问量的!O(∩_∩)O~~ 在使用MySQL进行文件数据读取的时候,在终端敲入命令行 ...

  9. linux系统下MYSQL备份与恢复

    本文介绍了linux下如何备份与恢复mysql数据库. 数据库备份是非常重要的.如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次正常的状态,把损失减小到最少. 一. 用命令实现备份 My ...

最新文章

  1. 如何划分155MSDH带宽
  2. python赋值符号前后的空格_191012 python3关于空格打印、赋值、+=符号的小坑
  3. python编程基础与应用-Python程序设计基础与应用
  4. ubuntu声音太小的解决方案
  5. 网络研讨室_网络研讨会:Java 9的第一印象–构建可伸缩企业应用程序的新方法...
  6. 函数调用关系图如何画_彩铅画入门植物教程 | 如何用彩铅画一株多肉?多肉彩铅画教程步骤图详细...
  7. NLP《词汇表示方法(四)负采样》
  8. 一图胜千言,这本交互式线代教科书让你分分钟理解复杂概念,佐治亚理工出品...
  9. 在block中使用self
  10. 评论.gitignore?
  11. 鸿蒙灵珠被林铭得到,上古五大灵珠,蕴含三界奥秘,为众生求得一线生机。
  12. 实现加载页Loading Page 的几种方法
  13. 携程中转机票竟然相差23小时
  14. Pixel手机电信4G破解(含解锁BL和root)
  15. JavaScript设计模式之装饰者模式
  16. Intellij IDEA误删文件恢复
  17. iOS开发常用之博客
  18. 信息熵——与一枚硬币的故事
  19. java宝典 pdf下载_Java面试宝典2020修订版 PDF 下载
  20. 微信小程序页面onLoad获取app.js的onLaunch数据(异步获取用户信息)

热门文章

  1. vaadin教程_Vaadin教程
  2. java设计模式教程_Java设计模式教程
  3. 魔术笔反选_魔术二传手反图案
  4. Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!
  5. 将Spock 1.3测试迁移到Spock 2.0
  6. 使用Jmeter的Websocket:获取性能数字
  7. Spring @Value批注
  8. 使用Spring Boot和H2可以完全工作的原型
  9. apache.camel_Apache Camel 2.12 –支持后退,以减少不太积极的轮询路线
  10. 坚实原则:单一责任原则