Назад | Перейти на главную страницу

Исправление «Не могу найти файл:… (ошибка: 13)» в mysql

Я бьюсь головой об этом уже несколько дней. У нас есть двухнедельные ежедневные снимки резервных копий нашего производственного каталога данных mysql (то есть фактические двоичные файлы, а не дампы sql), и мне нужно восстановить таблицу из одной из резервных копий, чтобы мы могли сравнить ее с тем, что у нас есть сейчас .

Итак, я создал каталог фиктивной схемы, извлек соответствующие файлы таблиц (.MYI, .MYD и .frm) и перезапустил mysql. Он появляется, я могу «показать таблицы», но если я попытаюсь каким-либо образом с ним взаимодействовать («desc tablename», «select ...» и т. Д.), Я получаю:

Can't find file: './schema_name/table_name.frm' (errno: 13)

[ed: настоящие имена очищены]

Errno 13 - это разрешения, поэтому я все перепроверил. Каталог и файлы имеют того же владельца и группу (mysql: mysql), что и все другие схемы. У них тоже пермы одинаковые (700 в каталоге, 660 в файлах). Глядя на "ls -n", uid также точно совпадают.

Совсем недавно я попытался сделать полное извлечение другой резервной копии, а затем связать ее с каталогом данных mysql (на этом томе недостаточно места для извлечения всего файла), и я получаю ту же ошибку. Я также попытался указать каталог данных mysql в my.cnf на каталог, содержащий резервную копию и перезапуск. Он построил таблицы mysql, которые должны были быть там, но я все равно получил ту же ошибку.

Единственное, что я могу найти через поиск в Google, - это людей, у которых возникла эта проблема из-за фактических ошибок владения или прав доступа, что, похоже, не относится ко мне. Я также нашел несколько замечаний по поводу переменной env UMASK, которая может привести к этой ошибке, но я считать это связано с новыми установками, а это не так.

Вы используете что-то вроде selinux или другого подобного пакета? Я бы предложил отключить это (или изменить политику безопасности), чтобы увидеть, не мешает ли что-то MySQL доступу к файлам.

[править] Если это так, проверьте системный журнал, чтобы узнать, не блокирует ли selinux выполнение каких-либо действий mysql. Если это SELinux, мне сказали, что это может отключить его, чтобы вы могли проверить эту теорию.

/usr/sbin/setenforce Permissive

strace - ваш друг в этом случае. Найдите идентификатор процесса вашего mysql, затем запустите:

strace -efile -f -o /tmp/mysql.log -p $pid

В другом окне выполните действия, вызывающие ошибку. Затем вы можете нажать ctrl-c, чтобы убить strace. Если вы посмотрите в /tmp/mysql.log, вы увидите, что вызвало проблему.

Кроме того, я действительно рекомендую вам не полагаться на копирование двоичных файлов данных. Дампы SQL намного надежнее и гибче. Кроме того, похоже, вы используете MyISAM. Я бы действительно не рекомендовал использовать их, если вам не нужны данные в них. InnoDB имеет множество преимуществ перед MyISAM.

Недавно у меня была эта проблема, и я решил ее, изменив разрешение каталога базы данных для каждого каталога базы данных, расположенного в /var/lib/mysql как это:

PWD: /var/lib/mysql
chmod u+x schema_db1
chmod u+x schema_db2
chmod u+x schema_db3
chmod u+x schema_db4

Перезагрузите движок MySQL и снова работает! Я надеюсь, что это сработает для вас.

Когда я раньше сталкивался с этой проблемой, это было потому, что файлы не принадлежали пользователю mysql, независимо от его разрешений. chmod 777 в любом случае это не то, что вы хотите запускать в каталоге данных, редактируемом сервером.

Проверьте, какое имя пользователя настроено в /etc/my.cnf

[mysqld]
bind-address=<IP Address>
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=<username>

Может быть корень или который вы настроили. Я изменился на корень и это начало работать у меня.

Затем запустите mysql

service mysqld stop

service mysqld start

У меня была эта ошибка, SELinux отказывал в доступе к файлам (они предоставлены другим сервером, который разбился - поэтому они были 'unlimited_u: object_r: home_root_t'), поэтому я сделал это, чтобы восстановить правильный контекст:

semanage fcontext -a -t mysqld_db_t -s system_u "/var/lib/mysql/<my dbname>(/.*)?"
restorecon -vFr /var/lib/mysql/<my dbname>

Это устранило проблему :)