如果你不想让拥有任意权限(哪怕仅仅只读权限)的用户能任意操作test数据库或者以test_开头命名的数据库,可以delete其mysql.db表中test相关的行,如下:
shell> mysql -u root -p
Enter password: (enter root password here)
mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';
mysql> FLUSH PRIVILEGES;
#再次使用只读用户操作
#如下,已经无法任意操作test相关数据库
mysql> select user();
+------------------+
| user() |
+------------------+
| select@localhost |
+------------------+
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| yujx |
+--------------------+
2 rows in set (0.00 sec)
mysql> create database test;
ERROR 1044 (42000): Access denied for user 'select'@'localhost' to database 'test'
mysql> create database test_a;
ERROR 1044 (42000): Access denied for user 'select'@'localhost' to database 'test_a'
至此,可以看到默认情况下,初始化的mysql环境中mysql.db表默认包含的2行test数据库相关的配置,导致任意用户可以随意操作test或者test_开头的数据库,如果你想避免此问题,可以直接drop test数据库。
关于此现象,大家可能需要注意的问题:
1、正式环境千万别使用test数据库或者创建test_开头的数据库来存储业务数据
2、对用户的权限进行测试、验证的时候,千万别去test数据库,这可能误导你