在一台测试服务器上部署了2个实例,一个端口是默认的3306,另一个端口是3376。MySQL的版本是5.6.35

[root@MySQL56_L1 ~]# ps -ef | grep mysql | grep -v grep
mysql : pts/ :: /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
mysql : pts/ :: /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3376/my3376.cnf

  my3376.cnf的部分参数配置如下

[root@MySQL56_L1 ~]# more /etc/my.cnf 

[client]
port =
socket = /tmp/mysql.sock # The MySQL server
[mysqld]
# Basic
port =
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3306/data
tmpdir = /data/mysql/mysql3306/tmp
socket = /tmp/mysql.sock

  my3376.cnf的部分参数配置如下

[root@MySQL56_L1 ~]# more /data/mysql/mysql3376/my3376.cnf 

[client]
port =
socket = /tmp/mysql3376.sock # The MySQL server
[mysqld]
# Basic
port =
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql/mysql3376/data
tmpdir = /data/mysql/mysql3376/tmp
socket = /tmp/mysql3376.sock

  两个数据库中的账号及密码如下

(product)root@localhost [(none)]> select host, user, password from mysql.user ;
+-----------+------+----------+
| host | user | password |
+-----------+------+----------+
| localhost | root | |
| 127.0.0.1 | root | |
+-----------+------+----------+

  当使用账号、密码、端口的方式方式登录到端口为3376的实例时,发现登录的却是3306端口的实例下

[root@MySQL56_L1 ~]# mysql  -uroot -p -P3376
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.6.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (product)root@localhost mysql.sock [(none)]>

  请注意上面代码块中的红色加粗字体,这是端口为3306实例的socket文件,3376端口实例使用socket方式登录如下:

[root@MySQL56_L1 ~]# mysql -S /tmp/mysql3376.sock
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.6.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (product)root@localhost mysql3376.sock [(none)]>

  在需要登录到3376端口实例下时,已经明确指定了端口,为什么还是登录到3306端口实例下呢?

  难道是因为没有加上“-h”?

[root@MySQL56_L1 ~]# mysql -hlocalhost -uroot -p -P3376
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.6.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (product)root@localhost mysql.sock [(none)]>

  可以看到,使用“-hlocalhost”是还是登录到3306端口实例下,若是修改为“-h IP”,又会怎么样呢?

[root@MySQL56_L1 ~]# mysql -h127.0.0. -uroot -p -P3376
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is
Server version: 5.6.-log MySQL Community Server (GPL) Copyright (c) , , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. (product)root@127.0.0.1 3376 [(none)]>

  这次就能如愿登录到所期望的3376端口实例下了。

  小结:安装了多实例的情况下,需要登录到特定端口实例下的方法

  1、使用“-S” 参数,通过指定实例下的socket文件来登录到指定的实例

  2、使用“-h”参数,注意,这里必须是使用'TCP/IP'的方式,不能是'localhost',因为'localhost'会使用默认的socket文件登录

  那么,为什么指定了端口“-P3376”,还是会登录到3306端口实例下呢?

  原因是因为没有指定“-h”使用'TCP/IP'方式来登录时,是默认使用socket方式登录,问题又来了,是使用哪个socket文件呢?

