Не удается найти файл: './ci/users.frm' (номер ошибки: 13)

Я установил LAMP на Ubuntu 11.04 и скопировал проект из 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)

7 ответов

Решение

Проблема с разрешениями, означающая права доступа к файлу. MySQL, вероятно, не может прочитать это. Просто измените владельца и группу на mysql, и это должно работать.

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

Так же как файлы, читаемые пользователем 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

Это старая тема, но я не нашел ничего подходящего для меня, так что для тех, кто сталкивался с такой же проблемой, все же приведенные выше рекомендации по разрешению файлов по-прежнему не изменяют ошибки "Не удается найти файл", вот что сработало для меня и моей конкретной проблемы.

Я выполнял восстановление с одного сервера CentOS на другой, используя образ для восстановления, который имел ОС, отличную от исходной ОС, и исходная файловая система была смонтирована во временную директорию. Хотя у меня был доступ к исходным файлам /var/lib/mysql, у меня не было доступа к утилитам mysql admin или dump, которые в любом случае требуют, чтобы сервер работал (он не включается автоматически при восстановлении после чтения только изображение). Резервным копиям была неделя, и я хотел посмотреть, смогу ли я получить самые последние данные.

Изменение стандартных прав доступа к файлам по-прежнему давало "Не удается найти файл" почти для всех таблиц базы данных, однако я мог видеть, что таблицы были там. Оказывается, это было связано с контекстом SELinux для файлов, которые я переместил с помощью rysnc. Все спасенные каталоги и файлы выглядели так:

$ 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 отмечает контекст безопасности файлов и директорий. Обратите внимание на контекст undefined_u и admin_home_t. Они отличаются от того, что они должны быть:

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

Изменение этих файлов базы данных в надлежащий контекст решило проблему и предоставило правильный доступ к mysqld с помощью команды chcon:

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

Это изменило все мои пользовательские базы данных на правильный контекст SELinux, и теперь файлы mysqld могли распознавать файлы. Я рекомендую запускать chcon commad, пока сервер базы данных не активен, просто в качестве меры предосторожности.

Надеюсь, это поможет кому-то столкнуться с той же проблемой, что и я! Конечно, вы можете временно отключить SELinux, чтобы проверить, действительно ли это является проблемой, но я не хотел отключать SELinux как постоянное решение.

Если вы не выполнили оператор RENAME TABLE, метаданные MySQL могут остаться в плохом состоянии. Решение состоит в том, чтобы воссоздать схему или воссоздать таблицу.

Я следовал за этими шагами:

  • Остановите службу mysql.

  • Измените строку данных my.cnf на мое собственное местоположение.

  • Удалил все файлы ib_data*, ib_logfile* в нашем новом пользовательском расположении

  • Измените права доступа ко всей папке с вашим предложением: chown mysql:mysql -R /custom_location/mysql/*

  • Запустите снова службу MySQL.

Оно работает!!

Спасибо

@Brent Baisley Это работает в XAMPP для Linux, но местоположение отличается.

Сегодня я обновил ядро, чтобы исправить уязвимость Linux "Dirty Cow" (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

Надеюсь, что это помогает кому-то.

Эта ошибка также возникает, если таблица отсутствует в базе данных; поэтому, если вы изменили разрешения для каталога и все еще сталкиваетесь с проблемами, проверьте свою базу данных и убедитесь, что таблица там есть.

Допустим, вы получили ошибку, подобную OP:

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

ci это имя базы данных

users это имя таблицы

Так что в этом случае, если вы изменили разрешения и все еще имели эту проблему, вы бы убедились, что таблица users находится в базе данных ci.

Другие вопросы по тегам