【问题标题】:Can't find file: './ci/users.frm' (errno: 13)找不到文件:'./ci/users.frm'(错误号:13)
【发布时间】:2011-09-20 13:38:11
【问题描述】:

我在 Ubuntu 11.04 上安装了 LAMP 并从 Windows 复制项目。 PHP 目录 (/ci/) 到 var/www/ 和 MySQL 项目目录 (/ci/) 到 var/lib/mysql/

我得到的错误全文:

A Database Error Occurred

    Error Number: 1017
    Can't find file: './ci/users.frm' (errno: 13)
    SELECT COUNT(*) AS `numrows` FROM (`users`) WHERE `email` = 'admin@localsite.com'

我用谷歌搜索了它的权限问题,但不知道下一步该怎么做。

Log from /var/log/mysql/error.log:

    110622 19:27:21 [ERROR] /usr/sbin/mysqld: Can't find file: './ci/users.frm' (errno: 13)

【问题讨论】:

  • 能否提供以下输出:ls -al /var/lib/mysql/ci
  • 您可能需要 chmod 或 chown ./cli/users.frm 文件,以便 mysqld 可以访问它。可能是最适合 serverfault.com 的问题

标签: mysql ubuntu permissions


【解决方案1】:

权限问题意味着文件的权限。 MySQL 可能无法读取它。只需将所有者和组更改为 mysql 即可。

chown mysql:mysql /var/lib/mysql/ci/*

【讨论】:

  • 是的,甚至 chown -R mysql:mysql /var/lib/mysql/ci 授予 mysql 用户对整个目录及其所有文件的所有权。可能需要将新表添加到数据库中。
  • 工作,但我也需要 chmod -R g+w /var/lib/mysql/ci 和 chmod -R g+r /var/lib/mysql/ci 。
【解决方案2】:

我按照以下步骤操作:

  • 停止mysql服务。

  • 将 my.cnf 行 datadir 修改为我的自定义位置。

  • 删除了我们新自定义位置的所有文件 ib_data* 、 ib_logfile*

  • 用你的一句话改变整个文件夹的权限: chown mysql:mysql -R /custom_location/mysql/*

  • 再次启动mysql服务。

有效!!

谢谢

【讨论】:

  • 为我工作。为什么投反对票,我想知道为什么没人愿意解释。
【解决方案3】:

除了 MySQL 用户可以读取的文件之外,包含 .MYI 文件的 目录 也需要 MySQL 用户读取、写入和执行。在我的系统上,这是通过以下方式实现的:

chown -R mysql:mysql /var/lib/mysql/dbname
chmod -R 660 /var/lib/mysql/dbname
chown mysql:mysql /var/lib/mysql/dbname
chmod 700 /var/lib/mysql/dbname

【讨论】:

    【解决方案4】:

    如果表不在数据库中,也会出现此错误;因此,如果您更改了目录的权限并且仍然遇到问题,请检查您的数据库并确保该表在那里。

    假设你遇到了类似 OP 的错误:

    Can't find file: './ci/users.frm'

    ci 是数据库名称

    users 是表名

    因此,在这种情况下,如果您更改了权限但仍然存在此问题,您需要验证 users 表是否在 ci 数据库中。

    【讨论】:

      【解决方案5】:

      @Brent Baisley 它确实在 XAMPP for Linux 中工作,但位置不同。

      我今天确实升级了内核以修复新的 Linux“脏牛”漏洞 (CVE-2016-5195)。重启后我也得到了“frm”权限错误。

      所以,如果你得到以下错误:

      Can't find file: 'yourtablename.frm' (errno: 13 - Permission denied) SQL query :...
      

      你可以这样做:

      chown mysql:mysql /opt/lampp/var/mysql/yourDBname/*.frm
      

      这将解决您的问题。

      如果您想检查,在您执行权限更改之前,您对任何文件的权限是否已被修改,请执行以下操作:

      ls -l /opt/lampp/var/mysql/yourDBname/*.frm
      

      希望对某人有所帮助。

      【讨论】:

        【解决方案6】:

        这是一个老话题,但我没有找到任何对我有用的东西,所以对于遇到同样问题的任何人来说,但上述文件权限建议仍然没有改变“找不到文件”错误,这对我和我的特定问题有用。

        我正在使用恢复映像从一台 CentOS 服务器到另一台服务器进行救援,该恢复映像具有与原始操作系统不同的操作系统,并且原始文件系统安装在一个临时目录上。虽然我可以访问原始 /var/lib/mysql 文件,但我无权访问 mysql 管理或转储实用程序,这需要服务器无论如何都在运行(从读取恢复时不会自动包含它-只有图像)。备份是一周前的,我想看看我是否可以获得最新的数据。

        更改这些的标准文件权限仍然会为几乎所有数据库表提供“找不到文件”,但是我可以看到这些表在那里。原来它与我使用 rysnc 移动的文件上的 SELinux 上下文有关。所有获救的目录和文件如下所示:

        $ ls -alZ
        drwx------. mysql mysql unconfined_u:object_r:admin_home_t:s0 somedb_dev
        drwx------. mysql mysql unconfined_u:object_r:admin_home_t:s0 somedb_local
        drwx------. mysql mysql unconfined_u:object_r:admin_home_t:s0 somedb_production
        drwx------. mysql mysql unconfined_u:object_r:admin_home_t:s0 somedb_staging
        

        -Z 标志记录文件和目录的安全上下文。注意 unconfined_u 和 admin_home_t 上下文。这些与应有的不同:

        drwx------. mysql mysql system_u:object_r:mysqld_db_t:s0 mysql
        

        将这些数据库文件更改为正确的上下文解决了问题并使用 chcon 命令提供了对 mysqld 的正确访问权限:

        $ chcon -R -u system_u -t mysqld_db_t somedb_*
        

        这将我所有的自定义数据库更改为正确的 SELinux 上下文,并且这些文件现在可以被 mysqld 识别。我建议在数据库服务器不活动时运行 chcon 命令,以防万一。

        希望能帮助遇到我遇到同样问题的人!当然,您可以暂时关闭 SELinux 来测试是否是这个问题,但我不想将 SELinux 作为永久解决方案。

        【讨论】:

        • 帮我省了很多苦:)
        猜你喜欢
        • 2012-12-28
        • 2011-06-17
        • 2012-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-23
        相关资源
        最近更新 更多