mysql用户管理
MYSQL是一个多用户的数据库,MYSQL的用户可以分为两大类:
1.超级管理员用户(root),拥有全部权限。
2.普通用户,由root创建,普通用户只拥有root所分配的权限。
创建数据库用户
1.CREATE USER创建用户
使用CREATE USER语句创建用户,必须要拥有CREATE USER权限。其格式如下
CREATE USER user[IDENTIFIED BY [PASSWORD] 'password';
其中,user参数表示新建用户的账户,user由用户名(User)和主机名(Host)构成;IDENTIFIED BY关键字用来设置用户的密码;password参数表示用户的密码;如果密码是一个普通的字符串,就不需要使用PASSWORD关键字。可以没有初始密码。
mysql> CREATE USER 'paul'@'%' IDENTIFIED BY 'paul';
执行之后user表会增加一行记录,但权限暂时全部为‘N’。
2.INSERT语句创建用户
可以使用INSERT语句直接将用户的信息添加到mysql.user表。但必须拥有mysql.user表的INSERT权限。
mysql>INSERT INTO mysql.user (Host,User,Password) VALUES
('%','Cherry',PASSWORD('123456'));
mysql> FLUSH PRIVILEGES;
执行INSERT之后,要使用命令:FLUSH PRIVILEGES;命令来使用户生效。
3. GRANT语句创建用户
用GRANT来创建新的用户时,能够在创建用户时为用户授权。但需要拥有GRANT权限。
语法如下:
GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password']
priv_type:参数表示新用户的权限;
databse.table:参数表示新用户的权限范围;
user:参数新用户的账户,由用户名和主机构成;
IDENTIFIED BY关键字用来设置密码;
password:新用户密码;
4.删除用户
4.1.DROP USER 删除用户
DROP USER语句删除普通用户,需要拥有DROP USER权限。 删除完成后,一样要FLUSH PRIVILEGES才生效。
语法如下:
DROP USER user[,user]...
mysql> drop user Cherry;
user是需要删除的用户,由用户名(User)和主机名(Host)构成
4.2 DELETE 语句删除普通用户
可以使用DELETE语句直接将用户的信息从mysql.user表中删除。但必须拥有对mysql.user表的DELETE权限。DELETE FROM mysql.user WHERE Host = ‘%’ AND User = ‘admin’; 删除完成后,一样要FLUSH PRIVILEGES才生效。
mysql> DELETE FROM mysql.user WHERE Host='%'AND User='Paul';
mysql> FLUSH PRIVILEGES;
修改用户密码
1. 用mysqladmin 修改root用户密码
语法:mysqladmin -u用户名 -p旧的密码 password 新密码
[root@paul ~]# mysqladmin -uroot -p123 password 123456
2. 用SET语句修改密码
使用root用户登录到MySQL服务器后,可以使用SET语句来修改密码:
修改自己的密码,不需要用户名
SET PASSWORD = PASSWORD("123");
mysql> SET PASSWORD=PASSWORD('redhat');
修改其他用户密码:
SET PASSWORD FOR 'myuser'@'%'=PASSWORD("123456") FOR 用户名@主机名
3. 修改user表
UPDATE user表的passwor字段的值,也可以达到修改密码的目的;
mysql> UPDATE mysql.user SET Password=PASSWORD('123') WHERE USER='root';
mysql> FLUSH PRIVILEGES; 刷新后生效。
忘记用户密码解决办法
普通用户,直接用root超级管理员登录进去修改密码就可以了,但是如果root密码丢失了,怎么办呢?
方法一:
1.mysqld_safe方式找回密码
[root@paul ~]# service mysqld stop; 停止mysql
[root@paul ~]# mysqld_safe --skip-grant-tables& 安全模式启动
[root@paul ~]# mysql -uroot –p 无密码回车键登录
重置密码:
mysql> use mysql;
mysql>update user set password=password("123456") where user='root' and host='localhost';
mysql> flush privileges;
正常启动:
[root@paul ~]# service mysqld restart
方法二:
1、在配置文件/etc/my.cnf添加skip-grant-tables一行,跳过密码验证。
2、重启mysql数据库主进程# /etc/init.d/mysqld restart(也可以直接先停掉MySQL进程后使用 skip-grant-tables参数重启MySQL)
3、登录数据库修改密码。mysql> update user set authentication_string=password('') where user='root' and host='localhost';
mysql> flush privileges;
这里需要修改的字段是authentication_string,这点和之前的旧版本不同。
4、将my.cnf中mysqld节点的skip-grant-tables配置删除,然后重新启动服务即可。
mysql权限管理
安装MySQL时会自动安装一个名为mysql的数据库。mysql数据库里面存储的都是权限表。与权限相关的数据表:user,db,host,tables_priv,columns_priv,procs_priv等
用户权限管理主要有以下作用:
1. 可以限制用户访问哪些库、哪些表
2. 可以限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
3. 可以限制用户登录的IP或域名
4. 可以限制用户自己的权限是否可以授权给别的用户
mysql 的权限体系大致分为5个层级:
全局层级全局权限
适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
表层级
表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
列层级
列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
这些权限信息存储在下面的系统表中:
mysql.user
mysql.db
mysql.host
mysql.table_priv
mysql.column_priv
当用户连接进来,mysqld会通过上面的这些表对用户权限进行验证!
我们可以用 CREATE USER 或 GRANT 创建用户,后者还同时分配相关权限。而 REVOKE 则用于删除用户权限,DROP USER 删除账户。MySQL 赋予用户权限命令语法为:
grant 权限 on 数据库对象 to 用户;
grant 权限 on 数据库对象 to 用户 identified by "密码";
grant 权限 on 数据库对象 to 用户@"ip" identified by "密码"
GRANT 语法:
GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION;
privileges 列表:
* ALTER: 修改表和索引。
* CREATE: 创建数据库和表。
* DELETE: 删除表中已有的记录。
* DROP: 抛弃(删除)数据库和表。
* INDEX: 创建或抛弃索引。
* INSERT: 向表中插入新行。
* REFERENCE:未使用。
* SELECT: 检索表中的记录。
* UPDATE: 修改现存表记录。
* FILE: 读或写服务器上的文件。
* PROCESS: 查看服务器中执行的线程信息或杀死线程。
* RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
* SHUTDOWN: 关闭服务器。
* ALL: 所有权限,ALL PRIVILEGES同义词。
* USAGE: 特殊的 "无权限" 权限。
下面创建一个test用户,密码为test,并且只能对studb数据库进行操作的命令
语法:
GRANT UPDATE(cid,cname) ON mysqlpart2.custom TO 'user3'@'localhost';
mysql> GRANT ALL ON studb.* TO test IDENTIFIED BY "test";
GRANT语句的语法看上去像这样:
GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
mysql> flush privileges;
撤销所有权限
语法:
REVOKE 权限 ON 数据库.表 FROM '用户名'@'登录主机;
mysql> REVOKE ALL ON studb.* FROM test IDENTIFIED BY "test";
mysql> flush privileges;
注:说明:赋权与撤销权限的区别,就是REVOKE是将to改为from
查看权限
show grants;//自己
show grants for dba@localhost;//指定用户指定host
设置权限时必须给出一下信息
1,要授予的权限
2,被授予访问权限的数据库或表
3,用户名
grant和revoke可以在几个层次上控制访问权限
1,整个服务器,使用 grant ALL 和revoke ALL
2,整个数据库,使用on database.*
3,特点表,使用on database.table
4,特定的列
5,特定的存储过程
user表中host列的值的意义
% 匹配所有主机
localhost localhost不会被解析成IP地址,直接通过UNIXsocket连接
127.0.0.1 会通过TCP/IP协议连接,并且只能在本机访问;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
原文地址:http://blog.51cto.com/437549/2107411