MySQL连接类型的localhost与127.0.0.1,IP差异:
localhost和127.0.0.1有什么区别? 也有人说本地ip,据说使用127.0.0.1比localhost更好。 可以减少一次分析。 好像还有人不明白这个入门问题,其实这两个有区别。
NO.1 -普通接说:
localhost也称为local,正确的解释是:本地服务器
127.0.0.1windows等系统上的正确解释是:本地地址(本地服务器)
NO.2:
localhot(local )不通过网卡传输! 这很重要,不受网络防火墙和网卡相关的限制。
127.0.0.1通过网卡传输,取决于网卡,受网络防火墙和网卡的限制。
一般来说,本地服务最好使用localhost。 localhost不解析为ip,不消耗网卡、网络资源。
localhost可能可以,但如果不能是127.0.0.1,就在这里。 在localhost访问的情况下,系统持有的本机的当前用户的权限去访问,但使用ip的情况下,预计与本机通过网络再次访问本机一样,可能与网络用户的权限有关。
no.3 -连接MySQL时的主机类型:
1、对于mysql -h 127.0.0.1,请使用TCP/IP连接,
mysql server认为此连接来自127.0.0.1或' localhost.localdomain '
2、对于MySQL-h本地主机,使用UNIX套接字,而不是TCP/IP连接;
在这种情况下,mysql server认为此客户端来自“localhost”
mysql权限管理的“localhost”有特定的含义。
—— MySQL手册5.6.4 . ahostvaluemaybeahostnameoranipnumber,or ' localhost ' toindicatethelocalhost。
注:虽然两者的连接方法不同,但如果localhost为默认127.0.0.1,则这两种连接方法使用的权限记录为: (因为记录在前面,先匹配)
主机: localhost
user:路由
MySQL连接类型证明: # MySQL-h 127.0.0.1-uroot-pwww.fity.cn # 123
必须指定error2003(hy000 ) : can ' tconnecttomysqlserveron ' 127.0.0.1 ' (111 ) [端口。 相反,你会收到这个错误]
# MySQL-h 127.0.0.1-p 3307-uroot-pwww.fity.cn # 123
MySQL状态;
-----------------
mysqlVer 14.12 Distrib 5.0.95,forredhat-Linux-GNU(I686 ) using readline 5.1
连接id :1599
current数据库:
目前用户: root @ 127.0.0.1
SSL:Not in use
Current pager:stdout
Using outfile: ' '
用户定义器:
服务器版本:5.1.48-logsourcedistribution
协议版本: 10
连接:127.0.0.1 via TCP/IP//请注意此处
服务器恶作剧的约定:latin1
JB恶作剧的约定:latin1
客户端恶作剧的约定:latin1
Conn .淘气的约定:latin1
TCP port: 3307
Uptime: 5 hours 54 min 48 sec
threads :1 questions :5432 slow queries 33601619 opens :72 flush tables :1 open tables :65 queriespersecondavg 3360.255
-----------------
# MySQL-h 192.168.1.246-uroot-pwww.fity.cn # 123
错误2003 (hy 000 ) : Ca
n't connect to MySQL server on '192.168.1.246' (111)[需要指定端口,反之收到这个错误]# mysql -h 192.168.1.246 -P 3307 -u root -pwww.fity.cn#123
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i686) using readline 5.1
Connection id: 1598
Current database:
Current user: root@192.168.1.246
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.48-log Source distribution
Protocol version: 10
Connection: 192.168.1.246 via TCP/IP //注意这里
Server 调皮的诺言: latin1
Db 调皮的诺言: latin1
Client 调皮的诺言: latin1
Conn. 调皮的诺言: latin1
TCP port: 3307
Uptime: 5 hours 53 min 54 sec
Threads: 1 Questions: 5428 Slow queries: 1619 Opens: 72 Flush tables: 1 Open tables: 65 Queries per second avg: 0.255
--------------
# mysql -h localhost -u root -pwww.fity.cn#123[连接OK]
# mysql -h localhost -P 3307 -u root -pwww.fity.cn#123
mysql> status;
--------------
mysql Ver 14.12 Distrib 5.0.95, for redhat-linux-gnu (i686) using readline 5.1
Connection id: 1600
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.1.48-log Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket //注意这里
Server 调皮的诺言: latin1
Db 调皮的诺言: latin1
Client 调皮的诺言: latin1
Conn. 调皮的诺言: latin1
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 5 hours 56 min 18 sec
Threads: 1 Questions: 5436 Slow queries: 1619 Opens: 72 Flush tables: 1 Open tables: 65 Queries per second avg: 0.254
--------------
从这里看以看出,通过通过unix domain socket方式连接mysql时,你不需要特意指定端口,按照mysql官方所说通过unix domain socket方式连接mysql较快于TCP/IP方式。不过,如果通过socket方式连接mysql,当mysql.sock文件不再是默认的名称或存放路径时,你将会收到下面这个错误信息,当然,你可以需要在php代码config中声明一个变量指定unix domain socket路径或者在php.ini配置文件中定义也可。错误信息如下:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
默认情况下我们PHP实例和mysql通信是走TCP/IP的,但如果你加载了socket模块,默认会走sock文件连接,但如果你的linux主机上没有指定默认的socket文件,这样如果你使用mysql_connect连接的话,经常我们使用mysql_connect()或socket方式连接mysql时会收到错误:
No such file or directory、Can’t connect to local MySQL server through socket... ,如图:
然而此时mysql客户端可以正常使用,当然此刻你通过mysqli或pdo方式连接一般情况下也是不会有错误的,所以可以确定不是服务器的问题。
简而言之:主要区别是localhost是通过unix domain socket方式来连接,而127.0.0.1则是走的TCP协议方式连接
这是linux套接字网络的特性,win平台不会有这个问题
php.ini文件中如何定义mysql socket路径:
mysql.default_socket = mysql.sock //绝对路径就可以了
或者你可以在my.cnf文件中把mysql.sock路径指向/tmp/mysql.sock也可以
请注意,如果你指定localhost作为一个主机名,mysqladmin默认使用Unix套接字文件连接,而不是TCP/IP。从 MySQL 4.1开始,通过--protocol= TCP | SOCKET | PIPE | MEMORY}选项,你可以显示地指定连接协议。
Socket简要通信机制与原理说明
根据连接启动的方式以及本地套接字要连接的目标,套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
思考:mysql socket连接是否比TCP/IP方式连接更快?
最后更新于 2013-04-01 12:37:20 并被添加「mysql socket」标签,已有 19640 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
相关文章