iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mysql中select into outfile问题的示例分析
  • 907
分享到

mysql中select into outfile问题的示例分析

2024-04-02 19:04:59 907人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Mysql中select into outfile问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。01 背景s

这篇文章将为大家详细讲解有关Mysql中select into outfile问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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作限制,则可以赋权成功。

mysql> grant file on *.* to "ebank"@"%";
Query OK, 0 rows affected (0.00 sec)

2.查看数据库的全局参数secure_file_priv

用户权限已经赋予,接下来要看数据库的全局参数secure_file_priv是否打开。

mysql> show variables like "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | null |
+------------------+-------+
1 row in set (0.01 sec)

secure_file_priv的取值有三种,其一为一个具体的路径,那么使用select into outfile导出数据时,则只能导出在secure_file_priv指定的路径下;其二为一个空字符串,在此种取值下,那么数据库不会对导出的路径做限制,只要select into outfile指定导出的路径对于操作系统层面的mysql用户具有读写执行的权限,则数据即可正常导出;其三取值为null,此种取值代表数据库不能使用select into outfile导出数据。

由于此时数据库secure_file_priv的取值为null,是不能导出数据的,因此需要在配置文件中重新指定secure_file_priv的取值,由于数据库的数据目录为/data2,因此将/data2设置select into outfile的导出路径。

mysql> show variables like "secure_file_priv";
+------------------+---------+
| Variable_name | Value |
+------------------+---------+
| secure_file_priv | /data2/ |
+------------------+---------+
1 row in set (0.01 sec)

测试一下是否能够正常导出数据。

[root@multi-master2 tmp]# mysql -uebank -pebank -h227.0.0.1
mysql> use test
Reading table infORMation for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from player into outfile "/data2/player.txt";
Query OK, 4 rows affected (0.00 sec)
mysql> ^DBye
[root@multi-master2 tmp]# cat /data2/player.txt
2   messi   sf  agen
4   neymar  wf  brazil
6   ramos   CB  spain
8   xavi    AMF spain

数据导出成功。

3.开发的特殊需求
测试完select into outfile导出数据成功后,对于DBA的工作已然完成。将数据库调整的结果告诉开发后,但开发仍然认为不符合需求。由于开发在此测试环境的服务器上也有一个操作系统用户ebank,因此开发需要将数据导出的目录设置为/home/ebank/data。遵从开发的需求,将secure_file_priv的取值改为/home/ebank/data,并将/home/ebank/data目录的属主改为mysql。
[root@multi-master2 ebank]# chown -R mysql:mysql data/
[root@multi-master2 ebank]# ll
total 4
drwxr-xr-x. 2 mysql mysql 4096 Aug 21 03:54 data
[root@multi-master2 ebank]#
[root@multi-master2 ebank]# pwd
/home/ebank

由于已经有了之前的测试,而这次的修改在本人看来,和前一次只有路径上的差别,因此,在配置文件中修改secure_file_priv的取值为/home/ebank/data后,重启数据库,并未手工进行select into outfile导出的测试,就通知开发可以进行数据的导出了。然而问题还是出现了,开发仍然反馈无法成功导出数据。

收到此反馈后,便手动进行了一次数据导出测试。

[root@multi-master2 data]# mysql -uebank -pebank -h227.0.0.1
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from player into outfile "/home/ebank/data/player.txt";
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

奇怪的是这次的确无法导出数据,看到这个报错,首先确认是否是数据库的配置出了问题。

mysql> show variables like "secure_file_priv";
+------------------+-------------------+
| Variable_name | Value |
+------------------+-------------------+
| secure_file_priv | /home/ebank/data/ |
+------------------+-------------------+
1 row in set (0.00 sec)
mysql> show grants for "ebank"@"%";
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for ebank@% |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT FILE 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)

数据库的配置没有问题,且之前设置的/home/mysql/data目录的属主也为mysql,此时对于这个问题的研究陷入了瓶颈。

百思不得其解之际,请教了大佬,经过大佬的指点,方知此问题的关键点如下图所示:

[root@multi-master2 data]# cd /home/
[root@multi-master2 home]# ll
total 8
drwx------. 5 ebank ebank 4096 Aug 21 03:54 ebank
drwx------. 7 mysql mysql 4096 Aug 20 14:34 mysql

ebank用户家目录在创建之初的访问权限为700,数据库导出数据的存放路径为/home/ebank/data,虽然data目录的属主为mysql,但由于上层路径ebank目录的属主为700,即除ebank用户外的所有用户都对此目录无执行权限,因此使用select into outfile导出数据时会报错。

根据此原因可以通过以下方法解决该问题:

  • 将/home/ebank的访问权限改为701,即任何用户对/home/ebank目录都有执行权限。

[root@multi-master2 home]# ll
total 8
drwx------. 5 ebank ebank 4096 Aug 21 03:54 ebank
drwx------. 7 mysql mysql 4096 Aug 20 14:34 mysql
[root@multi-master2 home]# chmod 701 ebank/
[root@multi-master2 home]# ll
total 8
drwx-----x. 5 ebank ebank 4096 Aug 21 03:54 ebank
drwx------. 7 mysql mysql 4096 Aug 20 14:34 mysql
[root@multi-master2 home]# mysql -uebank -pebank -h227.0.0.1
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from player into outfile "/home/ebank/data/player1.txt";
Query OK, 4 rows affected (0.01 sec)
mysql> ^DBye
[root@multi-master2 home]# cat /home/ebank/data/player1.txt
2   messi   sf  agen
4   neymar  wf  brazil
6   ramos   CB  spain
8   xavi    AMF spain
[root@multi-master2 home]#

通过上述配置,数据导出成功。

