`

Mysql:远程连接及用户权限问题

 
阅读更多

Mysql:远程连接及用户权限问题

 

今天开发程序,新建用户后,从本机连接服务器时报异常:

1103 - host xxx.xxx.xxx.xx is not allowed to connec to this mysql server.

 返回异常不允许连接,这个比较怪,各种倒腾后,发现是Mysql的用户体系和权限体系问题、这个只是以前没有认真学习过,这次根据学习过程,将用户体系和权限体系系统学习,记录以供后来查阅。

 

Mysql安装之后,有个mysql数据库,里面保存着Mysql的用户(user)、权限(privilege)、帮助(help)、数据库(db)、时区(timezone)等信息,我们这次连接出问题是由于用户(user)表限定了登陆数据库的IP地址。需要修改数据库或者重新更新用户权限。

 

我们先看下user表的结构:

mysql> desc user;
+-----------------------+-----------------------------------+------+-----+---------
| Field                 | Type                              | Null | Key | Default 
+-----------------------+-----------------------------------+------+-----+---------
| Host                  | char(60)                          | NO   | PRI |                 
| User                  | char(16)                          | NO   | PRI |                 
| Password              | char(41)                          | NO   |     |                 
| Select_priv           | enum('N','Y')                     | NO   |     | N               
| Insert_priv           | enum('N','Y')                     | NO   |     | N               
| Update_priv           | enum('N','Y')                     | NO   |     | N               
| Delete_priv           | enum('N','Y')                     | NO   |     | N               
| Create_priv           | enum('N','Y')                     | NO   |     | N               
| Drop_priv             | enum('N','Y')                     | NO   |     | N               
| Reload_priv           | enum('N','Y')                     | NO   |     | N               
| Shutdown_priv         | enum('N','Y')                     | NO   |     | N               
| Process_priv          | enum('N','Y')                     | NO   |     | N               
| File_priv             | enum('N','Y')                     | NO   |     | N               
| Grant_priv            | enum('N','Y')                     | NO   |     | N               
| References_priv       | enum('N','Y')                     | NO   |     | N               
| Index_priv            | enum('N','Y')                     | NO   |     | N               
| Alter_priv            | enum('N','Y')                     | NO   |     | N               
| Show_db_priv          | enum('N','Y')                     | NO   |     | N               
| Super_priv            | enum('N','Y')                     | NO   |     | N               
| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N               
| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N               
| Execute_priv          | enum('N','Y')                     | NO   |     | N               
| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N               
| Repl_client_priv      | enum('N','Y')                     | NO   |     | N               
| Create_view_priv      | enum('N','Y')                     | NO   |     | N               
| Show_view_priv        | enum('N','Y')                     | NO   |     | N               
| Create_routine_priv   | enum('N','Y')                     | NO   |     | N               
| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N               
| Create_user_priv      | enum('N','Y')                     | NO   |     | N               
| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |                 
| ssl_cipher            | blob                              | NO   |     | NULL            
| x509_issuer           | blob                              | NO   |     | NULL            
| x509_subject          | blob                              | NO   |     | NULL            
| max_questions         | int(11) unsigned                  | NO   |     | 0               
| max_updates           | int(11) unsigned                  | NO   |     | 0               
| max_connections       | int(11) unsigned                  | NO   |     | 0               
| max_user_connections  | int(11) unsigned                  | NO   |     | 0               
+-----------------------+-----------------------------------+------+-----+---------
37 rows in set (0.00 sec)

 其中以priv结尾的字段都是权限;查询下当前用户Host的User、Password字段,看看是否允许远端登陆。如果不允许的话,我们可以直接修改Host字段,使其支持从远端登陆,这样太过粗暴,通常都不会这么做。

 

我们通常的解决方法是创建用户,赋予用户的密码、Host、权限,甚至可以直接将这些内容赋予到具体某张表上,能够达到细致入微的程度。

 

Mysql中能够授予用户权限的命令是grant,我们先看下grant的用法: http://dev.mysql.com/doc/refman/5.1/en/grant.html


     这种类描述方式的语义定义我很喜欢,能够根据定义很快的了解到语法使用。

我将上面那张图精简一下,语法可以修改为:

grant `privilege list` on `db.table` to `user`@`host` idenfied by `password` require `ssl_option` with `with_option`

 

我们逐个解释上面的字段

privilege list:

Mysql支持的privilege如下所示,注意有些权限不在user表里面,如columns_priv就是单独一张表;还有些是数据库版本的问题,自己的机器上装的是5.0版本。


    看完这些权限后,是不是感觉有点乱。其实对于使用者来说,只要不是root权限,也可以得到这些权限。其中ALL可以在某种程度上得到这些权限(这么说是因为GRANT OPTIN也可以对权限做控制)。这些权限中最为常用的是select、insert、update、delete、create、drop、index、alter、event、trigger等。

 

db.table

支持*、*.*、db.*、db.table、table等各种形式的控制,表示将某个库的某张表赋予权限,最细致能够到达数据库表的列字段。其中*表示所有的数据库或者表。对于数据库表列权限控制的语法如下:

GRANT SELECT (col1), INSERT (col1,col2) ON mydb.mytbl TO 'someuser'@'somehost';

     注意支持列权限控制的命令有Select、Insert、Update、References这四个,其它命令不支持列权限控制。

 

user:用户名称,user名称不支持匹配符,所以*并不是指任何用户,而是单独指*用户。

host:用户地址,这个是支持%匹配符的。

password:标准的password就行,复杂度越大越好。密码在mysql.user表中是加密存在,所以想直接修改密码的同学可能要要失望。

 

ssl_option:连接方式支持,SSL或者X509等支持。

with_option:额外对授权用户提出的限制,如

grant option:权限级联,如果当前用户被取消权限,授予的用户权限取消。
MAX_QUERIES_PER_HOUR:最大查询数/小时
MAX_UPDATES_PER_HOUR:最大更新次数/小时
MAX_CONNECTIONS_PER_HOUR:最大连接数/小时
MAX_USER_CONNECTIONS:最大用户连接数

 

熟悉了grant的语法和字段含义,我们来学习下grant的用法:

CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY '123456';

     创建用户jeffery,密码123456,仅允许在本地登录

GRANT ALL ON db1.tbl1 TO 'jeffrey'@'%';

     允许jeffery在任何机器连接,并且授予db1.tbl1的所有操作权限

GRANT SELECT ON db2.* TO 'jeffrey'@'10.11.11.123';

     仅允许jeffery从10.11.11.123连接,授予db2里面所有表的查询权限

GRANT USAGE ON *.* TO 'jeffrey'@'%' WITH MAX_QUERIES_PER_HOUR 90;

     给jeffery的权限添加MAX_QUERIES_PER_HOUR限制

注意这个grant是USAGE,USAGE的用法是给用户添加新的资源限制而不影响用户已经有的权限。

 

对于最开始不能连接的问题,我们可以通过直接新建用户连接地址改正:

CREATE USER 'jeffrey'@'%' IDENTIFIED BY '123456';  //创建新用户jeffery,允许从任意机器连接数据库
GRANT ALL ON *.* TO 'jeffrey'@'%';  //授予jeffery全部数据库操作权限,你可以根据需要授予部分权限

 

有授予GRANT权限,肯定也有回收(REVOKE)权限。

REVOKE `privilege list` on `db.table` from `user`@`host`

     语法类似,不在细解释。

 

注意REVOKE中能够回收GRANT OPTION,如果想确定收回该用户授权出去的用户权限,可以将GRANT OPTION也添加在privilege list中,该用户授权出去的权限自动失效。

 

如果遇到无法连接的问题,除去网络问题外,最有可能就是数据库的设置不正确。了解下Mysql的用户体系和权限体系,对于排查问题是很有帮助的。

 

本节内容到此。

 

  • 大小: 34.5 KB
  • 大小: 61.4 KB
分享到:
评论

相关推荐

    远程用户连接mysql授权

    授权法,介绍远程用户连接mysql数据库,给任意远程主机授权访问mysql server的权限。

    设置mysql远程连接

    设置mysql数据库远程连接: Windows系统 1、 停止mysql的服务。 2、 进入命令窗口,然后进入MySQL的安装目录,比如我的安装目录是c:\mysql,进入c:\mysql\bin 3、 进入mysql数据库服务器 c:\mysql\bin>mysql –u ...

    mysql开启远程连接权限

    通过cmd命令开启windows系统上的mysql远程连接权限,简单明了。

    XAMPP 设置远程连接MYSQL

    设置文件 开通防火墙端口 设置权限 让XAMPP远程连接MYSQL

    牛族MYSQL 远程连接器1.8

    【牛族MYSQL远程连接器1.8】是一款专为MySQL数据库设计的图形化远程连接工具,它使得用户可以通过直观的用户界面与远端MySQL服务器进行交互。这款软件简化了数据库管理,尤其是对于需要频繁跨网络操作数据库的专业...

    mysql5.5.8安装问题(无法远程连接)

    MySQL 5.5.8 安装过程中遇到的“无法远程连接”问题通常是由于服务器配置不当或安全设置限制导致的。解决这个问题需要了解几个关键的知识点: 1. **MySQL服务安装**:首先,确保MySQL 5.5.8正确安装并成功启动。这...

    Mysql数据库远程连接利器SQLyog

    2. **远程连接能力**:SQLyog的一大亮点就是其强大的远程连接功能,允许用户通过Internet或局域网连接到任何位置的MySQL服务器,这对于分布式团队协作和远程数据库管理非常实用。 3. **数据可视化**:SQLyog可以将...

    阿里云下配置MySQL远程连接的步骤详解

    众所周知在默认情况下,我们安在阿里云上的mysql是不支持远程连接的,但是我们还需要通过一些工具来连接mysql,如navicat,这时就需要我们来修改mysql的远程连接了。 注意一点:当我们修改完mysql权限相关的操作后...

    Linux,mysql同意远程连接教程-mysql5.6同意远程连接.docx

    在Linux系统中,MySQL数据库是广泛使用的开源关系型数据库...总之,允许MySQL远程连接是一项基本的系统管理任务,理解并熟练掌握这一过程对于管理和维护MySQL服务器至关重要。确保遵循最佳实践,同时保持系统的安全性。

    android远程连接MYSQL数据库

    本教程将探讨如何在Android应用中实现远程连接到MySQL数据库。标题"android远程连接MYSQL数据库"暗示了我们将讨论这一关键技能。 首先,我们要知道Android系统本身并不支持直接连接到MySQL数据库,因为Android设备...

    Linux,mysql同意远程连接教程-mysql5.6同意远程连接.pdf

    4. **MySQL远程连接工具**:如MySQL Workbench,Navicat等,它们可以帮助你方便地进行远程数据库管理。 以上就是关于“Linux,mysql同意远程连接教程-mysql5.6同意远程连接”的详细步骤和相关知识点。遵循这些指南,...

    vb6源码:VB远程连接MySQL.zip

    标题中的“vb6源码:VB远程连接MySQL.zip”表明这是一个使用Visual Basic 6(VB6)编程语言编写的源代码,其主要功能是实现VB6应用程序与远程MySQL数据库的直接连接,不依赖PHP或其他网页服务作为中介。 描述中提到...

    delphi远程连接MySQL(完美版)

    对于远程连接MySQL,首先确保你的MySQL服务器已经配置为接受远程连接。这通常涉及到修改`my.cnf`配置文件中的`bind-address`项,设置为`0.0.0.0`,然后重启MySQL服务。同时,为了安全,需要在MySQL的用户权限表中,...

    MySQL数据库远程连接开启方法.pdf

    总结,开启MySQL远程连接涉及修改用户权限和主机限制,确保安全性和性能是关键。了解这些步骤后,您就可以根据项目需求灵活地管理远程数据库访问了。对于更多关于GRANT语句和其他MySQL权限管理的信息,可以查阅MySQL...

    mysql远程连接失败解决方法.docx

    MySQL 远程连接需要满足两个必要条件:一是 MySQL 服务器需要开启远程登录功能,二是 MySQL 用户需要有远程连接的权限。在本文中,我们可以看到作者由于对 MySQL 不熟悉,导致了远程连接失败的错误。 知识点2:...

    不改权限远程访问MySql服务器

    在许多情况下,为了确保数据安全,数据库管理员通常会限制对MySQL服务器的远程访问,但有时我们可能需要在不修改服务器权限的情况下实现远程连接。下面将详细探讨这一主题。 首先,MySQL服务器的默认配置通常只允许...

    远程连接mysql数据库 Linux,MySql数据库远程连接教程.docx

    - 授予root用户所有权限以允许远程连接:`GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '新密码';` - 注意:`%`表示任何IP地址,如果只想特定IP能连接,可以用具体的IP地址替换`%`。 - 刷新权限设置...

    linux下Mysql数据库远程连接操作[整理].pdf

    Linux 下 MySQL 数据库远程连接操作详解 Linux 下 MySQL 数据库远程连接操作是指在...本文详细介绍了 Linux 下 MySQL 数据库远程连接操作的步骤、设置密码的方式、解决权限问题的方法等,为用户提供了实用的参考指南。

Global site tag (gtag.js) - Google Analytics