我的 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 文件并注释掉该命令或将其删除,然后重新启动服务器 - 问题已解决。
请勿在没有先执行上述操作的情况下删除不需要的目录=因为服务器保存的数据存储将被损坏,并且您可能无法重新启动它,而必须删除所有数据库并从备份中恢复数据库或更糟糕的情况 - 这是一个很大的麻烦。