MySQL学习8–MySQL5.1的用户管理

12月 1st, 2013
用户管理:我们可以定义一个account访问和控制mysql服务器.在MYSQL服务器中,account包含两部分,用户名和主机名.也就是说,当连接到服务器时,除了要检查用户名还要检查连接进来的主机.一个隐式的概念就是说用户名相同但是主机名不同的account是不同的account;
Mysql可以支持的权限类型
  1. 管理权限
    1. CREATE TEMPORARY TABLES:创建临时表;
    2. CREATE USER:创建/删除/重命名账户;
    3. FILE:在sql语句中读写操作系统的文件;
    4. LOCK TABLES:锁表;
    5. PROCESS:查看进程的活动状态;
    6. RELOAD:重新加载,FLUSH OR RESET;
    7. REPLICATION CLIENT:作为复制功能的主机;
    8. REPLICATION SLAVE:作为复制功能的备机;
    9. SHOW DATABASES:查看数据库名称;
    10. SHUTDOWN:关闭服务器;
    11. SUPER:各种管理操作;
  2. 数据访问权限
    1. ALTER:修改表结构,alter table;
    2. ALTER ROUTINE:修改或者删除存储过程和函数;
    3. CREATE:创建数据库或者表;
    4. CREATE ROUTINE:创建存储过程或者函数;
    5. CREATE VIEW:创建视图;
    6. DELETE:删除表中数据;
    7. DROP:删除数据库或者表;
    8. EXECUTE:执行函数或者过程;
    9. GRANT OPTION:授权给其它账户;
    10. INDEX:创建/删除索引;
    11. INSERT:向表中插入记录;
    12. SELECT:查询表的记录;
    13. SHOW VIEW:查看视图定义,show create view;
    14. UPDATE:更新表的记录:
  3. 特殊的权限
    1. ALL and ALL PRIVILEGES:即’all privileges except grant option’,授予账户除了把权限赋予其它帐号外的所有权限;
    2. USAGE:即没有任何权限,但是它可以连接到数据库上,也在user表中生成一条记录.这类账户的存在就是为了执行向’show variables’ or ‘show status’这类的语句,也不能查看表的内容;
  4. 权限的级别
    1. 所有的权限都可以被授予全局的,一个账户拥有全局权限,它可以在任何数据库任何时间使用此权限.一般只授予管理员这样的权限;
    2. 一些权限可以被授予特定的数据库:ALTER, CREATE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, GRANT OPTION, IDEX, INSERT, LOCK TABLES, SELECT, SHOW VIEW and UPDATE.一个数据库级别的权限可以应用于所有的tables和routines;
    3. 一些权限可以被授予特定的表:ALERT, CREATE, DELETE, DROP, GRANT OPTION, INDEX, INSERT, SELECT and UPDATE.一个标记别的权限可以应用于表中所有的列;
    4. 一些权限可以被授予表中的列:INSERT, SELECT and UPDATE;
    5. 一些权限可以被授予函数和存储过程:EXECUTE, ALTER ROUTINE and GRANT OPTION;
授权表
  1. 在mysql数据库中有几张授权表包含了服务器大部分的访问控制信息,它们包含了哪些是合法的账户和这些账户拥有的访问级别的信息;
  2. user:每一个账户在user表包含一条记录,它记录了用户拥有的全局的权限,也包含了一些其它信息,比如:使用资源的限制,客户端连接进来是否需要使用SSL链接;
  3. db:列出了账户对指定数据库的权限;
  4. tables_priv:列出了账户对指定表的权限;
  5. columns_priv:列出了账户对指定列的权限;
  6. procs_priv:列出了账户对存储过程和函数的权限;
  7. 服务器使用授权表中的信息决定是否允许客户端连接进来,也决定了客户端是否有权限执行某些语句,mysql服务器每次启动时都把授权信息载入到内存,以加快读取权限的速度,在一下两种情况下会刷新权限表的内存拷贝:
    1. 使用CREATE USER, GRANT, REVOKE or SET PASSWORD语句修改磁盘上的账户信息;
    2. 也可以显式的重新加载这些表使用FLUSH PRIVILEGES语句,执行mysqladmin flush-privileges or mysqladmin reload命令;
