zoukankan      html  css  js  c++  java
  • 一、MySQL的连接建立与权限

    一、MySQL的连接建立与权限

      写这些的目的一是记录下工作这几年所学,算是成长脚印吧。二是复习一遍,也给自己当笔记看,通篇观点都属于个人理解较多。读者观看的时候也需要自己判断下是否正确,另外,记下一段我非常喜欢的话:年少轻狂的我同样有对未来的迷茫,对生活的愤懑,对社会的厌恶,对世道的鄙夷......在阅尽沧桑的饱览岁月的人看来,这些也许很幼稚,但这不正是青春的特质吗?青春既然不能够被挽留,也不能够被拒绝,那就用自己的方式去挥霍或者,珍惜。

      一、连接建立前

        1、连接方式

        2、服务器、客户端域名连接

        3、重要参数

      二、权限

    一、连接建立前

      1、连接方式

    复制代码
    首先介绍连接方式,mysql可以提供来自网络的tcp/ip连接和只服务本机localhost的Unix域套接字连接,如果服务器不监听来自网络的连接,远程客户端连接会报错,服务器不会收到任何消息。
     
    Tcp/ip:用于跟mysql实例不在同一台机器上的客户端和本机127.0.0.1连接;注意防火墙的设置,防火墙是否放过mysql的进程,是否屏蔽了mysql的3306端口。
    Unix域套接字:它不是一种网络协议,只用于客户端和mysql实例在同一台机器上,用localhost访问。
    
    <1>skip_networking
    告诉mysql不要监听网络,服务只限于本机localhost访问,127.0.0.1也不能访问。如果不需要其他主机连接,最好把这变量打开,防止穷举密码攻击。
    <2> bind-address 只监听某个特定地址的连接,这个参数是指定哪些服务器监听哪些ip的请求,其他ip就算有权限也连接不上。为了数据的安全,可以考虑让MySQL只守候在127.0.0.1上,这样从Internet上就无法直接访问数据库了。
    复制代码

      2、服务器、客户端域名连接

    1
     

      

    复制代码
    1)服务端
      只要你安装启动了mysql服务,就可以通过mysql服务器主机名称或ip连接。但是客户端给mysql服务器传递之前,主机名称一定要转换成ip,如果此主机名称不是公共网络上的主机名称,必须在hosts表里填写主机名和其ip对应关系,
    否则无法连接。
      Mysql服务器本机命令行客户端:Shell>./mysql –hhost –uuser –ppwd
      分别在C:WindowsSystem32driversetchosts和/etc/hosts中添加:ip  hostname,然后分别重新连接,均可正常连接。
    【1】resolveip工具
       对hostname和ip的转换工具。位于/usr/local/mysql/bin/2)客户端域名连接授权
      此域名对应mysql库的user表中的host字段,是用来控制对客户端的连接权限的。
      mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"),  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', 'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', '', '', '', '', '0', '0', '0', '0', '', null);//域名授权
      mysql> INSERT INTO `user` VALUES ('ip', 'user', password("pwd"),  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', 'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N',  'N', '', '', '', '', '0', '0', '0', '0', '', null);//ip段授权,在此ip段的客户端都可以通过hanmm这个账号连接mysql服务。
      or
      grant 权限 on 数据库对象 to 用户@'host' identified by 'pwd'
       Host cache
       选项就能禁用主机缓存。想要清除主机缓存,可以提交 FLUSH HOSTS 语句或者运行 mysqladmin flush-hosts.
    
    <1>skip-name-resolve 
      skip-name-resolve能大大加快用户获得连接的速度,特别是在网络情况较差的情况下。MySQL在收到连接请求的时候,会根据请求包中获得的ip来反向追查请求者的主机名。然后再根据返回的主机名又一次去获取ip。如果两次获得的ip相同,那么连接就成功建立了。在DNS不稳定或者局域网内主机过多的情况下,一次成功的连接将会耗费很多不必要的时间。假如MySQL服务器的ip地址是广域网的,最好不要设置skip-name-resolve。
      When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the host cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
      当一个新的连接请求产生,mysql会启动一个新线程去处理此请求,该线程首先会检查域名缓存里是否有此域名,如果缓存里不存在,则调用gethostbyaddr_r()和gethostbyname_r()处理此域名。
      If the operating system doesn't support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
    如果操作系统对这两个函数不提供线程安全的调用(我理解是每个线程隔离并行),则此线程对操作系统该资源加锁,然后调用方法,直到它处理完释放此资源锁,别的线程才能调用。
      You can disable DNS host lookup by starting mysqld with --skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
    你可以在启动时加--skip-name-resolve这个参数,避免DNS host查找过程,这样你使用ip地址而不能使用域名连接访问mysql。
      If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with --skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.
      如果DNS服务很慢且有很多域名,想要提高性能,你可选择加参数--skip-name-resolve启动,或者增大域名缓存空间大小。
    允许域名解析的时候 localhost=127.0.0.1,禁止域名解析之后localhost与127.0.0.1并不是同一个主机。所以在禁止域名解析之后,需要重新设置用户权限,不能再使用 localhost ,使用 % 任意主机或者IP地址如127.0.0.1 。
    
      You can disable the hostname cache with --skip-host-cache. You can clear the hostname cache with FLUSH HOSTS or mysqladmin flush-hosts.
    
      If you don't want to allow connections over TCP/IP, you can do this by starting mysqld with --skip-networking.
    
    <2>host_cache_size
      5.6.26默认279。The host_cache_size value, introduced in MySQL 5.6.5, is ignored by the server. The host_cache table only holds 128 entries.
    <3>skip-grant-tables
      如果忘记管理员密码,在启动mysql时不启动grant-tables授权表。mysqld_safe --skip-grant-tables &
      然后修改管理员密码:
      mysql>update user set password=password('yournewpasswordhere') where user='root';
      mysql>flush privileges;
      mysql>exit;
      重启mysql。
    复制代码

      3、重要参数

    复制代码
    <1>socket
        默认值是/tmp/mysql.sock,此文件删除掉会导致socket连接失败。
        Unix平台:用于本地客户端连接的套接字文件。默认为/var/lib/mysql/mysql.sock。
        Windows:用于本地客户端连接的命名管道名。默认为mysql。
    <2>max_connections
        mysql是多线程的,可以同时接收客户端的多个连接(connection)请求。max_connections是整个mysql允许的最大并发连接数(实际值比该值多1,预留给系统管理员),影响整个mysql应用的并发处理能力。
    只要服务器监听了网络tcp连接,不管用户名密码对不对,有没有权限,客户端发起连接请求,不管三七二十一,先检查当前连接数是否已达到上限,达到连接上线拒绝连接。一般来说,只要mysql主机性能允许,应该将
    该参数设置的尽量大一点,一般1000-5000左右是一个比较合适的参考值。 <3>max_user_connections 每个用户允许的最大连接数。该参数针对单个用户的连接限制。 在一般情况下我们很少使用这个限制,只有在一些专门提供mysql数据存储服务或者提供虚拟主机的应用中可能用到。 <4>connect_timeout 连接超时 检测方法 telnet ip 3306.连接超时时间,客户端发送tcp第一次握手,我要请求了;服务器端收到请求,检查连接未达到上限,返回同意,计时开始;客户端发送真正的(如select)请求,再到服务器端,
    这段时间超过connet_timeout,就断开了。默认值10,一般不要动。【在数据量大的情况下,由于网络等原因,如果connect_timeout设置过低,极有可能连接超时。这个值最低好像是2,许允许设置成0,设置成0其实就是
    所有连接都连接不上了。】 权限1---连接权限认证: Usage,连接(登陆)权限。建立一个用户,默认授予这个权限。该权限只能用于数据库登陆,不能做任何操作。客户端连接时,传递给服务器端的信息:客户端的hostname或者IP地址、数据库
    服务器的IP地址或域名、数据库服务的端口号、数据库帐号名称、数据库帐号对应的密码。服务器端检查mysql库的user表是否存在user和password对应用户,host是否符合对应host,用户是否有Usage权限。通过身份认证
    连接才能建立,否则拒绝连接。客户端连接成功后取得该链接的所有权限,在该连接生命周期内权限不会变,即使在别处更改了权限,也不会影响。例如:该用户没有delete权限,在连接后,管理员赋予它delete权限,可是得等
    到此连接断开,下一次连接成功后才能获得delete权限。 例如: 192.168.1.1服务器上安装启动mysql服务。 mysql> INSERT INTO `user` VALUES ('192.168.1.1', 'user', password("pwd"), 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N', '', '', '', '', '0', '0', '0', '0', '', null); User表里host字段是连接客户端的ip,和mysql服务器主机ip没有关系,为哪个客户端赋连接权限,就是哪个客户端主机的ip。 <5>Aborted_connects 用户名密码不对或没权限或连接超时(connect_timeout),被丢弃的连接数。 <6>max_connect_errors 最大连接失败数,max_connect_errors默认值为10,如果受信帐号错误连接次数达到10则自动堵塞,需要flush hosts来解除。如果你得到象这样的一个错误: Host ’hostname’ is blocked because of many connection errors. Unblock with ’mysqladmin flush-hosts’ 在max_connect_errors次失败请求后,mysqld认定出错了(像来自一个黑客的攻击),并且阻止该站点进一步的连接,直到某人执行命令mysqladmin flush-hosts或者有reload权限的用户登录后,执行mysql>flush hosts。 mysql认为是恶意连接,会强制阻止此客户端连接。当此客户端有一次连接成功后,针对此客户端的max_connect_errors会清零。---这个参数没验证出来。 <7>thread_stack 每个连接线程被创建的时候,MySQL 给他分配的内存大小。 当 MySQL 创建一个新的连接线程的时候,是需要给他分配一定大小的内存堆栈空间,以便存放 客户端的请求 Query 以及自身的各种状态和处理信息。不过一般来说如果不是对 MySQL 的连接线 程处理机制十分熟悉的话,不应该轻易调整该参数的大小,使用系统的默认值(192KB)基本上 可以所有的普通应用环境。如果该值设置太小,会影响 MySQL 连接线程能够处理客户端请求的 Query 内容的大小,以及用户创建的 Procedures 和 Functions 等 <8>back_log 短时间内得到大量连接请求,并且超过max_connections,mysql暂时停止回答新请求之前, 允许被存在堆栈中的请求数量。操作系统的TCP/ip连接的侦听队列大小对这个队列大小有限制, 高于操作系统限制是无效的。
    复制代码

    二、权限

    复制代码
    1、Usage权限
      连接登陆。新增的用户默认赋予这个权限,且此usage权限不能被收回。
    2、管理grant权限   拥有grant option,就可以将自己拥有的权限授予其他用户(仅限于自己已经拥有的权限)   mysql> grant Grant option on db.* to db@localhost;   mysql> grant select on db.* to db@localhost;   mysql>grant select *.* to ‘user’@’192.168.1.%’ identified by ‘pwd’;
    3、管理权限process   通过这个权限,用户可以执行SHOW PROCESSLIST和KILL命令。默认情况下,每个用户都可以执行SHOW PROCESSLIST命令,但是只能查询本用户的进程。kill命令杀死服务器线程。你总是能显示或杀死你自己的线程,
    但是你需要PROCESS权限来显示或杀死其他用户和SUPER权限启动的线程。 mysqld为有process权限的用户保留一个额外的连接, 以便一个MySQL root用户能登录并检查,即使所有的正常连接在使用。所以当连接数达到最大时,普通连接建立不了的时候,拥有process权限的用户还是可以连接的。 shell>./mysqladmin –uroot –proot restart mysql>kill 3;//杀死id=3的进程。

    4、管理权限file   拥有file权限才可以执行 select ..into outfile和load data infile…操作,但是不要把file, process, super权限授予管理员以外的账号,这样存在严重的安全隐患。   管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟*.*。   mysql> grant file on *.* to db@localhost;   mysql> load data infile ‘/home/mysql/db.txt’ into table db;
    5、管理权限super   这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。修改存储过程需要super权限():   mysql> grant super on *.* to 'ld'@'ip';   mysql> purge master logs before ‘mysql-bin.000006′;   管理权限(如 super, process, file等)不能够指定某个数据库,on后面必须跟*.*
    6、管理权限Shutdown   shell>./mysqladmin –hip –uld –pld shutdown
    7、管理权限replication slave   拥有此权限可以查看从服务器,从主服务器读取二进制日志。   mysql> grant replication slave on *.* to 1d@localhost;   mysql> show slave hosts;   mysql>show binlog events;
    8、 replication client   此权限可以查询master server、slave server状态。   mysql> grant Replication client on *.* to ld@localhost;   或:mysql> grant super on *.* to ld@localhost;   mysql> show master status;
    9、Reload权限   必须拥有reload权限,才可以执行   flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload命令。    MySQL的FLUSH句法,用于清除或者重新加载内部缓存。而使用flush语句,你必须有reload权限。 (1)flush hosts   清空hostname cache,hostname cache与连接时skip-name-resolve有关。   Flush logs: 关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。 (2)flush logs   关闭当前的二进制日志文件并创建一个新文件,新的二进制日志文件的名字在当前的二进制文件的编号上加1。 (3)flush privileges   这个也是经常使用的,每当重新赋权后,为了以防万一,让新权限立即生效,一般都执行一把,目地是从数据库授权表中重新装载权限到缓存中。 (4)flush tables   关闭所有打开的表,同时该操作将会清空查询缓存中的内容。
    (5)flush tables with read lock   关闭所有打开的表,同时对于所有数据库中的表都加一个读锁,直到显示地执行unlock tables,该操作常常用于数据备份的时候。 (6)flush STATUS   重置大多数状态变量到0。 (7)flush MASTER    删除所有的二进制日志索引文件中的二进制日志文件,重置二进制日志文件的索引文件为空,创建一个新的二进制日志文件,不过这个已经不推荐使用,改成reset master 了。
    (8)flush QUERY CACHE   重整查询缓存,消除其中的碎片,提高性能,但是并不影响查询缓存中现有的数据,这点和Flush table 和Reset Query Cache(将会清空查询缓存的内容)不一样的。 (9)flush slave   类似于重置复制吧,让从数据库忘记主数据库的复制位置,同时也会删除已经下载下来的relay log,与Master一样,已经不推荐使用,改成Reset Slave了。这个也很有用的。   一般来讲,Flush操作都会记录在二进制日志文件中,但是FLUSH LOGS、FLUSH MASTER、FLUSH SLAVE、FLUSH TABLES WITH READ LOCK不会记录,因此上述操作如果记录在二进制日志文件中话,
    会对从数据库造成影响。注意:Reset操作其实扮演的是一个Flush操作的增强版的角色。 (10) references   有了REFERENCES权限,用户就可以将其它表的一个字段作为某一个表的外键约束。 11、 lock tables   必须拥有lock tables权限,才可以使用lock tables   mysql> grant lock tables on ld.* to p1@localhost;   mysql> lock tables a1 read;   mysql> unlock tables;。 12、show view   必须拥有show view权限,才能执行show create view。   mysql> grant show view on ld.* to ld@localhost;   mysql> show create view v_shop; 13、show database   通过show database只能看到你拥有的某些权限的数据库,除非你拥有全局SHOW DATABASES权限。   对于ld@localhost用户来说,没有对mysql数据库的权限,所以以此身份登陆查询时,无法看到mysql数据库:   mysql> show databases; <1>skip_show_database   防止不具有SHOW DATABASES权限的人们使用SHOW DATABASES语句。如果你担心用户能够看见属于其它用户的数据库,这样设置可以提高安全性。其效果取决于SHOW DATABASES权限:如果变量值为ON,只允许具有SHOW DATABASES权限的人们使用SHOW DATABASES 语句,并且该语句将显示所有数据库名。如果值为OFF,允许所有用户执行SHOW DATABASES,但只显示用户具有SHOW DATABASES或其它权限的数据库的名称。 14. excute   查看并执行存在的Functions,Procedures的权限。   mysql> grant execute on ld.* to 'ld'@'192.168.1.1' identified by 'ld';   查看并执行存储过程的权限。例如:执行完这句ld用户就可以查看到ld库中的存储过程名字,但打开啥也没有,也能执行,但是不能修改。   mysql> call pro_shop1(0001,@a);   mysql> select @a; 15、alter routine权限   必须具有alter routine的权限,才可以使用{alter |drop} {procedure|function}   mysql> grant alter routine on ld.* to 'ld'@'%' identified by 'ld';   mysql> drop procedure pro_shop; 16、create routine   创建存储过程或函数。   mysql> grant create routine on zz4.* to 'ld'@'%' identified by 'ld';//赋予权限   mysql> revoke create routine on zz4.* from 'ld'@'%' identified by 'ld';//收回权限   只赋予create routine权限后,修改存储过程,报错   mysql> grant select on ld.* from 'ld'@'192.168.1.1' identified by 'ld';   mysql> grant select routine on ld.* from '*'@'192.168.1.1' identified by 'ld'; 17. create temporary tables   (注意这里是tables,不是table)   必须有create temporary tables的权限,才可以使用create temporary tables.   mysql> grant create temporary tables on ld.* to ‘ld′@’localhost’;   [mysql@mydev ~]$ mysql -h localhost -u ld -p ld   mysql> create temporary table tt1(id int); 18. create view   必须有create view的权限,才可以使用create view   mysql> grant create view on ld.* to ‘ld′@’localhost’;   mysql> create view v_shop as select price from shop; 19. create user   要使用CREATE USER,必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。   mysql> grant create user on *.* to ‘ld′@’localhost’;   或:mysql> grant insert on *.* to ld@localhost; 20. index   必须拥有index权限,才能执行[create |drop] index 21、create权限   数据库、表或索引.   必须有create的权限,才可以使用create table   mysql> grant create on ld.* to ‘ld′@’localhost’; 22、insert权限 23、drop权限 24、delete权限 25、alter 修改表结构、数据库属性、存储过程。 26、update权限、 27、Select权限 查找数据库、表或索引。 mysql> select * from cat; 另外,连接后,查询只显示有权限的库和表和字段,新建的用户默认有Usage权限,和test库的访问权限,可以对它查询,修改,删除等。权限补充:

    【1】proxy user              

    Mysql伪装用户,自从MySQL 5.5 发布第一个版本以来,就在GRANT权限列表里面新增加了一条记录: PROXY。 不要以为这个是以前的MySQL Proxy 哦。其实这个是用来给用户做马甲用的。

    伪装用户方法:

    步骤1:

    mysql> select version();//确保版本是5.5以上

    步骤2:

    mysql> select * from mysql.plugin; //检查是否已经加载test_plugin_server插件,默认5.5和5.6版本的mysql,都没有安装。

    +--------------------+----------------------+

    | name               | dl                   |

    +--------------------+----------------------+

    | test_plugin_server | auth_test_plugin.dll |

    +--------------------+----------------------+

    步骤3:

    //如果没有安装插件,执行这句安装;

    mysql> install plugin test_plugin_server soname 'auth_test_plugin.dll';

    步骤4:

    mysql> create user 'pp_ext'@'%' identified with test_plugin_server as 'pp';

    步骤5:

    mysql> grant proxy on 'pp'@'%' to 'pp_ext'@'%';

    步骤6:

    mysql> flush privileges;

    步骤7:

    退出,用用户名pp_ext密码:pp登陆。

    报错:

    1251-Client does not support authentication protocol requested by server;consider upgrading MySQL client

    @@proxy_user 这个只读变量为NULL。没有伪装成功。得升级客户端版本。我用的是navicat.

    更新完客户端后,查看一下伪装用户的权限

    Mysql>show grants for ‘pp’@’%’;

    操作更正常用户没什么区别。

    <1> proxy_user 

    【2】Mysqlaccess命令

    用户权限检查程序

    【3】mysql_setpermission

     用于管理用户权限信息的交互式perl脚本。

  • 相关阅读:
    153. Find Minimum in Rotated Sorted Array
    228. Summary Ranges
    665. Non-decreasing Array
    661. Image Smoother
    643. Maximum Average Subarray I
    4.7作业
    面向对象编程
    常用模块3
    3.31作业
    常用模块2
  • 原文地址:https://www.cnblogs.com/chengege/p/10394128.html
Copyright © 2011-2022 走看看