MySQL的用户创建和授权基本是通过一个命令解决:

GRANT privileges ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION

要使用该语句,你需要填写下列部分:

1、privileges : 授予用户的权限,下表列出可用于GRANT语句的权限指定符:

  • Alter 修改表和索引
  • Create 创建数据库和表
  • Delete 删除表中已有的记录
  • Drop 抛弃(删除)数据库和表
  • INDEX 创建或抛弃索引
  • Insert 向表中插入新行
  • REFERENCE 未用
  • Select 检索表中的记录
  • Update 修改现存表记录
  • FILE 读或写服务器上的文件
  • PROCESS 查看服务器中执行的线程信息或杀死线程
  • RELOAD 重载授权表或清空日志、主机缓存或表缓存
  • SHUTDOWN 关闭服务器
  • ALL 所有,ALL PRIVILEGES同义词
  • USAGE 无权限,即创建用户,但不授予权限

2、what : 权限运用的级别。权限可以是全局的(适用于所有数据库和所有表)、特定数据库(适用于一个数据库中的所有表)或特定表的。可以通过指定一个columns字句是权限是列特定的。

3、user : 权限授予的用户,它由一个用户名和主机名组成。在 MySQL 中,你不仅指定谁能连接,还有从哪里连接。这允许你让两个同名用户从不同地方连接。

4、password : 赋予用户的口令,它是可选的。如果你对新用户没有指定 IDENTIFIED BY 子句,该用户不赋给口令(不安全)。对现有用户,任何你指定的口令将代替老口令。如果你不指定口令,老口令保持不变,当你用 IDENTIFIED BY 时,口令字符串用改用口令的字面含义,GRANT 将为你编码口令,不需要用 SET PASSWORD 那样使用 password() 函数。 当然你也可以使用 IDENTIFIED BY PASSWORD 指定编码后的密码。

5、WITH GRANT OPTION : 可选。如果你包含它,用户可以授予权限通过 GRANT 语句授权给其它用户。你可以用该子句给与其它用户授权的能力。

NOTES

用户名、口令、数据库和表名在授权表记录中是大小写敏感的,主机名和列名不是。

一些例子

mysql> GRANT ALL ON `reading`.* TO 'arganzheng'@'localhost' IDENTIFIED BY 'xxxx';

给来自localhost的用户arganzheng分配可对数据库reading的所有操作权限,并且密码设置为xxxx。

mysql> GRANT ALL ON `reading`.* TO 'arganzheng'@'%' IDENTIFIED BY '密码';

给来自任何机器的用户arganzheng分配可对数据库reading的所有操作权限,并且密码设置为xxxx。

mysql> GRANT ALL ON `reading`.* TO 'arganzheng'@'localhost' IDENTIFIED BY '密码' with GRANT OPTION
mysql> GRANT select, insert, delete, update ON `reading`.* TO 'arganzheng'@'localhost'

给来自localhost的用户arganzheng分配可对数据库reading的所有表进行select,insert,update,delete操作的权限,因为arganzheng前面已经设置密码了,所以这里不需要再次通过IDENTIFIED BY设置密码。

TISP

1、当你使用 GRANT 和 REVOKE 语句时,会自动重载权限,但是如果是直接修改授权表则需要手动执行 FLUSH PRIVILEGES 命令。

2、复制老数据库的权限

这个在做 MySQL slave 的时候特别有用,可以使用下面这个脚本将主机的权限导出:

MYSQL_CONN="-uroot -pXXXXX"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql

然后将其导入到新的slave:

mysql -uroot -p -A < MySQLUserGrants.sql