user, db, tables_priv, columns_priv, and procs_priv
这几个系统表中,待MySQL实例启动后就加载到内存中对比root用户在几个权限系统表中的数据mysql
mysql> select * from user where user=‘root’ and host=‘localhost’; ##都是’Y’ mysql> select * from db where user=‘root’ and host=‘localhost’; ##无记录 mysql> select * from tables_priv where host=‘localhost’ and user=‘root’; ##无记录 mysql> select * from columns_priv where user=‘root’ and host=‘localhost’; ##无记录 mysql> select * from procs_priv where user=‘root’ and host=‘localhost’; ##无记录
• Delete权限表明容许删除行数据的权限
• Drop权限表明容许删除数据库、表、视图的权限,包括truncatetable命令
• Event权限表明容许查询,建立,修改,删除MySQL事件
• Execute权限表明容许执行存储过程和函数的权限
• File权限表明容许在MySQL能够访问的目录进行读写磁盘文件操做,可以使用 的命令包括load data infile,select ... into outfile,load file()函数
• Grant option权限表明是否容许此用户受权或者收回给其余用户你给予的权 限
• Index权限表明是否容许建立和删除索引
• Insert权限表明是否容许在表里插入数据,同时在执行analyze table,optimize table,repair table语句的时候也须要insert权限
• Lock权限表明容许对拥有select权限的表进行锁定,以防止其余连接对此表 的读或写sql
• Process权限表明容许查看MySQL中的进程信息,好比执行showprocesslist,
• Reference权限是在5.7.6版本以后引入,表明是否容许建立外键
• Reload权限表明容许执行flush命令,指明从新加载权限表到系统内存中, refresh命令表明关闭和从新开启日志文件并刷新全部的表
• Replication client权限表明容许执行show master status,show slave status,show binary logs命令
• Replication slave权限表明容许slave主机经过此用户链接master以便创建主从 复制关系
• Select权限表明容许从表中查看数据,某些不查询表数据的select执行则不需 要此权限,如Select 1+1,Select PI()+2;并且select权限在执行update/delete 语句中含有where条件的状况下也是须要的
• Showdatabases权限表明经过执行showdatabases命令查看全部的数据库名
• Show view权限表明经过执行show create view命令查看视图建立的语句mysqladmin processlist, show engine等命令shell
• Shutdown权限表明容许关闭数据库实例,执行语句包括mysqladmin shutdown
• Super权限表明容许执行一系列数据库管理命令,包括kill强制关闭某个链接 命令,change master to建立复制关系命令,以及create/alter/drop server等命 令
• Trigger权限表明容许建立,删除,执行,显示触发器的权限
• Update权限表明容许修改表中的数据的权限
• Usage权限是建立一个用户以后的默认权限,其自己表明链接登陆权限数据库
• 权限存储在mysql库的user,db, tables_priv, columns_priv, and procs_priv这几个系统表中,待MySQL实例启动后就加载到内存中
• User表:存放用户帐户信息以及全局级别(全部数据库)权限,决定了 来自哪些主机的哪些用户能够访问数据库实例,若是有全局权限则意味
着对全部数据库都有此权限
• Db表:存放数据库级别的权限,决定了来自哪些主机的哪些用户能够访 问此数据库
• Tables_priv表:存放表级别的权限,决定了来自哪些主机的哪些用户能够 访问数据库的这个表
• Columns_priv表:存放列级别的权限,决定了来自哪些主机的哪些用户可 以访问数据库表的这个字段
• Procs_priv表:存放存储过程和函数级别的权限
• User和db权限表结构
• User权限表结构中的特殊字段
• Plugin,password,authentication_string三个字段存放用户认证信息
• Password_expired设置成’Y’则代表容许DBA将此用户的密码设置成过时而 且过时后要求用户的使用者重置密码(alter user/set password重置密码)
• Password_last_changed做为一个时间戳字段表明密码上次修改时间,执 行create user/alter user/set password/grant等命令建立用户或修改用户密 码时此数值自动更新
• Password_lifetime表明从password_last_changed时间开始此密码过时的天 数
• Account_locked表明此用户被锁住,没法使用
• Tables_priv和columns_priv权限表结构
• Timestamp和grantor两个字段暂时没用
• Tables_priv和columns_priv权限值
• procs_priv权限表结构
• Routine_type是枚举类型,表明是存储过程仍是函数
• Timestamp和grantor两个字段暂时没用
• 系统权限表字段长度限制表
• 权限认证中的大小写敏感问题
• 字段user,password,authencation_string,db,table_name大小写敏感
• 字段host,column_name,routine_name大小写不敏感
• User用户大小写敏感app
mysql> create user abc@localhost; ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost' mysql> create user Abc@localhost; Query OK, 0 rows affected (0.01 sec)
• Host主机名大小写不敏感ide
mysql> create user abc@Localhost; ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'
• MySQL的受权用户由两部分组成:用户名和登陆主机名
• 表达用户的语法为‘user_name’@‘host_name’
• 单引号不是必须,但若是其中包含特殊字符则是必须的
• ‘’@‘localhost’表明匿名登陆的用户
• Host_name可使主机名或者ipv4/ipv6的地址。Localhost表明本机,127.0.0.1表明ipv4的 本机地址,::1表明ipv6的本机地址
• Host_name字段容许使用%和_两个匹配字符,好比’%’表明全部主机,’%.mysql.com’表明 来自mysql.com这个域名下的全部主机,‘192.168.1.%’表明全部来自192.168.1网段的主机函数
• 执行Grant,revoke,setpassword,renameuser命令修改权限以后,MySQL会自动
将修改后的权限信息同步加载到系统内存中
• 若是执行insert/update/delete操做上述的系统权限表以后,则必须再执行刷 新权限命令才能同步到系统内存中,刷新权限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload
• 若是是修改tables和columns级别的权限,则客户端的下次操做新权限就会生 效
• 若是是修改database级别的权限,则新权限在客户端执行use database命令后 生效
• 若是是修改global级别的权限,则须要从新建立链接新权限才能生效
• --skip-grant-tables能够跳过全部系统权限表而容许全部用户登陆,只在特殊 状况下暂时使用this
mysql --user=finley --password db_name mysql -u finley -p db_name mysql --user=finley --password=password db_name shell> mysql -u finley -ppassword db_name
• 有两种方式建立MySQL受权用户
• 执行createuser/grant命令(推荐方式)
• 经过insert语句直接操做MySQL系统权限表spa
mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass'; mysql>GRANTALLPRIVILEGESON*.*TO'finley'@'localhost' WITH GRANT OPTION; mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass'; mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%‘ WITH GRANT OPTION; mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass'; mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost'; mysql> grant select(id) on test.temp to cdq@localhost;
建立MySQL用户日志
mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON bankaccount.* -> TO 'custom'@'localhost'; mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON expenses.* -> TO 'custom'@'host47.example.com'; mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
• 经过revoke命令收回用户权限
mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;
• 经过执行drop user命令删除MySQL用户
mysql> DROP USER 'jeffrey'@'localhost';
• 经过设置全局变量max_user_connections能够限制全部用户在同一时 间链接MySQL实例的数量,但此参数没法对每一个用户区别对待,因此 MySQL提供了对每一个用户的资源限制管理
• MAX_QUERIES_PER_HOUR:一个用户在一个小时内能够执行查询的次 数(基本包含全部语句)
• MAX_UPDATES_PER_HOUR:一个用户在一个小时内能够执行修改的次 数(仅包含修改数据库或表的语句)
• MAX_CONNECTIONS_PER_HOUR:一个用户在一个小时内能够链接 MySQL的时间
• MAX_USER_CONNECTIONS:一个用户能够在同一时间链接MySQL实例 的数量
• 从5.0.3版本开始,对用户‘user’@‘%.example.com’的资源限制是指全部 经过example.com域名主机链接user用户的链接,而不是分别指从 host1.example.com和host2.example.com主机过来的链接
• 经过执行createuser/alteruser设置/修改用户的资源限制
mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank' -> -> -> -> WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2; mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
• 取消某项资源限制既是把原先的值修改为0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
• 当针对某个用户的max_user_connections非0时,则忽略全局系统参数 max_user_connections,反之则全局系统参数生效
设置MySQL用户的密码
• 执行create user建立用户和密码
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
• 修改用户密码的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass'); mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass'; shell> mysqladmin -u user_name -h host_name password "new_password";
• 修改自己用户密码的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass'; mysql> SET PASSWORD = PASSWORD('mypass');
• 设置系统参数default_password_lifetime做用于全部的用户帐户
• default_password_lifetime=180 设置180天过时
• default_password_lifetime=0 设置密码不过时
• 若是为每一个用户设置了密码过时策略,则会覆盖上述系统参数
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL90DAY; ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INEVER;密码不过时 ALTER USER‘jeffrey’@‘localhost’ PASSWORD EXPIRE DEFAULT;默认过时策略
• 手动强制某个用户密码过时
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE; mysql> SELECT 1; ERROR 1820 (HY000): You must SET PASSWORD before executing this statement mysql> ALTER USER USER() IDENTIFIED BY 'new_password'; Query OK, 0 rows affected (0.01 sec) mysql> SELECT 1; |1|
经过执行create user/alter user命令中带account lock/unlock子句设 置用户的lock状态
Createuser语句默认的用户是unlock状态
mysql>create user abc2@localhost identified by 'mysql' account lock; QueryOK,0rowsaffected(0.01sec) Alter user语句默认不会修改用户的lock/unlock状态 mysql>alter user 'mysql.sys'@localhost account lock; Query OK,0 row saffected(0.00sec) mysql>alter user 'mysql.sys'@localhost account unlock; Query OK,0 row saffected(0.00sec) -- 当客户端使用lock状态的用户登陆MySQL时,会收到如此报错 Access denied for user 'user_name'@'host_name'. Account is locked.
• 企业生产系统中MySQL用户的建立一般由DBA统一协调建立,并且按需
建立
• DBA一般直接使用root用户来管理数据库
• 一般会建立指定业务数据库上的增删改查、临时表、执行存储过程的权限给应 用程序来链接数据库
Create user app_full identified by ‘mysql’; Grant select,update,insert,delete,create temporary tables,execute on esn.* to app_full@’10.0.0.%’; mysql>show grants for app_full@'10.0.0.%'; +------------------------------------------------------------------------------------------------------------+ |Grantsforapp_full@10.0.0.% | +------------------------------------------------------------------------------------------------------------+ |GRANTUSAGEON*.*TO'app_full'@'10.0.0.%' | | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `esn`.* TO 'app_full'@'10.0.0.%' |
• 一般也会建立指定业务数据库上的只读权限给特定应用程序或某些高级别人员 来查询数据,防止数据被修改
Create user app_readonly identified by ‘mysql’; Grant select on esn.* to app_readonly identified by ‘mysq’;