我无法删除一个数据库:
mysql> drop database mydb; ERROR 1010 (HY000): Error dropping database (can't rmdir './mydb', errno: 39)
在mysql中存在目录db/mydb,但是里面没有表:
# ls -l db/mydb -rw-rw---- mysql mysql HIS_STAT.MYD -rw-rw---- mysql mysql HIS_STAT.MYI
我该怎么办?
我无法删除一个数据库:
mysql> drop database mydb; ERROR 1010 (HY000): Error dropping database (can't rmdir './mydb', errno: 39)
在mysql中存在目录db/mydb,但是里面没有表:
# ls -l db/mydb -rw-rw---- mysql mysql HIS_STAT.MYD -rw-rw---- mysql mysql HIS_STAT.MYI
我该怎么办?
如果您想无论如何都要删除数据库(但请先阅读整篇文章:错误是有原因的,了解原因可能很重要!),您可以:
SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
找到datadir。service mysql stop
或rcmysqld stop
等,或在Windows上通过SERVICES.MSC
使用NET STOP <MYSQL服务名称,通常为MYSQL57或类似名称>
)。MySQL在包含mydb
文件夹的父目录中没有写入权限。
使用以下命令进行检查:
ls -la /path/to/data/dir/ # see below on how to discover data dir
ls -la /path/to/data/dir/mydb
/path/to/data/dir
中,并允许完全R/W,但是MySQLd来自不同的分发或构建,它实际上将其数据存储在其他地方(例如:/var/lib/mysql5/data/**
而不是/var/lib/mysql/**
)。因此,您看到的是目录具有正确的权限和所有权,但仍然会出现Errno 13,因为apparmor/selinux不允许访问它。touch aardvark && rm aardvark
的命令。如果权限和所有权匹配,但以上操作仍然产生访问错误,则很可能是安全框架问题。
"易修复"被认为是有害的
我偶然在一个“专家论坛”上发现了一个“易修复”的建议(不是Stack Overflow,谢天谢地),这也是我有时会找到Web和FTP问题的“解决方法”——chown 777
。请永远不要这样做。对于那些还不知道的人来说,777(或775、666)不是MySQL程序员忘记应用或不想让你知道的神奇数字。每个数字都有一个含义,777意味着“我同意任何人对我的东西做任何他们想做的事情,包括将其作为二进制或shell脚本执行”。通过这样做(很可能你不能在合理配置的系统上这样做),
mysqladmin
也不再授予本地访问权限),并且一旦事情恢复正常,这些事情将立即被撤销——这不是一个永久性的变化,即使那时。这也不是“能够删除我的DB的一个奇怪技巧”的修复方法。(不用说,这几乎从来不是任何Web或FTP问题的真正解决方法。解决“最近,妻子的钥匙无法打开前门,她无法进入我们的家”的方法是“检查钥匙或修理或更换锁”,尽管chown 777
显然更快,但它是“只需将前门敞开!易如反掌!最坏的情况是什么?”)
这个代码意味着“目录非空”。该目录包含一些MySQL不知道的隐藏文件。对于非隐藏文件,请参见Errno 17。解决方案是相同的。
这个代码意味着“文件已存在”。该目录包含一些MySQL文件,MySQL不想删除它们。这些文件可能是通过SELECT ... INTO OUTFILE "filename";
命令创建的,其中filename
没有路径。在这种情况下,MySQL进程会在其当前工作目录中创建它们(在OpenSuSE 12.3上测试的MySQL 5.6中,该目录是数据库的数据目录,例如/var/lib/mysql/data/nameofdatabase
)。
可重现性:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1676
Server version: 5.6.12-log openSUSE package
[ snip ]
mysql> CREATE DATABASE pippo;
Query OK, 1 row affected (0.00 sec)
mysql> USE pippo;
Database changed
mysql> SELECT version() INTO OUTFILE 'test';
Query OK, 1 row affected (0.00 sec)
mysql> DROP DATABASE pippo;
ERROR 1010 (HY000): Error dropping database (can't rmdir './pippo/', errno: 17)
-- now from another console I delete the "test" file, without closing this connection
-- and just retry. Now it works.
mysql> DROP DATABASE pippo;
Query OK, 0 rows affected (0.00 sec)
file
工具检查它或使用杀毒软件扫描它。或者直接检查它的内容。不要假设它是因为某些无害的错误而存在。DROP DATABASE
并出现错误。从CPU负载和syslog消息来看,我相当确定主机已成为垃圾邮件农场。rsync
或复制,它们的版本相同但平台或文件系统不同(比如Linux或Windows),这是被不鼓励且有风险的,但仍然有许多人这样做。尤其是当大小写敏感性设置不同时,你可能会意外地得到同一文件(数据、索引或元数据)的两个版本,例如Customers.myi
和Customer.MYI
。MySQL使用其中一个,并且对另一个一无所知(可能已过时且导致灾难性的同步)。当删除数据库时(在许多mysqldump ... | ... mysql
备份方案中也会发生),DROP
将失败,因为存在额外的文件(或这些额外的文件)。如果出现这种情况,你应该能够通过文件时间或从它们的大小写方案与其他表的大多数不同来识别需要手动删除的过时文件。
my.cnf
文件(在Linux上为/etc/my.cnf
、/etc/sysconfig/my.cnf
、/etc/mysql/my.cnf
;在Windows中为MySQL程序文件目录下的my.ini
),在[mysqld]
标题下找到datadir
来查找数据目录。mysql> SHOW VARIABLES WHERE Variable_name LIKE '%datadir%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
my.cnf
的建议添加到答案中。errno 13 的问题可能对来这里进行故障排除的人有用,所以我决定保留它。 - LSerni只需前往 /opt/lampp/var/mysql
在那里,您可以找到您的数据库
名称。打开那个文件夹。如果有任何文件,请将其删除
现在转到 phpmyadmin
并删除那个数据库
关于错误代码39,您可以直接在磁盘上删除物理表文件。其位置取决于您的操作系统分发和设置。在Debian中,通常位于/var/lib/mysql/数据库名/下。因此,请执行以下操作:
rm -f /var/lib/mysql/<database_name>/
然后使用您选择的工具或使用命令从数据库中删除:
DROP DATABASE <database_name>
我使用XAMP服务器来管理MySQL,但是当我想删除数据库时,遇到了以下问题:
#1010 - Error dropping database (can't rmdir '.\database_name', errno: 41 "Directory not empty")
mysql> DROP DATABASE mydatabase;
ERROR 1010 (HY000): Error dropping database (can't rmdir '.\mydatabase', errno: 13)
mysql>
我去删除这个目录:C:\...\UniServerZ\core\mysql\data\mydatabase
。
mysql> DROP DATABASE mydatabase;
ERROR 1008 (HY000): Can't drop database 'mydatabase'; database doesn't exist
在Linux中,只需转到“/var/lib/mysql”,右键单击并(以管理员身份打开),在mysql文件夹内找到与您的数据库名称对应的文件夹并将其删除。 就这样。 数据库已删除。
ls -l
输出吗? - Chris Henry