MySQL应用技巧之存取权限

  MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用户名作为MySQL用户名登录,但是这仅仅为了方便,客户程序允许用-u或--user选项指定一个不同的名字。及与安全的考虑,所有的MySQL用户名都应该有口令。

 1. MySQL 用户名和口令

  * MySQL使用于认证目的的用户名,与Unix用户名(登录名字)或Windows用户名无关。缺省地,大多数MySQL客户尝试使用当前Unix用户名作为MySQL用户名登录,但是这仅仅为了方便,客户程序允许用-u或--user选项指定一个不同的名字。及与安全的考虑,所有的MySQL用户名都应该有口令。

  * MySQL用户名最长可以是16各字符;典型地,Unix用户名限制为8个字符。

  * MySQL口令与Unix口令没关系。

  * MySQL加密口令使用了一个Unix登录期间所用的不同算法,PASSWORD()和ENCRYPT()

  函数PASSWORD(str)

  从纯文本口令str计算一个口令字符串。该函数被用于为了在user授权表的Password列中存储口令而加密MySQL口令。

  mysql> select PASSWORD('badpwd');

  -> '7f84554057dd964b'

  PASSWORD()加密是非可逆的。PASSWORD()不以与Unix口令加密的相同的方法执行口令加密。你不应该假定如果你的Unix 口令和你的MySQL口令是一样的,PASSWORD()将导致与在Unix口令文件存储的相同的加密值。见ENCRYPT()。

  ENCRYPT(str[,salt])

  使用Unix crypt()系统调用加密str。salt参数应该是一个有2个字符的字符串。(MySQL 3.22.16中,salt可以长于2个字符。)

  mysql> select ENCRYPT("hello");

  -> 'VxuFAJXVARROc'

  如果crypt()在你的系统上不可用,ENCRYPT()总是返回NULL。ENCRYPT()只保留str起始8个字符而忽略所有其他,至少在某些系统上是这样。这将由底层的crypt()系统调用的行为决定。

  1. 与MySQL服务器连接

  语法格式:

  shell> mysql [-h host_name][-u user_name][-pyour_pass ]

  -h, -u和-p选项的另一种形式是--host=host_name、--user=user_name和--password=your_pass。

  注意:在-p或--password=与跟随它后面的口令之间没有空格。(在命令行上指定一个口令是不安全的!)

  对于命令行没有的联接参数,mysql使用缺省值:

  * 缺省主机名是localhost。

  * 缺省用户名是你的Unix登录名。

  * 如果没有-p,则没有提供口令。

  缺省值参数的指定:

  在你的主目录下“.my.cnf”的配置文件的[client]小节里指定连接参数:

  [client]

  host=host_name

  user=user_name

  password=your_pass

  注:命令行上被指定的值优先于在配置文件和环境变量中指定的值

  最安全的方法是让客户程序提示口令或在一个适当保护的“.my.cnf”文件中指定口令。

  1. MySQL提供的权限

  权限   列   上下文

  select Select_priv 表

  insert Insert_priv 表

  update Update_priv 表

  delete Delete_priv 表

  index Index_priv 表

  alter Alter_priv 表

  create Create_priv 数据库、表或索引

  drop Drop_priv 数据库或表

  grant Grant_priv 数据库或表

  references References_priv 数据库或表

  reload Reload_priv 服务器管理

  shutdown Shutdown_priv 服务器管理

  process Process_priv 服务器管理

  file File_priv 在服务器上的文件存取

  注:grant权限允许你把你自己拥有的那些权限授给其他的用户。

  file权限给予你用LOAD DATA INFILE和SELECT ... INTO OUTFILE语句读和写服务器上的文件,任何被授予这个权限的用户都能读或写MySQL服务器能读或写的任何文件。

  2. 存取控制:连接证实

  身份检查使用user表3个(Host, User和Password)范围字段。服务器只有在一个user表条目匹配你的主机名和用户名并且你提供了正确的口令时才接受连接。

  注:一个Host值可以是主机名或一个IP数字,或'localhost'指出本地主机。 可以在Host字段里使用通配符字符“%”和“_”。 Host值'%'匹配任何主机名。当一个连接被尝试时,服务器浏览排序的条目并使用找到的第一个匹配。

  普遍的误解是认为,对一个给定的用户名,当服务器试图对连接寻找匹配时,明确命名那个用户的所有条目将首先被使用。这明显不是事实。

  3. 存取控制:请求证实

  一旦你建立了一个连接,服务器进入阶段2。对在此连接上进来的每个请求,服务器检查你是否有足够的权限来执行它,授权表用GRANT和REVOKE命令操作。

  GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...]

  ON {tbl_name * *.* db_name.*}

  TO user_name [IDENTIFIED BY 'password']

  [, user_name [IDENTIFIED BY 'password'] ...]

  [WITH GRANT OPTION]

  REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...]

  ON {tbl_name * *.* db_name.*}

  FROM user_name [, user_name ...]

  GRANT在MySQL 3.22.11或以后版本中实现。对于更早MySQL版本,GRANT语句不做任何事情。

  GRANT和REVOKE命令允许系统主管在4个权限级别上授权和撤回赋予MySQL用户的权利:

  全局级别

  全局权限作用于一个给定服务器上的所有数据库。这些权限存储在mysql.user表中。

  数据库级别

  数据库权限作用于一个给定数据库的所有表。这些权限存储在mysql.db和mysql.host表中。

  表级别

  表权限作用于一个给定表的所有列。这些权限存储在mysql.tables_priv表中。

  列级别

  列权限作用于在一个给定表的单个列。这些权限存储在mysql.columns_priv表中。

  user表权限是超级用户权限。只把user表的权限授予超级用户如服务器或数据库主管是明智的。对其他用户,你应该把在user表中的权限设成'N'并且仅在一个特定数据库的基础上授权, 使用db和host表。

  4. 权限更改何时生效

  当mysqld启动时,所有的授权表内容被读进存储器并且从那点生效。

  用GRANT、REVOKE或SET PASSWORD对授权表施行的修改会立即被服务器注意到。

  如果你手工地修改授权表(使用INSERT、UPDATE等等),你应该执行一个FLUSH PRIVILEGES语句或运行mysqladmin flush-privileges告诉服务器再装载授权表,否则你的改变将不生效,除非你重启服务器。

  5. 建立初始的MySQL权限

  在安装MySQL后,你通过运行scripts/mysql_install_db安装初始的存取权限。包含下列权限集合:

  * MySQL root用户作为可做任何事情的一个超级用户。连接必须由本地主机发出。注意:出世的root口令是空的,因此任何人能以root而没有一个口令进行连接并且被授予所有权限。

  * 一个匿名用户,他可对有一个'test'或以'test_'开始的名字的数据库做任何时期事情,连接必须由本地主机发出。这意味着任何本地用户能连接并且视为匿名用户。

  * 其他权限被拒绝。例如,一般用户不能使用mysqladmin shutdown或mysqladmin processlist。

  为MySQL root用户指定一个口令(注意,你使用PASSWORD()函数指定口令):

  shell> mysql -u root mysql

  mysql> UPDATE user SET Password=PASSWORD('new_password')

  WHERE user='root';

  mysql> FLUSH PRIVILEGES;

  在MySQL 3.22和以上版本中,你可以使用SET PASSWORD语句:

  shell> mysql -u root mysql

  mysql> SET PASSWORD FOR root=PASSWORD('new_password');

  设置口令的另一种方法是使用mysqladmin命令:

  shell> mysqladmin -u root password new_password

  看看scripts/mysql_install_db脚本,看它如何安装缺省的权限。你可用它作为一个研究如何增加其他用户的基础

  为了完全重建权限表,删除在包含mysql数据库的目录下所有“*.frm”,“*.MYI”和“*.MYD”文件。(这是在数据库目录下面命名为“mysql”的目录,当你运行mysqld --help时,它被列出。)然后运行mysql_install_db脚本,可能在首先编辑它拥有你想要的权限之后。

  1. 向MySQL增加新用户权限

  增加用户2个不同的方法:

  通过使用GRANT语句或通过直接操作MySQL授权表。

  比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些。

  shell> mysql --user=root mysql

  mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost

  IDENTIFIED BY 'something' WITH GRANT OPTION;

  mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"

  IDENTIFIED BY 'something' WITH GRANT OPTION;

  mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;

  mysql> GRANT USAGE ON *.* TO dummy@localhost;

  monty

  可以从任何地方连接服务器的一个完全的超级用户,但是必须使用一个口令('something'做这个。注意,我们必须对monty@localhost和monty@"%"发出GRANT语句。如果我们增加localhost条目,对localhost的匿名用户条目在我们从本地主机连接接时由mysql_install_db创建的条目将优先考虑,因为它有更特定的Host字段值,所以以user表排列顺序看更早到来。

  admin

  可以从localhost没有一个口令进行连接并且被授予reload和process管理权限的用户。这允许用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,还有mysqladmin processlist。没有授予数据库有关的权限。他们能在以后通过发出另一个GRANT语句授权。

  dummy

  可以不用一个口令连接的一个用户,但是只能从本地主机。全局权限被设置为'N'--USAGE权限类型允许你无需权限就可设置一个用户。它假定你将在以后授予数据库相关的权限。

  也可以直接通过发出INSERT语句增加同样的用户存取信息,然后告诉服务器再次装入授权表:

  shell> mysql --user=root mysql

  mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('something'),

  'Y','Y','Y

时间: 2024-09-21 13:45:10

MySQL应用技巧之存取权限的相关文章

MySQL中文参考手册7(MySQL 存取权限系统) grant 设置密码 password

mysql|word|参考|参考手册|中文 MySQL中文参考手册7(MySQL 存取权限系统)转载 译者:晏子 [返回][转发] 译者:晏子 (clyan@sohu.com)主页:http://linuxdb.yeah.net6 MySQL 存取权限系统MySQL有一个先进但非标准的安全/权限系统.本节描述它的工作原理.  6.1 权限系统做什么MySQL权限系统的主要功能是证实连接到一台给定主机的一个用户,并且赋予该用户在一个数据库上select. insert.update和delete的

在MySQL数据库增加新用户权限简介

有2个不同的方法增加用户:通过使用GRANT语句或通过直接操作MySQL授权表.比较好的方法是使用GRANT语句,因为他们是更简明并且好像错误少些. 下面的例子显示出如何使用mysql客户安装新用户.这些例子假定权限根据以前的章节描述的缺省被安装.这意味着为了改变,你必须在mysqld正在运行同一台机器上,你必须作为MySQL root用户连接,并且root用户必须对mysql数据库有insert权限和reload管理权限.另外,如果你改变了root用户口令,你必须如下的mysql命令指定它.

Mysql下建立用户授权权限例子

用户授权在mysql中使用grant命令就可以了,我相信各位都会有了解过了,下面小编为各位介绍一个Mysql下建立用户授权权限例子,希望本文章对各位有帮助.     建立用户,授权数据库: mysql> create user 'byrd'@'localhost' identified by 'admin123';    #建立主机为localhost,密码为admin123的用户byrd Query OK, 0 rows affected (0.05 sec) mysql> show gra

MySQL用户执行存储过程的权限

  MySQL中以用户执行存储过程的权限为EXECUTE 比如我们在名为configdb的数据库下创建了如下存储过程,存储过程的定义者为user_admin use configdb; drop procedure if exists sp_dev_test_user_add; delimiter $$ CREATE DEFINER=`user_admin`@`%` PROCEDURE `sp_dev_test_user_add`( in var_user varchar(30), in var

十大MySQL优化技巧

WEB开发者不光要解决程序的效率问题,对数据库的快速访问和相应也是一个大问题.希望本文能对大家掌握MySQL优化技巧有所帮助. 1. 优化你的MySQL查询缓存 在MySQL服务器上进行查询,可以启用高速查询缓存.让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一.当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的. 但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它.在有些处理任务中,我们实际上是可以阻止查询缓存工作的. 1. // query cache d

mysql mysql权限-如何恢复mysql数据库的root账户权限

问题描述 如何恢复mysql数据库的root账户权限 本人小白,在服务器装了mysql之后,在phpmyadmin里自作聪明创建了一个新的账号(newroot),然后给了所有权限(除了Grant),然后就把root账号的权限都取消了..现在发现这个新的账号,不能给新建账号分配数据库权限,很坑爹呀.. 求前辈们指点,如何恢复root权限

查询语句-mysql 查询出错! 是权限的问题吗?

问题描述 mysql 查询出错! 是权限的问题吗? 报错如下: 查询不了当前使用的数据库, 也查询不了当前操作数据库的版本, 可以查询当前用户,当前时间, 这是权限问题吗?请大神指教! 并且在增加了一个用户后却删不了, 该怎么办? 最后这个ERROR 1064(4200)与 1054(42S22) 的报错又是怎么回事? 解决方案 当前使用的数据库 show databases 数据库的版本 select version();或select @@version 解决方案二: 暴汗!去百度搜索,关键

MAC上Mysql忘记Root密码或权限错误的快速解决方案_Mysql

最近一段时间都在倒腾mantis发现总是连接mysql出错,就随手修改了root权限,导致登录不上了. 下面给大家分享还原root权限和更改root密码的最便捷方法. 1:装mysql workbench .可视化界面直接操作. 2:苹果->系统偏好设置->最下边点mysql 在弹出页面中 关闭mysql服务 3:进入终端 输入: cd /usr/local/mysql/bin/ 回车后 登录管理员权限 sudo su 回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe -

详解MySQL中的存取权限_Mysql

看到很多网友提出关于MySQL登录不上服务器的问题,包括有的是在PHP中调用MySQL时发生的不能登录MySQL数据库服务器的问题,以为是PHP出了问题.其实是MySQL权限的问题. MySQL的权限系统在MySQL的手册中是很长的一章,我把它打印出来足足印了20多页!这里就将我对它的理解简要地写出来,希望能对刚刚接触MySQL的同志有点帮助:有说得不对的地方,也请同志们指出. 在我了解了MySQL的权限机制后,不由得不赞叹它的严密与巧妙:也许所有的数据库系统都是如此罢,只是别的大型数据库把权限