← 返回错误码列表

MySQL错误码 2003 分析与解决方案

错误信息

Error 2003

无法连接到MySQL服务器。检查主机和端口。

你的PHP应用在使用PDO连接MySQL时遇到了网络连接问题:

'pdo_code' => 'HY000',
'db_code' => 2003,
'db_error' => 'Can\'t connect to MySQL server on \'host\' (10061)'

解决方案

  • 检查MySQL服务是否正在运行
  • 验证网络连接和防火墙设置
  • 确认MySQL服务器的主机名和端口
  • 检查DNS解析是否正确
  • 验证MySQL用户权限和连接限制
  • 调整连接超时设置

PHP连接配置示例

// 基本TCP/IP连接配置
$host = 'localhost'; // 或具体的IP地址
$port = 3306;
$dbname = 'your_database';
$charset = 'utf8mb4';

$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset={$charset}";
$options = [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
  PDO::ATTR_EMULATE_PREPARES => false,
  PDO::ATTR_TIMEOUT => 30, // 连接超时时间(秒)
  PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
];

try {
  $pdo = new PDO($dsn, 'username', 'password', $options);
  echo "连接成功!";
} catch (PDOException $e) {
  echo "连接失败: " . $e->getMessage();
  // 检查错误码是否为2003
  if ($e->getCode() == '2003') {
    // 网络连接问题,尝试诊断
    echo "
网络连接问题,请检查:"
;
    echo "
- MySQL服务是否运行"
;
    echo "
- 防火墙设置"
;
    echo "
- 主机名解析"
;
    echo "
- 端口是否开放"
;
  }
}

网络连接问题模拟

MySQL服务器 (3306)
Error 2003
防火墙
10061
PHP应用

连接失败:无法连接到MySQL服务器,网络连接被拒绝

排查步骤

1 检查MySQL服务状态

# Linux/Mac
systemctl status mysql
# 或
service mysql status
# 启动服务
systemctl start mysql

# Windows
net start mysql

2 检查网络连通性

# 测试端口连通性
telnet 服务器IP 3306
# 或
nc -zv 服务器IP 3306

# 检查DNS解析
nslookup mysql-server-hostname
# 或
ping mysql-server-hostname

3 检查防火墙设置

# Linux 防火墙检查
ufw status
# 或
iptables -L -n

# 开放MySQL端口
ufw allow 3306/tcp
# 或
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

调试工具

MySQL配置检查

# 查看MySQL绑定地址
SHOW VARIABLES LIKE 'bind_address';

# 查看最大连接数
SHOW VARIABLES LIKE 'max_connections';

# 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';

网络诊断命令

# 查看端口监听状态
netstat -tuln | grep 3306
# 或
ss -tuln | grep 3306

# 查看连接追踪
netstat -an | grep :3306
# 或
lsof -i :3306

常见问题原因

  • MySQL服务未启动或已停止
  • 防火墙阻止了3306端口的连接
  • MySQL绑定到127.0.0.1而不是0.0.0.0
  • DNS解析失败或主机名错误
  • 网络路由问题或中间设备阻挡
  • 连接数达到最大限制
  • 连接超时设置过短