正确远程连接MySQL需显式使用-h指定IP(如mysql -h 192.168.1.100 -P 3306 -u remote_user -p),-h强制走TCP协议,否则默认走本地socket;同时必须确保bind-address=0.0.0.0生效、用户host为'%'或匹配IP、防火墙及云安全组放行3306端口。

mysql 命令加 -h 参数才能连远程
不加 -h 默认走本地 socket,哪怕你写 mysql -u root -p -h 127.0.0.1 也和 mysql -u root -p 行为不同——前者走 TCP,后者走 Unix domain socket。远程连接必须显式指定主机地址。
正确写法:
-
mysql -h 192.168.1.100 -P 3306 -u remote_user -p(-P是大写,端口不是-p) - 输完回车后,命令行会提示
Enter password:,此时再输入密码(不显示、不回显) - 如果服务器改了默认端口(比如 3307),
-P必须带上,否则连不上
连不上时先看是不是被防火墙或安全组拦了
很多情况根本不是 MySQL 配置问题,而是请求压根没到 MySQL 进程。执行以下检查:
- 在服务器上运行
sudo netstat -tlnp | grep :3306,确认输出里有*:3306或0.0.0.0:3306,而不是127.0.0.1:3306 - 用
telnet 192.168.1.100 3306(或nc -zv 192.168.1.100 3306)从客户端测试端口通不通。不通就说明卡在中间层 - 云服务器(如阿里云、腾讯云)必须额外配置「安全组」放行 3306(TCP),仅开放服务器防火墙不够
用户 host 匹配失败是常见静默错误
报错 Access denied for user 'remote_user'@'xxx.xxx.xxx.xxx' 不一定是密码错,大概率是 remote_user 账号的 host 字段不匹配。MySQL 认证时严格比对 user@host 全名。
- 登录服务器本地执行:
mysql -u root -p -e "SELECT user,host FROM mysql.user;" - 确认你要用的账号存在且
host是%或具体 IP(比如'remote_user'@'%') -
'remote_user'@'localhost'和'remote_user'@'%'是两个完全独立的账号,不能混用 - MySQL 8.0+ 默认用
caching_sha2_password插件,某些旧客户端不支持;可临时改用:ALTER USER 'remote_user'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx';
别跳过 FLUSH PRIVILEGES;但重启服务更重要
GRANT 或 CREATE USER 后执行 FLUSH PRIVILEGES; 是保险做法,尤其在 MySQL 5.7 及更早版本中必须。但 8.0+ 多数情况自动生效,真正容易被忽略的是服务重启。
- 改完
my.cnf里的bind-address = 0.0.0.0,必须执行sudo systemctl restart mysqld(或mysql,依发行版而定) - Ubuntu/Debian 系统配置文件常在
/etc/mysql/mysql.conf.d/mysqld.cnf,CentOS 多在/etc/my.cnf,改错位置等于白改 - 改完立刻验证监听状态:
sudo ss -tln | grep :3306,看到*:3306才算真正生效
最常卡住的地方不是密码或 SQL 语句,而是 bind-address 没生效 + 安全组没开 + 用户 host 写成 localhost。三者缺一不可,顺序错了也白搭。


















