目录
MySQL登录方式:
1、通过tcp/ip网络协议连接数据库(该方式最常用)
(1)
mysql -u root -P 5508 -h 127.0.0.1 -p
图中可以看到:
Current user: root@localhost
Connection: 127.0.0.1 via TCP/IP
TCP port: 5508
如此可知,本次连接是root用户通过127.0.0.1:5508进行登录的。
(2)
mysql -u root -P 5508 -h 192.168.199.128 -p
图中信息:
Current user: root@opengauss
Connection: 192.168.199.128 via TCP/IP
TCP port: 5508
如此可知,本次连接是root用户通过192.168.199.128:5508进行登录的。
2、通过UNIX socket连接
2.1、使用socket登录
(1)不指定socket位置
mysql -u root -P 5508 -h localhost -p
图中信息:
Current user: root@localhost
Connection: Localhost via UNIX socket
UNIX socket: /tmp/mysql.sock
如此可知,本次的Connection信息为:Localhost via UNIX socket,而非ip:port的方式登录的。
因此,当使用-h localhost登录MySQL的时候,实际上走的是本地socket,不走网络传输。
即 mysql -u root -P 5508 -h localhost -p 等效 mysql -uroot -ptest,其中socket是走的缺省值/tmp/mysql.sock,因此,如果你修改了MySQL监听的socket的目录或者是手动将/tmp/mysql.sock文件删除,那么此时采用此种方式连接将会失败。
手动删除了socket文件,那么将无法使用socket连接数据库。
如果需要自定义MySQL监听socket的位置,该怎么做呢?
可以在配置文件my.cnf中添加socket参数来指定监听位置。然后重启数据库,每次重启数据库,MySQL回去更新这个socket文件,所以及时你不小心删除了socket文件,也还可以通过重启数据库的方式来重新生成新的socket。
(2)指定socket位置
这里我在配置文件my.cnf的mysqld_safe模块中添加了socket=/tmp/mysql57/sql.sock参数指定新的socket位置。所以如果要用socket 连接数据库就必须指定socket,否则MySQL就会按缺省值处理,去默认值位置找,导致socket方式登录失败。
mysql -S /tmp/mysql57/sql.sock -uroot -ptest
图中信息:
Current user: root@localhost
Connection: Localhost via UNIX socket
UNIX socket: /tmp/mysql57/sql.sock
可以看到,本次连接是socket方式,此外UNIX socket的信息为/tmp/mysql57/sql.sock,与我们设置的socket参数一致。
从上面的实践可知,登录MySQL时,如果明确指定的是ip:port登录那么就会走网络,如果指定localhost或者不指定host或者socket,那么就通过socket连接。当然,MySQL还有其他方式登录,暂时没有学习,就先不探讨了。
socket相关介绍可参考此文:Unix Domain Socket与PostgreSQL的local连接 - 简书 (jianshu.com)
MySQL命令行参数示例:
mysql -uroot -ptest -h127.0.0.1 -P5508 -D sys
-u用户名
-p(小写)密码
-P(大写)端口
-h MySQL服务器ip
-D 指定登录的数据库名
查询当前所在数据库:
select database();
2.2、关于socket更多的认识
在前面介绍了使用socket登录数据库的方法,但是可以看到,在使用socket登录,我们都指定了用户以及密码。那既然都考虑本地socket了,为什么不可以省略用户密码呢,直接使用如:mysql -S /tmp/mysq.sock的方式登录?接下来就实际操作一下。
一种方式是将用户密码写到文件里面,这样在登录的时候则自动使用文件里的用户进行socket连接。(这种方法先就不讨论了)
另一种是修改使用socket登录的账户的登录插件为auth_socket,下面就来学习一下该方式的用法。
(1)操作系统中创建一个用户,该用户名需要与想用socket连接数据库的用户名相同。用户创建后,需要将mysql加入到新用户的环境变量中。
(2)在配置文件中加入参数plugin-load-add=auth_socket.so(如果你是用mysqld程序启动数据库,那就配置到mysqld模块中;如果你是用mysqld_safe启动数据库的,那就配置到mysqld_safe的模块中,我这里就是用的mysqld_safe启动的数据库)
(3)重启数据库服务
(4)登录数据库,然后安装auth_socket插件
use mysql;
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
SELECT PLUGIN_NAME, PLUGIN_STATUS
FROM INFORMATION_SCHEMA.PLUGINS
WHERE PLUGIN_NAME LIKE '%socket%';
(5)创建需要用socket登录的用户。(实际上,mysql中的任何用户都可以用socket连接。只是说,不需要指定用户名和密码的情况下才需要这样做。)
#这种是把已有用户的验证方式改成auth_socket
ALTER USER 'root'@'%' IDENTIFIED WITH auth_socket AS 'test';
#这种创建新用户,新用户的验证方式为socket
CREATE USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket;
ALTER USER 'valerie'@'localhost' IDENTIFIED WITH auth_socket AS 'stephanie';
(6)新建一个会话窗口,使用新用户登录操作系统。(在已有窗口中使用su 用户名的方式不会默认使用切过去的那个用户去连数据库)
(7)在新的会话窗口中使用socket登录
mysql -S /tmp/mysql.sock
注意点:
a.验证方式为auth_socket插件的用户,只能使用socket连接本地数据库
b.验证方式为auth_socket插件的用户,不需要密码登录,即使你输入的密码是错误的,也能正常登录(因为它不会去验证密码)
c.mysql中的socket与postgresql的socket不同。在mysql中,用socket连接数据库的用户不是必须存在于操作系统中,只要用户存在于mysql中,那就可以用socket连接(要使用socket免密登录数据库的用户验证方式必须是auth_socket)。在postgresql中,不需要额外配置,使用默认配置即可使用socket连接,但是用于socket连接的用户必须同时存在于操作系统和数据库中。
postgresql数据库关于socket登录的内容: