【问题标题】:Mysql ERROR 1005 (HY000): Can't create table 'tmp' (errno: 13)Mysql ERROR 1005 (HY000): Can't create table 'tmp' (errno: 13)
【发布时间】:2011-01-29 09:29:55
【问题描述】:

我在 ubuntu 9.10 上运行 Mysql, Mysql的进程以root身份运行,我在登录Mysql时使用root帐户,我授予了所有权限,我使用自己的db(不是mysql),我可以创建一个表,但是当我尝试创建时临时表我得到这个错误:

ERROR 1005 (HY000): 无法创建表 'tmp' (errno: 13)

对于这个查询:

创建临时表 tmp (id int);

我的硬盘空间很大,所有权限都已授予(var/lib/mysql 也有 mysql 权限)。

有什么想法吗? 谢谢, 科比

【问题讨论】:

  • 从命令行运行命令perror 13 会告诉您该错误号的含义。错误代码 13 在 Linux 上是“权限被拒绝”。

标签: mysql ubuntu ubuntu-9.10 mysql-error-1005


【解决方案1】:

几周前我遇到了同样的问题。 文件系统上的数据库文件夹归错误的用户所有。 一个简单的chown -R mysql:mysql /var/lib/mysql/database_name 就成功了!

一切都在这里解释:http://www.dinosources.eu/2010/10/mysql-cant-create-table(它是意大利语,但很清楚)

干杯

【讨论】:

  • 这对我有用。我从另一个驱动器复制了目录,但它们的所有者错误。
  • 如果你在mac上,试试sudo chown -R mysql:mysql /usr/local/mysql/data/my_database
【解决方案2】:

嗯... 在 /etc/mysql/my.cnf 中有一个“tmp”文件夹可供使用,默认为 /tmp(从根目录).. 并且没有 mysql 权限。 chmod 0777 /tmp 可以解决问题

【讨论】:

    【解决方案3】:

    我在 /tmp 上的正确权限、正确的上下文和 Fedora 16 上的足够磁盘空间时遇到了上述错误。

    经过一天的努力,我将问题归结为 MySQL 服务的 systemd 配置中的设置。

    /etc/systemd/system/multi-user.target.wants/mysqld.service 中检查是否有设置PrivateTmp=true。此更改强制 MySQL 使用 /tmp/systemd-namespace-XXXXX 子目录,而不是将文件直接放入 /tmp。显然 MySQL 不喜欢这样,并且对于任何需要创建临时文件的查询都会出现权限被拒绝错误 (13)。

    您可以按如下方式覆盖此设置:

    cat >> /etc/systemd/system/mysqld.service << END_CONFIG
    .include /lib/systemd/system/mysqld.service
    [Service]
    PrivateTmp=false
    END_CONFIG
    

    然后通过运行:systemctl daemon-reload 重新加载配置并重新启动 MySQL。

    【讨论】:

    • 这个解决方案在今天和去年一样适用!做得很好。 mysqld 还是不喜欢 privatetmp。
    【解决方案4】:

    您是否在 config.ini 中设置属性 MaxNoOfOrderedIndexes? 它的默认值是 128,所以如果你有很多表要创建,最后一个是不能创建的。 看: http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbd-definition.html#ndbparam-ndbd-maxnooforderedindexes

    【讨论】:

      【解决方案5】:

      我今天在我的 Amazon Red Hat 实例上遇到了同样的问题。我既不能执行 mysql decribe(来自 mysql shell)也不能执行 mysqldump。为了解决这个问题,我尝试了最明显的解决方案:

      # chown root:root /tmp -v
      # chmod 1777 /tmp -v
      # /etc/init.d/mysqld restart
      

      但这没有帮助。在 /var/log/mysqld.log 中我还是看到了:

      141022 10:23:35  InnoDB: Error: unable to create temporary file; errno: 13
      141022 10:23:35 [ERROR] Plugin 'InnoDB' init function returned error.
      141022 10:23:35 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
      

      结果证明是 SELinux 不允许 MySQL 守护进程写入 /tmp。因此,我所做的是:

      # getenforce 
      Enforcing
      

      验证 SELinux 是否在强制模式下运行(您可以阅读有关此here 的更多信息)。对此的快速解决方案是切换到 SELinux 许可模式:

      # setenforce 0
      # getenforce 
      Permissive
      # /etc/init.d/mysqld restart
      

      以上解决了我的问题。

      请注意,如果您正在处理强化生产,则在从强制切换到许可时应该非常小心。另请注意,此特定设置将在重新启动后重置。

      【讨论】:

        【解决方案6】:

        我遇到了这些 (errno: 13) 错误,只是在查看 /var/log/syslog 后才发现它们,所以我的建议是:

        tail -f /var/log/syslog
        

        在你尝试访问数据库后,看看这是否与数据库文件有关,在我的情况下是

        apparmor=[DENIED]
        

        这意味着你需要处理 apparmor,但在你的情况下可能是别的东西。

        【讨论】:

          【解决方案7】:

          我的情况:

              # semanage fcontext -a -t mysqld_db_t "/datadir(/.*)?"
              # restorecon -Rv /datadir
              #chcon -R -t mysqld_db_t /datadir
          

          解决了我的问题。

          【讨论】:

            【解决方案8】:

            如果在 Linux 上使用 XAMPP 安装 PhpMyAdmin,则可以在此路径中设置用户:

            sudo chown -R mysql:mysql /opt/lampp/var/mysql/my_database

            【讨论】:

              猜你喜欢
              • 2018-10-04
              • 1970-01-01
              • 2021-07-06
              • 1970-01-01
              • 2021-08-31
              • 2021-04-24
              • 1970-01-01
              • 2020-03-23
              • 2017-03-18
              相关资源
              最近更新 更多