Causa del error: tabla no válida (¿antigua?) O nombre de la base de datos 'perdido + encontrado'

8

Mi registro de MySQL muestra errores duplicados:

141223  5:47:21 [ERROR] Invalid (old?) table or database name 'lost+found'

Tengo una base de datos llamada #mysql50#lost+foundpero parece que no puedo eliminarla.

mysql> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| maindatabas         |
| maindatabas_help    |
| maindatabas_tracker |
| gitlabhq_production |
| locations           |
| #mysql50#lost+found |
| mysql               |
| osticket            |
| performance_schema  |
+---------------------+
10 rows in set (0.00 sec)

mysql> DROP DATABASE `#mysql50#lost+found`;
ERROR 1008 (HY000): Can't drop database '#mysql50#lost+found'; database doesn't exist
mysql>

Estoy operando la versión del servidor: 5.5.40 Distribuida por The IUS Community Project en Centos 6.

Según MySQL se ejecuta MUY lento en CentOS 6x (no 5x) , mi datadir está en ext3 con la opción de barrera = 0.

¿Qué está causando este error y cómo se puede eliminar?

usuario1032531
fuente

Respuestas:

14

Me parece que tu datadirestá en un sistema de archivos propio.

Los sistemas de archivos externos, como la mayoría de los FSes en Unix, tienen en su raíz un directorio llamado lost+found. Existe para permitir que los archivos que se separan (es decir, tienen contenido, pero no tienen una entrada de directorio asociada) se vuelvan a unir en algún lugar cuando se sincroniza un sistema de archivos inconsistente (ver, por ejemplo, https://unix.stackexchange.com/ preguntas / 18154 / cuál-es-el-propósito-de-la-carpeta-perdida-encontrada en linux-y-unix para más detalles). Este propósito es importante en la recuperación ante desastres, por lo que no debe eliminar el directorio.

Su problema surge cuando el punto de montaje, en el que se monta el sistema de archivos que contiene ese directorio, se entrega completamente a una aplicación que espera que todo en ese punto de montaje le pertenezca. MySQL es uno de esos, intenta interpretar el lost+founddirectorio como algo relacionado con db, y (no sin razón) falla.

Su mejor opción es nunca dedicar un FS completo a una aplicación, sino montar el FS en algún punto de montaje no específico de la aplicación, por ejemplo /data1, crear un subdirectorio debajo de eso, por ejemplo /data1/mysql, y reconfigurar la aplicación para usar ese directorio como su datadir

MadHatter
fuente
12

MadHatter explicó bien el error. Pero desde entonces los tiempos han cambiado y ahora MySQL ( desde 5.6.3 ) tiene una opción para ignorar este directorio. Simplemente agregue esta declaración en su /etc/mysql/my.cnfarchivo:

ignore-db-dir=lost+found

Después de reiniciar MySQL, puede verificarlo con el comando:

show global variables like 'ignore_db_dirs';

Si desea ignorar varios directorios, debe especificar la opción para cada uno de ellos por separado.

Fuente: http://www.chriscalender.com/ignoring-the-lostfound-directory-in-your-datadir/

Marki555
fuente
3

Ubicación de my.cnf bajo CentOS 7.2 si está utilizando MariaDB está en

/etc/my.cnf

Puede reiniciar el servicio con

systemctl restart mariadb.service

ignore-db-dir debe colocarse en la sección [mysqld] y no en [mysqld_safe] uno.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

ignore-db-dir=lost+found

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
Strahinja Radman
fuente
1

Como nuestro MySQL aún no comprende ignore_db_dirs, lo hice

# chmod 0 lost+found

que resolvió el (este) problema.

Gerrit A. Smit
fuente
0

MariaDb es ignore_db_dirs MySQL es ignore_db_dir - sin la "s"

Ver https://mariadb.com/kb/en/library/server-system-variables/#ignore_db_dirs

Tenía un directorio oculto como a continuación

mysql50 # .local

así que en etc / my.cnf --- para MariaDB fue

[mysqld] ignore_db_dirs = .local

y reinicie el servidor de la base de datos - luego verifique que la base de datos ya no esté en el comando SHOW DATABASES o con MariaDB hay un "mysqlshow" desde la línea de comandos

Luego puede eliminar el directorio y lo que esté debajo de él en / var / lib / mysql, luego vuelva a editar el archivo /etc/my.cnf y comente el comando o elimínelo, y reinicie el servidor nuevamente; el problema se solucionó

NO SUPRIMA EL DIRECTORIO NO DESEADO SIN hacer esto arriba PRIMERO = ya que el almacén de datos que guarda el servidor estará dañado y es posible que no pueda reiniciarlo de nuevo sin tener que eliminar todas las bases de datos y restaurar las bases de datos desde una copia de seguridad o algo peor, y eso es un gran Ouch.

Wilburunion
fuente