Causa do erro: Nome da tabela ou do banco de dados inválido (antigo?) 'Perdido + encontrado'

8

Meu log do MySQL mostra erros duplicados:

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

Eu tenho um banco de dados chamado, #mysql50#lost+foundmas não consigo excluí-lo.

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>

Estou operando a versão do servidor: 5.5.40 Distribuído pelo projeto da comunidade IUS no Centos 6.

Pelo MySQL está rodando MUITO devagar no CentOS 6x (não 5x) , meu datadir está no ext3 com a opção barreira = 0.

O que está causando esse erro e como ele pode ser eliminado?

user1032531
fonte

Respostas:

14

Parece-me que você datadirestá em um sistema de arquivos próprio.

Os sistemas de arquivos ext, como a maioria dos FSes no Unix, têm na raiz um diretório chamado lost+found. Existe para permitir que os arquivos desanexados (ou seja, eles tenham conteúdo, mas nenhuma entrada de diretório associada) sejam reconectados em algum lugar quando um sistema de arquivos inconsistente é fscked (consulte, por exemplo, https://unix.stackexchange.com/ question / 18154 / qual é o objetivo da pasta perdida encontrada em linux e unix para obter mais detalhes). Esse objetivo é importante na recuperação de desastres; portanto, você não deve excluir o diretório.

Seu problema surge quando o ponto de montagem, no qual o sistema de arquivos que contém esse diretório está montado, é entregue inteiramente a um aplicativo que espera que tudo nesse ponto de montagem pertença a ele. Sendo o MySQL um desses, ele tenta interpretar o lost+founddiretório como algo relacionado ao banco de dados e (não é razoável) falhar.

Sua melhor aposta é nunca dedicar um FS inteiro a um aplicativo, mas montar o FS em algum ponto de montagem não específico do aplicativo, por exemplo /data1, criar um subdiretório sob esse, por exemplo /data1/mysql, e reconfigurar o aplicativo para usar esse diretório como seu datadir.

Chapeleiro Louco
fonte
12

MadHatter explicou bem o erro. Mas desde então os tempos mudaram e agora o MySQL ( desde a versão 5.6.3 ) tem uma opção para ignorar esse diretório. Basta adicionar esta declaração ao seu /etc/mysql/my.cnfarquivo:

ignore-db-dir=lost+found

Após o reinício do MySQL, você pode verificá-lo com o comando:

show global variables like 'ignore_db_dirs';

Se você deseja ignorar vários diretórios, precisa especificar a opção para cada um deles separadamente.

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

Marki555
fonte
3

Localização do my.cnf no CentOS 7.2, se você estiver usando o MariaDB, está

/etc/my.cnf

Você pode reiniciar o serviço com

systemctl restart mariadb.service

ignore-db-dir deve ser colocado na seção [mysqld] e não na [mysqld_safe].

[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
fonte
1

Como nosso MySQL ainda não entende ignore_db_dirs, eu entendi

# chmod 0 lost+found

que resolveu o (este) problema.

Gerrit A. Smit
fonte
0

MariaDb é ignore_db_dirs O MySQL é ignore_db_dir - sem o "s"

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

Eu tinha um diretório oculto como abaixo

mysql50 # .local

então no etc / my.cnf --- para o MariaDB era

[mysqld] ignore_db_dirs = .local

e reinicie o servidor de banco de dados - verifique se o banco de dados não está mais no comando SHOW DATABASES ou com o MariaDB existe um "mysqlshow" na linha de comando

Em seguida, você pode excluir o diretório e tudo o que estiver sob ele em / var / lib / mysql, editar novamente o arquivo /etc/my.cnf e comentar o comando ou removê-lo, e reiniciar o servidor novamente - o problema foi corrigido

NÃO APAGUE O DIRETÓRIO INDESEJADO SEM fazer isso acima PRIMEIRO = pois o armazenamento de dados que o servidor mantém estará corrompido e você poderá não reiniciar novamente com a exclusão de todos os bancos de dados e a restauração de backup ou pior - e isso é um grande ai.

Wilburunion
fonte