Causa dell'errore: nome della tabella o del database non valido (vecchio?) "Perso + trovato"


8

Il mio registro MySQL mostra errori duplicati:

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

Ho un database chiamato #mysql50#lost+foundma non riesco a eliminarlo.

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>

Sono operativo Versione server: 5.5.40 Distribuito da IUS Community Project su Centos 6.

Per MySQL funziona MOLTO lentamente su CentOS 6x (non 5x) , il mio datadir è su ext3 con l'opzione barrier = 0.

Cosa sta causando questo errore e come può essere eliminato?

Risposte:


14

Mi sembra che il tuo datadirsia in un file system a parte.

I file system ext, come la maggior parte delle FS sotto Unix, hanno alla radice una directory chiamata lost+found. Esiste per consentire ai file che si staccano (ovvero hanno contenuto, ma nessuna voce di directory associata) di essere ricollegati da qualche parte quando viene fscked un file system incoerente (vedere, ad esempio, https://unix.stackexchange.com/ questions / 18154 / what-is-the-purpose-of-the-lostfound-folder-in-linux-and -ix per maggiori dettagli). Questo scopo è importante nel ripristino di emergenza, quindi non è necessario eliminare la directory.

Il problema si presenta quando il punto di montaggio, su cui è montato il file system che contiene quella directory, viene ceduto interamente a un'applicazione che si aspetta che tutto ciò che appartiene a quel punto di montaggio appartenga ad esso. Essendo MySQL uno di questi, tenta di interpretare la lost+founddirectory come qualcosa di correlato al db e (non irragionevolmente) fallisce.

La tua scommessa migliore non è mai dedicare un intero FS a un'applicazione, ma invece di montare FS su un punto di montaggio non specifico dell'applicazione, ad esempio /data1, creare una sottodirectory sotto quella, ad esempio /data1/mysql, e riconfigurare l'applicazione per utilizzare quella directory come suo datadir.


12

MadHatter ha spiegato bene l'errore. Ma da allora i tempi sono cambiati e ora MySQL ( dalla 5.6.3 ) ha un'opzione per ignorare questa directory. Aggiungi questa affermazione nel tuo /etc/mysql/my.cnffile:

ignore-db-dir=lost+found

Dopo il riavvio di MySQL puoi controllarlo con il comando:

show global variables like 'ignore_db_dirs';

Se si desidera ignorare più directory, è necessario specificare l'opzione per ciascuna di esse separatamente.

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


3

La posizione di my.cnf in CentOS 7.2 se si sta utilizzando MariaDB è in

/etc/my.cnf

È possibile riavviare il servizio con

systemctl restart mariadb.service

ignore-db-dir dovrebbe essere inserito nella sezione [mysqld] e non in [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

1

Come il nostro MySQL non capisce ancora ignore_db_dirs, l'ho fatto

# chmod 0 lost+found

che ha risolto il (questo) problema.


0

MariaDb è ignore_db_dirs MySQL è ignore_db_dir - senza la "s"

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

Avevo una directory nascosta come di seguito

mysql50 # .local

così in etc / my.cnf --- per MariaDB lo era

[mysqld] ignore_db_dirs = .local

e riavvia il server database - quindi controlla che il database non sia più nel comando SHOW DATABASES o con MariaDB sia presente un "mysqlshow" dalla riga di comando

Quindi puoi cancellare la directory e tutto ciò che c'è sotto in / var / lib / mysql, quindi modificare nuovamente il file /etc/my.cnf e commentare il comando o rimuoverlo e riavviare nuovamente il server - il problema è stato risolto

NON SOLO ELIMINARE LA DIRECTORY indesiderata SENZA farlo sopra PRIMA = poiché il datastore che il server conserva sarà danneggiato e potresti non riuscire a riavviarlo di nuovo a meno di dover eliminare tutti i database e ripristinare i database dal backup o peggio - e questo è un GRANDE OUCH.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.