【问题标题】:mysqldump: Got error: 1: "Can't create/write to file '*.txt' (Errcode: 13 "Permission denied")" when executing 'SELECT INTO OUTFILE'mysqldump:得到错误:1:执行“SELECT INTO OUTFILE”时“无法创建/写入文件'*.txt'(错误代码:13“权限被拒绝”)”
【发布时间】:2017-05-09 01:03:22
【问题描述】:

Linux。没有 SELinux(已禁用)。 我尝试以我的 linuxuser(mysql 组的成员)身份运行此命令:

mysqldump --user=root --tab "/some/folder" dbname

收到此错误:

mysqldump: Got error: 1: "Can't create/write to file 'sometable.txt' (Errcode: 13 "Permission denied")" when executing 'SELECT INTO OUTFILE'

如果我查看文件夹,有一个 sometable.sql 文件,但没有 txt 文件。 据我了解,sql文件是从运行命令的用户名(在我的例子中是linuxuser)创建的,但是txt文件是由mysql服务器(在这种情况下是mysql用户)生成的。注意mysql用户也是mysql组的成员。

可能是什么问题?什么都试过了:)

【问题讨论】:

  • 这可能是一个简单的权限问题,您可以通过chmod 777 /some/folder 确认如果mysql仍然无法写入数据文件,请检查父目录权限。
  • 好的,谢谢。我认为这是由于父文件夹权限。

标签: mysql linux permissions


【解决方案1】:

解决方案是将"some/folder" 更改为外部位置。似乎存在权限问题,因为最初提到的文件夹位于 Perforce 根目录下,并且可能具有只读权限。

然后我将新文件夹权限更改为:

mylinuxuser:mysql

确保启动进程的用户以及 mysql 服务器都有权在此处写入。这是因为 sql 文件是从用户名写入的,而 txt 文件是从 mysql 服务器名写入的。

我还将我的用户添加到mysql 组。

【讨论】:

    【解决方案2】:

    什么对我有用(在 Windows 中),尝试使用以下方式导出文件:

    SELECT  * INTO OUTFILE 'C:/documents/dumps' from file
    
    1. MySQL 服务属性 --> 登录:记下已定义的帐户。
    2. 目录 C:\documents\dumps --> 属性 --> 安全性:上面定义的帐户需要读/写权限

    【讨论】:

    • 这是操作系统权限相关问题
    【解决方案3】:

    如果您尝试在与服务器不同的客户端中执行 mysqldump 可能是个问题 我尝试使用适用于 Linux (x86_64) 的 mysqldump Ver 10.14 Distrib 5.5.56-MariaDB,并且仅适用于 /tmp/ 目录。 也许,帮助信息说这不起作用

      -T, --tab=name      Create tab-separated textfile for each table to given path. (Create .sql and .txt files.) NOTE: This only works if mysqldump is run on the same machine as the mysqld server.
    

    【讨论】:

      【解决方案4】:

      这是我刚刚发现并想传递给寻找相同答案的人们的东西。

      这在运行 systemd 的系统上已经发生。 /lib/systemd/system/mariadb.service 文件中的设置是“PrivateTmp=true”。这是一项安全措施,可防止数据被不应该看到的人看到。

      如果你运行:

      SELECT * TO OUTFILE '/var/tmp/tablename.txt' FROM TABLENAME;
      

      它会创建文件,但它会在受 systemd 保护的目录中创建它。

      /var/tmp/systemd-private-[hash]-mariadb-[hash]/tmp/tablename.txt

      您可以从这里保存完全可以接受的数据或停止 mariadb,创建目录 /etc/systemd/system/mariadb.service.d 并在该目录中创建文件“mariadb.conf”(例如; 任何文件都应该这样做)具有以下内容:

      [Service]
      PrivateTmp=false
      

      运行 systemctl daemon-reload 重新加载配置并重启 mariadb。

      您现在应该可以创建备份了。

      【讨论】:

      • 附加信息。显然 mysqldump 不喜欢写入 /tmp 或 /var/tmp 目录。如果您将备份切换到其他目录,例如 /opt/mysqlbackup,它将在不更改 mariadb 配置的情况下工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-15
      • 2021-06-03
      • 2019-06-27
      • 2014-10-04
      • 2015-08-02
      • 1970-01-01
      相关资源
      最近更新 更多