Mysql分为服务端和客户端,服务端运行的是Mysqld进程,mysqld是用来管理数据库和表的进程。另外还有客户端的工具,客户端工具可以通过网络与服务端链接起来。客户端的工具会发出查询,mysqld进程对用户发出的指令进行预处理,处理完之后将数据库的内容再通过网络返回给客户端。

 

还有一种是非客户端的程序,这些程序有一些是修复程序,由于不支持网络协议仅仅只允许在服务端。如myisamchk只能在本地运行,对数据库查看和修复的工具。所以这种工具不能通过网络只能在本地运行的程序。

 MySQL的客户端、服务器的连接协议

 

所以mysql由三部分组成,服务端,客户端和本地程序组成。

 MySQL的客户端、服务器的连接协议

 

Mysql还提供了跨平台的交互式查询方式,如Windows的主机去查询Linux上的数据,或者Linux的客户端查看Windows服务端的数据。

 

Mysql通讯的协议,mysql的客户端和服务端要进行通讯要通过供协议。

 

 MySQL的客户端、服务器的连接协议

可以看到tcp/ip支持的网络协议无论是Linux还是Windows都支持,即可以本地链接也可以远程链接。上面就是网络的几种模式。

 

一个web服务器,一个客户端,客户端发出查询到网页的时候,web服务器就会去数据库进行查询。会去找mysqld进程。这种模型只能通过tcp/ip协议来实现。

还有一种情况就是web服务mysql在同一台服务器上,这种场景可以避免使用tcp/ip的网络,使用tcp/ip可能会受到黑客的攻击,那么这种只能通过客户端对自己的某个嵌套字进行衔接,以本地文件进行衔接。用户通过tcp/ip协议链接到服务器,对端口进行攻击,但是链接不进来,因为没有tcp/ip的端口的一个开放,只采用文件方式进行访问。

 MySQL的客户端、服务器的连接协议

 

在centos下面已经安装好了mysql服务端。

(1)首先通过 mysqld service start 将服务端的进程启动起来。

(2)之后通过 mysql -u root登入到数据库

(3)这样是root没有密码直接登入,很危险通过mysqladmin这个工具来修改密码。

Mysqladmin -u root password ‘密码’

(4)输入密码之后重新登入 通过mysql -u root -p密码就可以登入到数据库了。

 

开始查看网络

[[email protected] lu]# netstat -tpln

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1400/dnsmasq        

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      940/sshd            

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      932/cupsd           

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1403/master         

tcp6       0      0 :::3306                 :::*                    LISTEN      6039/mysqld         

tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           

tcp6       0      0 :::22                   :::*                    LISTEN      940/sshd            

tcp6       0      0 ::1:631                 :::*                    LISTEN      932/cupsd           

tcp6       0      0 ::1:25                  :::*                    LISTEN      1403/master   

  

 

tcp6       0      0 :::3306                 :::*                    LISTEN      6039/mysqld

可以看到mysqld监听在3306这个端口。

通过下面语句可以连接到服务端。

[[email protected] lu]# mysql -u root -p123456 -h127.0.0.1  这个方式就是通过tcp/ip的方式进行链接的。

 

 

通过vim /tec/my.cnf可以将自己的选项加进去,这个my.cnfmysql的配置文件。是对mysqld进程启动的控制。

 

 

通过 [[email protected] lu]# which mysqld

/usr/sbin/mysqld

可以得到mysqld所在位置

再通过[[email protected] lu]# /usr/sbin/mysqld --help --verbose

可以查看到mysql启动时候的参数。

server-id-bits                                             32

show-old-temporals                                         FALSE

show-slave-auth-info                                       FALSE

simplified-binlog-gtid-recovery                            FALSE

skip-grant-tables                                          FALSE

skip-name-resolve                                          FALSE

skip-networking                                            FALSE

skip-show-database                                         FALSE

skip-slave-start                                           FALSE

slave-allow-batching                                       FALSE

 

可以看到skip-networking这个选项是关闭的。

vim /etc/my.cnf编辑mysql的配置文件

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

Skip-networking  加上跳过tcp/ip网络

 

之后关闭mysql服务之后再重启。最后netstat -tpln查看

[[email protected] lu]# netstat -tpln

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           

tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1400/dnsmasq        

tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      940/sshd            

tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      932/cupsd           

tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1403/master         

tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           

tcp6       0      0 :::22                   :::*                    LISTEN      940/sshd            

tcp6       0      0 ::1:631                 :::*                    LISTEN      932/cupsd           

tcp6       0      0 ::1:25                  :::*                    LISTEN      1403/master  

 

发现没有mysqld开启的监听端口。再尝试登入[[email protected] lu]# mysql -uroot -p123456 -h127.0.0.1

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

会发现无法连接到。因为没有开辟监听的端口。所以mysql是通过协议的方式来访问。

 

 

现在没有开启网络可以通过其他方式衔接。

[[email protected] lu]# mysql -uroot -p123456

这样可以连接到mysql,这是什么原因。

[[email protected] lu]# ps aux | grep mysqld  --查看进程,观察mysqld如何运行的

mysql     15246  0.0  0.0 113256  1584 ?        Ss   10:01   0:00 /bin/sh /usr/bin/mysqld_safe --basedir=/usr

mysql     15425  0.0  6.0 958992 113120 ?       Sl   10:01   0:01 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock

root      16319  0.0  0.0 112664   972 pts/0    R+   10:46   0:00 grep --color=auto mysqld

 

这里有一个选项--socket=/var/lib/mysql/mysql.socksocket嵌套字这里有一个插口,等着另外一个插座的连接。如果客户端也是连接在相同的插座上,那么就可以连到对应的主机。

由于服务器监听的是这个文件即socket嵌套字,那么连接的时候也是连接到该嵌套字。

用这句话连接mysql

[[email protected] lu]# mysql -uroot -p123456 --socket=/var/lib/mysql/mysql.sock

发现连接成功。

 

[[email protected] lu]# mysql -uroot -p123456 --socket=/var/lib/mysql/mysqhhhl.sock

Warning: Using a password on the command line interface can be insecure.

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

如果socket文件写错会发现报错,无法连接到本地的mysql通过嵌套字。

 

[[email protected] lu]# ls -l /var/lib/mysql/mysql.sock

srwxrwxrwx. 1 mysql mysql 0 9月  26 10:01 /var/lib/mysql/mysql.sock

查看可以得到mysql.sock这个文件类型是以s打头的,是Linux特殊文件socket文件。只能通过本地文件存取。

 

 

使用mysql可以通过网络协议tcp,或者通过socket嵌套字进行衔接。如果web服务器和mysql服务是同一台主机,关闭网络会更加安全。如果是分层结构,web服务是一层,mysql服务是一层即不在同一台机器上面。那么tcp/ip网络必须开启。否者无法让主机连接。

 

相关文章: