Mysql分为服务端和客户端,服务端运行的是Mysqld进程,mysqld是用来管理数据库和表的进程。另外还有客户端的工具,客户端工具可以通过网络与服务端链接起来。客户端的工具会发出查询,mysqld进程对用户发出的指令进行预处理,处理完之后将数据库的内容再通过网络返回给客户端。
还有一种是非客户端的程序,这些程序有一些是修复程序,由于不支持网络协议仅仅只允许在服务端。如myisamchk只能在本地运行,对数据库查看和修复的工具。所以这种工具不能通过网络只能在本地运行的程序。
所以mysql由三部分组成,服务端,客户端和本地程序组成。
Mysql还提供了跨平台的交互式查询方式,如Windows的主机去查询Linux上的数据,或者Linux的客户端查看Windows服务端的数据。
Mysql通讯的协议,mysql的客户端和服务端要进行通讯要通过供协议。
可以看到tcp/ip支持的网络协议无论是Linux还是Windows都支持,即可以本地链接也可以远程链接。上面就是网络的几种模式。
一个web服务器,一个客户端,客户端发出查询到网页的时候,web服务器就会去数据库进行查询。会去找mysqld进程。这种模型只能通过tcp/ip协议来实现。
还有一种情况就是web服务mysql在同一台服务器上,这种场景可以避免使用tcp/ip的网络,使用tcp/ip可能会受到黑客的攻击,那么这种只能通过客户端对自己的某个嵌套字进行衔接,以本地文件进行衔接。用户通过tcp/ip协议链接到服务器,对端口进行攻击,但是链接不进来,因为没有tcp/ip的端口的一个开放,只采用文件方式进行访问。
在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.cnf是mysql的配置文件。是对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.sock,socket嵌套字这里有一个插口,等着另外一个插座的连接。如果客户端也是连接在相同的插座上,那么就可以连到对应的主机。
由于服务器监听的是这个文件即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网络必须开启。否者无法让主机连接。