SELECT INTO OUTFILE,给出操作系统错误号13



我们最近从MySQL5.6.51迁移到了MySQL8.0.28(Ubuntu 20.04.3 LTS(,我们开始注意到一些差异。其中一个问题已经使用一个名为people的表的示例数据库重新创建。

mysql> show tables;
+-------------------+
| Tables_in_Sandbox |
+-------------------+
| people            |
+-------------------+

我们可以在没有任何问题的情况下将INTO OUTFILE选择到/tmp目录。

mysql> SELECT * FROM people INTO OUTFILE '/tmp/people.txt';
Query OK, 6 rows affected (0.00 sec)

然而,我们得到了另一个目录(让我们称之为/mysql_tmp(的错误,尽管它有777权限,用户和组是mysql

mysql> SELECT * FROM people INTO OUTFILE '/mysql_tmp/people.txt';
ERROR 1 (HY000): Can't create/write to file '/mysql_tmp/people.txt' (OS errno 13 - Permission denied)

以下是ls -l:的截断输出

$ ls -l /
...
drwxrwxrwx   2 mysql       mysql           4096 Apr  5 13:52 mysql_tmp
...
drwxrwxrwt  26 root        root            4096 Apr  5 14:17 tmp
...

当您从old-version更新到new-version时,检查这些版本之间的所有发布说明可能是明智的。

Google:mysql发行说明outfile可能会有所帮助:

  • MySQL 8.0.20的更改(2020-04-27,通用(

以前,SELECT语句的INTO子句可以出现在两个位置中的任意一个:

FROM:之前

从表名称中选择*INTO OUTFILE'file_name';拖尾之前锁定条款:

选择*FROM table_name INTO OUTFILE'file_name'进行更新;INTO现在可以出现在SELECT语句末尾的第三个位置:

SELECT*FROM table_name FOR UPDATE INTO OUTFILE'file_name';浇筑末端的INTO是首选位置。a之前的位置locking子句现在已被弃用,对它的支持将在中删除未来的MySQL版本。换句话说,INTO在FROM之后,但不在SELECT结束时会产生警告。

此外,联塞综合办在进入。这些包含INTO的UNION变体在语法上是正确的并产生相同的结果:

UNION SELECT*FROM table_name INTO OUTFILE'file_name'。。。活接头(SELECT*FROM table_name(INTO OUTFILE'file_name'。。。联合选择

  • INTO OUTFILE'file_name'FROM table_name。。。UNION(SELECT*INTO OUTFILE'file_name'FROM table_name(;然而,最后两种变体令人困惑,就好像它们从命名表中收集信息一样而不是整个查询表达式(UNION(。那两个工会包含INTO的变体现在已被弃用,对它们的支持将在未来的MySQL版本中删除。因此:

在查询表达式的尾部查询块中,在FROM产生警告。

在查询表达式的带括号的尾部块中,使用INTO(无论其相对于FROM的位置如何(都会产生警告。

弃用适用于所有INTO形式:INTO OUTFILE、INTO DUMPFILE、,和INTO var_list。

  • MySQL 8.0.17的更改(2019-07-22,正式发布(

使用SELECT创建的文件的umask。。。INTO OUTFILE或SELECT…INTO DUMPFILE从0666更改为0640。LOAD_FILE((函数不再要求文件具有全局可读性,而只是可读性由服务器执行。(错误号24513720(

  • MySQL 8.0.4的变化(2018-01-23,候选版本(

为准备好的SELECT检查FILE权限。。。进入外场陈述不正确。(错误#27094955(

我停止检查此处,因为8.0.4中的此更改可能是您的问题。

最新更新