drop database失败?可能有人动了你的环境
今天晚上临走的时候,接到需求要更新一个很久没有用过的实例的一个数据库对象,其实操作很简单,就是drop database,然后create database,然后use database,执行一个SQL文件。
就这个看似简单的问题,还花费了一点时间,反正花时间了,就跟大家分享一下呗。我用测试环境复现了一下当时的场景。
01
问题描述
drop database失败:
mysql--dba_admin@127.0.0.1:yeyztest 20:13:33>>create database root;
Query OK, 1 row affected (0.05 sec)
mysql--dba_admin@127.0.0.1:yeyztest 20:13:42>>drop database root;
ERROR 1008 (HY000): Can't drop database 'root'; database doesn't exist
10s前创建的数据库,10s后drop就报错了?
你可能已经猜到了,我一定在这10s中间动了手脚。
02
说说思路
看到这个错误,我的第一反应lower_case那个参数的问题,是不是做了库名的大小写转换啊之类的。这里你可以参考我之前写的一个文章,这里给出链接:
经过一阵理性的判断,此处省略300字,发现了一个问题,就是我的mysql目录的系统文件属主被系统运维的哥们儿给改了。。。问题复现如下:
[root@tk-dba-mysql-194 data]# ll
total 1064860
-rw------- 1 mysql mysql 1676 May 10 2018 private_key.pem
-rw-r--r-- 1 mysql mysql 452 May 10 2018 public_key.pem
drwxr-x--- 2 mysql mysql 4096 Jun 17 20:13 root
-rw-r--r-- 1 mysql mysql 1087 May 10 2018 server-cert.pem
-rw------- 1 mysql mysql 1680 May 10 2018 server-key.pem
drwxr-x--- 2 mysql mysql 4096 Jun 1 15:09 yeyztest
[root@tk-dba-mysql-194 data]# chown root.root -R root/
[root@tk-dba-mysql-194 data]# ll
total 1064860
-rw------- 1 mysql mysql 1676 May 10 2018 private_key.pem
-rw-r--r-- 1 mysql mysql 452 May 10 2018 public_key.pem
drwxr-x--- 2 root root 4096 Jun 17 20:13 root
-rw-r--r-- 1 mysql mysql 1087 May 10 2018 server-cert.pem
-rw------- 1 mysql mysql 1680 May 10 2018 server-key.pem
drwxr-x--- 2 mysql mysql 4096 Jun 1 15:09 yeyztest
这里我复现了一下,就是把root这个数据库的属主给他改成root用户的,而不是mysql用户的。这样再重新执行的手就会复现刚才的错误了。
问题其实很简单,但是奇怪的是MySQL的报错是无法删除数据库,数据库不存在。然后我使用use root这个命令,进入到root这个数据库里面,发现是可以执行成功的,show tables 命令一敲,看到返回,这个问题就算完全解决了,基本上你也就明白了:
mysql--dba_admin@127.0.0.1:yeyztest 20:15:17>>use root
Database changed
mysql--dba_admin@127.0.0.1:root 20:15:28>>show tables;
ERROR 1018 (HY000): Can't read dir of './root/' (errno: 13 - Permission denied)
mysql--dba_admin@127.0.0.1:root 20:15:31>>
很明显,不能读取root目录的内容,这里就很明确了,问题就是出在root这个数据库的目录上,因为它的属主变了,所以MySQL无法访问了。如果你drop database root,肯定就报错无法删除数据库了。
OK,就这样,回家了