1.版本
1)操作系统
cat /etc/issue
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Kernel \r on an \m
cat /proc/version
Linux version 2.6.32-504.el6.x86_64 ([email protected]) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) ) #1 SMP Wed
2)mysql数据库版本
mysql --version
mysql Ver 14.14 Distrib 5.6.27, for Linux (x86_64) using EditLine wrapper
2.问题描述
今天测试跟我反映,他们有一套测试库,别人登录不上,而且他发现该套库所在的主机上3306端口并未被监控。
3.问题排查
一开始我怀疑是不是配置的不是默认端口
1)查看mysqld进程
ps -ef|grep mysqld root 21304 9809 0 14:32 pts/1 00:00:00 /bin/sh /usr/bin/mysqld_safe --defaults-file=/etc/my3306.cnf mysql 21784 21304 0 14:32 pts/1 00:00:02 /usr/sbin/mysqld --defaults-file=/etc/my3306.cnf --basedir=/usr --datadir=/data/mysql/mysql3306/data --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --log-error=/data/mysql/mysql3306/log/error3306.log --open-files-limit=10240 --pid-file=/data/mysql/mysql3306/data/3306.pid --socket=/tmp/3306.sock --port=3306 root 22888 9997 0 14:58 pts/2 00:00:00 grep mysqld##我们可以看到mysqld进程是存在的,而且配置文件中写的也是3306端口
2)查看配置文件
[mysqld] #socket-datafile socket =/tmp/3306.sock port = 3306 basedir=/usr##我们看到配置文件中也确实写的是3306端口
3)检查3306端口是否被监听
# netstat -lanp|grep 3306 unix 2 [ ACC ] STREAM LISTENING 2788738 21784/mysqld /tmp/3306.sock # netstat -naop | grep 3306 unix 2 [ ACC ] STREAM LISTENING 2788738 21784/mysqld /tmp/3306.sock正常情况下监听3306端口应该输出如下:
netstat -lanp|grep 3306 tcp 0 0 127.0.0.1:28226 127.0.0.1:3306 TIME_WAIT - tcp 0 0 :::3306 :::* LISTEN 24736/mysqld unix 2 [ ACC ] STREAM LISTENING 2796207 24736/mysqld /tmp/3306.sock netstat -naop | grep 3306 tcp 0 0 :::3306 :::* LISTEN 24736/mysqld off (0.00/0/0) unix 2 [ ACC ] STREAM LISTENING 2796207 24736/mysqld /tmp/3306.sock
mysql -uroot -p -h127.0.0.1 -P3306 Enter password: ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)##可以看到 我在本地通过127.0.0.1回环地址登录数据库时候报错
通过socket文件登录成功mysql -uroot -p -S /tmp/3306.sock
5)查看 port参数
mysql> show variables like 'port'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | port | 0 | +---------------+-------+ 1 row in set (0.00 sec)##注意果然 端口居然变成了0
6)查看err错误日志
<span style="color:#333333;">Version: '5.6.27-log' socket: '/tmp/mysql3306.sock' </span><span style="color:#ff0000;">port: 0 </span><span style="color:#333333;"> Source distribution</span>##这是mysql启动最后的输出日志,正常情况下port处应该指定的是3306(因为我cnf文件中指定的就是3306)
4.解决方案
因为在本地通过socket方案数据库是能够正常登陆的,但是通过网络来登录数据库就报错,这时我们会想到一个参数skip-networking
1)查看skip-networking参数
mysql> show variables like 'skip_networking'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | skip_networking | ON | +-----------------+-------+##果然设置了 skip-networking参数,这个就是导致mysql监听的端口变成0,并且通过网络无法登录数据库的主要原因了
2)查看cnf文件中是否有skip-networking参数
skip-networking innodb_log_file_size=64M innodb_log_files_in_group=3##我们看到cnf文件中确实配置了 skip-networking参数
3)注释掉skip-networking参数后重启实例,问题解决