MySQL 8.0远程连接需同步解除四层封锁:①将bind-address设为0.0.0.0并重启服务;②用CREATE USER指定mysql_native_password插件创建用户并授权;③开放本地防火墙及云安全组3306端口;④客户端显式指定认证插件。
刚装好的 MySQL 8.0 默认完全禁止远程连接,不是“没开权限”,而是从监听地址、用户 host、认证插件、防火墙四层全部堵死——必须同步解四道锁,缺一不可。
MySQL 进程默认只监听 127.0.0.1:3306,外部请求根本到不了服务端。光改用户权限没用。
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu/Debian)或 /etc/my.cnf(CentOS/RHEL),Windows 是 C:ProgramDataMySQLMySQL Server 8.0my.ini
[mysqld] 段下找到 bind-address = 127.0.0.1,改为 bind-address = 0.0.0.0 或直接注释掉整行sudo systemctl restart mysql(Ubuntu)或 net stop mysql80 && net start mysql80(Windows)ss -tlnp | grep :3306 输出中必须含 *:3306 或 0.0.0.0:3306,不能只有 127.0.0.1:3306
MySQL 8.0 默认用 caching_sha2_password,Navicat、旧版 PyMySQL、PHP mysqli 等会直接报 ERROR 2059 或卡在握手阶段。
UPDATE user SET host = '%' —— MySQL 8.0 会报 ERROR 1396 (HY000),且破坏系统表结构CREATE USER 'app_user'@'192.168.10.%' IDENTIFIED WITH mysql_native_password BY 'StrongPass!2026';(生产环境禁用 '%',用具体 IP 段)ALL):GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'192.168.10.%';
FLUSH PRIVILEGES;,否则权限仍在内存缓存中未加载SELECT user, host, plugin FROM mysql.user WHERE user = 'app_user'; 返回的 plugin 必须是 mysql_native_password
ufw/firewalld 放行后不 reload,或云服务器安全组没开,现象都是 ERROR 2003 (HY000): Can't connect to MySQL server,但错误日志里无记录——静默丢包。
sudo ufw allow 3306/tcp(注意不是 ufw allow 3306,后者默认开 UDP)sudo firewall-cmd --permanent --add-port=3306/tcp && sudo firewall-cmd --reload
sestatus 查看):sudo setsebool -P mysqld_connect_any on
即使服务端已设为 mysql_native_password,某些驱动仍会默认尝试 caching_sha2_password,导致连接失败。
conn = pymysql.connect(..., auth_plugin='mysql_native_password')
mysql.connector.connect(..., auth_plugin='mysql_native_password')
mysql_native_password
mysql_native_password 插件——它被 sys 库等内部账户依赖,删了可能导致 mysqld 启动失败最容易被跳过的环节是:改完用户权限后忘了改 bind-address,或开了防火墙但没 reload,或云安全组压根没配。三者任一缺失,都会表现为“连不上”,但原因完全不同——得一层层查,不能只盯着 SQL 权限看。