文章目录
数据库连接测试
-
设定本地主机A:
IP:192.168.2.63
系统CentOs7
使用工具:telnet、openssl、mysql client等
- 远程mysql数据库服务器B:
IP地址192.168.1.10,
用户名:myname,
密码:mypassword,
数据库名称:mydate。
影响远程数据库连接的因素还是比较多的,数据库服务器的一些配置、用户权限、网络连通、防火墙等。
本文主要介绍对本地网络连接情况排查和在网络连通的情况下怎么进行连接测试。
安装常用工具
大概会使用到ping、netstat、ifconfig、route、curl、traceroute、opensll和mysql client等工具,如果你不确定你用的centos7是否已经有这些工具,没关系,重新安装一次就行。
重新安装,会把已有的工具版本更新至最新版本,执行如下命令:
yum update
yum install -y ping net-tools curl traceroute
yum install -y openssl
yum install mysql-client
测试本地主机与远程数据库服务器网络连接情况
一般来说,我们不需要把所有涉及的网络工具都拿来用一遍,网络连接的测试要根据故障的实际情况逐步的排查:
- 使用ping命令简单测试连通情况
用法:ping ip地址
示例:
#- mysql数据库服务器B的IP地址192.168.1.10,使用如下命令即可
ping 192.168.1.10
如果返回“未发现主机”或“time out"等信息提示,一般就是网络配置,或连接线路有问题:
-
检查网络配置文件,是否正确配置本地IP地址和网关IP地址:
网络配置文件位置:/etc/sysconfig/network-scripts/
如果本地主机有多个网卡,则此文件夹中会有多个配置文件,你需要确定当前使用的网卡名称,才能查看对应的配置文件。
使用如下命令,查看活动网卡:
# ifconfig命令:该命令用于查看和配置网络接口信息,包括IP地址、子网掩码等。 # ifconfig eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.2.63 netmask 255.255.255.0 broadcast 192.168.2.255 inet6 fe80::38cc:83c9:a24a:c634 prefixlen 64 scopeid 0x20<link> ether 28:8d:23:ff:7c:f5 txqueuelen 1000 (Ethernet) RX packets 1582080 bytes 738700111 (698.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1492542 bytes 341527506 (325.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 17 eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 21:80:2e:af:7c:f6 txqueuelen 1000 (Ethernet) RX packets 5973 bytes 1430598 (1.3 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 # 如上显示,很容易对比出,当前在用的网卡名称为:eno1
那么,我们就可以去查看对应的配置文件内容,以了解更多信息了:
# cd /etc/sysconfig/network-scripts/
#
# cat ifcfg-eno1
#
# ifcfg-eno1就是en01网卡对应的配置文件
# 内容如下:
#
TYPE=Ethernet # 定义网络类型为以太网
PROXY_METHOD=none # 定义代理方式为无代理
BROWSER_ONLY=no # 定义浏览器是否只使用网络功能,no表示不只使用浏览器功能
BOOTPROTO=static # 定义启动协议为静态
DEFROUTE=yes # 定义默认路由为yes,即启用默认路由
IPV4_FAILURE_FATAL=no # 定义是否对IPv4的连接失败采取致命性措施,no表示不致命
IPV6INIT=yes # 定义是否初始化IPv6,yes表示初始化
IPV6_AUTOCONF=yes # 定义IPv6是否自动配置,yes表示自动配置
IPV6_DEFROUTE=yes # 定义IPv6默认路由为yes,即启用默认路由
IPV6_FAILURE_FATAL=no # 定义是否对IPv6的连接失败采取致命性措施,no表示不致命
IPV6_ADDR_GEN_MODE=stable-privacy # 定义IPv6的地址生成模式为稳定隐私模式
NAME=eno1 # 定义设备名称为eno1
UUID=11c42907-7faf-4cdf-8cd4-608d1f01acd0 # 定义设备的UUID(Universally Unique Identifier)
DEVICE=eno1 # 定义设备名称为eno1
ONBOOT=yes # 定义是否在启动时启用设备,yes表示启用
IPADDR=192.168.2.63 # 定义IPv4地址为10.10.0.69
NETMASK=255.255.255.0 # 定义IPv4的子网掩码为255.255.255.0,即C类私网地址
GATEWAY=192.168.2.254 # 定义IPv4的网关为10.10.0.254,即通往外部网络的重要通道
DNS1=172.16.100.4 # 定义DNS服务器1为172.16.100.4,一般为公司内部DNS服务器或私有DNS服务器
DNS2=8.8.8.8 # 定义DNS服务器2为8.8.8.8,一般为Google提供的公开DNS服务器
根据本地网络情况配置,无误后重新加载配置,基本上可以解决大部分网络连接问题,
现在再使用ping命令查看,如果还有问题,那么大概存在两种情况:
- mysql服务器禁ping了
- 物理链路可能有故障
可以很熟悉网络拓扑的话,可以用ping命令逐段查看情况,直至找到故障链路为止。
当然也有可能是其他原因:比如:默认路由有问题、本地安全策列等
这里不再过多展开,仅提供几个常用工具:
- route命令:该命令用于查看和配置路由信息,包括默认网关等。
route -n
- netstat命令:该命令用于查看网络连接状态、路由表等信息。
netstat -rn
- hostname命令:该命令用于查看主机名。
hostname
- traceroute命令:系统将根据路由路径逐跳地跟踪到目标网关的路径,并显示每个跃点的IP地址和延迟信息。
traceroute 网关IP地址
网络故障多种多样,往往是某处不起眼的配置错误,就会造成通信失败,难以全述,只能根据经验反复检查确认。
网络确认正常后,我们就可以连接数据库了
连接远程mysql数据库
远程mysql数据库服务器B的一些基本信息,是必须知道的:
-
IP地址192.168.1.10,
-
用户名:myname,
-
密码:mypassword,
-
数据库名称:mydate。
方法一:使用命令telnet、openssl和mysql client连接
示例:telnet
# telnet 192.168.1.10 3306
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
N
5.6.16-logbQKIka$/]g!oy1'nt~>X"<Jmysql_native_password
# 连接成功,提示输入密码,等待几秒后会自动退出连接。
示例:openssl
# openssl s_client -connect 192.168.1.10:3306
CONNECTED(00000003)
139881324279696:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 289 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1693907898
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
这是连接失败的返回:
服务器在 SSL/TLS 握手过程中返回了 “unknown protocol”,这通常意味着服务器不支持与客户端通信所使用的 SSL/TLS 协议版本。远程 MySQL 服务器可能没有配置SSL 连接。
也有可能服务器不支持客户端使用的 SSL/TLS 协议版本。服务器支持的是其他版本的 SSL/TLS 协议,或者需要特定的配置才能支持 SSL 连接。
示例:mysql clinent
# mysql -h 192.168.1.10 -u myname -p mypassword
Enter password: #连接成功提示输入密码
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1212219
Server version: 5.6.16-log Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [hongheweisheng]> Ctrl-C -- exit! #正确输入密码后,进入MySQL交互模式,这里按Ctrl+c退出了
Aborted
上述,应该是正常的情况。
但我在实际操作的时候-p参数后跟随密码是不行的,得换成数据库名称”mydate"才能正常连接,不知道是我本地主机问题还是远程mysql数据库服务器做了什么特别的配置。
mysql我不是很熟……暂时也没看去查看错误提示代码的空闲。
以下是我实际操作时的记录,仅供参考,如果你也遇到相关问题,可以按我的过程尝试一下,如果有大神看到请给我解解惑:
# mysql -h 192.168.1.10 -u myname -p mypassword
Enter password:
ERROR 1044 (42000): Access denied for user 'myname'@'%' to database 'mypassword'
# mysql -h 192.168.1.10 -u myname -p mydate
Enter password:
ERROR 1045 (28000): Access denied for user 'myname'@'39.130.xx.186' (using password: YES)
#好像输错密码了,39.130.xx.186 是我的外网nat地址,再来
# mysql -h 192.168.1.10 -u myname -p mydate
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
^C
# 远程服务器卡住了,ctrl+c后再来
# 这次-p后我什么都没加
# mysql -h 192.168.1.10 -u myname -p
Enter password:
ERROR 1045 (28000): Access denied for user 'myname'@'39.130.xx.186' (using password: YES)
# 好像还是密码问题,继续
#
# mysql -h 192.168.1.10 -u myname -p mydate
Enter password:
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 1451126
Server version: 5.6.16-log Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [hongheweisheng]> select tablename from table; # 胡乱输了一个指令,不记得查表名的语句了。
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table' at line 1
MySQL [hongheweisheng]> exit # 输入exit退出
Bye
备注:示例openssl返回日志解释
这段信息是示例openssl中 SSL/TLS 连接失败的详细日志。以下是每行的解释:
CONNECTED(00000003)
: 这个消息表示已经开始与远程服务器的连接,并且已经进行了三个握手阶段。139881324279696:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794:
: 这个错误消息表示在尝试与服务器进行 SSL/TLS 握手时发生了错误。具体来说,问题出现在尝试获取服务器 hello 消息时,服务器发送了一个未知的协议。--- no peer certificate available ---
: 这个消息表示在连接过程中没有收到服务器证书。No client certificate CA names sent
: 这个消息表示在连接过程中没有发送任何客户端证书的 CA 名称。--- SSL handshake has read 7 bytes and written 289 bytes ---
: 这个消息表示在 SSL/TLS 握手过程中,读取了 7 字节的数据,写入了 289 字节的数据。New, (NONE), Cipher is (NONE)
: 这个消息表示在握手过程中使用了新的加密套件,但是没有成功地协商任何加密算法。Secure Renegotiation IS NOT supported
: 这个消息表示服务器不支持安全重新协商。Compression: NONE Expansion: NONE
: 这个消息表示在连接过程中没有使用压缩或扩展。No ALPN negotiated
: 这个消息表示在连接过程中没有进行 ALPN 协商。SSL-Session
: 这个消息表示下面是关于 SSL/TLS 会话的详细信息。Protocol : TLSv1.2 Cipher : 0000 Session-ID : Session-ID-ctx : Master-Key : Key-Arg : None Krb5 Principal : None PSK identity : None PSK identity hint : None Start Time : 1693907898 Timeout : 300 (sec) Verify return code : 0 (ok)
: 这些消息提供了关于 SSL/TLS 会话的详细信息,包括使用的协议、加密套件、会话 ID、主密钥、krb5 主要身份、PSK 身份、PSK 身份提示、会话开始时间和验证返回代码等。---
: 这个消息表示日志的结束。
总的来说,这个日志显示了一个不成功的 SSL/TLS 连接尝试,原因是服务器发送了一个未知的协议。
方法二:使用脚本测试
以python为例:
import mysql.connector
# 连接数据库
cnx = mysql.connector.connect(
host=[hostname],
user=[username],
password=[password],
database=[datename]
)
if cnx is not None:
print("数据库连接成功")
# 关闭数据库连接
mydb.close()
else:
print("数据库连接失败")
在上述代码中,把[hostname],[username],[password],[datename]修改成对应的信息
ort mysql.connector