mysql50#.本地

mysql50#.本地

我的 MySQL 日志显示重复的错误:

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

我有一个名为的数据库#mysql50#lost+found,但是似乎无法删除它。

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>

我正在操作由 IUS 社区项目在 Centos 6 上分发的服务器版本:5.5.40。

MySQL 在 CentOS 6x(不是 5x)上运行非常慢,我的 datadir 在 ext3 上,并且带有 barrier=0 选项。

是什么原因导致了这个错误?如何消除它?

答案1

在我看来,您datadir位于它自己的文件系统中。

与 Unix 下的大多数文件系统一样,Ext 文件系统的根目录下有一个名为 的目录lost+found。它的存在是为了允许在文件系统检查不一致时将分离的文件(即,它们有内容,但没有关联的目录条目)重新附加到某个位置(例如,参见https://unix.stackexchange.com/questions/18154/what-is-the-purpose-of-the-lostfound-folder-in-linux-and-unix了解更多详情)。此目的在灾难恢复中很重要,因此您不应删除该目录。

当包含该目录的文件系统的挂载点被完全交给一个应用程序时,就会出现问题,该应用程序希望该挂载点中的所有内容都属于它。 MySQL 就是这样一个应用程序,它试图将目录解释lost+found为与数据库相关的内容,并且(并非毫无道理地)失败了。

最好的选择是永远不要将整个 FS 专用于某个应用程序,而是将 FS 挂载到某个非特定于应用程序的挂载点上,例如/data1,在该挂载点下创建一个子目录/data1/mysql,然后重新配置应用程序以使用该目录作为其数据目录。

答案2

MadHatter 很好地解释了这个错误。但从那时起时代已经改变,现在 MySQL (自 5.6.3 起) 有一个选项可以忽略此目录。只需将此语句添加到您的/etc/mysql/my.cnf文件中:

ignore-db-dir=lost+found

MySQL 重启后你可以用命令检查:

show global variables like 'ignore_db_dirs';

如果要忽略多个目录,则需要为每个目录分别指定选项。

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

答案3

如果你使用 MariaDB,那么在 CentOS 7.2 下 my.cnf 的位置是

/etc/my.cnf

你可以使用以下命令重新启动服务

systemctl restart mariadb.service

ignore-db-dir 应该放在 [mysqld] 部分下,而不是 [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

答案4

MariaDb 是 ignore_db_dirs MySQL 是 ignore_db_dir - 没有“s”

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

我有一个如下所示的隐藏目录

mysql50#.本地

所以在 etc/my.cnf 中 --- 对于 MariaDB 来说它是

[mysqld] ignore_db_dirs=.local

并重新启动数据库服务器 - 然后检查数据库不再在 SHOW DATABASES 命令中,或者使用 MariaDB 时在命令行中出现“ mysqlshow ”

然后,您可以删除 /var/lib/mysql 中的目录及其下的内容,然后重新编辑 /etc/my.cnf 文件并注释掉该命令或将其删除,然后重新启动服务器 - 问题已解决。

请勿在没有先执行上述操作的情况下删除不需要的目录=因为服务器保存的数据存储将被损坏,并且您可能无法重新启动它,而必须删除所有数据库并从备份中恢复数据库或更糟糕的情况 - 这是一个很大的麻烦。

相关内容