mysql服务已经启动但是无法进行连接(can't connect to mysql 1055)

windows服务器下,mysql运行一段时间之后忽然无法连接,但是mysql服务启动正常,连接时报错:
can't connect to mysql server on 'localhost' (10055)
网上搜索了很久,最终确定原因为:
Win32 error code 10055: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作

出现这种情况我认为重启服务器可以解决,但是治标不治本,一段时间之后仍然会出现此问题。

此问题不是mysql应用程序的问题而是windows server system 的配置问题。因此需要修改windows server system的配置。
具体办法为修改windows 注册表:
有两个相关值,一是修改MaxUserPort(最大连接数);另一个是修改TcpTimedWaitDelay(TCP/IP 可释放已关闭连接并重用其资源前,必须经过的时间)
据我的经验推断修改MaxUserPort为最佳。
注册表位置如下,如果没有此项,需要手动添加
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
Value Name: MaxUserPort
Value Type: DWORD
Value data: 65534(十进制)

参考并感谢以下博主:
http://www.myexception.cn/mysql/288628.html
http://www.cnblogs.com/tianzhiliang/articles/2400176.html
http://www.111cn.net/database/mysql/37700.htm
https://talk.plesk.com/threads/cant-connect-to-mysql-server-on-localhost-10055.263061/
### 解决方案 当遇到 `Can't connect to MySQL server on 'localhost:3306'` 的错误时,通常是因为服务未正常启动、网络配置问题者权限设置不正确等原因引起的。以下是针对该问题的具体分析和解决方案。 #### 1. 验证MySQL服务状态 确认MySQL服务是否已成功启动。可以通过以下命令检查服务状态: ```bash netstat -an | find "3306" ``` 如果端口3306未被监听,则说明MySQL服务可能未正常启动。此时可以尝试重新启动服务[^3]: ```bash net stop mysql net start mysql ``` #### 2. 检查防火墙设置 确保本地防火墙未阻止MySQL的默认端口(3306)。可以在Windows防火墙中添加入站规则允许TCP流量通过3306端口[^2]。 #### 3. 修改my.ini文件中的绑定地址 打开MySQL安装目录下的`my.ini`文件,查找并修改如下参数以支持本地访问: ```ini bind-address=127.0.0.1 port=3306 ``` 保存更改后重启MySQL服务[^1]。 #### 4. 处理密码登录失败的情况 如果MySQL服务已经启动但仍无法使用root账户登录,可能是由于密码丢失配置不当引起。按照以下步骤重置root密码: - 停止当前正在运行的服务: ```bash net stop mysql ``` - 使用跳过授权表的方式启动MySQL实例: ```bash mysqld --skip-grant-tables ``` - 打开新的CMD窗口,无需输入密码直接进入MySQL客户端: ```sql use mysql; update user set authentication_string=password('新密码') where User='root'; flush privileges; exit; ``` 注意:从8.0版本起推荐改用`ALTER USER`语句替代上述更新操作: ```sql alter user 'root'@'localhost' identified by '新密码'; ``` 完成以上步骤后再退出并按常规方式测试连接即可。 --- ### 提供一段Python脚本用于自动化检测和服务恢复功能 下面是一个简单的Python程序用来验证数据库连通性和自动修复部分常见问题。 ```python import pymysql from subprocess import call def check_mysql_connection(host, port, username, password): try: connection = pymysql.connect( host=host, port=int(port), user=username, passwd=password ) print("Connection successful!") connection.close() except Exception as e: handle_error(e) def restart_service(): result = call(["net", "stop", "mysql"]) if result != 0: raise RuntimeError("Failed stopping service.") result = call(["net", "start", "mysql"]) if result != 0: raise RuntimeError("Failed starting service.") def handle_error(error_message): if str(error_message).find("(2003)") >= 0: print("Attempting to restart the MySQL service...") try: restart_service() print("Service restarted successfully! Please retry your operation.") except Exception as ex: print(f"Error during service management:{ex}") else: print(f"Unhandled exception occurred: {error_message}") if __name__ == "__main__": HOSTNAME = "127.0.0.1" PORT = "3306" USERNAME = "root" PASSWORD = "" # Set appropriate value here check_mysql_connection(HOSTNAME,PORT,USERNAME,PASSWORD) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值