我对数据库很陌生,通过课本学习MySQL。
我对grant的声明表示怀疑。
我是在本地主机环境中学习的(服务器和客户端都是我自己的系统)。
如果我创建一个新的用户帐户
GRANT ALL on mydb.* TO 'violetkiwi' IDENTIFIED BY '12345';命令已成功执行。当我试图登录这个帐户时
mysql -u violetkiwi -p
Access denied for user 'violetkiwi'@'localhost' (using password: YES)如果我在GRANT ALL中指定@'localhost‘,问题就解决了:
GRANT ALL on mydb.* TO 'violetkiwi'@'localhost' IDENTIFIED BY '12345';@'localhost'或@'IP ADDRESS'在创建GRANT ALL用户帐户时是必需的吗?
第二个疑问是GRANT ALL中针对用户帐户的IPADDRESS规范
考虑一下,我必须通过互联网连接到MySQL服务器。
如何通过ADSL调制解调器实现与MySQL服务器的连接,该调制解调器在创建GRANT ALL用户帐户时不需要指定静态IP?
有时,我可以不指定MySQL就可以访问-p:
mysql -u root;
mysql -u violetkiwi;但我不能对DB执行操作。为什么在不指定密码的情况下提供此访问?是我系统里的窃听器吗?它有目的吗?
发布于 2013-02-04 16:53:39
让我们看看您创建用户的方式。
示例:我有一个名为zipcodes的数据库。我将创建一个名为rolando的用户
mysql> grant all on zipcodes.* to rolando identified by 'blahblah';
Query OK, 0 rows affected (0.04 sec)
mysql> show grants for rolando;
+--------------------------------------------------------------------------------------------------------+
| Grants for rolando@% |
+--------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'rolando'@'%' IDENTIFIED BY PASSWORD '*446525BB82B5E22BD9E525261D37C494F623C52B' |
| GRANT ALL PRIVILEGES ON `zipcodes`.* TO 'rolando'@'%' |
+--------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)我指定了没有IP或网卡的rolando。使用“%”。这应该允许远程IP地址登录。
你说你试图登录你的帐户
mysql -u violetkiwi -p为什么这不管用?简单地说,你没有远程连接。您创建了用户violetkiwi@'%'。您应该创建用户violetkiwi@localhost。然后,它可以干净地连接。
您需要确保您的mysql身份验证方案已经清理完毕。
MySQL 5.0认证研究指南第498页第6段在其公报中介绍了如何清理身份验证过程:
在Unix上,MySQL附带了一个mysql_secure_installation脚本,可以在安装过程中执行几个有用的与安全相关的操作。该脚本具有以下功能:
远程访问帐户是一个以%为主机的帐户,它允许任何人和他的祖母。要查找这些帐户,请运行以下查询:
SELECT user,host FROM mysql.user WHERE host='%';您还应该了解MySQL用户身份验证是如何发生的。
根据MySQL 5.0认证研究指南第486,487页,下面描述mysql的身份验证算法:
客户端访问控制有两个阶段:在第一阶段,客户端尝试连接,而服务器要么接受连接,要么拒绝连接。要想成功,用户表中的某些条目必须与客户端连接的主机、用户名和密码匹配。在第二阶段(只有当客户端已经成功连接时才会发生),服务器将检查它从客户端收到的每一个查询,以查看客户机是否有足够的权限来执行它。服务器根据客户端连接的主机和客户端提供的用户,根据授予表中的条目匹配客户端。但是,可能有多条记录匹配:当模式包含通配符值时,可以指定授予表amy中的宿主值。如果授予表包含来自
myhost.example.com、%.example.com、%.com和%的入口,则它们都匹配从myhost.example.com连接的客户端。授予表条目中的用户值不允许使用模式,但是可以将用户名作为空字符串来指定匿名用户。空字符串匹配任何用户名,因此实际上是通配符。当主机和用户在多个用户表记录中的值与客户端匹配时,服务器必须决定使用哪一个。它首先对具有最特定主机和用户列值的记录进行排序,然后选择排序列表中首先发生的匹配记录,排序如下:在主机列中,文字值(如localhost、127.0.0.1和myhost.example.com排序)先于具有模式字符的值(如%.example.com)。模式值根据它们的具体程度进行排序。例如,%.example.com比%.com更具体,后者比%更具体。在User列中,非空白用户名在空白用户名之前排序.也就是说,非匿名用户优先于匿名用户排序。服务器在启动时执行此排序。它将授权表读入内存,对它们进行排序,并使用内存中的副本进行访问控制.
如果您有任何必须具有远程访问权限的用户,请将每个拥有%的用户的主机更改为您将要连接的公共IP。
例如,如果用户myuser必须从208.21.42.184连接,则替换主机如下
UPDATE mysql.user SET host='208.21.42.184' WHERE user='myuser' AND host='%';
FLUSH PRIVILEGES;您还应该检查是否存在任何测试数据库。测试数据库的存在。任何名为test的数据库或其前五个字符为**`test`_ _need的数据库将被重命名为immediately_。
https://dba.stackexchange.com/questions/34071
复制相似问题