Mysql ne démarre pas-ibdata1 corrompu? - erreur du système d'exploitation numéro 13 - problème d'autorisations

arrêt du serveur suite à une panne de courant.

Mysql ne commencera pas maintenant.

Le disque n'est pas plein. Syslog est en dessous de

Oct 11 15:03:31 joe mysqld_safe[24757]: started
Oct 11 15:03:31 joe mysqld[24760]: 101011 15:03:31  InnoDB: Operating system error number 13 in a file operation.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: The error means mysqld does not have the access rights to
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: the directory.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File name ./ibdata1
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: File operation call: 'create'.
Oct 11 15:03:31 joe mysqld[24760]: InnoDB: Cannot continue operation.
28
demandé sur eat_a_lemon 2010-10-11 19:32:04

14 réponses

Le fichier n'est pas corrompu. Vous pouvez trouver la source de ces erreurs avec "perror'. i.e.

toaster:~ morgo$ perror 13
OS error code  13:  Permission denied

InnoDB a la détection de la corruption (sommes de contrôle de page) et serait heureux de vous dire si c'était le problème.

soit les permissions du répertoire ont changé, soit votre my.le fichier cnf a été piraté, et il essaie de recréer des fichiers ailleurs.

16
répondu Morgan Tocker 2010-10-27 19:45:01

Si vous utilisez ubuntu ou apparmor vous devrait permettre ce changement de apparmor.

Modifier /etc/apparmor.d/usr.sbin.mysqld et changez /var/lib/mysql avec la DATADIR.

ça devrait marcher.

92
répondu Dan 2015-12-02 20:48:14

Erreur:

101130 14:42:51 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended
101130 18:07:58 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
101130 18:07:58  InnoDB: Operating system error number 13 in a file operation.
InnoDB: The error means mysqld does not have the access rights to
InnoDB: the directory.
InnoDB: File name ./ibdata1
InnoDB: File operation call: 'open'.
InnoDB: Cannot continue operation.

Solution de SeLinux de sécurité SeLinux:

[root@localhost ~]# service mysqld restart
Deteniendo mysqld:                                         [  OK  ]
Iniciando mysqld:                                          [  FALLÓ  ]
[root@localhost ~]#  restorecon -R /var/lib/mysql/
[root@localhost ~]# service mysqld restart
Deteniendo mysqld:                                         [  OK  ]
Iniciando mysqld:                                          [  OK  ]
[root@localhost ~]#
15
répondu Carlos Omar Briseño Gutierrez 2010-12-01 01:28:10

pour moi, restaurer le contexte de sécurité (selinux) a fait l'affaire

restorecon -R /var/lib/mysql/

12
répondu dordal 2013-01-03 09:15:48

s'il vous plaît vérifier:

chown -R mysql:mysql /var/lib/mysql
9
répondu IndikatorDesign 2014-06-11 13:35:40

j'ai eu exactement le même problème sur ma boîte de CentOS. Après avoir déplacé le répertoire de données mysql, Je ne pouvais plus démarrer le service, même si j'avais copié les fichiers avec le même propriétaire et les mêmes permissions.

j'ai eu un problème avec le contexte de sécurité SELinux. Si vous lancez votre stock de CentOS il a de bonnes chances d'être activé et ne laissera pas faire ce que vous voulez avec MySQL. Pour résoudre ce problème :

comparez D'abord l'ancien dir et le nouveau dir en utilisant

ls -Z /var/lib/mysql 

et

ls -Z /new/mysql/dir

si vous voyez une différence, c'est probablement votre problème. Pour modifier ceci :

chcon -R --type=mysql_db_t /new/mysql/dir

le commutateur R est pour la récursion. Si vous avez seulement besoin de modifier un fichier, vous pouvez l'omettre. Si votre contexte est différent du mien (peut-être une distro différente), utilisez celui indiqué par la sortie du premier (il devrait être le 3ème champ du truc SELinux)

ls -Z /var/lib/mysql 
5
répondu A Nun Famous 2013-09-04 14:19:50

En bref, (en particulier sur RHEL/CentOS/Fedora) essayer

getenforce