04 select into outfile的替代方案

  • select into outfile可以方便的把表中的数据导出为csv文件,且可以根据需求筛选需要的字段。但有时需要导出多张表,且对表的字段没有筛选需求时,对每一张表一条条的去写导出的SQL语句未免显得麻烦。这时候就可以使用mysqldump来对数据进行导出。

  • 使用mysqldump将数据导出成csv格式时,需要加一个参数--tab,该参数指定文件导出的路径。对于每一张表,会生成两个文件,一个txt文件,以csv格式保存了表中的数据,一个sql文件,保存了表结构。

#如下语句为导出test库下的所有表
[root@multi-master2 data]# mysqldump --single-transaction -uebank -pebank -h227.0.01 --tab="/home/ebank/data" test
mysqldump: [Warning] Using a passWord on the command line interface can be insecure.
Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;
--
-- GTID state at the beginning of the backup
--
SET @@GLOBAL.GTID_PURGED='8d52b2f3-c316-11e9-8b39-000c29a27f67:1-40';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
[root@multi-master2 data]# ll
total 16
-rw-r--r--. 1 root root 1623 Aug 21 06:51 player.sql
-rw-rw-rw-. 1 mysql mysql 69 Aug 21 06:51 player.txt
-rw-r--r--. 1 root root 1426 Aug 21 06:51 team.sql
-rw-rw-rw-. 1 mysql mysql 61 Aug 21 06:51 team.txt

关于“mysql中select into outfile问题的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: mysql中select into outfile问题的示例分析

本文链接: https://www.lsjlt.com/news/63315.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中select into outfile问题的示例分析
    这篇文章将为大家详细讲解有关mysql中select into outfile问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。01 背景s...
    99+
    2024-04-02
  • MySQL中select into outfile语句怎么用
    在MySQL中,SELECT INTO OUTFILE语句用于将查询结果导出到一个文件中。使用该语句的基本语法如下:...
    99+
    2024-03-01
    MySQL
  • Mysql注入中outfile、dumpfile、load_file函数的示例分析
    这篇文章将为大家详细讲解有关Mysql注入中outfile、dumpfile、load_file函数的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所...
    99+
    2024-04-02
  • mysql中replace into的示例分析
    这篇文章给大家分享的是有关mysql中replace into的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。mysql 的replace into实例详解1、...
    99+
    2024-04-02
  • mysql中max与where间执行问题的示例分析
    这篇文章主要介绍mysql中max与where间执行问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql max 与 where 间的执行问题执...
    99+
    2024-04-02
  • Mysql中select加锁的示例分析
    这篇文章将为大家详细讲解有关Mysql中select加锁的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。引言大家在面试中有没遇到面试官问你下面六句Sql的区别呢select *...
    99+
    2023-06-02
  • mysql中max与where的示例分析
    这篇文章主要介绍mysql中max与where的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql max 与 where 间的执行问题执行sql:...
    99+
    2024-04-02
  • MySQL中SELECT执行顺序的示例分析
    小编给大家分享一下MySQL中SELECT执行顺序的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!SELECT语...
    99+
    2024-04-02
  • mysql insert into ... select的死锁问题是什么
    小编给大家分享一下mysql insert into ... select的死锁问题是什么,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!问题产生:系统中mysql里面有几个event...
    99+
    2024-04-02
  • MySQL中Identifier Case Sensitivity问题的示例分析
    这篇文章主要介绍了MySQL中Identifier Case Sensitivity问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一...
    99+
    2024-04-02
  • MySQL中隐藏空间问题的示例分析
    小编给大家分享一下MySQL中隐藏空间问题的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!MySQL的隐藏空间通过环境变量TMPDIR的设置实现。如果未设置TMPDIR,MySQL...
    99+
    2024-04-02
  • MySQL中SELECT..INTO OUTFILE语句只能导出1000行的故障怎么处理
    这篇文章将为大家详细讲解有关MySQL中SELECT..INTO OUTFILE语句只能导出1000行的故障怎么处理,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。...
    99+
    2024-04-02
  • Java中文问题的示例分析
    这篇文章将为大家详细讲解有关Java中文问题的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我来说一下tomcat如何实现JSP的你就明白了。预备知识: 1.字节和unicode  Java内核是...
    99+
    2023-06-03
  • mysqldump问题的示例分析
    mysqldump问题的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。导出:mysqldump数据库[表]>/t...
    99+
    2024-04-02
  • MySQL之递归小问题的示例分析
    这篇文章给大家分享的是有关MySQL之递归小问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 mysql本身不支持递归语法,但可通过自连...
    99+
    2024-04-02
  • MySQL中where查询的案例分析
    这篇文章将为大家详细讲解有关MySQL中where查询的案例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。不能说不行今天加班,业务的妹子过来找我们查数据,说...
    99+
    2024-04-02
  • MySQL服务器中SSD性能问题的示例分析
    这篇文章给大家分享的是有关MySQL服务器中SSD性能问题的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。【问题】我们有台HP的服务器,SSD在写IOPS约5000时,%...
    99+
    2024-04-02
  • Python中复数问题的示例分析
    这篇文章主要介绍Python中复数问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!问题关于 Python 的复数类型,以下选项中描述错误的是A复数的虚数部分通过后缀“J”或者“j”来表示B对于复数 z,可...
    99+
    2023-06-15
  • MySQL中select、insert、update批量操作语句的示例分析
    这篇文章主要介绍了MySQL中select、insert、update批量操作语句的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
    99+
    2024-04-02
  • MySQ中Select * for update用法的示例分析
    本篇文章为大家展示了MySQ中Select * for update用法的示例分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。今天有个小伙伴问我Mysql什么时候...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作