mysql的权限和账户管理

  • 内容
  • 评论
  • 相关

mysql的权限管理是一个比较简单的问题,今天我们来讲一下一些关于mysql的管理命令。
首先由一个问题引出我们的话题,很多童鞋在远程连接mysql数据库的时候,会经常报出1045的错误,这个错误码对于经常接触mysql的人来说是很熟悉的,这个错误代码告诉我们,mysql服务器禁止这个用户远程连接mysql。那么如何解决呢。相信很多人从网上找到一些方法,例如这个方法:

UPDATE user SET Host='%' WHERE User='root' AND Host='localhost';
flush privileges;

这样修改之后,你的root账户就可以本地登录,但是如果你同时需要远程登录的话,就需要两个root账号,另外一个root账户的host改为'%',但是在实际的生产环境中我们应该禁止掉root账户登录,或者说禁止root远程登录。如何禁用root的也弄成登录呢,很简单,先查询一下你的root远程登录权限是不是打开了:

SELECT `user`,`host` FROM user WHERE user='root';

查看你的显示界面:

+------+-----------+
| user | host      |
+------+-----------+
| root | %         | 
| root | localhost | 
+------+-----------+

如果你的显示结果中有这一条,也就是host=%的这一行,那么你的可以删除这一行或者将host修改成%以外的东东即可。那么这样你的root账户就只能本地登录,而不能远程登录了,安全保护就有了一重保障。
其实作为一个DBA,正常的做法是为每个用户分配合适的数据库访问权限,而不是开通一个超级账户,所有的人都共用这一个账户,这样是不安全也不合理的。正确的方法是,每个用户只能对自己使用的数据库拥有相关权限,也就是说正常的流程是:当你建立完数据库之后,就开始为这个数据库分配使用账户,然后授予这个账户相应的权限。okay,那么我们开始这样做一下。
建立数据库的工作在此省略,我们默认有一个数据库mydb。
那么,我们新建一个mysql用户,这个用户只能访问mydb,只能拥有这个数据库的相关权限。

//新建用户,在新建一个mysql账户的时候,这一句可以省略,直接使用GRANT句也可以
CREATE USER 'gvin'@'localhos' IDENTIFIED BY 'passwd';
//为账户赋予权限,这样用户名为gavin的这个账户就可以本地访问数据库
GRANT ALL PRIVILEGES ON mydb.* TO 'gavin'@'localhost' IDENTIFIED BY 'passwd';
//下面的这条权限赋予语句使gavin这个账户可以远程访问,*.*表示所有数据库的所有权限
GRANT ALL PRIVILEGES ON *.* TO 'gavin'@'localhost' IDENTIFIED BY 'passwd';
flush privileges;

那么对于mysql账户授权语句GRANT,有很多参数,其中我们使用的ALL是使这个用户有对这个数据库的所有权限。在这里简单列出几个参数

ALTER        //更改数据表和索引的定义
SELECT       //可以检索数据表中的数据
UPDATE       //可以更新表数据
EXECUTE      //可以执行存储函数和存储过程

另外还有一个字句也是很有用的,就是GRANT OPTION。例如我是gavin账户,我想把这个账户的权限转授给david,那么我可以这样做。假设david不存在。

CREATE USER 'david'@'%' IDENTIFIED BY 'pass';
//新建一个mysql账户其实可以不用上面的CREATE句,直接使用下面这句
GRANT ALL PRIVILEGES ON mydb.* TO 'david'@'%' WITH GRANT OPTION;
flush privileges;

这样gavin的所有权限都转授给了david。
再次还有一个mysql中经常遇到的问题,就是MySQL4.1版本的安全密码验证问题。从MySQL4.1版开始,MySQL服务器对于密码的加密进行了改进。素具表mysql.user中的password数据列的文本长度增加到了45个字符(原来是16个字符),同时验证协议也改变了。这样增加了MySQL的密码验证的安全性。因此问题也来了,很多MySQL服务器升级以后,很多web应用会失效,例如你使用mysql_connect()函数连接数据库的时候会报错:
mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication
那么解决这个问题的最好方法是升级web应用的MySQL服务器,但是如果在没有办法升级的情况下如何做呢,可以这样做:

vim /etc/my.conf
old_passwords=1

将其改为

old_passwords=0

最好重启一下mysqld服务器,然后再重新的设置一下密码即可:

UPDATE mysql.user SET Password = PASSWORD(‘123456’) WHERE user = 'name';
flush privileges;

评论

0条评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注