si elle répond avec Enforcing vous avez SELinux en marche. Désactiver temporairement avec setenforce 0 et voir si MariaDB commence maintenant! Assez fréquent, surtout sur RHEL / CentOS / Fedora.

il y a plus à ce sujet plus bas, aussi bien que dans cet article officiel.

En général

il y a plus de choses dans un environnement UNIX qui pourraient empêcher file accès, que les droits d'accès de l'utilisateur.

  • des modules de sécurité comme SELinux (voir ci-dessus) ou AppArmor (comme Dan l'a mentionné) pourraient le désactiver
  • les listes de contrôle D'accès (ACL) peuvent être définies spécifiquement, pour les fichiers/répertoires requis
  • N'importe lequel des dossiers parents pourrait être la propriété d'un autre utilisateur, et n'avoir aucun x (="accès dir") défini pour les autres

en Outre, il pourrait y avoir d'autres facteurs inattendus, comme ...

  • mysql datadir étant défini à un endroit, où mysql n'a pas de permissions (voir /etc/my.cnf)
  • Mysql pourrait (étrangement) fonctionner comme un utilisateur différent, ou le fichier pourrait simplement être la propriété de quelqu'un d'autre

juste pour mentionner une vue des choses sur le dessus de ma tête (n'hésitez pas à éditer/ajouter à cette réponse btw).

dans le cas, SELinux est "le problème"

Pour une solution permanente, vous pouvez essayer de restaurer le contexte de sécurité approprié ...

restorecon -R /var/lib/mysql/

... ou tout simplement désactiver SELinux (mais pensez à celui-ci un peu avant de le faire), en éditant la configuration (typiquement en /etc/selinux/config) et le paramètre SELINUX=disabled comme suggéré dans l'article suivant.

évidemment ceux-ci sont applicables à MySQL de la même manière.

3
répondu Levit 2014-10-31 09:34:06

j'ai eu le même problème et de le résoudre par les étapes ci-dessous

répertoire de Travail /var/lib/mysql

plus Tôt /var/lib/mysql a été possédé par un inconnu de l'utilisateur

Changé à mysql

mysql]# chown -R mysql:mysql *

mysql]# service mariadb start

Redirecting to /bin/systemctl start mariadb.service

Fonctionne comme un charme

3
répondu Rohit Gupta 2017-05-31 16:19:51

Quand cette surgi pour moi, j'ai trouvé la réponse dans le /etc/mysql/my.cnf fichier de configuration. datadir la ligne ne pointait pas vers le /var/lib/mysql répertoire (où les bases de données). Une fois que j'ai mis ce chemin, le serveur a redémarré sans problème.

2
répondu John Creamer 2015-10-11 19:05:49

j'ai eu exactement le même problème sur ma boîte de CentOS. Après avoir déplacé le répertoire de données mysql, Je ne pouvais plus démarrer le service, même si j'avais copié les fichiers avec le même propriétaire et les mêmes permissions.

j'ai eu un problème avec le contexte de sécurité SELinux. Si vous lancez votre stock de CentOS il a de bonnes chances d'être activé et ne laissera pas faire ce que vous voulez avec MySQL. Pour résoudre ce problème :

comparez D'abord l'ancien dir et le nouveau dir en utilisant

ls -Z /var/lib/mysql 

et

ls -Z /new/mysql/dir

si vous voyez une différence, c'est probablement votre problème. Pour modifier ceci :

chcon -R --type=mysql_db_t /new/mysql/dir

le commutateur R est pour la récursion. Si vous avez seulement besoin de modifier un fichier, vous pouvez l'omettre.

1
répondu A Nun Famous 2013-09-04 14:28:18

dans ma situation est le problème de Selinux. Et le

chcon -R --type=mysql_db_t /new/mysql/dir vient d'erreur:

chcon: failed to change context of /new/mysql/dir to root:object_r:mysql_db_t: Invalid argument.

J'utilise donc le commandement!--2-->.

0
répondu zjhui 2013-10-21 09:09:02

si vous avez ce problème sur un NAS de Synologie, vous pouvez le corriger en suivant les conseils de L'équipe de soutien de Synologie:

Cher Utilisateur,

ceci a été confirmé comme un problème connu et nous essaierons de corriger ce problème dans une version ultérieure de MariaDB. Désolé pour votre compréhension.