管理用户
  1. 查看当前的用户:
    1. select user();
    2. select current_user();
    3. show grants:查看当前用户权限信息;
    4. show grants for ‘user’@’host’:查看某个用户的权限信息;
    5. show processlist:查看当前连接进来用户的信息;
  2. create user创建一个用户(可选的指定密码,不指定的话为null),这个语句在user表中创建一条记录.它没有授予任何权限,可以之后使用grant语句.eg:create user ‘user’@’host’ identified by ‘password’;
  3. drop user回收一个账户的所有权限,并且删除这个账户.这会删除所有授权表中跟这个账户有关的信息,如果要收回用户权限而不删除用户要使用revoke语句.eg:drop user ‘user’@’host’;
  4. rename user改变一个现有账户的用那个户名,可以修改用户名或者主机名的任意一部分,或者两部分都修改.eg:rename user ‘user’@’host’ to ‘user’@’host’;
  5. 创建一个匿名账户,不需要用户名和密码即可登录,比较危险.eg:insert into user(host, user, password) values(‘%’, ”, ”);
  6. 修改用户的密码:set password for ‘u1’@’%’=password(‘u1’);
  7. 授权语句:grant privileges on objects to ‘user’@’host’ identified by ‘password’;
    1. on *.*:全局权限,所有的对象,eg:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with grant option;
    2. on db_name.*:对数据库的权限,eg:grant select, update on test.* to ‘u1’@’localhost’;
    3. on db_name.tbl_name:数据库中表的权限,eg:grant select on mysql.user to ‘u1’@’localhost’;
    4. on db_name.tbl_name.col_name:数据库中表的列的权限,eg:grant select(host, user) on mysql.user to ‘u1’@’%’;
    5. on db_name.routine_name:数据库中routine的权限;
  8. 要添加用户并授权一般使用:grant 权限1,权限2,… on 数据库.表 to “username”@”host” identified by “password”;(创建用户的同时授予权限)
    1. grant all privileges on *.* to “user1″@”%” identified by “pwd”:表示对user1授予所有数据库中所有表的所有权限,并可以从任意客户端连接进来;
    2. grant select,insert,delete,update on mysql.user to “user1″@”192.168.0.1” identified by “pwd”:表示对用户user1授予mysql数据库的user表增删改查权限,并且只能从192.168.0.1客户端连接进来;
    3. host列为%表示可以从任意的客户端连接到服务器端;
    4. 一般在开发的时候使host为%,在生产环境修改host的地址;
  9. 回收权限:revoke prilileges on objects from ‘user’@’host’;
    1. 回收全局权限:revoke all privileges, grant option from ‘u1’@’%’;
    2. 回收数据库的权限:revoke select, grant option on mysql.* from ‘u1’@’%’;
    3. 回收表的权限:revoke select on mysql.user from ‘u1’@’%’;
    4. 回收列的权限:revoke select(host, user) on mysql.user from ‘u1’@’%’;
  10. 限制用户资源:默认情况下对客户端连进来的次数,查询次数等资源没有限制,grant语句可以对账户以下几个方面的资源做限制:
    1. 每个小时允许连到服务器的次数:max_connections;
    2. 每个小时允许查询的次数:max_questions;
    3. 每个小时允许更新的次数:max_updates;
    4. 用户的并发连接数:max_user_connections;
    5. 语句:grant all privileges on *.* to ‘u1’@’%’ identified by ‘u1’ with max_queries_per_hour 10 max_updates_per_hour 5 max_connections_per_hour 5 max_user_connections 8;
  11. 忘记用户密码
    1. Linux中的处理方法:
      1. 关闭服务器或者kill掉mysqld的进程;
      2. 使用–skip-grant-tables选项登录,启动服务器并跳过授权表
      3. 使用mysql登录,可以不用使用用户名和密码,并且有全部权限;
      4. 登录之后修改密码(set password for u1@’%’=password(‘pwd’)),或者直接更新mysql.user表密码字段为空即可;
    2. Windows中的处理方法:
      1. 停止mysql的服务:net stop mysql;
      2. 到mysql的bin目录下执行mysqld -nt –skip-grant-tables;
      3. 到新的命令行下执行mysqladmin -uroot flush-privileges password ‘pwd’;
      4. 然后关闭mysql服务:mysqladmin -uroot -p shutdown,此时输入刚刚设置的密码;
      5. 启动mysql服务:net start mysql;
标签:
目前还没有任何评论.