[root@MySQL56_L1 ~]# mysql --verbose --help | grep socket
--protocol=name The protocol to use for connection (tcp, socket, pipe,
-S, --socket=name The socket file to use for connection.
The buffer size for TCP/IP and socket communication.
socket /tmp/mysql.sock

  这个文件是在哪里指定呢?

[root@MySQL56_L1 ~]# mysql --verbose --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

  注:以上的4个“my.cnf”后面的参数会覆盖前面的。

  若是产生怀疑,可以试验一下在“~/.my.cnf”中添加如下代码

[root@MySQL56_L1 ~]# vi ~/.my.cnf  

[client]
socket = /tmp/mysql3306.sock

  再查看一下mysql读取的socket文件

[root@MySQL56_L1 ~]# mysql --verbose --help | grep socket
--protocol=name The protocol to use for connection (tcp, socket, pipe,
-S, --socket=name The socket file to use for connection.
The buffer size for TCP/IP and socket communication.
socket /tmp/mysql3306.sock

  从上面的测试就可以看出是读取socket文件的路径

  注意:测试完之后需要改回正确的socket文件名

  看完上面的说明,现在应该能明白为什么为什么指定了“-P 3376”,却登录到了3306端口是实例下了。其实,正确的应该是这个路径“/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf”下的socket参数对应的是哪个端口,就会登录到哪个端口的实例下。

  看完了这么多,可能还是不明白socket是什么?

  socket是用于同一台主机的进程间通讯(IPC),不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另外一个进程,消息既不会丢失也不会顺序错乱。可用于两个没有亲缘关系的进程,是全双工的。

  以上,若有错误,请不吝指出。

MySQL登录之socket与TCP的更多相关文章

  1. 通过Socket实现TCP编程,用户登录之服务器相应客户端,客户端和服务端之间的通信

    服务器端: 1.创建ServerSocket对象,绑定监听端口: 2.通过accept()方法监听客户端请求: 3.建立连接后通过输入流读取客户端发送的请求信息; 4.通过输出流向客户端发送响应信息; ...

  2. MySQL登录报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

    [root@pisphkdcbsql01 mysql3307]# /opt/mysql3307/bin/mysql -upisp -ppisp@ mysql: [Warning] Using a pa ...

  3. 深度解析mysql登录原理

    使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...

  4. Mac mySql ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)的解决办法

    我的环境:Mac 10.11.6 ,mysql  5.7.14  . mac mySql 报错ERROR 2002 (HY000): Can't connect to local MySQL serv ...

  5. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib

    今天在linux里安装mysql,运行时遇到这样的错误 ERROR 2002 (HY000): Can't connect to local MySQL server through socket ' ...

  6. 【MySQL案件】mysql登录-S失败

    1.1.1. mysql登录mysql时间,-S参数失效 [环境的叙述性说明] mysql5.5.14 [问题叙述性说明] 配置多个实例 实例1 实例2 datadir /home/mysql_330 ...

  7. MySQL登录汇总

    --MySQL登录汇总 --------------------2014/5/17 1. ERROR 1045错误ERROR 1045 (28000): Access denied for user ...

  8. mysql unix domain socket and network socket, ssh key

    当主机填写为localhost时mysql会采用 unix domain socket连接 当主机填写为127.0.0.1时mysql会采用tcp方式连接 这是linux套接字网络的特性,win平台不 ...

  9. ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

    有时候,当我们使用"mysql"."mysqladmin"."mysqldump"等命令管理数据库时,服务器抛出类似如下错误: 一.错误现场 ...

随机推荐

  1. c# 委托访问listbox多线程操作

    c# 委托访问listbox多线程操作 using System;using System.Collections.Generic;using System.ComponentModel;using ...

  2. HDU6312 Game(博弈,拿出本数与这个数的除数)

    题意:A和B玩游戏 , 给出1 ~ n 的集合 ,每个人可以拿出一个数 , 这个数的除数也被拿出 , A先开始 , 没有数拿的人就输 , 问A赢不赢 分析:很有意思的一道题目 ///假设2 ~ n A ...

  3. KD树的极简单笔记(待后续更新)

    今天(18.5.4)室友A突然问我算法怎么入门,兴奋之下给他安利了邓公的<数据结构>,然而他接着又问我能不能两周内快速入门,毕竟打算搞Machine Learning,然后掏出手机看了下他 ...

  4. stream4

    import java.util.Comparator; import java.util.function.BinaryOperator; public class BinaryOperatorTe ...

  5. VUE中toast的使用与开发

    在这篇文章中介绍了toast是什么,这篇文章主要介绍toast的开发与使用. 开发 Vuejs很流行,并且官方也给出了路由插件vue-router.数据管理插件vuex,但是我们仅仅停留在了使用的阶段 ...

  6. 【计算机网络】SSL交互和握手过程

    SSL消息按如下顺序发送:  1.Client Hello  客户发送服务器信息,包括它所支持的密码组.密码组中有密码算法和钥匙大小: 2.Server Hello  服务器选择客户和服务器都支持的密 ...

  7. centOS7关闭防火墙的命令

    centOS7下关闭防火墙的命令已经改了,如下:      systemctl stop firewalld

  8. C#(Winform)的Show()和ShowDialog()方法

    1. 显示窗口的两种方式: Winform中的Form,在显示窗口时,可以使用Show()和ShowDialog()两种方式 2. 非模态窗口方式(可以跟其他界面自由切换,而且不阻塞代码) Show( ...

  9. Programmer Competency Matrix--ref--http://sijinjoseph.com/programmer-competency-matrix/

    Note that the knowledge for each level is cumulative; being atlevel n implies that you also know eve ...

  10. jQuery 菜单小练习(实现点击和移动鼠标效果)

    这个代码的练习是点击事件后 如何用jQuery联动的方式找到相关标签 实现的结果是点击菜单一或者菜单二等 会出现相关菜品,并隐藏其他菜品.鼠标移动才菜品上会在右侧框内出现相关菜品的价格.实现特殊的效果 ...