Fehlerursache: Ungültiger (alter?) Tabellen- oder Datenbankname 'verloren + gefunden'

8

Mein MySQL-Protokoll zeigt doppelte Fehler:

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

Ich habe eine Datenbank mit dem Namen #mysql50#lost+found, kann sie aber scheinbar nicht löschen.

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>

Ich verwende die Serverversion: 5.5.40, die vom IUS Community Project unter Centos 6 vertrieben wird.

Per MySQL läuft unter CentOS 6x SEHR langsam (nicht 5x) , mein Datenverzeichnis befindet sich auf ext3 mit der Option Barriere = 0.

Was verursacht diesen Fehler und wie kann er behoben werden?

user1032531
quelle

Antworten:

13

Es sieht für mich so aus, als ob Sie datadirsich in einem eigenen Dateisystem befinden.

Ext-Dateisysteme haben, wie die meisten FSes unter Unix, im Stammverzeichnis ein Verzeichnis namens lost+found. Es ist vorhanden, damit Dateien, die getrennt werden (dh sie haben Inhalt, aber keinen zugehörigen Verzeichniseintrag), irgendwo erneut angehängt werden können, wenn ein inkonsistentes Dateisystem überprüft wird (siehe z. B. https://unix.stackexchange.com/). Fragen / 18154 / Was-ist-der-Zweck-des-verlorenen-gefundenen-Ordners-in-Linux-und-Unix für weitere Details). Dieser Zweck ist bei der Notfallwiederherstellung wichtig, daher sollten Sie das Verzeichnis nicht löschen.

Ihr Problem tritt auf, wenn der Bereitstellungspunkt, auf dem das Dateisystem, das dieses Verzeichnis enthält, bereitgestellt wird, vollständig an eine Anwendung übergeben wird, die erwartet, dass alles in diesem Bereitstellungspunkt dazu gehört. Da MySQL eines davon ist, versucht es, das lost+foundVerzeichnis als db-bezogen zu interpretieren , und schlägt (nicht unangemessen) fehl.

Am besten widmen Sie niemals einen gesamten FS einer Anwendung, sondern mounten den FS an einem anwendungsunabhängigen Einhängepunkt, z. B. /data1erstellen Sie ein Unterverzeichnis darunter, z. B. /data1/mysql, und konfigurieren Sie die Anwendung neu, um dieses Verzeichnis als dessen zu verwenden Datadir.

MadHatter
quelle
12

MadHatter erklärte den Fehler gut. Aber seitdem haben sich die Zeiten geändert und jetzt hat MySQL ( seit 5.6.3 ) die Option, dieses Verzeichnis zu ignorieren. Fügen Sie einfach diese Anweisung in Ihre /etc/mysql/my.cnfDatei ein:

ignore-db-dir=lost+found

Nach dem Neustart von MySQL können Sie dies mit dem folgenden Befehl überprüfen:

show global variables like 'ignore_db_dirs';

Wenn Sie mehrere Verzeichnisse ignorieren möchten, müssen Sie die Option für jedes Verzeichnis separat angeben.

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

Marki555
quelle
3

Der Speicherort von my.cnf unter CentOS 7.2, wenn Sie MariaDB verwenden, befindet sich in

/etc/my.cnf

Sie können den Dienst mit neu starten

systemctl restart mariadb.service

ignore-db-dir sollte unter [mysqld] und nicht unter [mysqld_safe] eingefügt werden.

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

Da unser MySQL noch nicht versteht ignore_db_dirs, habe ich es getan

# chmod 0 lost+found

das löste das (dieses) Problem.

Gerrit A. Smit
quelle
0

MariaDb ist ignore_db_dirs MySQL ist ignore_db_dir - ohne das "s"

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

Ich hatte ein verstecktes Verzeichnis wie unten

mysql50 # .local

also in etc / my.cnf --- für MariaDB war es

[mysqld] ignore_db_dirs = .local

und starten Sie den Datenbankserver neu - überprüfen Sie dann, ob sich die Datenbank nicht mehr im Befehl SHOW DATABASES befindet oder mit MariaDB eine "mysqlshow" über die Befehlszeile angezeigt wird

Anschließend können Sie das Verzeichnis und alle darin enthaltenen Dateien in / var / lib / mysql löschen, die Datei /etc/my.cnf erneut bearbeiten und den Befehl auskommentieren oder entfernen und den Server erneut starten - das Problem ist behoben

LÖSCHEN SIE DAS UNGEWÜNSCHTE VERZEICHNIS NICHT, OHNE dies oben zu tun eine große Autsch.

Wilburunion
quelle