Voici la solution:

  • s'il vous Plaît essayer de telnet à votre DS avec le compte "root" et le mot de passe (même en tant qu'admin)
  • exécuter la commande "echo 1 > /var / services / mysql / VERSION"
  • ouvrir MariaDB paquet de DSM va déclencher la mise à jour de
  • tapez le mot de passe DB et cliquez sur Update pour corriger ce problème

Plus d'info: Forum De Synologie

0
répondu DarkLite1 2014-05-25 09:55:02

si vous utilisez SEL Linux

Intall semanage

yum whatprovides /usr/sbin/semanage vous obtenez policycoreutils-python-2.5-22.el7.x86_64

voir le contexte de sécurité mysqld

après l'installation yum install policycoreutils-python vous pouvez simplement regarder le contexte de sécurité différent de mysqld.

semanage fcontext -l | grep mysqld
/etc/mysql(/.*)?                       all files    system_u:object_r:mysqld_etc_t:s0
/etc/my\.cnf\.d(/.*)?                  all files    system_u:object_r:mysqld_etc_t:s0
/var/log/mysql.*                       regular file system_u:object_r:mysqld_log_t:s0
/var/lib/mysql(-files|-keyring)?(/.*)? all files    system_u:object_r:mysqld_db_t:s0
/var/run/mysqld(/.*)?                  all files    system_u:object_r:mysqld_var_run_t:s0
/var/log/mariadb(/.*)?                 all file     system_u:object_r:mysqld_log_t:s0
/var/run/mariadb(/.*)?                 all files    system_u:object_r:mysqld_var_run_t:s0
/usr/sbin/mysqld(-max)?                regular file system_u:object_r:mysqld_exec_t:s0
/var/run/mysqld/mysqlmanager.*         regular file system_u:object_r:mysqlmanagerd_var_run_t:s0
/usr/lib/systemd/system/mysqld.*       regular file system_u:object_r:mysqld_unit_file_t:s0
/usr/lib/systemd/system/mariadb.*      regular file system_u:object_r:mysqld_unit_file_t:s0
/etc/my\.cnf                           regular file system_u:object_r:mysqld_etc_t:s0
/root/\.my\.cnf                        regular file system_u:object_r:mysqld_home_t:s0
/usr/sbin/ndbd                         regular file system_u:object_r:mysqld_exec_t:s0
/usr/libexec/mysqld                    regular file system_u:object_r:mysqld_exec_t:s0
/usr/bin/mysqld_safe                   regular file system_u:object_r:mysqld_safe_exec_t:s0
/usr/bin/mysql_upgrade                 regular file system_u:object_r:mysqld_exec_t:s0
/etc/rc\.d/init\.d/mysqld              regular file system_u:object_r:mysqld_initrc_exec_t:s0
/var/lib/mysql/mysql\.sock             socket       system_u:object_r:mysqld_var_run_t:s0
/usr/libexec/mysqld_safe-scl-helper    regular file system_u:object_r:mysqld_safe_exec_t:s0
/home/[^/]+/\.my\.cnf                  regular file unconfined_u:object_r:mysqld_home_t:s0

ici vous voyez tout le contexte pour mysqld une courte liste avec explication

  1. mysqld_etc_t - fichiers de configuration
  2. mysqld_db_t - données des fichiers db
  3. mysqld_log_t - journal les fichiers
  4. mysqld_exec_t - exécution de fichiers

donc si vous avez le mauvais contexte de sécurité sur vos fichiers vous obtenez une permission refusée (erreur 13)

Solution

chcon -R -u system_u -t mysqld_db_t  /var/lib/mysql

mais vérifiez aussi les permissions" normales". J'ai eu ce problème avec centos. Vous devez vous systemctl restart mysql pour les changements.

0
répondu Kordi 2018-09-12 07:28:11

j'ai eu le même problème. Fait beaucoup de recherche et a trouvé cette solution. Vous devez exécuter cette commande sur ibdata1 sudo shadowprotect-u root / root

je ne sais pas ce que cela fait.. mais il a travaillé pour moi.

Bonne chance.

-9
répondu NickMonkey 2010-10-11 18:45:47